支付寶是用 POST 方式發送通知信息,只有在支付寶的交易管理中存在該筆交易,且發生了交易狀態的改變,支付寶才會通過該方式發起服務器通知(即時到賬交易狀態為 等待買家付款 的狀態默認是不會發送通知的)
程序執行完后必須打印輸出 success。如果商戶反饋給支付寶的字符不是 success 這 7 個字符,支付寶服務器會不斷重發通知,直到超過 24 小時22 分鐘。一般情況下,25 小時以內完成 8 次通知(通知的間隔頻率一般是:4 m、10 m、10 m、1 h、2 h、6 h、15 h)。
當商戶收到服務器異步通知并打印出 success 時,服務器異步通知參數 notify_id 才會失效。也就是說在支付寶發送同一條異步通知時(包含商戶并未成功打印出 success 導致支付寶重發數次通知),服務器異步通知參數 notify_id 是不變的。
相關參數說明及代碼
參數 參數名稱 類型 必填 描述 范例
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) 是 通知校驗 ID ac05099524730693a8b330c5ecf72da9786
app_id 支付寶分配給開發者的應用Id String(32) 是 支付寶分配給開發者的應用 Id。 2.01407E+15
charset 編碼格式 String(10) 是 編碼格式,如 utf-8、gbk、gb2312 等。 utf-8
version 接口版本 String(3) 是 調用的接口版本, 固定為:1.0。 1
sign_type 簽名類型 String(10) 是 商戶生成簽名字符串所使用的簽名算法類型,目前支 RSA2 和 RSA,推薦使用 RSA2。 RSA2
sign 簽名 String(256) 是 請參考?異步返回結果的驗簽。 601510b7970e52cc63db0f44997cf70e
trade_no 支付寶交易號 String(64) 是 支付寶交易憑證號。 2.01311E+27
out_trade_no 商戶訂單號 String(64) 是 原支付請求的商戶訂單號。 6.82379E+15
out_biz_no 商戶業務號 String(64) 否 商戶業務 ID,主要是退款通知中返回退款申請的流水號。 HZRF001
buyer_id 買家支付寶用戶號 String(16) 否 買家支付寶賬號對應的支付寶唯一用戶號。 以 2088 開頭的純 16 位數字。 2.0881E+15
buyer_logon_id 買家支付寶賬號 String(100) 否 買家支付寶賬號。 15901825620
seller_id 賣家支付寶用戶號 String(30) 否 賣家支付寶用戶號。 2.0881E+15
seller_email 賣家支付寶賬號 String(100) 否 賣家支付寶賬號。 zhuzhanghu@alitest.com
trade_status 交易狀態 String(32) 否 交易目前所處的狀態,見下張表?交易狀態說明。 TRADE_CLOSED
total_amount 訂單金額 "Number(9,2)" 否 本次交易支付的訂單金額,單位為人民幣(元)。 20
receipt_amount 實收金額 "Number(9,2)" 否 商家在交易中實際收到的款項,單位為人民幣(元)。 15
invoice_amount 開票金額 "Number(9,2)" 否 用戶在交易中支付的可開發票的金額。 10
buyer_pay_amount 付款金額 "Number(9,2)" 否 用戶在交易中支付的金額。 13.88
point_amount 集分寶金額 "Number(9,2)" 否 使用集分寶支付的金額。 12
refund_fee 總退款金額 "Number(9,2)" 否 退款通知中,返回總退款金額,單位為元,支持兩位小數。 2.58
subject 訂單標題 String(256) 否 商品的標題/交易標題/訂單標題/訂單關鍵字等,是請求時對應的參數,原樣通知回來。 當面付交易
body 商品描述 String(400) 否 該訂單的備注、描述、明細等。對應請求時的 body 參數,原樣通知回來。 當面付交易內容
gmt_create 交易創建時間 Date 否 該筆交易創建的時間。格式為 yyyy-MM-dd HH:mm:ss。 2015/4/27 15:45
gmt_payment 交易付款時間 Date 否 該筆交易的買家付款時間。格式為 yyyy-MM-dd HH:mm:ss。 2015/4/27 15:45
gmt_refund 交易退款時間 Date 否 該筆交易的退款時間。格式為 yyyy-MM-dd HH:mm:ss。 45:57.3
gmt_close 交易結束時間 Date 否 該筆交易結束時間。格式為 yyyy-MM-dd HH:mm:ss。。 2015/4/29 15:45
fund_bill_list 支付金額信息 String(512) 否 支付成功的各個渠道金額信息,詳見下表?資金明細信息說明。 "[{“amount”:“15.00”,“fundChannel”:“ALIPAYACCOUNT”}]"
passback_params 回傳參數 String(512) 否 公共回傳參數,如果請求時傳遞了該參數,則返回給商戶時會在異步通知時將該參數原樣返回。本參數必須進行 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_CLOSED 未付款交易超時關閉,或支付完成后全額退款。
TRADE_SUCCESS 交易支付成功。
TRADE_FINISHED 交易結束,不可退款。
通知觸發條件
觸發條件名 觸發條件描述 觸發條件默認值
TRADE_FINISHED 交易完成 true(觸發通知)
TRADE_SUCCESS 支付成功 true(觸發通知)
WAIT_BUYER_PAY 交易創建 false(不觸發通知)
TRADE_CLOSED 交易關閉 true(觸發通知)
資金明細信息說明
參數 參數名稱 類型 參數說明 是否可為空 樣例
fundChannel 支付渠道 String 支付渠道,參見 支付渠道說明。 可空 ALIPAYACCOUNT
amount 支付金額 String 使用指定支付渠道支付的金額,單位為元。 可空 15.00
支付渠道代碼 支付渠道
COUPON 支付寶紅包
ALIPAYACCOUNT 支付寶余額
POINT 集分寶
DISCOUNT 折扣券
PCARD 預付卡
FINANCEACCOUNT 余額寶
MCARD 商家儲值卡
MDISCOUNT 商戶優惠券
MCOUPON 商戶紅包
PCREDIT 螞蟻花唄
優惠券信息說明
參數 參數名稱 類型 必填 描述 范例
name 券名稱 String(64) 是 券名稱。 XX超市5折券
type 券類型 String(32) 是 券類型,當前支持三種類型:ALIPAY_FIX_VOUCHER - 全場代金券 ALIPAY_DISCOUNT_VOUCHER - 折扣券 ALIPAY_ITEM_VOUCHER - 單品優惠注:不排除將來新增其他類型的可能,商家接入時請注意兼容性,避免硬編碼。 ALIPAY_FIX_VOUCHER
amount 優惠券面額 Number(9,2) 是 優惠券面額,它應該等于商家出資加上其他出資方出資。 10.00
merchant_contribute 商家出資 Number(9,2) 否 商家出資(特指發起交易的商家出資金額)。 9.00
other_contribute 其他出資方出資金額 Number(9,2) 否 其他出資方出資金額,可能是支付寶,可能是品牌商,或者其他方,也可能是他們的共同出資。 1.00
memo 優惠券備注信息 String(256) 否 優惠券備注信息。 學生專用優惠

