天天看點

支付寶手機網站接入2-支付結果異步通知

對于手機網站支付産生的交易,支付寶會根據原始支付API中傳入的異步通知位址notify_url,通過POST請求的形式将支付結果作為參數通知到商戶系統。

異步通知參數

參數 參數名稱 類型 必填 描述 範例
notify_time 通知時間 Date 通知的發送時間。格式為yyyy-MM-dd HH:mm:ss 2015-14-27 15:45:58
notify_type 通知類型 String(64) 通知的類型 trade_status_sync
notify_id 通知校驗ID String(128) ac05099524730693a8b330c5ecf72da9786
app_id 開發者的app_id String(32) 支付寶配置設定給開發者的應用Id 2014072300007148
charset 編碼格式 String(10) 編碼格式,如utf-8、gbk、gb2312等 utf-8
version 接口版本 String(3) 調用的接口版本,固定為:1.0 1.0
sign_type 簽名類型 商戶生成簽名字元串所使用的簽名算法類型,目前支援RSA2和RSA,推薦使用RSA2 RSA2
sign 簽名 String(256) 請參考異步傳回結果的驗簽 601510b7970e52cc63db0f44997cf70e
trade_no 支付寶交易号 支付寶交易憑證号 2013112011001004330000121536
out_trade_no 商戶訂單号 原支付請求的商戶訂單号 6823789339978248
out_biz_no 商戶業務号 商戶業務ID,主要是退款通知中傳回退款申請的流水号 HZRF001
buyer_id 買家支付寶使用者号 String(16) 買家支付寶賬号對應的支付寶唯一使用者号。以2088開頭的純16位數字 2088102122524333
buyer_logon_id 買家支付寶賬号 String(100) 15901825620
seller_id 賣家支付寶使用者号 String(30) 2088101106499364
seller_email 賣家支付寶賬号 [email protected]
trade_status 交易狀态 交易目前所處的狀态,見交易狀态說明 TRADE_CLOSED
total_amount 訂單金額 Number(9,2) 本次交易支付的訂單金額,機關為人民币(元) 20
receipt_amount 實收金額 商家在交易中實際收到的款項,機關為元 15
invoice_amount 開票金額 使用者在交易中支付的可開發票的金額 10.00
buyer_pay_amount 付款金額 使用者在交易中支付的金額 13.88
point_amount 集分寶金額 使用集分寶支付的金額 12.00
refund_fee 總退款金額 退款通知中,傳回總退款金額,機關為元,支援兩位小數 2.58
subject 訂單标題 商品的标題/交易标題/訂單标題/訂單關鍵字等,是請求時對應的參數,原樣通知回來 當面付交易
body 商品描述 String(400) 該訂單的備注、描述、明細等。對應請求時的body參數,原樣通知回來 當面付交易内容
gmt_create 交易建立時間 該筆交易建立的時間。格式為yyyy-MM-dd HH:mm:ss 2015-04-27 15:45:57
gmt_payment 交易付款時間 該筆交易的買家付款時間。格式為yyyy-MM-dd HH:mm:ss
gmt_refund 交易退款時間 該筆交易的退款時間。格式為yyyy-MM-dd HH:mm:ss.S 2015-04-28 15:45:57.320
gmt_close 交易結束時間 該筆交易結束時間。格式為yyyy-MM-dd HH:mm:ss 2015-04-29 15:45:57
fund_bill_list 支付金額資訊 String(512) 支付成功的各個管道金額資訊,詳見資金明細資訊說明 [{“amount”:“15.00”,“fundChannel”:“ALIPAYACCOUNT”}]
passback_params 回傳參數 公共回傳參數,如果請求時傳遞了該參數,則傳回給商戶時會在異步通知時将該參數原樣傳回。本參數必須進行UrlEncode之後才可以發送給支付寶 merchantBizType%3d3C%26merchantBizNo%3d2016010101111
voucher_detail_list 優惠券資訊 String 本交易支付時所使用的所有優惠券資訊,詳見優惠券資訊說明 [{“amount”:“0.20”,“merchantContribute”:“0.00”,“name”:“一鍵建立券模闆的券名稱”,“otherContribute”:“0.20”,“type”:“ALIPAY_DISCOUNT_VOUCHER”,“memo”:“學生卡8折優惠”]

交易狀态說明

枚舉名稱 枚舉說明
WAIT_BUYER_PAY 交易建立,等待買家付款
未付款交易逾時關閉,或支付完成後全額退款
TRADE_SUCCESS 交易支付成功
TRADE_FINISHED 交易結束,不可退款

通知觸發條件

觸發條件名 觸發條件描述 觸發條件預設值
交易完成 false(不觸發通知)
支付成功 true(觸發通知)
交易建立
交易關閉

資金明細資訊說明

參數說明 是否可為空 樣例
fundChannel 支付管道 支付管道,參見下面的“支付管道說明”。 可空 ALIPAYACCOUNT
amount 支付金額 使用指定支付管道支付的金額,機關為元。

支付管道說明

支付管道代碼
COUPON 支付寶紅包
支付寶餘額
POINT 集分寶
DISCOUNT 折扣券
PCARD 預付卡
FINANCEACCOUNT 餘額寶
MCARD 商家儲值卡
MDISCOUNT 商戶優惠券
MCOUPON 商戶紅包
PCREDIT 螞蟻花呗

優惠券資訊說明

name 券名稱 XX超市5折券
type 券類型

券類型,目前支援三種類型:

ALIPAY_FIX_VOUCHER - 全場代金券

ALIPAY_DISCOUNT_VOUCHER - 折扣券

ALIPAY_ITEM_VOUCHER - 單品優惠

注:不排除将來新增其他類型的可能,商家接入時請注意相容性,避免寫死

ALIPAY_FIX_VOUCHER
優惠券面額 優惠券面額,它應該等于商家出資加上其他出資方出資
merchant_contribute 商家出資 商家出資(特指發起交易的商家出資金額) 9.00
other_contribute 其他出資方出資金額 其他出資方出資金額,可能是支付寶,可能是品牌商,或者其他方,也可能是他們的共同出資
memo 優惠券備注資訊 學生專用優惠

伺服器異步通知頁面特性

  • 必須保證伺服器異步通知頁面(notify_url)上無任何字元,如空格、HTML标簽、開發系統自帶抛出的異常提示資訊等;
  • 支付寶是用POST方式發送通知資訊,是以該頁面中擷取參數的方式,如:request.Form(“out_trade_no”)、$_POST[‘out_trade_no’];
  • 支付寶主動發起通知,該方式才會被啟用;
  • 隻有在支付寶的交易管理中存在該筆交易,且發生了交易狀态的改變,支付寶才會通過該方式發起伺服器通知(即時到賬交易狀态為“等待買家付款”的狀态預設是不會發送通知的);
  • 伺服器間的互動,不像頁面跳轉同步通知可以在頁面上顯示出來,這種互動方式是不可見的;
  • 第一次交易狀态改變(即時到賬中此時交易狀态是交易完成)時,不僅會傳回同步處理結果,而且伺服器異步通知頁面也會收到支付寶發來的處理結果通知;
  • 程式執行完後必須列印輸出“success”(不包含引号)。如果商戶回報給支付寶的字元不是success這7個字元,支付寶伺服器會不斷重發通知,直到超過24小時22分鐘。一般情況下,25小時以内完成8次通知(通知的間隔頻率一般是:4m,10m,10m,1h,2h,6h,15h);
  • 程式執行完成後,該頁面不能執行頁面跳轉。如果執行頁面跳轉,支付寶會收不到success字元,會被支付寶伺服器判定為該頁面程式運作出現異常,而重發處理結果通知;
  • cookies、session等在此頁面會失效,即無法擷取這些資料;
  • 該方式的調試與運作必須在伺服器上,即網際網路上能通路;
  • 該方式的作用主要防止訂單丢失,即頁面跳轉同步通知沒有處理訂單更新,它則去處理;
  • 當商戶收到伺服器異步通知并列印出success時,伺服器異步通知參數notify_id才會失效。也就是說在支付寶發送同一條異步通知時(包含商戶并未成功列印出success導緻支付寶重發數次通知),伺服器異步通知參數notify_id是不變的。

異步傳回結果的驗簽

某商戶設定的通知位址為https://api.xx.com/receive_notify.htm,對應接收到通知的示例如下:

https:

//api.xx.com/receive_notify.htm?total_amount=2.00&buyer_id=2088102116773037&body=大樂透2.1&trade_no=2016071921001003030200089909&refund_fee=0.00&notify_time=2016-07-19 14:10:49&subject=大樂透2.1&sign_type=RSA2&charset=utf-8&notify_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&notify_id=4a91b7a78a503640467525113fb7d8bg8e

第一步: 在通知傳回參數清單中,除去sign、sign_type兩個參數外,凡是通知傳回回來的參數皆是待驗簽的參數。

第二步: 将剩下參數進行url_decode, 然後進行字典排序,組成字元串,得到待簽名字元串:

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

&notify_time=

2016

-

07

-

19

14

:

10

:

49

&notify_type=trade_status_sync&out_trade_no=

0719141034

-

6418

&refund_fee=

0.00

&subject=大樂透

2.1

&total_amount=

2.00

&trade_no=

2016071921001003030200089909

&trade_status=TRADE_SUCCESS&version=

1.0

第三步: 将簽名參數(sign)使用base64解碼為位元組碼串。

第四步: 使用RSA的驗簽方法,通過簽名字元串、簽名參數(經過base64解碼)及支付寶公鑰驗證簽名。

    • 狀态TRADE_SUCCESS的通知觸發條件是商戶簽約的産品支援退款功能的前提下,買家付款成功;
    • 交易狀态TRADE_FINISHED的通知觸發條件是商戶簽約的産品不支援退款功能的前提下,買家付款成功;或者,商戶簽約的産品支援退款功能的前提下,交易已經成功并且已經超過可退款期限。

繼續閱讀