一、實戰
上篇文章介紹了微信的付款碼支付,今天介紹支付寶的付款碼支付和刷臉支付實現。感興趣的童鞋也可以閱讀微信付款碼支付。
微信付款碼支付鏈接: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位