支付寶app接入異步回調
1 class AliPayNotify(tornado.web.RequestHandler):
2 def post(self):
3 def check_pay(params): # 定義檢查支付結果的函數
4 sign = params.pop('sign', None) # 取出簽名
5 params.pop('sign_type') # 取出簽名類型
6 params = sorted(params.items(), key=lambda e: e[0], reverse=False) # 取出字典元素按key的字母升序排序形成列表
7 message = "&".join(u"{}={}".format(k, v) for k, v in params).encode() # 將列表轉為二進制參數字符串
8
9 try:
10 public_key = '4Et4H9eKrffZJ9F3ZdgporsYl8U7E5+RqClbioDHqNWOsd6jtQfO94SPiUdAFyvRgEDWj8rum4IjERBgwGS1lb8rycCqA1xUlH3U+8Qg6OpxSR8aTL4jhTSfriUhz3jPHqgIilr3mfpoJ+P' #支付寶公鑰
11 status = verify_with_rsa(public_key.encode('utf-8').decode('utf-8'), message,sign) # 驗證簽名并獲取結果
12 return status # 返回驗證結果
13 except: # 如果驗證失敗,返回假值。
14 return False
15
16 recv = self.request.arguments
17
18
19 for k, v in recv.items():
20 recv[k] = str(v[0], encoding='utf-8')
21 out_trade_no = recv.get('out_trade_no')
22 if out_trade_no:
23 #寫數據庫
24 AliPayUpdate(out_trade_no, recv)
25 if (check_pay(recv)):
26 self.write('success')
27 else:
28 print('驗簽失敗')
29 self.write('Fail'