PHP-SDK實現支付寶 付款碼支付、刷臉支付

一、實戰

上篇文章介紹了微信的付款碼支付,今天介紹支付寶的付款碼支付和刷臉支付實現。感興趣的童鞋也可以閱讀微信付款碼支付。

微信付款碼支付鏈接:https://blog.csdn.net/u013715754/article/details/103334261

第一步

請自行完成支付寶商戶號的註冊流程

【支付寶多端發佈:https://opendocs.alipay.com/mini/multi-platform

【下圖是前端開發具體的位置】

第二步

支付寶PHP-SDK

【PHP-SDK下載鏈接 https://docs.open.alipay.com/54/103419/

第三步

採用證書模式開發【統一支付接口文檔https://docs.open.alipay.com/api_1/alipay.trade.pay

SDK目錄說明文件

 

alipay.php 文件內部源碼說明

#引入證書支付類
require_once './aop/AopCertClient.php';
require_once './aop/request/AlipayTradePayRequest.php';
require_once './aop/request/AlipayTradePagePayRequest.php';

header('content-type:application/json;charset=utf-8');
/**
 * 證書類型AopCertClient功能方法使用測試,特別注意支付寶更證書預計2037年會過期,請在適當時間下載更新支付更證書
 * 1、execute 證書模式調用示例
 * 2、sdkExecute 證書模式調用示例
 * 3、pageExecute 證書模式調用示例
 */
#接收參數 bar_code

$server = $_SERVER;
$addr = $server['REMOTE_ADDR'];
$port = $server['REMOTE_PORT'];

$params = $_REQUEST;
$bar_code = $params['bar_code'];
$total_amount = $params['total_amount'];
$pay_type = $params['pay_type'];#刷臉支付face 掃碼支付code

#驗證支付寶 | 微信支付
#支付授權碼,25~30開頭的長度爲16~24位的數字,實際字符串長度以開發者獲取的付款碼長度爲準
#微信授權碼,掃碼支付授權碼,設備讀取用戶微信中的條碼或者二維碼信息(注:用戶付款碼條形碼規則:18位純數字,以10、11、12、13、14、15開頭)

$bar_code_header = $bar_code[0].$bar_code[1];
if($bar_code_header >= 10 && $bar_code_header <= 15){
    echo json_encode(['code'=>'10003','msg'=>'目前暫未開放別的支付方式']);
    exit;
}elseif($bar_code_header >= 25 && $bar_code_header <= 30){
    $zfb = true;
}else{
    echo json_encode(['code'=>'10003','msg'=>'目前暫未開放別的支付方式']);
    exit;
}

//execute 使用
$aop = new AopCertClient ();
$appCertPath = "./aop/crt/appCertPublicKey_2019110468928224.crt";
$alipayCertPath = "./aop/crt/alipayCertPublicKey_RSA2.crt";
$rootCertPath = "./aop/crt/alipayRootCert.crt";
$private = file_get_contents('./aop/crt/www.qingzhoudata.com_private');


#支付調用URL不需要修改
$aop->gatewayUrl = 'https://openapi.alipay.com/gateway.do';
$aop->appId = 'xxxxxxxxxxx';#APPID
$aop->rsaPrivateKey = $private;
$aop->alipayrsaPublicKey = $aop->getPublicKey($alipayCertPath);//調用getPublicKey從支付寶公鑰證書中提取公鑰
$aop->apiVersion = '1.0';
$aop->signType = 'RSA2';
$aop->postCharset='utf-8';
$aop->format='json';
$aop->isCheckAlipayPublicCert = true;//是否校驗自動下載的支付寶公鑰證書,如果開啓校驗要保證支付寶根證書在有效期內
$aop->appCertSN = $aop->getCertSN($appCertPath);//調用getCertSN獲取證書序列號
$aop->alipayRootCertSN = $aop->getRootCertSN($rootCertPath);//調用getRootCertSN獲取支付寶根證書序列號

#商戶訂單號,64個字符以內、可包含字母、數字、下劃線;需保證在商戶端不重複
$out_trade_no = date("YmdHis").md5(microtime(true).$addr.$port);
$sys_service_provider_id = '2088721901222682';

#處理支付方式
switch ($pay_type){
    case 'face':
        $biz = json_encode([
            "out_trade_no"=>$out_trade_no,
            "scene"=>"bar_code",
            "subject"=>"親情支付-支付訂單",
            "auth_code"=>$bar_code,
            "total_amount"=>$total_amount,
            "extend_params"=>[
                "sys_service_provider_id"=>$sys_service_provider_id
            ]
        ],JSON_UNESCAPED_UNICODE);
        $request = new AlipayTradePayRequest();
        $request->setBizContent($biz);
        $result = $aop->execute($request);
        break;
    case 'code':
        $request = new AlipayTradePagePayRequest();
        $biz = json_encode([
            "out_trade_no"=>$out_trade_no,
            "product_code"=>'FAST_INSTANT_TRADE_PAY',
            "scene"=>"bar_code",
            "subject"=>"親情支付-支付訂單",
            "body"=>'親情支付-支付訂單',
            "auth_code"=>$bar_code,
            "total_amount"=>$total_amount,
            "extend_params"=>[
                "sys_service_provider_id"=>$sys_service_provider_id
            ]
        ],JSON_UNESCAPED_UNICODE);
        $request->setBizContent($biz);
        $result = $aop->pageExecute($request);
        #下單完成,處理支付流程
        $biz = json_encode([
            "out_trade_no"=>$out_trade_no,
            "scene"=>"bar_code",
            "subject"=>"親情支付-支付訂單",
            "auth_code"=>$bar_code,
            "total_amount"=>$total_amount,
            "extend_params"=>[
                "sys_service_provider_id"=>$sys_service_provider_id
            ]
        ],JSON_UNESCAPED_UNICODE);
        $request = new AlipayTradePayRequest();
        $request->setBizContent($biz);
        $result = $aop->execute($request);
        break;
}
#處理返回值
$data = [
    "code"=>$result->alipay_trade_pay_response->code,
    "msg"=>$result->alipay_trade_pay_response->msg,
    "buyer_logon_id"=>$result->alipay_trade_pay_response->buyer_logon_id,
    "buyer_pay_amount"=>$result->alipay_trade_pay_response->buyer_pay_amount,
    "buyer_user_id"=>$result->alipay_trade_pay_response->buyer_user_id,
    "invoice_amount"=>$result->alipay_trade_pay_response->invoice_amount,
    "out_trade_no"=>$result->alipay_trade_pay_response->out_trade_no,
    "point_amount"=>$result->alipay_trade_pay_response->point_amount,
    "receipt_amount"=>$result->alipay_trade_pay_response->receipt_amount,
    "total_amount"=>$result->alipay_trade_pay_response->total_amount,
    "trade_no"=>$result->alipay_trade_pay_response->trade_no
];
echo json_encode($data);

 

 

特別說明:

微信和支付的付款碼區別在於前兩位數字

微信 以 10、11、12、13、14、15開頭的數字,長度18位

支付寶 以 25、26、27、28、29、30開頭的數字,長度16-24位

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章