天天看點

PHP 支付寶小程式 支付以及回調處理

PHP 支付寶小程式 支付以及回調處理

          • 一、去支付寶官網下載下傳對應的PHP SDK
          • 二、 在服務端調用 alipay.trade.create (統一收單交易建立接口),獲得支付寶交易号 tradeNO
          • 首先加載支付寶的系統參數,以及基礎的配置
          • 第二步:調用 alipay.trade.create (統一收單交易建立接口),獲得支付寶交易号 tradeNO
          • 在小程式端使用 tradeNO,調用 my.tradePay 接口喚起支付收銀台。
          • 最後就是我們的回調處理了
          • 我們需要驗簽
一、去支付寶官網下載下傳對應的PHP SDK
二、 在服務端調用 alipay.trade.create (統一收單交易建立接口),獲得支付寶交易号 tradeNO

接下來直接上代碼:

首先加載支付寶的系統參數,以及基礎的配置
public function ali_init($config) {
        require  dirname(__FILE__) .'/../library/alipay/AopSdk.php';
        $aop = new \AopClient ();
        //支付寶網關
        $aop->gatewayUrl = 'https://openapi.alipay.com/gateway.do';

        //第三方配置資訊
        $aop->appId              = $config['ali_app_id'];//第三方應用的appid
        $aop->rsaPrivateKey      = $config['ali_rsa_pri_key'];//第三方應用的密鑰
        $aop->alipayrsaPublicKey = $config['ali_rsa_pub_key'];//第三方應用的公鑰
        $aop->apiVersion         = '1.0';
        $aop->signType           = 'RSA2';
        $aop->postCharset        = 'UTF-8';
        $aop->format             = 'json';
        return $aop;
    }
    
           
第二步:調用 alipay.trade.create (統一收單交易建立接口),獲得支付寶交易号 tradeNO
public function Ali_Pay($data = [])
    {
        $config = pdo_get('bda_cardcrm_company', ['id' => $data['company_id']]);
        //執行個體化用戶端
        $aop                     = $this->ali_init($config);
        $aop->alipayrsaPublicKey = $config['ali_pay_rsa_pub_key'];

        //執行個體化具體API對應的request類,類名稱和接口名稱對應,目前調用接口名稱:alipay.trade.create.
        $request = new AlipayTradeCreateRequest ();

        $request_data = [
            'out_trade_no' => $data['out_trade_no'],        //  商戶訂單号
            'total_amount' => $data['total_amount'],        //  訂單總金額
            'subject'      => $data['subject'],             //  訂單标題
            'buyer_id'     => $data['buyer_id'],            //  買家的支付寶唯一使用者号(2088開頭的16位純數字)
        ];
        $http_type = ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')) ? 'https://' : 'http://';
        $website = $http_type . $_SERVER['HTTP_HOST'];
        $request->setNotifyUrl($website .'/payment/alipay/notify.php');
        $request_data = json_encode($request_data);
        $request->setBizContent($request_data);
        $result = $aop->execute ( $request);

        $responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response";
        $resultCode   = $result->$responseNode->code;
        if(!empty($resultCode) && $resultCode == 10000){
            return ['error'=>0 , 'res'=>$result->$responseNode];
        } else {
            return ['error'=>-1 , 'res'=>$result->$responseNode];
        }
    }
           

測試一下接口是否成功

PHP 支付寶小程式 支付以及回調處理

到這一步,基本上服務端處理就差不多了;接下來,将後端生成的支付寶交易号 tradeNO返給前端;

在小程式端使用 tradeNO,調用 my.tradePay 接口喚起支付收銀台。
my.tradePay({
		tradeNO: '2017111521001104105336677922',  
		success: function(res) {
			my.alert(res.resultCode);
		},
		fail: function(res) {
          my.alert(res.resultCode);
       },
	});
           
最後就是我們的回調處理了

我們可以将支付寶回調傳回的資料寫入檔案中。

file_put_contents(‘alipay.txt’ , json_encode($_POST));

回調成功的話,會在檔案中看到相應的json字元串,就像這樣:

我們需要驗簽
//驗證簽名
$aop = new \AopClient();
$aop->alipayPublicKey = $ali_pay_rsa_pub_key;

$flag = $aop->rsaCheckV1($data , NULL, "RSA2");

if(!empty($data) && $flag) {
    //以下為回調業務邏輯代碼

	... ...資料處理



	
    if ($trade_status == 'TRADE_SUCCESS') {
        //支付成功業務處理
		...	...
		//
        exit('success');
    }
}
exit('failed');
           

最後就是支付方法的調用

// 支付寶
        load()->classs("alipay");
        $data['total_amount'] = '商品金額';
        $data['subject']      = "AliPay";
        $data['out_trade_no'] = '訂單号';
        $data['buyer_id']     = '使用者openID';
        $alipay = new AliPay();
        $res    = $alipay->Ali_Pay($data);
        if ($res['error'] == 0) {
            pdo_commit();// 全部執行成功送出
            return $this->result(0,'success',$res['res']);
        } else {
            return $this->result(-1,'error',$res['res']);
        }
        
           

這樣完整的支付寶小程式支付就完成了