支付宝开发-关于条码支付
最近项目需要用到支付宝支付。大致流程就是收银台通过扫码设备扫描用户出示的付款码。进行付款。快捷方便。用php编写请求代码。c++(也就是收银台)那边调用我写的接口。进行付款。
首先还是看看开发文档吧 。传送门:https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.u3cxFZ&treeId=193&articleId=105072&docType=1
具体流程图如下:
第一步:首先要去支付宝开发者平台创建应用
1.点击创建应用,下面两个是我已经创建过了应用
2.设置应用参数
这里面应用网关和回调地址我都设置服务器地址了。
这里的rsa密钥很关键,我是通过openssl工具生成,我建议大家也用这个生成。这个工具在官方文档上可以下载。
这里我给个配置rsa密钥连接,里面详细介绍了如果获得rsa密钥,
传送门:https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.XZAA3d&treeId=200&articleId=105310&docType=1
如果还有其他问题,再联系我。
以上设置过了。就可以上线应用了,一般半天就好 了。
第二步,下载官方demo,阅读代码
下面拿我的php代码解释:
首先要在config.php文件中配置appid,商户密钥 支付宝密钥什么的。
<?php
$config = array(
//支付宝公钥
'alipay_public_key' => "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDI6d306Q8fIfCOaTXyiUeJHkrIvYISRcc73s3vF1ZT7XN8RNPwJxo8pWaJMmvyTn9N4HQ632qJBVHf8sxHi/fEsraprwCtzvzQETrNRwVxLO5jVmRGi60j8Ue1efIlzPXV9je9mkjzOmdssymZkh2QhUrCmZYI/FCEa3/cNMW0QIDAQAB",
//商户私钥
'merchant_private_key' =>
"MIICXAIBAAKBgQDvLN/xcR8Nu+3/3K8IHaYK/LrFS3JPwM38oN95RaqAwSMJ6XH9vR2JB5w9MM+Et3gdZ/iVWROALQV5TSZIsVRA56u4jhnucuTC8YqNejySpxSI/N8rqffGqmfvtO+wDU3pcLrGiJN9FcPuUNVwYvdLuli0N6DAh2S5Vtvna2ovoQIDAQABAoGAT7vODFeB2rpD5YBUeYgoypDmUs+MFDpacVXQKkWnSbUZUTyZ29Un+36l/2A+Tig7ytHWdTN05M4dfQrTMHitdTC874vrbFHaDUT5vF7uPeA+wLDthM5lI1yrMT+L9sNYwDDTQYoRyBDhQ7miYd/Up3TGyinMQ0whBQkRuX1HAWECQQD92rQfgvY4qV0uFyPJAULObw8xk9G3dKYKl8TXKdi0q1F0Obu1GO6XiXqxHmXI1RsZ7rxqIPcbEBwsESrq8W6nAkEA8TJoiOU9EEGYNMra67GluoCII830qe+P9unIUKKdhIKuXxOfJt38+sqRThdFEarefrBIyTSkfE8p2CEKIQpAdwJBAL4S9tGtbo0oiyOKofnMXuhREfBOPTX/OqAt2W494AwPRtMes2S7AVMn1l0uZIoGvt8g+aUBf+ScoGuCgz8dfXsCQDVagjcuBljvOZ0L9mtGq7NatUK+T027+WuUAUSdBB0Iz0umyoDNgCV147iTeyrSUk9R7XfcljoNRONTQ6tVWjcCQC7ZddZzf12IgFFgHMF+5TStuGhLBVBVttvCBFGj1Jk9QPi7IOuzBrxSdmG530eMTnjBaJAAolGfLb6XrHrhdlI=",
//编码格式
'charset' => "UTF-8",
//支付宝网关
'gatewayUrl' => "https://openapi.alipay.com/gateway.do",
//应用ID
'app_id' => "2016120904050389",
//异步通知地址,只有扫码支付预下单可用
'notify_url' => "http://www.baidu.com",
//最大查询重试次数
'MaxQueryRetry' => "10",
//查询间隔
'QueryDuration' => "3"
);
支付宝公钥和商户私钥在你的应用信息里面都有,appid也在你的应用中。
支付接口请求接口:https://openapi.alipay.com/gateway.do
请求参数
- out_trade_no //订单编号
- auth_code //付款码
- subject //订单名称
这3个参数必填。其他参数可以在官方文档详细介绍。
if (!empty($_POST['out_trade_no'])&& trim($_POST['out_trade_no'])!="") {
// (必填) 商户网站订单系统中唯一订单号,64个字符以内,只能包含字母、数字、下划线,
// 需保证商户系统端不能重复,建议通过数据库sequence生成,
$outTradeNo = "2016120904050389" . date('Ymdhis') . mt_rand(100, 1000);
// $outTradeNo = $_POST['out_trade_no'];
// (必填) 订单标题,粗略描述用户的支付目的。如“XX品牌XXX门店消费”
$subject = $_POST['subject'];
// (必填) 订单总金额,单位为元,不能超过1亿元
// 如果同时传入了【打折金额】,【不可打折金额】,【订单总金额】三者,则必须满足如下条件:【订单总金额】=【打折金额】+【不可打折金额】
$totalAmount = $_POST['total_amount'];
// (必填) 付款条码,用户支付宝钱包手机app点击“付款”产生的付款条码
$authCode = $_POST['auth_code']; //28开头18位数字
// 继续创建并添加第一条商品信息,用户购买的产品为“xx牙刷”,单价为5.05元,购买了两件
$goods2 = new GoodsDetail();
$goods2->setGoodsId("good_id002");
$goods2->setGoodsName("XXX商品2");// 当面付2.0条码支付(带轮询逻辑)
public function barPay($req) {
$outTradeNo = $req->getOutTradeNo();
$bizContent = $req->getBizContent();
$appAuthToken = $req->getAppAuthToken();
$this->writeLog($bizContent);
echo $bizContent;
$request = new AlipayTradePayRequest();
$request->setBizContent ( $bizContent );
$response = $this->aopclientRequestExecute ( $request , NULL , $appAuthToken);
//获取alipay_trade_pay_response对象数据,方便后续处理
$response = $response->alipay_trade_pay_response;
$result = new AlipayF2FPayResult($response);
if (!empty($response)&&("10000" == $response->code)) {
// 支付交易明确成功
$result->setTradeStatus("SUCCESS");
} elseif (!empty($response)&&("10003" == $response->code)) {
// 返回用户处理中,则轮询查询交易是否成功,如果查询超时,则调用撤销
$queryContentBuilder = new AlipayTradeQueryContentBuilder();
$queryContentBuilder->setOutTradeNo($outTradeNo);
$queryContentBuilder->setAppAuthToken($appAuthToken);
$loopQueryResponse = $this->loopQueryResult($queryContentBuilder);
return $this->checkQueryAndCancel($outTradeNo, $appAuthToken, $result, $loopQueryResponse);
} elseif ($this->tradeError($response)) {
// 系统错误或者网络异常未响应,则查询一次交易,如果交易没有支付成功,则调用撤销
$queryContentBuilder = new AlipayTradeQueryContentBuilder();
$queryContentBuilder->setOutTradeNo($outTradeNo);
$queryContentBuilder->setAppAuthToken($appAuthToken);
$queryResponse = $this->query($queryContentBuilder);
return $this->checkQueryAndCancel($outTradeNo, $appAuthToken, $result, $queryResponse);
} else {
// 其他情况表明该订单支付明确失败
$result->setTradeStatus("FAILED");
}
return $result;
}
// 当面付2.0条码支付(带轮询逻辑)
public function barPay($req) {
$outTradeNo = $req->getOutTradeNo();
$bizContent = $req->getBizContent();
$appAuthToken = $req->getAppAuthToken();
$this->writeLog($bizContent);
echo $bizContent;
$request = new AlipayTradePayRequest();
$request->setBizContent ( $bizContent );
$response = $this->aopclientRequestExecute ( $request , NULL , $appAuthToken);
//获取alipay_trade_pay_response对象数据,方便后续处理
$response = $response->alipay_trade_pay_response;
$result = new AlipayF2FPayResult($response);
if (!empty($response)&&("10000" == $response->code)) {
// 支付交易明确成功
$result->setTradeStatus("SUCCESS");
} elseif (!empty($response)&&("10003" == $response->code)) {
// 返回用户处理中,则轮询查询交易是否成功,如果查询超时,则调用撤销
$queryContentBuilder = new AlipayTradeQueryContentBuilder();
$queryContentBuilder->setOutTradeNo($outTradeNo);
$queryContentBuilder->setAppAuthToken($appAuthToken);
$loopQueryResponse = $this->loopQueryResult($queryContentBuilder);
return $this->checkQueryAndCancel($outTradeNo, $appAuthToken, $result, $loopQueryResponse);
} elseif ($this->tradeError($response)) {
// 系统错误或者网络异常未响应,则查询一次交易,如果交易没有支付成功,则调用撤销
$queryContentBuilder = new AlipayTradeQueryContentBuilder();
$queryContentBuilder->setOutTradeNo($outTradeNo);
$queryContentBuilder->setAppAuthToken($appAuthToken);
$queryResponse = $this->query($queryContentBuilder);
return $this->checkQueryAndCancel($outTradeNo, $appAuthToken, $result, $queryResponse);
} else {
// 其他情况表明该订单支付明确失败
$result->setTradeStatus("FAILED");
}
return $result;
}
barpay方法中调用aopclientRequestExecute方法请求支付接口,根据返回的参数来判断支付成功
如果返回10003的情况下,证明用户正在付款,它会查询10次订单状态,每次睡眠5秒。如果10次之后用户依旧没有付款的情况下,那它就调用撤销订单接口。避免用户继续支付。
我这边只介绍一些重点。如果想进行开发的话,建议一定要通读源码。理解其意。
以上!