W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
本章節(jié)詳細(xì)說明支付寶APP支付服務(wù)器同步、異步的通知參數(shù)說明。
notify_url
,通過POST請求的形式將支付結(jié)果作為參數(shù)通知到商戶系統(tǒng)。支付寶sdk對商戶的請求支付數(shù)據(jù)處理完成后,會將結(jié)果同步反饋給商戶app端。
同步返回的數(shù)據(jù),商戶可以按照下文描述的方式在服務(wù)端驗證,驗證通過后,可以認(rèn)為本次用戶付款成功。有些時候會出現(xiàn)商戶app在支付寶付款階段被關(guān)閉導(dǎo)致無法正確收到同步結(jié)果,此時支付結(jié)果可以完全依賴服務(wù)端的異步通知。
由于同步通知和異步通知都可以作為支付完成的憑證,且異步通知支付寶一定會確保發(fā)送給商戶服務(wù)端。為了簡化集成流程,商戶可以將同步結(jié)果僅僅作為一個支付結(jié)束的通知(忽略執(zhí)行校驗),實際支付是否成功,完全依賴服務(wù)端異步通知。
對于iOS平臺而言返回參數(shù)是一個NSDictionary
對象,對于Android平臺而言是一個map結(jié)構(gòu)體。里面有三個key
,其中memo是描述信息(類型為字符串);result
是處理結(jié)果(類型為json結(jié)構(gòu)字符串);resultStatus
是結(jié)果碼(類型為字符串)。
{
"memo" : "xxxxx",
"result" : "{
\"alipay_trade_app_pay_response\":{
\"code\":\"10000\",
\"msg\":\"Success\",
\"app_id\":\"2014072300007148\",
\"out_trade_no\":\"081622560194853\",
\"trade_no\":\"2016081621001004400236957647\",
\"total_amount\":\"0.01\",
\"seller_id\":\"2088702849871851\",
\"charset\":\"utf-8\",
\"timestamp\":\"2016-10-11 17:43:36\"
},
\"sign\":\"NGfStJf3i3ooWBuCDIQSumOpaGBcQz+aoAqyGh3W6EqA/gmyPYwLJ2REFijY9XPTApI9YglZyMw+ZMhd3kb0mh4RAXMrb6mekX4Zu8Nf6geOwIa9kLOnw0IMCjxi4abDIfXhxrXyj********\",
\"sign_type\":\"RSA2\"
}",
"resultStatus" : "9000"
}
參數(shù) | 類型 | 是否必填 | 最大長度 | 描述 | 示例值 |
---|---|---|---|---|---|
out_trade_no | String | 是 | 64 | 商戶網(wǎng)站唯一訂單號 | 70501111111S001111119 |
trade_no | String | 是 | 64 | 該交易在支付寶系統(tǒng)中的交易流水號。最長64位。 | 2014112400001000340011111118 |
app_id | String | 是 | 32 | 支付寶分配給開發(fā)者的應(yīng)用Id。 | 2014072300007148 |
total_amount | Price | 是 | 9 | 該筆訂單的資金總額,單位為RMB-Yuan。取值范圍為[0.01,100000000.00],精確到小數(shù)點后兩位。 | 9.00 |
seller_id | String | 是 | 16 | 收款支付寶賬號對應(yīng)的支付寶唯一用戶號。以2088開頭的純16位數(shù)字 | 2088111111116894 |
msg | String | 是 | 16 | 處理結(jié)果的描述,信息來自于code返回結(jié)果的描述 | success |
charset | String | 是 | 16 | 編碼格式 | utf-8 |
timestamp | String | 是 | 32 | 時間 | 2016-10-11 17:43:36 |
code | String | 是 | 16 | 結(jié)果碼 | 具體見 |
返回碼 | 含義 |
---|---|
9000 | 訂單支付成功 |
8000 | 正在處理中,支付結(jié)果未知(有可能已經(jīng)支付成功),請查詢商戶訂單列表中訂單的支付狀態(tài) |
4000 | 訂單支付失敗 |
5000 | 重復(fù)請求 |
6001 | 用戶中途取消 |
6002 | 網(wǎng)絡(luò)連接出錯 |
6004 | 支付結(jié)果未知(有可能已經(jīng)支付成功),請查詢商戶訂單列表中訂單的支付狀態(tài) |
其它 | 其它支付錯誤 |
為了幫助開發(fā)者調(diào)用開放接口,我們提供了開放平臺服務(wù)端DEMO&SDK,包含JAVA、PHP和.NET三語言版本,封裝了簽名&驗簽、HTTP接口請求等基礎(chǔ)功能。強烈建議先下載對應(yīng)語言版本的SDK并引入您的開發(fā)工程進行快速接入。
在返回數(shù)據(jù)resultStatus
為9000
的情況下,解析result
結(jié)果,提取驗證簽名的相關(guān)核心數(shù)據(jù):
第一步: 提取alipay_trade_app_pay_response
字段值,其代表簽名原始字符串,上述示例格式如下:
{"code":"10000","msg":"Success","total_amount":"9.00","app_id":"2014072300007148","trade_no":"2014112400001000340011111118","seller_id":"2088111111116894","out_trade_no":"70501111111S001111119"}
第二步: 提取sign_type
字段值,其代表簽名類型,上述示例格式如下:
RSA2
第三步: 提取sign字段值,其代表簽名結(jié)果,上述示例格式如下:
NGfStJf3i3ooWBuCDIQSumOpaGBcQz+aoAqyGh3W6EqA/gmyPYwLJ2REFijY9XPTApI9YglZyMw+ZMhd3kb0mh4RAXMrb6mekX4Zu8Nf6geOwIa9kLOnw0IMCjxi4abDIfXhxrXyj**** 第四步: 驗證簽名是否合法:
使用各自語言對應(yīng)的SHA256WithRSA
簽名驗證函數(shù),傳入簽名的原始字符串、支付寶公鑰、簽名類型RSA、簽名字符進行合法性驗證。
第五步: 在第四步簽名驗證通過后,必須嚴(yán)格按照如下的描述校驗通知參數(shù)的合法性:
out_trade_no
是否為商戶系統(tǒng)中創(chuàng)建的訂單號;total_amount
是否確實為該訂單的實際金額(即商戶訂單創(chuàng)建時的金額);seller_id
(或者seller_email
) 是否為out_trade_no
這筆單據(jù)對應(yīng)的操作方(有的時候,一個商戶可能有多個seller_id/seller_email
);app_id
是否為該商戶本身。上述1、2、3、4有任何一個驗證不通過,則表明同步校驗結(jié)果是無效的,只有全部驗證通過后,才可以認(rèn)定買家付款成功。
對于App支付產(chǎn)生的交易,支付寶會根據(jù)原始支付API中傳入的異步通知地址notify_url
,通過POST請求的形式將支付結(jié)果作為參數(shù)通知到商戶系統(tǒng)。
參數(shù) | 參數(shù)名稱 | 類型 | 必填 | 描述 | 范例 | |
---|---|---|---|---|---|---|
notify_time | 通知時間 | Date | 是 | 通知的發(fā)送時間。格式為yyyy-MM-dd HH:mm:ss | 2015-14-27 15:45:58 | |
notify_type | 通知類型 | String(64) | 是 | 通知的類型 | trade_status_sync | |
notify_id | 通知校驗ID | String(128) | 是 | 通知校驗ID | ac05099524730693a8b330c5ecf72da9786 | |
app_id | 支付寶分配給開發(fā)者的應(yīng)用Id | String(32) | 是 | 支付寶分配給開發(fā)者的應(yīng)用Id | 2014072300007148 | |
charset | 編碼格式 | String(10) | 是 | 編碼格式,如utf-8、gbk、gb2312等 | ||
utf-8 | version | 接口版本 | String(3) | 是 | 調(diào)用的接口版本,固定為:1.0 | 1.0 |
sign_type | 簽名類型 | String(10) | 是 | 商戶生成簽名字符串所使用的簽名算法類型,目前支持RSA2和RSA,推薦使用RSA2 | RSA2 | |
sign | 簽名 | String(256) | 是 | 請參考異步返回結(jié)果的驗簽 | 601510b7970e52cc63db0f44997cf70e | |
trade_no | 支付寶交易號 | String(64) | 是 | 支付寶交易憑證號 | 2013112011001004330000121536 | |
out_trade_no | 商戶訂單號 | String(64) | 是 | 原支付請求的商戶訂單號 | 6823789339978248 | |
out_biz_no | 商戶業(yè)務(wù)號 | String(64) | 否 | 商戶業(yè)務(wù)ID,主要是退款通知中返回退款申請的流水號 | HZRF001 | |
buyer_id | 買家支付寶用戶號 | String(16) | 否 | 買家支付寶賬號對應(yīng)的支付寶唯一用戶號。以2088開頭的純16位數(shù)字 | 2088102122524333 | |
buyer_logon_id | 買家支付寶賬號 | String(100) | 否 | 買家支付寶賬號 | 15901825620 | |
seller_id | 賣家支付寶用戶號 | String(30) | 否 | 賣家支付寶用戶號 | 2088101106499364 | |
seller_email | 賣家支付寶賬號 | String(100) | 否 | 賣家支付寶賬號 | zhuzhanghu@alitest.com | |
trade_status | 交易狀態(tài) | String(32) | 否 | 交易目前所處的狀態(tài),見交易狀態(tài)說明 | TRADE_CLOSED | |
total_amount | 訂單金額 | Number(9,2) | 否 | 本次交易支付的訂單金額,單位為人民幣(元) | 20 | |
receipt_amount | 實收金額 | Number(9,2) | 否 | 商家在交易中實際收到的款項,單位為元 | 15 | |
invoice_amount | 開票金額 | Number(9,2) | 否 | 用戶在交易中支付的可開發(fā)票的金額 | 10.00 | |
buyer_pay_amount | 付款金額 | Number(9,2) | 否 | 用戶在交易中支付的金額 | 13.88 | |
point_amount | 集分寶金額 | Number(9,2) | 否 | 使用集分寶支付的金額 | 12.00 | |
refund_fee | 總退款金額 | Number(9,2) | 否 | 退款通知中,返回總退款金額,單位為元,支持兩位小數(shù) | 2.58 | |
subject | 訂單標(biāo)題 | String(256) | 否 | 商品的標(biāo)題/交易標(biāo)題/訂單標(biāo)題/訂單關(guān)鍵字等,是請求時對應(yīng)的參數(shù),原樣通知回來 | 當(dāng)面付交易 | |
body | 商品描述 | String(400) | 否 | 該訂單的備注、描述、明細(xì)等。對應(yīng)請求時的body參數(shù),原樣通知回來 | 當(dāng)面付交易內(nèi)容 | |
gmt_create | 交易創(chuàng)建時間 | Date | 否 | 該筆交易創(chuàng)建的時間。格式為yyyy-MM-dd HH:mm:ss | 2015-04-27 15:45:57 | |
gmt_payment | 交易付款時間 | Date | 否 | 該筆交易的買家付款時間。格式為yyyy-MM-dd HH:mm:ss | 2015-04-27 15:45:57 | |
gmt_refund | 交易退款時間 | Date | 否 | 該筆交易的退款時間。格式為yyyy-MM-dd HH:mm:ss.S | 2015-04-28 15:45:57.320 | |
gmt_close | 交易結(jié)束時間 | Date | 否 | 該筆交易結(jié)束時間。格式為yyyy-MM-dd HH:mm:ss | 2015-04-29 15:45:57 | |
fund_bill_list | 支付金額信息 | String(512) | 否 | 支付成功的各個渠道金額信息,詳見資金明細(xì)信息說明 | [{“amount”:“15.00”,“fundChannel”:“ALIPAYACCOUNT”}] | |
passback_params | 回傳參數(shù) | String(512) | 否 | 公共回傳參數(shù),如果請求時傳遞了該參數(shù),則返回給商戶時會在異步通知時將該參數(shù)原樣返回。本參數(shù)必須進行UrlEncode之后才可以發(fā)送給支付寶 | merchantBizType%3d3C%26merchantBizNo%3d2016010101111 | |
voucher_detail_list | 優(yōu)惠券信息 | String | 否 | 本交易支付時所使用的所有優(yōu)惠券信息,詳見優(yōu)惠券信息說明 | [{“amount”:“0.20”,“merchantContribute”:“0.00”,“name”:“一鍵創(chuàng)建券模板的券名稱”,“otherContribute”:“0.20”,“type”:“ALIPAY_DISCOUNT_VOUCHER”,“memo”:“學(xué)生卡8折優(yōu)惠”] |
枚舉名稱 | 枚舉說明 |
---|---|
WAIT_BUYER_PAY | 交易創(chuàng)建,等待買家付款 |
TRADE_CLOSED | 未付款交易超時關(guān)閉,或支付完成后全額退款 |
TRADE_SUCCESS | 交易支付成功 |
TRADE_FINISHED | 交易結(jié)束,不可退款 |
觸發(fā)條件名 | 觸發(fā)條件描述 | 觸發(fā)條件默認(rèn)值 |
---|---|---|
TRADE_FINISHED | 交易完成 | true(觸發(fā)通知) |
TRADE_SUCCESS | 支付成功 | true(觸發(fā)通知) |
WAIT_BUYER_PAY | 交易創(chuàng)建 | false(不觸發(fā)通知) |
TRADE_CLOSED | 交易關(guān)閉 | true(觸發(fā)通知) |
參數(shù) | 參數(shù)名稱 | 類型 | 參數(shù)說明 | 是否可為空 | 樣例 |
---|---|---|---|---|---|
fundChannel | 支付渠道 | String | 支付渠道,參見下面的“支付渠道說明”。 | 可空 | ALIPAYACCOUNT |
amount | 支付金額 | String | 使用指定支付渠道支付的金額,單位為元。 | 可空 | 15.00 |
支付渠道代碼 | 支付渠道 |
---|---|
COUPON | 支付寶紅包 |
ALIPAYACCOUNT | 支付寶余額 |
POINT | 集分寶 |
DISCOUNT | 折扣券 |
PCARD | 預(yù)付卡 |
FINANCEACCOUNT | 余額寶 |
MCARD | 商家儲值卡 |
MDISCOUNT | 商戶優(yōu)惠券 |
MCOUPON | 商戶紅包 |
PCREDIT | 螞蟻花唄 |
參數(shù) | 參數(shù)名稱 | 類型 | 必填 | 描述 | 范例 |
---|---|---|---|---|---|
name | 券名稱 | String(64) | 是 | 券名稱 | XX超市5折券 |
type | 券類型 | String(32) | 是 | 券類型,當(dāng)前支持三種類型:ALIPAY_FIX_VOUCHER - 全場代金券ALIPAY_DISCOUNT_VOUCHER - 折扣券ALIPAY_ITEM_VOUCHER - 單品優(yōu)惠注:不排除將來新增其他類型的可能,商家接入時請注意兼容性,避免硬編碼 | ALIPAY_FIX_VOUCHER |
amount | 優(yōu)惠券面額 | Number(9,2) | 是 | 優(yōu)惠券面額,它應(yīng)該等于商家出資加上其他出資方出資 | 10.00 |
merchant_contribute | 商家出資 | Number(9,2) | 否 | 商家出資(特指發(fā)起交易的商家出資金額) | 9.00 |
other_contribute | 其他出資方出資金額 | Number(9,2) | 否 | 其他出資方出資金額,可能是支付寶,可能是品牌商,或者其他方,也可能是他們的共同出資 | 1.00 |
memo | 優(yōu)惠券備注信息 | String(256) | 否 | 優(yōu)惠券備注信息 | 學(xué)生專用優(yōu)惠 |
notify_url
)上無任何字符,如空格、HTML標(biāo)簽、開發(fā)系統(tǒng)自帶拋出的異常提示信息等;為了幫助開發(fā)者調(diào)用開放接口,我們提供了開放平臺服務(wù)端DEMO&SDK,包含JAVA、PHP和.NET三語言版本,封裝了簽名&驗簽、HTTP接口請求等基礎(chǔ)功能。強烈建議先下載對應(yīng)語言版本的SDK并引入您的開發(fā)工程進行快速接入。
某商戶設(shè)置的通知地址為https://api.xx.com/receive_notify.htm,對應(yīng)接收到通知的示例如下: 注:以下示例報文僅供參考,實際返回的詳細(xì)報文請以實際返回為準(zhǔn)。
https://api.xx.com/receive_notify.htm?total_amount=2.00&buyer_id=2088102116773037&body=大樂透2.1&trade_no=2016071921001003030200089909&refund_fee=0.00¬ify_time=2016-07-19 14:10:49&subject=大樂透2.1&sign_type=RSA2&charset=utf-8¬ify_type=trade_status_sync&out_trade_no=0719141034-6418&gmt_close=2016-07-19 14:10:46&gmt_payment=2016-07-19 14:10:47&trade_status=TRADE_SUCCESS&version=1.0&sign=kPbQIjX+xQc8F0/A6/AocELIjhhZnGbcBN6G4MM/HmfWL4ZiHM6fWl5NQhzXJusaklZ1LFuMo+lHQUELAYeugH8LYFvxnNajOvZhuxNFbN2LhF0l/KL8ANtj8oyPM4NN7Qft2kWJTDJUpQOzCzNnV9hDxh5AaT9FPqRS6ZKxnzM=&gmt_create=2016-07-19 14:10:44&app_id=2015102700040153&seller_id=2088102119685838¬ify_id=4a91b7a78a503640467525113fb7d8bg8e
第一步: 在通知返回參數(shù)列表中,除去sign
、sign_type
兩個參數(shù)外,凡是通知返回回來的參數(shù)皆是待驗簽的參數(shù)。
第二步: 將剩下參數(shù)進行url_decode
, 然后進行字典排序,組成字符串,得到待簽名字符串:
app_id=2015102700040153&body=大樂透2.1&buyer_id=2088102116773037&charset=utf-8&gmt_close=2016-07-19 14:10:46&gmt_payment=2016-07-19 14:10:47¬ify_id=4a91b7a78a503640467525113fb7d8bg8e¬ify_time=2016-07-19 14:10:49¬ify_type=trade_status_sync&out_trade_no=0719141034-6418&refund_fee=0.00&seller_id=2088102119685838&subject=大樂透2.1&total_amount=2.00&trade_no=2016071921001003030200089909&trade_status=TRADE_SUCCESS&version=1.0
第三步: 將簽名參數(shù)(sign)使用base64解碼為字節(jié)碼串。
第四步: 使用RSA的驗簽方法,通過簽名字符串、簽名參數(shù)(經(jīng)過base64解碼)及支付寶公鑰驗證簽名。
第五步:在步驟四驗證簽名正確后,必須再嚴(yán)格按照如下描述校驗通知數(shù)據(jù)的正確性。
out_trade_no
是否為商戶系統(tǒng)中創(chuàng)建的訂單號,total_amount
是否確實為該訂單的實際金額(即商戶訂單創(chuàng)建時的金額),seller_id
(或者seller_email
) 是否為out_trade_no
這筆單據(jù)的對應(yīng)的操作方(有的時候,一個商戶可能有多個seller_id/seller_email
),app_id
是否為該商戶本身。
上述1、2、3、4有任何一個驗證不通過,則表明本次通知是異常通知,務(wù)必忽略。在上述驗證通過后商戶必須根據(jù)支付寶不同類型的業(yè)務(wù)通知,正確的進行不同的業(yè)務(wù)處理,并且過濾重復(fù)的通知結(jié)果數(shù)據(jù)。在支付寶的業(yè)務(wù)通知中,只有交易通知狀態(tài)為TRADE_SUCCESS
或TRADE_FINISHED
時,支付寶才會認(rèn)定為買家付款成功。
驗簽過程代碼描述【這里列舉java示例,按照服務(wù)端SDK中提供的工具類】:
Map<String, String> paramsMap = ... //將異步通知中收到的待驗證所有參數(shù)都存放到map中
boolean signVerified = AlipaySignature.rsaCheckV1(paramsMap, ALIPAY_PUBLIC_KEY, CHARSET) //調(diào)用SDK驗證簽名
if(signVerfied){
// TODO 驗簽成功后
//按照支付結(jié)果異步通知中的描述,對支付結(jié)果中的業(yè)務(wù)內(nèi)容進行1\2\3\4二次校驗,校驗成功后在response中返回success,校驗失敗返回failure
}else{
// TODO 驗簽失敗則記錄異常日志,并在response中返回failure.
}
注意:
TRADE_SUCCESS
的通知觸發(fā)條件是商戶簽約的產(chǎn)品支持退款功能的前提下,買家付款成功;TRADE_FINISHED
的通知觸發(fā)條件是商戶簽約的產(chǎn)品不支持退款功能的前提下,買家付款成功;或者,商戶簽約的產(chǎn)品支持退款功能的前提下,交易已經(jīng)成功并且已經(jīng)超過可退款期限。Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: