天天看点

PHP+vue Web端使用支付宝支付

php接入支付宝的流程写在这里供像我一样的小白参考。

1.首先要有一个创建一个应用(选好自己想要的功能,关于支付的功能,貌似都需要签约)

2.下载SDK&Dome(网址https://opendocs.alipay.com/open/270/106291)

PHP+vue Web端使用支付宝支付

 把下载下来的文件解压的网站根目录

首先我们要先找到 config.php

把我们的appi_id,'merchant_private_key',alipay_public_key,这三项配置正确,如何获取从网上就可以找到

然后在本地都可以跑通的情况下把sdk都放到Yii2项目中的 vendor/alipay中

再把config.php 中的 notify_url 设置成我们可以用外网可以访问的地址 ,这个 参数是异步处理数据的地址

我们改参数时一定要注意 千万不用多任何东西跟增加换行跟空格 否则很容易验证签名不通过

都修改完毕后,我们来写业务代码   这里 我将调用pagepay的方法写到了Payment的静态方法alipay中

require_once '../../vendor/alipay/pagepay/service/AlipayTradeService.php';
require_once '../../vendor/alipay/pagepay/buildermodel/AlipayTradePagePayContentBuilder.php';
class Payment
{
    public static function aliPay($price,$order,$type=[])
    {
        require_once("../../vendor/alipay/config.php");
        //商户订单号,商户网站订单系统中唯一订单号,必填
        $out_trade_no = $order;
        //订单名称,必填
        $subject = '余额充值';
        $body = '稿件交易余额充值';
        //付款金额,必填
        $total_amount = $price;
        //商品描述,可空
        //构造参数
        $payRequestBuilder = new \AlipayTradePagePayContentBuilder();
        $payRequestBuilder->setBody($body);
        $payRequestBuilder->setSubject($subject);
        $payRequestBuilder->setTotalAmount($total_amount);
        $payRequestBuilder->setOutTradeNo($out_trade_no);
        $payRequestBuilder->setPassbackParams(urlencode(json_encode($type)));
        $aop = new \AlipayTradeService($config);
        /**
         * pagePay 电脑网站支付请求
         * @param $builder 业务参数,使用buildmodel中的对象生成。
         * @param $return_url 同步跳转地址,公网可以访问
         * @param $notify_url 异步通知地址,公网可以访问
         * @return $response 支付宝返回的信息
         */
        $aop->pagePay($payRequestBuilder,$config['return_url'],$config['notify_url']);
    }
}  
/**      
* 创建订单号2q
     * @param string $prefix
     * @return string
     */
     public static function createOrderSn($prefix ='',$number=18){
        $string =  $prefix.date('ymdHsi',time());
        $str_number =  $number - strlen($string);
        $string .= self::get_millisecond(rand(0,$str_number));
        $string = str_pad($string,$number,"0");
        $str_number = strlen($string);
        if($str_number > $number){
            return substr($string,0,$number);
        }
        return $string ;
    }

    /**
     * 获取微妙
     * @param int $mumber 不能大于8
     * @return mixed
     */
    private static function get_millisecond($number = 8)
    {
        if ($number > 8) { $number = 8; }
        list($usec, $time) = explode(" ", microtime());
        $msec = $usec * 100000000 + rand(0,99)+ rand(0,999)+rand(0,9999)+rand(0,$usec)+rand(0,$usec);
        $string = str_pad($msec,$number , "0");
        $str_number = strlen($string);
        if($str_number > $number){
            return substr($string,0,$number);
        }
        return $string;
    }      

控制器代码

public function actionIndex()
    {   $price = Yii::$app->getRequest()->get('price');
        Payment::aliPay($price,Payment::createOrderSn('ZFB'));
    }      

 在这里很重要我们看看前台代码

 因为我们后台请求支付宝借口时他返回的是一个页面,所以我们在这里需要这么做才可以用vue调用支付宝支付页面

pay(){
      this.$axios
      .get('pay-ment/index',{
        params:{
          pay_type:this.pay_type,
          price:this.price,
        }
      })
      .then(res => {
          document.querySelector('body').innerHTML = res.data;  //查找到当前页面的body,将后台返回的form替换掉他的内容
          document.forms[0].submit();
        }
      })
    },      

 我们扫码付款完成以后  需要在我们配置文件中的异步地址中进行后台数据修改,同步地址进行跳转

//支付宝异步通知
    public function actionNotify()
    {
        require_once '../../vendor/alipay/pagepay/service/AlipayTradeService.php';
        require_once("../../vendor/alipay/config.php");
        $arr = Yii::$app->request->post();
        // Yii::info("",'pay');
        $alipaySevice = new \AlipayTradeService($config);
        $alipaySevice->writeLog(var_export($arr,true)); //支付宝带的写日志的函数
        $result = $alipaySevice->check($arr);
        if($result) {//验证成功
            //商户订单号
            $out_trade_no = $_POST['out_trade_no'];
            //支付宝交易号
            $trade_no = $_POST['trade_no'];
            //交易状态
            $trade_status = $_POST['trade_status'];
            //交易金额
            $total_amount = $_POST['total_amount'];
            //自己传的值
            $passback_params = json_decode(urldecode($_POST['passback_params']),true);
            $passback_params['out_trade_no'] = $out_trade_no;
            $time = time();
            if($trade_status == 'TRADE_FINISHED') {
                  //我们的业务代码
            }
            else if ($trade_status == 'TRADE_SUCCESS') {
                   //我们的业务代码
            }
        }else {
            $fail_msg = implode(',', $arr);
            Yii::warning("验证失败$fail_msg",'pay');
            //验证失败
            echo "fail";die;
        }
    }                        

到这里大功告成!骚年!