天天看點

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;
        }
    }                        

到這裡大功告成!騷年!