支付寶支付開發(fā)——當(dāng)面付條碼支付和掃碼支付實(shí)例
本文介紹支付寶中當(dāng)面付下屬的條碼支付、掃碼支付、訂單查詢、退款申請(qǐng)的集成開發(fā)過程。
本文分為以下五個(gè)部分:
- 條碼支付和掃碼支付介紹
- 申請(qǐng)應(yīng)用
- 密鑰生成及配置
- API及SDK集成
- 條碼支付、掃碼支付、訂單查詢、退款申請(qǐng)
一、條碼支付及二維碼支付介紹
1. 條碼支付
條碼支付是支付寶給到線下傳統(tǒng)行業(yè)的一種收款方式。商家使用掃碼槍等條碼識(shí)別設(shè)備掃描用戶支付寶錢包上的條碼/二維碼,完成收款。用戶僅需出示付款碼,所有收款操作由商家端完成。其使用場(chǎng)景如下:
業(yè)務(wù)流程:
使用步驟:
- 用戶登陸支付寶錢包,點(diǎn)擊首頁(yè)“付款”,進(jìn)入付款碼界面;
- 收銀員在商家收銀系統(tǒng)操作生成訂單,用戶確認(rèn)支付金額;
- 用戶出示錢包的“付款碼”,收銀員用掃碼設(shè)備來掃描用戶手機(jī)上的條碼/二維碼后,商家收銀系統(tǒng)提交支付;
- 付款成功后商家收銀系統(tǒng)會(huì)拿到支付成功或者失敗的結(jié)果。
2. 掃碼支付
掃碼支付,指用戶打開支付寶錢包中的“掃一掃”功能,掃描商家展示在某收銀場(chǎng)景下的二維碼并進(jìn)行支付的模式。該模式適用于線下實(shí)體店支付、面對(duì)面支付等場(chǎng)景。
其使用場(chǎng)景如下:
業(yè)務(wù)流程:
使用步驟:
- 用戶登陸支付寶錢包,點(diǎn)擊首頁(yè)“付款-掃碼付”,進(jìn)入掃一掃界面;
- 收銀員在商家收銀系統(tǒng)操作生成支付寶訂單,用戶確認(rèn)支付金額,并生成二維碼;
- 用戶使用錢包的“掃碼付”,掃收銀員提供的二維碼,確認(rèn)支付;
- 用戶付款后商家收銀系統(tǒng)會(huì)拿到支付成功或者失敗的結(jié)果。
二、接口申請(qǐng)
企業(yè)在申請(qǐng)企業(yè)支付寶之后,進(jìn)行功能申請(qǐng)并簽約,然后在螞蟻金服開放平臺(tái)中申請(qǐng)應(yīng)用如下(詳細(xì)過程就略了)
然后在功能列表中,申請(qǐng)當(dāng)面付這一功能,申請(qǐng)成功后如下。
這樣,我們就有了當(dāng)面付的權(quán)限了。
三、密鑰生成
在支付寶當(dāng)面付的接口中,使用了非對(duì)稱加密算法,商戶自己的公鑰和私鑰需要自己使用OpenSSL手動(dòng)生成。對(duì)這些概念比較陌生的話,請(qǐng)先自行先了解一下密碼學(xué)的相關(guān)知識(shí)。OpenSSL也可以從方倍工作室博客中找到。
下載支付寶官方提供的密鑰生成工具OpenSSL,然后執(zhí)行以下命令就可以生成公鑰和私鑰。
其中
genrsa -out rsa_private_key.pem 1024
是用于生成RSA私鑰,執(zhí)行后在程序目錄中生成一個(gè)文件rsa_private_key.pem,其內(nèi)容如下
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQCyffRONGd8Q/1kRh1cpsSRi360DXLHI7zxdPJGYe5HKDWF7u9b
3zZU9erZpM90XE7gZRKsxIgOurH4uqhmVRbto3e+LiYOyNpd6As3Q427KCTIT7aj
hHicZ6GWhegTUiVLqiuWLsauQcbI6DO4GEZrlvAdzus0WcJiJOxW02rxSQIDAQAB
AoGAXBJYyVaC4zj3Jph8YOStlR5N13bwdATdW/glWWT+0rnNEi90TQHRNvY7lNVN
JgrPrTS182TVgjOPxmwSnebakhIuGIdPq99GLE4LGd5lKWTzkd84BMvhatfNsCCz
cEVFqKg3tZd4t3fQ93FrILsnnZpLhiW53jIrStCkR3rx9OECQQDWMSHyc91hEVMQ
qVNasbGEicKWxhoDqjdm2lHkBx4mrB9JEZFDs6MxWdajf2/Qw+tgtpN3YBcCDw/H
nGHhQtStAkEA1VTyjOdAwWode8X4fu0IPq9+E19mcVOAJjLBH46mropwgOdj3raq
T/ThaKeaydjabsTAiY2J18HiTiyH+1bGjQJBAKgRJXH5OFxSG7uXIbCofYJiFi34
g7EcfxxVcqxaaW4u4N2Uy0c0TXkL5T+lXzeQg8D/gfbJj0QuTVNzgdofdoECQBHY
OznCFk6Xe8PguXqUhT4JG/iu4DjWjT+kuzbSjerHtcVylY4JpZFuoHRKoM4Fj6/4
UUqwRjmABFgZrX4+sfkCQCNI8RCZ6yprh5kEOePo3uazAlNENP8dKkhgqChawdK7
7NzlJ727Nt23STHFx6NkhzyruJGQ5Vx1Lkl0wKuKbXM=
-----END RSA PRIVATE KEY-----
命令
rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
是用于生成RSA公鑰,執(zhí)行后在程序目錄中生成一個(gè)文件rsa_public_key.pem,其內(nèi)容如下
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyffRONGd8Q/1kRh1cpsSRi360
DXLHI7zxdPJGYe5HKDWF7u9b3zZU9erZpM90XE7gZRKsxIgOurH4uqhmVRbto3e+
LiYOyNpd6As3Q427KCTIT7ajhHicZ6GWhegTUiVLqiuWLsauQcbI6DO4GEZrlvAd
zus0WcJiJOxW02rxSQIDAQAB
-----END PUBLIC KEY-----
生成的這個(gè)RSA公鑰,需要填寫到應(yīng)用中去,填寫地址如下所示。私鑰不需要填到配置中,到時(shí)候配置到代碼中。
特別注意,密鑰要去掉注釋部分,且轉(zhuǎn)換成一行字符,否則回車換行也成為密鑰的一部分,將導(dǎo)致無法正常加解密。
同時(shí),可以點(diǎn)擊 “查看支付寶公鑰”,將支付寶的公鑰復(fù)制保存下來,后面的程序中將需要用到。
四、密鑰生成API與密鑰配置
公共參數(shù)
請(qǐng)求地址:
環(huán)境 | HTTPS請(qǐng)求地址 |
---|---|
正式環(huán)境 | https://openapi.alipay.com/gateway.do |
公共請(qǐng)求參數(shù):
參數(shù) | 類型 | 是否必填 | 最大長(zhǎng)度 | 描述 |
---|---|---|---|---|
app_id | String | 是 | 32 | 支付寶分配給開發(fā)者的應(yīng)用ID |
method | String | 是 | 128 | 接口名稱 |
format | String | 否 | 40 | 僅支持JSON |
charset | String | 是 | 10 | 請(qǐng)求使用的編碼格式,如utf-8,gbk,gb2312等 |
sign_type | String | 是 | 10 | 商戶生成簽名字符串所使用的簽名算法類型,目前支持RSA |
sign | String | 是 | 256 | 商戶請(qǐng)求參數(shù)的簽名串,詳見簽名 |
timestamp | String | 是 | 19 | 發(fā)送請(qǐng)求的時(shí)間,格式"yyyy-MM-dd HH:mm:ss" |
version | String | 是 | 3 | 調(diào)用的接口版本,固定為:1.0 |
notify_url | String | 否 | 256 | 支付寶服務(wù)器主動(dòng)通知商戶服務(wù)器里指定的頁(yè)面http/https路徑。 |
app_auth_token | String | 否 | 40 | 詳見應(yīng)用授權(quán)概述 |
biz_content | String | 是 | - | 請(qǐng)求參數(shù)的集合,最大長(zhǎng)度不限,除公共參數(shù)外所有請(qǐng)求參數(shù)都必須放在這個(gè)參數(shù)中傳遞,具體參照各產(chǎn)品快速接入文檔 |
請(qǐng)求參數(shù)
參數(shù) | 類型 | 是否必填 | 最大長(zhǎng)度 | 描述 |
---|---|---|---|---|
out_trade_no | String | 必須 | 64 | 商戶訂單號(hào),64個(gè)字符以內(nèi)、可包含字母、數(shù)字、下劃線;需保證在商戶端不重復(fù) |
scene | String | 必須 | 32 | 支付場(chǎng)景 條碼支付,取值:bar_code 聲波支付,取值:wave_code |
auth_code | String | 必須 | 32 | 支付授權(quán)碼 |
seller_id | String | 可選 | 28 | 如果該值為空,則默認(rèn)為商戶簽約賬號(hào)對(duì)應(yīng)的支付寶用戶ID |
total_amount | Price | 可選 | 11 | 訂單總金額,單位為元, |
discountable_amount | Price | 可選 | 11 | 參與優(yōu)惠計(jì)算的金額,單位為元 |
undiscountable_amount | Price | 可選 | 11 | 不參與優(yōu)惠計(jì)算的金額,單位為元 |
subject | String | 必須 | 256 | 訂單標(biāo)題 |
body | String | 可選 | 128 | 訂單描述 |
GoodsDetail [] | 可選 | - | 訂單包含的商品列表信息,Json格式,其它說明詳見商品明細(xì)說明 | |
operator_id | String | 可選 | 28 | 商戶操作員編號(hào) |
store_id | String | 可選 | 32 | 商戶門店編號(hào) |
terminal_id | String | 可選 | 32 | 商戶機(jī)具終端編號(hào) |
alipay_store_id | String | 可選 | 32 | 支付寶的店鋪編號(hào) |
ExtendParams | 可選 | - | 業(yè)務(wù)擴(kuò)展參數(shù) | |
timeout_express | String | 可選 | 6 | 該筆訂單允許的最晚付款時(shí)間,逾期將關(guān)閉交易。 |
RoyaltyInfo | 可選 | - | 描述分賬信息,Json格式,其它說明詳見分賬說明 | |
SubMerchant | 可選 | - | 二級(jí)商戶信息,當(dāng)前只對(duì)特殊銀行機(jī)構(gòu)特定場(chǎng)景下使用此字段 |
公共響應(yīng)參數(shù)
參數(shù) | 類型 | 是否必填 | 最大長(zhǎng)度 | 描述 |
---|---|---|---|---|
code | String | 是 | - | 網(wǎng)關(guān)返回碼,詳見文檔 |
msg | String | 是 | - | 網(wǎng)關(guān)返回碼描述,詳見文檔 |
sub_code | String | 否 | - | 業(yè)務(wù)返回碼,詳見文檔 |
sub_msg | String | 否 | - | 業(yè)務(wù)返回碼描述,詳見文檔 |
sign | String | 是 | - | 簽名,詳見文檔 |
響應(yīng)參數(shù)
參數(shù) | 類型 | 是否必填 | 最大長(zhǎng)度 | 描述 |
---|---|---|---|---|
trade_no | String | 必填 | 64 | 支付寶交易號(hào) |
out_trade_no | String | 必填 | 64 | 商戶訂單號(hào) |
buyer_logon_id | String | 必填 | 100 | 買家支付寶賬號(hào) |
total_amount | Price | 必填 | 11 | 交易金額 |
receipt_amount | String | 必填 | 11 | 實(shí)收金額 |
buyer_pay_amount | Price | 選填 | 11 | 買家付款的金額 |
point_amount | Price | 選填 | 11 | 使用積分寶付款的金額 |
invoice_amount | Price | 選填 | 11 | 交易中可給用戶開具發(fā)票的金額 |
gmt_payment | Date | 必填 | 32 | 交易支付時(shí)間 |
TradeFundBill [] | 必填 | - | 交易支付使用的資金渠道 | |
card_balance | Price | 選填 | 11 | 支付寶卡余額 |
store_name | String | 選填 | 512 | 發(fā)生支付交易的商戶門店名稱 |
buyer_user_id | String | 必填 | 28 | 買家在支付寶的用戶id |
discount_goods_detail | String | 必填 | - | 本次交易支付所使用的單品券優(yōu)惠的商品優(yōu)惠信息 |
系統(tǒng)中配置如下
<?php $config = array ( //支付寶公鑰 'alipay_public_key' => "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDI6d306Q8fIfCOaTXyiUeJHkrIvYISRcc73s3vF1ZT7XN8RNPwJxo8pWaJMmvyTn9N4HQ632qJBVHf8sxHi/fEsraprwCtzvzQETrNRwVxLO5jVmRGi60j8Ue1efIlzPXV9je9mkjzOmdssymZkh2QhUrCmZYI/FCEa3/cNMW0QIDAQAB", //商戶私鑰 'merchant_private_key' => "MIICXAIBAAKBgQCyffRONGd8Q/1kRh1cpsSRi360DXLHI7zxdPJGYe5HKDWF7u9b3zZU9erZpM90XE7gZRKsxIgOurH4uqhmVRbto3e+LiYOyNpd6As3Q427KCTIT7ajhHicZ6GWhegTUiVLqiuWLsauQcbI6DO4GEZrlvAdzus0WcJiJOxW02rxSQIDAQABAoGAXBJYyVaC4zj3Jph8YOStlR5N13bwdATdW/glWWT+0rnNEi90TQHRNvY7lNVNJgrPrTS182TVgjOPxmwSnebakhIuGIdPq99GLE4LGd5lKWTzkd84BMvhatfNsCCzcEVFqKg3tZd4t3fQ93FrILsnnZpLhiW53jIrStCkR3rx9OECQQDWMSHyc91hEVMQqVNasbGEicKWxhoDqjdm2lHkBx4mrB9JEZFDs6MxWdajf2/Qw+tgtpN3YBcCDw/HnGHhQtStAkEA1VTyjOdAwWode8X4fu0IPq9+E19mcVOAJjLBH46mropwgOdj3raqT/ThaKeaydjabsTAiY2J18HiTiyH+1bGjQJBAKgRJXH5OFxSG7uXIbCofYJiFi34g7EcfxxVcqxaaW4u4N2Uy0c0TXkL5T+lXzeQg8D/gfbJj0QuTVNzgdofdoECQBHYOznCFk6Xe8PguXqUhT4JG/iu4DjWjT+kuzbSjerHtcVylY4JpZFuoHRKoM4Fj6/4UUqwRjmABFgZrX4+sfkCQCNI8RCZ6yprh5kEOePo3uazAlNENP8dKkhgqChawdK77NzlJ727Nt23STHFx6NkhzyruJGQ5Vx1Lkl0wKuKbXM=", //編碼格式 'charset' => "UTF-8", //支付寶網(wǎng)關(guān) 'gatewayUrl' => "https://openapi.alipay.com/gateway.do", //應(yīng)用ID 'app_id' => "2016061501500000", //異步通知地址,只有掃碼支付預(yù)下單可用 'notify_url' => "http://www.fangbei.org/alipay/notify.html", //最大查詢重試次數(shù) 'MaxQueryRetry' => "10", //查詢間隔 'QueryDuration' => "3" );
其中支付寶公鑰就是在前面中復(fù)制保存的,直接復(fù)制到程序中即可,而商戶私鑰是之前OpenSSL中生成的私鑰。APPID是該服務(wù)的id號(hào)。
而這個(gè)異步通知將會(huì)接收掃碼支付結(jié)果的通知。
五、條碼支付、掃碼支付、訂單查詢、退款申請(qǐng)
1. 條碼支付
條碼支付的參數(shù)配置如下
// (必填) 商戶網(wǎng)站訂單系統(tǒng)中唯一訂單號(hào),64個(gè)字符以內(nèi),只能包含字母、數(shù)字、下劃線, // 需保證商戶系統(tǒng)端不能重復(fù),建議通過數(shù)據(jù)庫(kù)sequence生成, $outTradeNo = "barpay" . date('Ymdhis') . mt_rand(100, 1000); $subject = "方倍工作室-支付寶-當(dāng)面付-掃碼支付"; $totalAmount = 0.01; // (必填) 訂單總金額,單位為元,不能超過1億元 // (必填) 付款條碼,用戶支付寶錢包手機(jī)app點(diǎn)擊“付款”產(chǎn)生的付款條碼 $authCode = $_POST['auth_code']; //28開頭18位數(shù)字 // 支付超時(shí),線下掃碼交易定義為5分鐘 $timeExpress = "5m"; // 創(chuàng)建請(qǐng)求builder,設(shè)置請(qǐng)求參數(shù) $barPayRequestBuilder = new AlipayTradePayContentBuilder(); $barPayRequestBuilder->setOutTradeNo($outTradeNo); $barPayRequestBuilder->setTotalAmount($totalAmount); $barPayRequestBuilder->setAuthCode($authCode); $barPayRequestBuilder->setTimeExpress($timeExpress); $barPayRequestBuilder->setSubject($subject); // 調(diào)用barPay方法獲取當(dāng)面付應(yīng)答 $barPay = new AlipayTradeService($config); $barPayResult = $barPay->barPay($barPayRequestBuilder); switch ($barPayResult->getTradeStatus()) { case "SUCCESS": echo "支付寶支付成功:" . "<br>--------------------------<br>"; print_r($barPayResult->getResponse()); break; case "FAILED": echo "支付寶支付失敗!!!" . "<br>--------------------------<br>"; if (!empty($barPayResult->getResponse())) { print_r($barPayResult->getResponse()); } break; case "UNKNOWN": echo "系統(tǒng)異常,訂單狀態(tài)未知!!!" . "<br>--------------------------<br>"; if (!empty($barPayResult->getResponse())) { print_r($barPayResult->getResponse()); } break; default: echo "不支持的交易狀態(tài),交易返回異常!!!"; break; } return; }
程序監(jiān)測(cè),最終提交的url如下
發(fā)送的json數(shù)據(jù)如下:
{ "scene":"bar_code", "out_trade_no":"barpay20160826051452680", "total_amount":0.01, "auth_code":"289743098358423535", "timeout_express":"5m", "subject":"方倍工作室-支付寶-當(dāng)面付-掃碼支付" }
接收到的數(shù)據(jù)如下
{ "alipay_trade_pay_response":{ "code":"10000", "msg":"Success", "buyer_logon_id":"118***@qq.com", "buyer_pay_amount":"0.01", "buyer_user_id":"2088002364008751", "fund_bill_list":[ { "amount":"0.01", "fund_channel":"ALIPAYACCOUNT" } ], "gmt_payment":"2016-08-26 17:14:59", "invoice_amount":"0.01", "open_id":"20880044751374809757987911112575", "out_trade_no":"barpay20160826051452680", "point_amount":"0.00", "receipt_amount":"0.01", "total_amount":"0.01", "trade_no":"2016082621001004750244100034" }, "sign":"pEDeMwh6x73t9LmWrZpGnVb1npnKtODw6+8MDUTurNPVWXR1JHT+x3cRt2G4SDNHzxkJTzSpUXjNylsWisRTnQJJzqRP5XMujxmaAHP/d5xXeyWasDag5Cj7yGD7t80buDAsdE4eoqQ6ox7KzJ6LwKcphOX13tI+Ukt1dGCQS5o=" }
2. 掃碼支付
掃碼支付的參數(shù)配置如下
// (必填) 商戶網(wǎng)站訂單系統(tǒng)中唯一訂單號(hào),64個(gè)字符以內(nèi),只能包含字母、數(shù)字、下劃線, // 需保證商戶系統(tǒng)端不能重復(fù),建議通過數(shù)據(jù)庫(kù)sequence生成, $outTradeNo = "qrpay".date('Ymdhis').mt_rand(100,1000); $subject = "方倍工作室-支付寶-當(dāng)面付-掃碼支付"; $totalAmount = "0.01"; // 支付超時(shí),線下掃碼交易定義為5分鐘 $timeExpress = "5m"; // 創(chuàng)建請(qǐng)求builder,設(shè)置請(qǐng)求參數(shù) $qrPayRequestBuilder = new AlipayTradePrecreateContentBuilder(); $qrPayRequestBuilder->setOutTradeNo($outTradeNo); $qrPayRequestBuilder->setTotalAmount($totalAmount); $qrPayRequestBuilder->setTimeExpress($timeExpress); $qrPayRequestBuilder->setSubject($subject); // 調(diào)用qrPay方法獲取當(dāng)面付應(yīng)答 $qrPay = new AlipayTradeService($config); $qrPayResult = $qrPay->qrPay($qrPayRequestBuilder); // 根據(jù)狀態(tài)值進(jìn)行業(yè)務(wù)處理 switch ($qrPayResult->getTradeStatus()){ case "SUCCESS": echo "支付寶創(chuàng)建訂單二維碼成功:"."<br>---------------------------------------<br>"; $response = $qrPayResult->getResponse(); $qrcode = $qrPay->create_erweima($response->qr_code); echo $qrcode; print_r($response); break; case "FAILED": echo "支付寶創(chuàng)建訂單二維碼失敗!!!"."<br>--------------------------<br>"; if(!empty($qrPayResult->getResponse())){ print_r($qrPayResult->getResponse()); } break; case "UNKNOWN": echo "系統(tǒng)異常,狀態(tài)未知!!!"."<br>--------------------------<br>"; if(!empty($qrPayResult->getResponse())){ print_r($qrPayResult->getResponse()); } break; default: echo "不支持的返回狀態(tài),創(chuàng)建訂單二維碼返回異常!!!"; break; }
生成的提交請(qǐng)求URL如下
發(fā)送的json數(shù)據(jù)如下:
{ "out_trade_no":"qrpay20160826053813582", "total_amount":"0.01", "timeout_express":"5m", "subject":"方倍工作室-支付寶-當(dāng)面付-掃碼支付" }
返回的數(shù)據(jù)如下:
{ "alipay_trade_precreate_response":{ "code":"10000", "msg":"Success", "out_trade_no":"qrpay20160826053813582", "qr_code":"https://qr.alipay.com/bax00885xbhszseo9l7p404d" }, "sign":"VfNTGo2WMZ+2CE1L05lNYWtFn4inHXO/tUaBZIBHN4fPlXnCvyc9IhS8S7wa3FYw23G30luEPEHkZWobnfpUjILonmExZVElHv3ylINz+Q2mQ5M8Sb/d61YPvf4Bgy1OvlrT4D3H/i3judmzEDBrOyFN9kB9vSkKaYC+b6L41Zw=" }
其中的https://qr.alipay.com/bax00885xbhszseo9l7p404d 就是二維碼鏈接地址,使用接口將其成二維碼后。
當(dāng)支付寶用戶掃碼的時(shí)候,接口通知將收到如下數(shù)據(jù)
{ "notify_id":"4c2c04c3cc50e978d44212febe7c3f0lse", "seller_email":"pay***@fangbei.org", "notify_type":"trade_status_sync", "sign":"R0iRdYmSQ0+zuSUGLzkutHcR40hoOp+CcKojVBCMa1uji3rqQFe5XeHoJB1nMBCApE3zXPKhXMdLis109ngPbGy+NUEBR7YZjYuR/hXq3WXeYfZ8aiWLvloZHrF7dQWxDho/VHYexaLeqvRi/03m0HxrwhZKUOu1eS9wMgZOlqQ=", "trade_no":"2016082621001004750241229810", "buyer_id":"2088002364008751", "app_id":"2016061501500000", "gmt_create":"2016-08-26 18:20:37", "out_trade_no":"qrpay20160826062009757", "seller_id":"2088421202724253", "notify_time":"2016-08-26 18:20:37", "subject":"方倍工作室-支付寶-當(dāng)面付-掃碼支付", "trade_status":"WAIT_BUYER_PAY", "open_id":"20880044751374809757987911112575", "total_amount":"0.01", "sign_type":"RSA", "buyer_logon_id":"118***@qq.com" }
當(dāng)用戶輸入密碼付款成功之后,將收到如下數(shù)據(jù)
{ "fund_bill_list":"[{"amount":"0.01","fundChannel":"ALIPAYACCOUNT"}]", "subject":"方倍工作室-支付寶-當(dāng)面付-掃碼支付", "trade_no":"2016082621001004750241229810", "gmt_create":"2016-08-26 18:20:37", "notify_type":"trade_status_sync", "total_amount":"0.01", "out_trade_no":"qrpay20160826062009757", "invoice_amount":"0.01", "open_id":"20880044751374809757987911112575", "seller_id":"2088421202724253", "notify_time":"2016-08-26 18:20:50", "trade_status":"TRADE_SUCCESS", "gmt_payment":"2016-08-26 18:20:50", "seller_email":"pay***@fangbei.org", "receipt_amount":"0.01", "buyer_id":"2088002364008751", "app_id":"2016061501500000", "notify_id":"56f97611ee609f46384b188b409e75else", "buyer_logon_id":"118***@qq.com", "sign_type":"RSA", "buyer_pay_amount":"0.01", "sign":"nf/KJryACk0utqlNrnuYMiSnYw6HsxqpJPk2O5MhCZ+wZUVQbrD3sq5POO3GU7LSRoSiUUIO4JEYEL12Ek2+w3lTcLS9WEi60sYowPOcJEYGmVfNZbVR6+k7yO5au2WIkM3MKsxm2XxIB9xPMmRDACGhvqZ2BXUAQujkPk1FT0s=", "point_amount":"0.00" }
3. 訂單查詢
訂單查詢的參數(shù)配置如下
////獲取商戶訂單號(hào) $out_trade_no = trim($_POST['out_trade_no']); //第三方應(yīng)用授權(quán)令牌,商戶授權(quán)系統(tǒng)商開發(fā)模式下使用 $appAuthToken = "";//根據(jù)真實(shí)值填寫 //構(gòu)造查詢業(yè)務(wù)請(qǐng)求參數(shù)對(duì)象 $queryContentBuilder = new AlipayTradeQueryContentBuilder(); $queryContentBuilder->setOutTradeNo($out_trade_no); $queryContentBuilder->setAppAuthToken($appAuthToken); //初始化類對(duì)象,調(diào)用queryTradeResult方法獲取查詢應(yīng)答 $queryResponse = new AlipayTradeService($config); $queryResult = $queryResponse->queryTradeResult($queryContentBuilder); //根據(jù)查詢返回結(jié)果狀態(tài)進(jìn)行業(yè)務(wù)處理 switch ($queryResult->getTradeStatus()){ case "SUCCESS": echo "支付寶查詢交易成功:"."<br>--------------------------<br>"; print_r($queryResult->getResponse()); break; case "FAILED": echo "支付寶查詢交易失敗或者交易已關(guān)閉!!!"."<br>--------------------------<br>"; if(!empty($queryResult->getResponse())){ print_r($queryResult->getResponse()); } break; case "UNKNOWN": echo "系統(tǒng)異常,訂單狀態(tài)未知!!!"."<br>--------------------------<br>"; if(!empty($queryResult->getResponse())){ print_r($queryResult->getResponse()); } break; default: echo "不支持的查詢狀態(tài),交易返回異常!!!"; break; }
最終提交的url如下
發(fā)送的json數(shù)據(jù)如下:
{ "out_trade_no":"qrpay20160826053813582" }
接收到的數(shù)據(jù)如下
{ "alipay_trade_query_response":{ "code":"10000", "msg":"Success", "buyer_logon_id":"118***@qq.com", "buyer_pay_amount":"0.01", "buyer_user_id":"2088002364008751", "fund_bill_list":[ { "amount":"0.01", "fund_channel":"ALIPAYACCOUNT" } ], "invoice_amount":"0.01", "open_id":"20880044751374809757987911112575", "out_trade_no":"qrpay20160826053813582", "point_amount":"0.00", "receipt_amount":"0.01", "send_pay_date":"2016-08-26 17:38:58", "total_amount":"0.01", "trade_no":"2016082621001004750239053830", "trade_status":"TRADE_SUCCESS" }, "sign":"E2MxjdAhW/EqRFNkZgy/Y//dA5Cmb54Hnqa0cjBz+ZcFTULi1lvFms93onP7cpVK/fI7YxbkZTKBPk29o4aeWKXlSYCrT92domAyqahzYCA7/5A3Msc/awALYrFOdWyJJdlncWdFRN9hx52iVRIjxvLJ0hIMVIQqEDavG28HPbo=" }
4. 訂單退款
訂單退款的參數(shù)配置如下
$out_trade_no = trim($_POST['out_trade_no']); $refund_amount = trim($_POST['refund_amount']); $out_request_no = trim($_POST['out_request_no']); //第三方應(yīng)用授權(quán)令牌,商戶授權(quán)系統(tǒng)商開發(fā)模式下使用 $appAuthToken = "";//根據(jù)真實(shí)值填寫 //創(chuàng)建退款請(qǐng)求builder,設(shè)置參數(shù) $refundRequestBuilder = new AlipayTradeRefundContentBuilder(); $refundRequestBuilder->setOutTradeNo($out_trade_no); $refundRequestBuilder->setRefundAmount($refund_amount); $refundRequestBuilder->setOutRequestNo($out_request_no); $refundRequestBuilder->setAppAuthToken($appAuthToken); //初始化類對(duì)象,調(diào)用refund獲取退款應(yīng)答 $refundResponse = new AlipayTradeService($config); $refundResult = $refundResponse->refund($refundRequestBuilder); //根據(jù)交易狀態(tài)進(jìn)行處理 switch ($refundResult->getTradeStatus()){ case "SUCCESS": echo "支付寶退款成功:"."<br>--------------------------<br>"; print_r($refundResult->getResponse()); break; case "FAILED": echo "支付寶退款失敗!!!"."<br>--------------------------<br>"; if(!empty($refundResult->getResponse())){ print_r($refundResult->getResponse()); } break; case "UNKNOWN": echo "系統(tǒng)異常,訂單狀態(tài)未知!!!"."<br>--------------------------<br>"; if(!empty($refundResult->getResponse())){ print_r($refundResult->getResponse()); } break; default: echo "不支持的交易狀態(tài),交易返回異常!!!"; break; }
最終提交的url如下
發(fā)送的json數(shù)據(jù)如下:
{ "out_trade_no":"qrpay20160826053813582", "refund_amount":"0.01", "out_request_no":"1" }
接收到的數(shù)據(jù)如下
{ "alipay_trade_refund_response":{ "code":"10000", "msg":"Success", "buyer_logon_id":"123***@qq.com", "buyer_user_id":"2088002364008751", "fund_change":"Y", "gmt_refund_pay":"2016-08-26 18:47:41", "open_id":"20880044751374809757987911112575", "out_trade_no":"qrpay20160826053813582", "refund_detail_item_list":[ { "amount":"0.01", "fund_channel":"ALIPAYACCOUNT" } ], "refund_fee":"0.01", "send_back_fee":"0.01", "trade_no":"2016082621001004750239053830" }, "sign":"YDNSMpX5y0rQEs0ZbfNxRFVIp8hf0W30OR74cMtwKVPO2BYee6TQC+pbnwESSZ2XSGLozTyy7o+SIa07L+FMhDv/PTt6QX1mVgQv7RhzoDkls0zDRS/5/fy9Oyj01XS1wb8Od/93iNLZDkd2yw9g0He6qGYlpcXutkmwuASd7BM=" }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Yii框架獲取當(dāng)前controlle和action對(duì)應(yīng)id的方法
這篇文章主要介紹了Yii框架獲取當(dāng)前controlle和action對(duì)應(yīng)id的方法,可實(shí)現(xiàn)獲取當(dāng)前controlle或action對(duì)應(yīng)id的功能,是非常實(shí)用的技巧,需要的朋友可以參考下2014-12-12PHP使用GIFEncoder類生成gif動(dòng)態(tài)滾動(dòng)字幕
這篇文章主要介紹了PHP使用GIFEncoder類生成gif動(dòng)態(tài)滾動(dòng)字幕,文字滾動(dòng)分為兩種情況,一種為水平滾動(dòng),一種為垂直滾動(dòng),需要的朋友可以參考下2014-07-07thinkPHP5.0框架整體架構(gòu)總覽【應(yīng)用,模塊,MVC,驅(qū)動(dòng),行為,命名空間等】
這篇文章主要介紹了thinkPHP5.0框架整體架構(gòu),簡(jiǎn)單介紹了thinkPHP5.0的應(yīng)用,模塊,MVC,驅(qū)動(dòng),行為,命名空間等概念與基本用法,需要的朋友可以參考下2017-03-03又一個(gè)PHP實(shí)現(xiàn)的冒泡排序算法分享
這篇文章主要介紹了又一個(gè)PHP實(shí)現(xiàn)的冒泡排序算法分享,標(biāo)題中的又一個(gè)是指本站已經(jīng)有好幾篇冒泡排序算法的文章了,如果這個(gè)沒有滿足你的要求,請(qǐng)看相關(guān)文章里的其他實(shí)現(xiàn)方法吧,需要的朋友可以參考下2014-08-08php實(shí)現(xiàn)zip壓縮文件解壓縮代碼分享(簡(jiǎn)單易懂)
這篇文章主要介紹了php的zip壓縮文件解壓縮實(shí)現(xiàn)代碼,需要的朋友可以參考下2014-05-05幾道坑人的PHP面試題 試試看看你會(huì)不會(huì)也中招
這篇文章主要介紹了幾道坑人的PHP面試題,試試看看你會(huì)不會(huì)也中招,這些題目都用了一些障眼法,需要你有一雙火眼金睛哦,需要的朋友可以參考下2014-08-08codeigniter中測(cè)試通過的分頁(yè)類示例
這篇文章主要介紹了codeigniter中測(cè)試通過的分頁(yè)類示例,需要的朋友可以參考下2014-04-04