支付宝 App支付同步通知参数说明
支付宝sdk对商户的请求支付数据处理完成后,会将结果同步反馈给商户app端。
同步返回的数据,商户可以按照下文描述的方式在服务端验证,验证通过后,可以认为本次用户付款成功。有些时候会出现商户app在支付宝付款阶段被关闭导致无法正确收到同步结果,此时支付结果可以完全依赖服务端的异步通知。
由于同步通知和异步通知都可以作为支付完成的凭证,且异步通知支付宝一定会确保发送给商户服务端。为了简化集成流程,商户可以将同步结果仅仅作为一个支付结束的通知(忽略执行校验),实际支付是否成功,完全依赖服务端异步通知。
返回结果示例(iOS|Android)
对于iOS平台而言返回参数是一个NSDictionary对象,对于Android平台而言是一个map结构体。里面有三个key,其中memo是描述信息(类型为字符串);result是处理结果(类型为json结构字符串);resultStatus是结果码(类型为字符串)。
{
"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"
}
返回结果参数
参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 |
---|---|---|---|---|---|
out_trade_no | String | 是 | 64 | 商户网站唯一订单号 70501111111S001111119 | |
trade_no | String | 是 | 64 | 该交易在支付宝系统中的交易流水号。最长64位。 | 2014112400001000340011111118 |
app_id | String | 是 | 32 | 支付宝分配给开发者的应用Id。 | 2014072300007148 |
total_amount | Price | 是 | 9 | 该笔订单的资金总额,单位为RMB-Yuan。取值范围为[0.01,100000000.00],精确到小数点后两位。 | 9.00 |
seller_id | String | 是 | 16 | 收款支付宝账号对应的支付宝唯一用户号。以2088开头的纯16位数字 | 2088111111116894 |
msg | String | 是 | 16 | 处理结果的描述,信息来自于code返回结果的描述 | success |
charset | String | 是 | 16 | 编码格式 | utf-8 |
timestamp | String | 是 | 32 | 时间 | 2016-10-11 17:43:36 |
code | String | 是 | 16 | 结果码 | 具体见 |
resultStatus结果码含义
返回码 | 含义 |
---|---|
9000 | 订单支付成功 |
8000 | 正在处理中,支付结果未知(有可能已经支付成功),请查询商户订单列表中订单的支付状态 |
4000 | 订单支付失败 |
5000 | 重复请求 |
6001 | 用户中途取消 |
6002 | 网络连接出错 |
6004 | 支付结果未知(有可能已经支付成功),请查询商户订单列表中订单的支付状态 |
其它 | 其它支付错误 |
同步通知验证
为了帮助开发者调用开放接口,我们提供了开放平台服务端DEMO&SDK,包含JAVA、PHP和.NET三语言版本,封装了签名&验签、HTTP接口请求等基础功能。强烈建议先下载对应语言版本的SDK并引入您的开发工程进行快速接入。
在返回数据resultStatus
为9000
的情况下,解析result
结果,提取验证签名的相关核心数据:
第一步: 提取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字段值,其代表签名结果,上述示例格式如下:
NGfStJf3i3ooWBuCDIQSumOpaGBcQz+aoAqyGh3W6EqA/gmyPYwLJ2REFijY9XPTApI9YglZyMw+ZMhd3kb0mh4RAXMrb6mekX4Zu8Nf6geOwIa9kLOnw0IMCjxi4abDIfXhxrXyj********
第四步: 验证签名是否合法:
使用各自语言对应的SHA256WithRSA签名验证函数,传入签名的原始字符串、支付宝公钥、签名类型RSA、签名字符进行合法性验证。
第五步: 在第四步签名验证通过后,必须严格按照如下的描述校验通知参数的合法性:
- 商户需要验证该通知数据中的
out_trade_no
是否为商户系统中创建的订单号; - 判断
total_amount
是否确实为该订单的实际金额(即商户订单创建时的金额); - 校验通知中的
seller_id
(或者seller_email
) 是否为out_trade_no
这笔单据对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email
); - 验证
app_id
是否为该商户本身。
上述1、2、3、4有任何一个验证不通过,则表明同步校验结果是无效的,只有全部验证通过后,才可以认定买家付款成功。
更多建议: