当收银台调用预下单请求API生成二维码展示给用户后,用户通过手机扫描二维码进行支付,支付宝会将该笔订单的变更信息,沿着商户调用预下单请求时所传入的通知地址主动推送给商户。
参数 | 参数名称 | 类型 | 必填 | 描述 | 范例 |
---|---|---|---|---|---|
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 |
sign_type | 签名类型 | String(10) | 是 | 商户生成签名字符串所使用的签名算法类型,目前支持RSA2和RSA,推荐使用RSA2 | RSA2 |
sign | 签名 | String(256) | 是 | 请参考异步返回结果的验签 | 601510b7970e52cc63db0f44997cf70e |
trade_no | 支付宝交易号 | String(64) | 是 | 支付宝交易凭证号 | 2013112011001004330000121536 |
app_id | 开发者的app_id | String(32) | 是 | 支付宝分配给开发者的应用Id | 2014072300007148 |
out_trade_no | 商户订单号 | String(64) | 是 | 原支付请求的商户订单号 | 6823789339978248 |
out_biz_no | 商户业务号 | String(64) | 否 | 商户业务ID,主要是退款通知中返回退款申请的流水号 | HZRF001 |
buyer_id | 买家支付宝用户号 | String(16) | 否 | 买家支付宝账号对应的支付宝唯一用户号。以2088开头的纯16位数字 | 2088102122524333 |
buyer_logon_id | 买家支付宝账号 | String(100) | 否 | 买家支付宝账号 | 15901825620 |
seller_id | 卖家支付宝用户号 | String(30) | 否 | 卖家支付宝用户号 | 2088101106499364 |
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.00 |
buyer_pay_amount | 付款金额 | Number(9,2) | 否 | 用户在交易中支付的金额 | 13.88 |
point_amount | 集分宝金额 | Number(9,2) | 否 | 使用集分宝支付的金额 | 12.00 |
refund_fee | 总退款金额 | Number(9,2) | 否 | 退款通知中,返回总退款金额,单位为元,支持两位小数 | 2.58 |
send_back_fee | 实际退款金额 | Number(9,2) | 否 | 商户实际退款给用户的金额,单位为元,支持两位小数 | 2.08 |
subject | 订单标题 | String(256) | 否 | 商品的标题/交易标题/订单标题/订单关键字等,是请求时对应的参数,原样通知回来 | 当面付交易 |
body | 商品描述 | String(400) | 否 | 该订单的备注、描述、明细等。对应请求时的body参数,原样通知回来 | 当面付交易内容 |
gmt_create | 交易创建时间 | Date | 否 | 该笔交易创建的时间。格式为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 | 交易结束时间 | Date | 否 | 该笔交易结束时间。格式为yyyy-MM-dd HH:mm:ss | 2015-04-29 15:45:57 |
fund_bill_list | 支付金额信息 | String(512) | 否 | 支付成功的各个渠道金额信息,详见资金明细信息说明 | [{“amount”:“15.00”,“fundChannel”:“ALIPAYACCOUNT”}] |
枚举名称 | 枚举说明 |
---|---|
WAIT_BUYER_PAY | 交易创建,等待买家付款 |
TRADE_CLOSED | 未付款交易超时关闭,或支付完成后全额退款 |
TRADE_SUCCESS | 交易支付成功 |
TRADE_FINISHED | 交易结束,不可退款 |
触发条件名 | 触发条件描述 | 触发条件默认值 |
---|---|---|
TRADE_FINISHED | 交易完成 | false(不触发通知) |
TRADE_SUCCESS | 支付成功 | true(触发通知) |
WAIT_BUYER_PAY | 交易创建 | false(不触发通知) |
TRADE_CLOSED | 交易关闭 | false(不触发通知) |
参数 | 参数名称 | 类型 | 参数说明 | 是否可为空 | 样例 |
---|---|---|---|---|---|
fundChannel | 支付渠道 | String | 支付渠道,参见下面的“支付渠道说明”。 | 可空 | ALIPAYACCOUNT |
amount | 支付金额 | String | 使用指定支付渠道支付的金额,单位为元。 | 可空 | 15.00 |
支付渠道代码 | 支付渠道 |
---|---|
COUPON | 支付宝红包 |
ALIPAYACCOUNT | 支付宝余额 |
POINT | 集分宝 |
DISCOUNT | 折扣券 |
PCARD | 预付卡 |
FINANCEACCOUNT | 余额宝 |
MCARD | 商家储值卡 |
MDISCOUNT | 商户优惠券 |
MCOUPON | 商户红包 |
PCREDIT | 蚂蚁花呗 |
某商户设置的通知地址为https://api.xx.com/receive_notify.htm,对应接收到通知的示例如下:
https://api.xx.com/receive_notify.htm?gmt_payment=2015-06-11 22:33:59¬ify_id=42af7baacd1d3746cf7b56752b91edcj34&seller_email=testyufabu07@alipay.com¬ify_type=trade_status_sync&sign=kPbQIjX+xQc8F0/A6/AocELIjhhZnGbcBN6G4MM/HmfWL4ZiHM6fWl5NQhzXJusaklZ1LFuMo+lHQUELAYeugH8LYFvxnNajOvZhuxNFbN2LhF0l/KL8ANtj8oyPM4NN7Qft2kWJTDJUpQOzCzNnV9hDxh5AaT9FPqRS6ZKxnzM=&trade_no=2015061121001004400068549373&out_trade_no=21repl2ac2eOutTradeNo322&gmt_create=2015-06-11 22:33:46&seller_id=2088211521646673¬ify_time=2015-06-11 22:34:03&subject=FACE_TO_FACE_PAYMENT_PRECREATE中文&trade_status=TRADE_SUCCESS&sign_type=RSA2
第一步: 在通知返回参数列表中,除去sign、sign_type两个参数外,凡是通知返回回来的参数皆是待验签的参数。
第二步: 将剩下参数进行url_decode, 然后进行字典排序,组成字符串,得到待签名字符串:
gmt_create=2015-06-11 22:33:46&gmt_payment=2015-06-11 22:33:59¬ify_id=42af7baacd1d3746cf7b56752b91edcj34¬ify_time=2015-06-11 22:34:03¬ify_type=trade_status_sync&out_trade_no=21repl2ac2eOutTradeNo322&seller_email=testyufabu07@alipay.com&seller_id=2088211521646673&subject=FACE_TO_FACE_PAYMENT_PRECREATE中文&trade_no=2015061121001004400068549373&trade_status=TRADE_SUCCESS
第三步: 将签名参数(sign)使用base64解码为字节码串。
第四步: 使用RSA的验签方法,通过签名字符串、签名参数(经过base64解码)及支付宝公钥验证签名。
第五步:需要严格按照如下描述校验通知数据的正确性。
商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号,并判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额),同时需要校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email),上述有任何一个验证不通过,则表明本次通知是异常通知,务必忽略。在上述验证通过后商户必须根据支付宝不同类型的业务通知,正确的进行不同的业务处理,并且过滤重复的通知结果数据。在支付宝的业务通知中,只有交易通知状态为TRADE_SUCCESS或TRADE_FINISHED时,支付宝才会认定为买家付款成功。注意: