PHP调用官方支付宝sdk的方法生成支付二维码
2022-12-20
开通支付宝网站支付功能,基本流程是:商户网站生成订单,然后向支付宝网关发出请求并跳转,支付宝收款成功后通知商户订单状态更新,进行业务处理。
上面流程有个不便之处是用户会跳出商户自己的网站,操作较为繁琐,于是越来越流行在站内完成支付的方式。
通常首选站内生成支付二维码,极速收款。
本文简单介绍PHP调用官方支付宝sdk的方法来实现:
<?php
/*
* 支付宝支付 - 需要开通当面付!!!
* @param $body 商品描述(可空)
* @param $subject 商品名称(必填)
* @param $total_amount 订单总额(必填)
* @param $out_trade_no 订单号(必填)
*/
function cpury_custom_qr_alipay($total_amount, $body, $subject, $out_trade_no){
// 引入sdk中的三个文件
require_once(plugin_dir_path( __FILE__ ). '../alipay/config.php'); // 配置文件
require_once(plugin_dir_path( __FILE__ ). '../alipay/aop/AopClient.php');
require_once(plugin_dir_path( __FILE__ ). '../alipay/aop/request/AlipayTradePrecreateRequest.php');
$aop = new \AopClient();
$aop->appId = $config['app_id']; // 应用唯一ID
$aop->gatewayUrl = $config['gatewayUrl'];
$aop->rsaPrivateKey = $config['merchant_private_key']; // 应用私钥
$aop->alipayrsaPublicKey = $config['alipay_public_key']; // 支付宝公钥
$aop->signType = "RSA2";
$aop->format = "json";
$aop->charset = "UTF-8";
$aop->debugInfo = true;
$request = new \AlipayTradePrecreateRequest();
$arr['body'] = $body;
$arr['subject'] = $subject;
$arr['out_trade_no'] = $out_trade_no;
$arr['timeout_express'] = '1d'; // 订单过期时间, 1d代表一天,24小时,还有1分钟(1m)、1小时(1h)等
$arr['total_amount'] = floatval($total_amount);
$json = json_encode($arr);
$request->setNotifyUrl($config['notify_url']); // 异步回调地址
$request->setBizContent($json);
$result = $aop->execute($request);
$responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response";
$resultCode = $result->$responseNode->code;
if(!empty($resultCode) && $resultCode == '10000') {
$resp = (array)$result->$responseNode;
return $resp['qr_code']; // 二维码链接地址,类似:https://qr.alipay.com/xxxxxxxxxxxxxxxxxxx
}
else {
return false;
}
}
返回成功的结果是一个二维码链接地址,类似:https://qr.alipay.com/xxxxxxxxxxxxxxxxxxx,发送给前端,将这个链接生成文本二维码。
常见问题
- 支付宝官方sdk需要手动引入SignData类
文件alipay/aop/AopClient.php中使用了SignData类,但没用引入该类:
// alipay/aop/AopClient.php
function parserJSONSignData($request, $responseContent, $responseJSON) {
$signData = new SignData();
$signData->sign = $this->parserJSONSign($responseJSON);
$signData->signSourceData = $this->parserJSONSignSource($request, $responseContent);
return $signData;
}
需要手动添加下:
require_once 'SignData.php';
2.提示错误码:40004 ACQ.ACCESS_FORBIDDEN
生成支付二维码必须签约开通【当面付】功能!
另外,用原生方法向支付宝网关发送请求也可以,就是稍微麻烦些,可见参考资料。
参考资料
- https://www.cnblogs.com/chenchenphp/p/14139376.html
- https://blog.csdn.net/chendongpu/article/details/120740709