支付寶開發-關於條碼支付
最近項目需要用到支付寶支付。大致流程就是收銀臺通過掃碼設備掃描用戶出示的付款碼。進行付款。快捷方便。用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次之後用戶依舊沒有付款的情況下,那它就調用撤銷訂單接口。避免用戶繼續支付。
我這邊只介紹一些重點。如果想進行開發的話,建議一定要通讀源碼。理解其意。
以上!