支付宝 SDK 对商家的请求支付数据处理完成后,会将结果同步反馈给商家 App 端。
**注意**:同步返回的数据,商家可以按照下文描述的方式在服务端验证,验证通过后,可以认为本次用户付款成功。有些时候会出现商家 App 在支付宝付款阶段被关闭导致无法正确收到同步结果,此时支付结果可以通过服务端的异步通知来获取。为了简化集成流程,商家可以将同步结果仅作为一个支付结束的通知(忽略执行校验),实际支付是否成功,可以通过服务端的异步通知来获取。
# 回调返回方法
**iOS**:参考 [iOS 集成流程](https://ideservice.alipay.com/cms/site/0izcsf) 的配置返回 URL 处理方法打印输出回调信息,对于 iOS 平台而言返回参数是一个 NSDictionary 对象。
**Android**:参考 [Android 集成流程](https://ideservice.alipay.com/cms/site/0izcsg) 支付结果获取和处理的同步返回打印输出回调信息,对于 Android 平台而言是一个 map 结构体。
# 返回结果示例(iOS|Android)
同步返回的回调信息里面有三个 key,其中 memo 是描述信息(类型为字符串);result 是处理结果(类型为 JSON 结构字符串);resultStatus 是结果码(类型为字符串)。
```json
{
"memo" : "xxxxx",
"result" : "{
\"alipay_trade_app_pay_response\":{
\"code\":\"10000\",
\"msg\":\"Success\",
\"app_id\":\"2014072300007148\",
\"out_trade_no\":\"081622560194853\",
\"trade_no\":\"2016081621001004400236957647\",
\"total_amount\":\"9.00\",
\"seller_id\":\"2088702849871851\",
\"charset\":\"utf-8\",
\"timestamp\":\"2016-10-11 17:43:36\"
},
\"sign\":\"NGfStJf3i3ooWBuCDIQSumOpaGBcQz+aoAqyGh3W6EqA/gmyPYwLJ2REFijY9XPTApI9YglZyMw+ZMhd3kb0mh4RAXMrb6mekX4Zu8Nf6geOwIa9kLOnw0IMCjxi4abDIfXhxrXyj********\",
\"sign_type\":\"RSA2\"
}",
"resultStatus" : "9000"
}
```
# result返回参数说明
| **参数** | **类型** | **是否必填** | **最大长度** | **描述** | **示例值** |
| --- | --- | --- | --- | --- | --- |
| out_trade_no | String | 是 | 64 | 商家网站唯一订单号。 | 70501111111S001111119 |
| trade_no | String | 是 | 64 | 该交易在支付宝系统中的交易流水号。最长 64 位。 | 2014112400001000340011111118 |
| app_id | String | 是 | 32 | 支付宝分配给开发者的应用 APPID。 | 2014072300007148 |
| total_amount | Price | 是 | 11 | 该笔订单的资金总额,单位为 RMB-Yuan。取值范围 [0.01, 100000000.00],精确到小数点后两位。 | 9.00 |
| seller_id | String | 是 | 16 | 收款支付宝账号对应的支付宝唯一用户号。以 2088 开头的纯 16 位数字。 | 20886894 |
| msg | String | 是 | 16 | 处理结果的描述,信息来自于 code 返回结果的描述。 | success |
| charset | String | 是 | 16 | 编码格式。 | utf-8 |
| timestamp | String | 是 | 32 | 时间。 | 2016-10-11 17:43:36 |
| code | String | 是 | 16 | 结果码,详情可查看 [公共错误码](https://ideservice.alipay.com/cms/site/02km9f)。 | 10000 |
# resultStatus 结果码含义
| **返回码** | **含义** |
| --- | --- |
| 9000 | 订单支付成功。 |
| 8000 | 正在处理中,支付结果未知(有可能已经支付成功),请查询商家订单列表中订单的支付状态。 |
| 4000 | 订单支付失败。 |
| 5000 | 重复请求。 |
| 6001 | 用户中途取消。 |
| 6002 | 网络连接出错。 |
| 6004 | 支付结果未知(有可能已经支付成功),请查询商家订单列表中订单的支付状态。 |
| 其它 | 其它支付错误。 |
# 同步通知验证
为了帮助开发者调用开放接口,支付宝提供了 [开放平台服务端 DEMO&SDK](https://ideservice.alipay.com/cms/site/02no46),包含 Java、PHP、Python、NodeJS 和 .NET 五种语言版本,封装了签名&验签、HTTP 接口请求等基础功能。强烈建议先下载对应语言版本的 SDK 并引入开发工程进行快速接入。
若未使用支付宝 SDK,可按以下步骤完成同步通知验签:
在返回数据 resultStatus 为 9000 的情况下,解析 result 结果进行 [同步返回验签](https://ideservice.alipay.com/cms/site/02mse7)。
在返回数据 resultStatus 为 9000 的情况下,解析 result 结果,提取验证签名的相关核心数据。
**第一步:**提取 `alipay_trade_app_pay_response` 字段值,其代表签名原始字符串,上述示例格式如下:
```json
{
"code":"10000",
"msg":"Success",
"app_id":"2014072300007148",
"out_trade_no":"081622560194853",
"trade_no":"2016081621001004400236957647",
"total_amount":"9.00",
"seller_id":"2088702849871851",
"charset":"utf-8",
"timestamp":"2016-10-11 17:43:36"
}
```
**第二步:**提取 `sign_type` 字段值,其代表签名类型,上述示例格式如下:
```java
RSA2
```
**第三步:**提取 `sign` 字段值,其代表签名结果,上述示例格式如下:
```java
NGfStJf3i3ooWBuCDIQSumOpaGBcQz+aoAqyGh3W6EqA/gmyPYwLJ2REFijY9XPTApI9YglZyMw+ZMhd3kb0mh4RAXMrb6mekX4Zu8Nf6geOwIa9kLOnw0IMCjxi4abDIfXhxrXyj********
```
**第四步:**验证签名是否合法。使用各自语言对应的 SHA256WithRSA 签名验证函数,传入签名的原始字符串、支付宝公钥、签名类型 RSA、签名字符进行合法性验证。
**第五步:**在第四步签名验证通过后,必须严格按照如下的描述校验通知参数的合法性。
1. 商家需要验证该通知数据中的 out_trade_no 是否为商家系统中创建的订单号。
2. 判断 total_amount 是否确实为该订单的实际金额(即商家订单创建时的金额)。
3. 校验通知中的 seller_id(或者 seller_email)是否为 out_trade_no 这笔单据对应的操作方(有的时候,一个商家可能有多个 seller_id/seller_email)。
4. 验证 app_id 是否为该商家本身。
5. 上述1、2、3、4有任何一个验证不通过,则表明同步校验结果是无效的,只有全部验证通过后,才可以认定买家付款成功。
# 客户端报错处理方案
商家客户端唤起支付宝客户端后,支付宝客户端中弹窗提示 支付失败 等报错信息。
## 系统交互流程
```
sequenceDiagram
actor 用户
participant 商户客户端
participant 支付宝app SDK
participant 支付宝服务端
participant 商户服务端
用户->>商户客户端: 1. 使用支付宝付款
商户客户端->>商户服务端: 2. 请求商户服务端,获取签名后的订单信息
商户服务端-->>商户客户端: 3. 返回签名后的订单信息
商户客户端->>支付宝app SDK: 4. 调用alipay.trade.app.pay接口
唤起支付宝app
支付宝app SDK->>支付宝服务端: 5. 支付请求
支付宝服务端->>支付宝服务端: 6. 验签以及其他处理
rect rgb(255, 240, 240)
Note left of 用户: ATL验签或参数校验失败
支付宝服务端->>支付宝app SDK: 7. 返回错误信息
支付宝app SDK->>用户: 8. 弹窗提示错误信息
用户->>支付宝app SDK: 9. 点击确认按钮,关闭支付宝app
end
支付宝app SDK->>商户客户端: 10. 返回详细错误信息
```
## 错误信息格式样例

## result错误处理方案
当resultStatus返回非9000状态,result返回的sub_code 和 sub_msg 含有具体错误原因,可查看 [alipay.trade.app.pay(app支付接口2.0接口)](https://ideservice.alipay.com/cms/site/02e7gq)错误码来进行排查和解决,如在开发过程中碰到其它的问题,可以在 [文档中心](https://opendocs.alipay.com/home) 搜索查找相关问题。
**注意**:部分报错没有显示具体报错信息,如{resultStatus=6001, result=, memo=用户取消},无法判断是用户取消支付导致还是报错导致,建议按照客户端页面显示的报错信息进行查询定位。常见报错信息及解决方案见下表。
| **客户端报错** | **解决方案** |
| --- | --- |
| 商家订单参数异常,请尝试返回后重新付款或联系商家确认 |
1. 请求 APPID 应用未上线。
2. 应用类型为第三方应用。
3. 未开通 App 支付或者未添加 App 支付功能包。
4. sign_type 填写错误,必须为 RSA2 类型。
5. 签名方式使用错误,应用的接口加签方式选择为公钥证书,则代码必须为证书模式加签(含有 app_cert_sn 和 alipay_root_cert_sn),若接口加签方式选择为公钥,则代码必须为普通公钥加签。
6. 请求参数问题,建议只传必传参数测试核实(沙箱调试客户端请开启沙箱联调代码)。
7. 密钥匹配问题,代码中设置的私钥和应用中上传的应用公钥不匹配。
|
| 卖家账户状态异常,请联系卖家解决。(T1) | 商家收款账号存在异常,建议商家拨打联系电话 4007585858 处理。 |
| 系统繁忙,请稍后再试 | 请按照 [常见问题](https://ideservice.alipay.com/cms/site/0izct7) 中客户端返回具体报错定位。 |
| 订单已付款成功,请勿重复提交。(ALIN42279) | 该笔订单已支付完成,不可使用相同的商家订单号发起请求。 |
| 花呗分期暂不可用,请更换付款方式 |
1. 用户尚未开通花呗或花呗可用额度不足。
2. 花呗分期额度过小或超支(建议设置 200 元测试)。
3. 收款账号未开通花呗分期协议或接口不支持花呗分期收款。
4. 账号存在风险。
5. 接口设置支付渠道,禁用花呗分期。
|
| 订单已超时,请重新下单后再发起付款(ALIN47094) | 接口传入了超时参数,未在交易超时前支付,建议更换新的订单号 out_trade_no 重新请求。 |