完成 [接入准备](https://ideservice.alipay.com/cms/site/0izcsa) 后,商家/服务商可根据本文指引快速接入 **App 支付**。
**说明:** - 仅支持自研商家/服务商通过 [自研应用](https://ideservice.alipay.com/cms/site/02bijh) 或 [第三方应用](https://ideservice.alipay.com/cms/site/02bijh) 代调用方式,调用 API 接入。{% if site_identifier=='/open-v3' %}{% else %} - 支持沙箱环境调试。{% endif %} - 需要服务端和客户端结合请求唤起支付。 # 整体交互流程图 ``` sequenceDiagram participant 用户 participant 商户APP participant 商户服务端 participant 支付宝APP participant 支付宝服务端 Note over 用户,支付宝服务端: 支付(必选) %% 支付主流程 用户->>商户APP: 1.1 打开商户APP下单 activate 用户 activate 商户APP 商户APP->>商户服务端: 1.2 请求商户服务端生成商户订单 activate 商户服务端 商户服务端->>商户服务端: 1.3 调用alipay.trade.app.pay获取orderStr 商户服务端-->>商户APP: 1.4 返回orderStr deactivate 商户服务端 activate 商户APP 商户APP->>支付宝APP: 1.5 调用客户端支付接口,将orderStr发送给支付宝 deactivate 商户APP activate 支付宝APP 支付宝APP->>支付宝服务端: 1.6 支付预下单(此时交易未创建) activate 支付宝服务端 %% 1.6下方的异常场景 alt 异常情况 支付宝服务端-->>支付宝APP: 1.7 返回异常,如参数有误等 支付宝APP->>支付宝APP: 1.8 支付宝弹窗显示异常信息 支付宝APP->>商户APP: 1.9 返回异常信息 else 正常情况 支付宝服务端-->>支付宝APP: 1.7 唤起收银台,等待用户核身 用户->>支付宝APP: 1.8 输入密码确认支付 支付宝APP->>支付宝服务端: 1.9 创建交易并推进支付 支付宝服务端-->>支付宝APP: 1.10 返回支付结果 支付宝APP-->>商户APP:1.11返回商户APP deactivate 支付宝APP 商户APP->>商户APP:1.12商户客户端显示结果 deactivate 商户APP 支付宝服务端-->>商户服务端:1.13异步通知发送notify_url返回trade_no和支付结果 activate 商户服务端 商户服务端->>商户服务端:1.14商户异步通知处理 商户服务端->>支付宝服务端:1.15若未收到异步可调用alipay.trade.query查询订单信息 商户服务端-->>支付宝服务端:1.16返回订单状态以及订单信息 deactivate 商户服务端 deactivate 支付宝服务端 end Note over 支付宝服务端,用户: 退款(可选) %% 退款流程(完全独立) 用户->>商户APP: 2.1 申请退款 activate 商户APP activate 用户 deactivate 用户 商户APP->>商户服务端: 2.2 请求商户服务端进行退款操作 deactivate 商户APP activate 商户服务端 商户服务端->>支付宝服务端: 2.3 调用alipay.trade.refund退款接口对trade_no进行全额退款/部分退款 activate 支付宝服务端 支付宝服务端-->>商户服务端: 2.4 返回退款结果 支付宝服务端-->>商户服务端: 2.5 用户银行卡付款,异步通知alipay.trade.refund.depositback.completed返回退款到卡通知 支付宝服务端-->>商户服务端: 2.6 根据退款后交易状态变化决定是否触发异步通知发送到alipay.trade.app.pay的notify_url地址
包含refund_fee(总退款金额)、gmt_refund(交易退款时间)等参数 deactivate 支付宝服务端 deactivate 商户服务端 deactivate 用户 ``` 以下对重点步骤做简要说明: - 第 1 步用户在商户 App 客户端中购买商品下单。 - 第 2 步商户订单信息由商户 App 客户端发送到服务端。 - 第 3 步商家服务端调用 [alipay.trade.app.pay(app支付接口2.0接口)](https://ideservice.alipay.com/cms/site/0izofu)通过支付宝服务端 SDK 获取 orderStr(orderStr 中包含了订单信息和签名)。 - 第 4 步商家将 orderStr 发送给商户 App 客户端。 - 第 5 步商家在客户端发起请求,将 orderStr 发送给支付宝。 - 第 6 步进行支付预下单:支付宝客户端将会按照商家客户端提供的请求参数进行支付预下单。正常场景下,会唤起支付宝收银台等待用户核身;异常场景下,会返回异常信息。 - 第 11 步返回商家 App:用户在支付宝 App 完成支付后,会跳转回商家页面,并返回最终的支付结果(即同步通知),可查看 [同步通知说明](https://ideservice.alipay.com/cms/site/0izcsj)。 - 第 13 步支付结果异步通知,支付宝会根据步骤3 传入的异步通知地址 notify_url,发送异步通知,可查看 [异步通知说明](https://ideservice.alipay.com/cms/site/0izcsk)。 除了正向支付流程外,支付宝也提供交易查询、关闭、退款、退款查询以及对账等配套 API。 ## 重要说明 1. 首先确认已完成开通产品、创建应用、配置应用、上线应用等步骤,详情可查看 [接入准备](https://ideservice.alipay.com/cms/site/0izcsa)。 2. 构造交易数据并签名必须在商家服务端完成,商家的应用私钥绝对不能保存在商家 APP 客户端中,也不能从服务端下发。 3. 服务端生成的orderStr只是加签数据,并未请求到支付宝,只有客户端请求后,支付宝才会收到商户的订单信息。 4. 同步返回的数据,只是一个简单的结果通知,商家确定该笔交易付款是否成功需要依赖服务端收到支付宝异步通知的结果进行判断,建议通过异步+查询方式判断避免错失异步漏失交易信息。 5. 商家系统接收到通知以后,必须通过验签(验证通知中的 sign 参数)来确保支付通知是由支付宝发送的。建议使用支付宝提供的 SDK 来完成,详细验签规则可查看 [异步通知说明](https://ideservice.alipay.com/cms/site/0izcsk) 的 **异步返回结果验签**。 6. **订单创建时间**:支付宝订单将在用户输入正确完整的支付密码后创建,并非唤起收银台时创建(余额不足等情况会导致交易处于订单创建等待支付状态)。 7. **订单支付超时时间**:订单创建后未支付,默认最晚付款时间为 15 天,若超过第 15 天当天 24 点订单超时关闭不可支付(超时参数设置范围 5min~15d)。 8. 异步或查询接口返回的 trade_status(交易状态)为 TRADE_SUCCESS 或 TRADE_FINISHED 时,支付宝才会认定为买家付款成功。 9. 由于网络异常等原因,可能会导致用户支付成功,但是商户侧未能成功接收到支付结果异步通知。因此当商家未收到支付结果通知时,必须要调用 alipay.trade.query(统一收单交易查询接口)来获取支付结果。 10. **判断退款成功**:退款接口返回 fund_change=Y 或者退款查询接口返回 refund_status=REFUND_SUCCESS。
**注意**:fund_change 只表示本次接口请求是否资金变动,不是指该笔交易是否资金变动。如果第一次退款成功,返回 Y,但是相同参数(如 out_request_no 不变)第二次请求则会返回 N,因此当 fund_change=N 时,建议通过退款查询接口进一步判断。 ## 交易状态流程 ![](https://cdn.nlark.com/yuque/0/2022/png/179989/1662454282907-29e733cb-88ce-443a-b045-47ffef16ab67.png#height=541&id=JTyga&originHeight=669&originWidth=1113&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=&width=900)随着订单支付成功、退款、关闭等操作,订单交易的每一个环节 trade_status(交易状态)也不同。 1. 交易创建成功后,用户支付成功,交易状态转为 **TRADE_SUCCESS(交易成功)**。 2. 交易成功后,规定退款时间内没有退款,交易状态转为 **TRADE_FINISHED(交易完成)**。 3. 交易支付成功后,交易部分退款,交易状态仍为 **TRADE_SUCCESS(交易成功)**。 4. 交易成功后,交易全额退款,交易状态转为 **TRADE_CLOSED(交易关闭)**。 5. 交易创建成功后,用户未付款交易超时关闭,交易状态转为 **TRADE_CLOSED(交易关闭)**。 6. 交易创建成功后,用户支付成功后,若用户商品不支持退款,交易状态直接转为 **TRADE_FINISHED(交易完成)**。 **注意**:交易成功后部分退款,交易状态仍为 TRADE_SUCCESS(交易成功)。
如果一直部分退款退完所有交易金额则交易状态转为 TRADE_CLOSED(交易关闭)。
如果未退完所有交易金额,超过有效退款时间后交易状态转为 TRADE_FINISHED(交易完成)不可退款。 # 支付流程 ## 服务端接入 ### 服务端获取 orderStr 开发者可通过外部商家 App 唤起服务端 SDK ,建议调用 [alipay.trade.app.pay(app支付接口2.0接口)](https://ideservice.alipay.com/cms/site/02e7gq)获取 orderStr。
**注意:**支付宝订单将在用户输入支付密码后创建,并非唤起收银台时创建。订单实际创建时间也为用户支付时间,非唤起收银台时间。 ### 请求示例 #### 方式一:使用支付宝SDK (推荐) 示例代码、参数说明及错误码等信息,可查看 [alipay.trade.app.pay(app支付接口2.0接口)](https://ideservice.alipay.com/cms/site/02e7gq)接口文档。
**注意:**证书模式加签也需通过 `alipayClient.sdkExecute(request);` 方法发起请求,获取 orderStr。
orderStr 示例代码: ```java alipay_sdk=alipay-sdk-java-dynamicVersionNo&app_id=2014100900010000&biz_content=%7B%22total_amount%22%3A%220.01%22%2C%22product_code%22%3A%22QUICK_MSECURITY_PAY%22%2C%22subject%22%3A%22%E5%93%88%E5%93%88%E5%93%88%E5%93%88%E5%93%88%E5%A4%A7%E4%B9%90%E9%80%8F%22%2C%22out_trade_no%22%3A%2220220530000000011111101%22%7D&charset=utf-8&format=json&method=alipay.trade.app.pay&sign=iuO%2FTso2zr236p%2F%2FgyVoM9B7JGhyQqHHlL82siLLPI90xUruDVRt8hIOAroNid%2FTCbYUENSV4FkIZ5krrXm1qDFLHUnvtsUA3kToEojxyKilR8czZFYm6w91oxJseFZQJe0Os6IJg8oG29tYRf9TiXjB0leSwGQ3Ax8VilW2ATsne9L4A9Xah5fz7PTlKURTMYFqU166J2RH769wtTOjOb5Gs74aSdB3ymlZ486%2FGAcFwyXSvd3i8FEzsx3obLaM3oRQGQ%2Fx2jn8aL5qH3nVkGFIKA4xAUOZAaZSrj4EFw17HPFBYvcPwG55DQlmyLluh5lb4Ibi3j1ZxR4NiB0YFQ%3D%3D&sign_type=RSA2×tamp=2022-05-30+17%3A43%3A28&version=1.0 ``` #### 方式二:自行构建请求 (不推荐) 若开发者无法使用支付宝 SDK,可根据以下步骤自行构建请求: 1. 请求参数组装分下列 3 步,以最后第三步获取到的请求为准。 请求参数按照 key=value&key=value 方式拼接的未签名原始字符串: ```java app_id=2015052600090779&biz_content={"timeout_express":"30m","product_code":"QUICK_MSECURITY_PAY","total_amount":"0.01","subject":"1","body":"我是测试数据","out_trade_no":"IQJZSRC1YMQB5HU"}&charset=utf-8&format=json&method=alipay.trade.app.pay¬ify_url=http://domain.merchant.com/payment_notify&sign_type=RSA2×tamp=2016-08-25 20:26:31&version=1.0 ``` 2. 再对原始字符串进行签名,可查看 [自行实现签名](https://ideservice.alipay.com/cms/site/02kf5q) 。 ```java app_id=2015052600090779&biz_content={"timeout_express":"30m","product_code":"QUICK_MSECURITY_PAY","total_amount":"0.01","subject":"1","body":"我是测试数据","out_trade_no":"IQJZSRC1YMQB5HU"}&charset=utf-8&format=json&method=alipay.trade.app.pay¬ify_url=http://domain.merchant.com/payment_notify&sign_type=RSA2×tamp=2016-08-25 20:26:31&version=1.0&sign=cYmuUnKi5QdBsoZEAbMXVMmRWjsuUj+y48A2DvWAVVBuYkiBj13CFDHu2vZQvmOfkjE0YqCUQE04kqm9Xg3tIX8tPeIGIFtsIyp/M45w1ZsDOiduBbduGfRo1XRsvAyVAv2hCrBLLrDI5Vi7uZZ77Lo5J0PpUUWwyQGt0M4cj8g= ``` 3. 最后对请求字符串的所有一级 value(biz_content 作为一个 value)进行 encode,编码格式按请求串中的 charset 为准,没传 charset 按 UTF-8 处理,获得最终的请求字符串。 ```java app_id=2015052600090779&biz_content=%7B%22timeout_express%22%3A%2230m%22%2C%22product_code%22%3A%22QUICK_MSECURITY_PAY%22%2C%22total_amount%22%3A%220.01%22%2C%22subject%22%3A%221%22%2C%22body%22%3A%22%E6%88%91%E6%98%AF%E6%B5%8B%E8%AF%95%E6%95%B0%E6%8D%AE%22%2C%22out_trade_no%22%3A%22IQJZSRC1YMQB5HU%22%7D&charset=utf-8&format=json&method=alipay.trade.app.pay¬ify_url=http%3A%2F%2Fdomain.merchant.com%2Fpayment_notify&sign_type=RSA2×tamp=2016-08-25%2020%3A26%3A31&version=1.0&sign=cYmuUnKi5QdBsoZEAbMXVMmRWjsuUj%2By48A2DvWAVVBuYkiBj13CFDHu2vZQvmOfkjE0YqCUQE04kqm9Xg3tIX8tPeIGIFtsIyp%2FM45w1ZsDOiduBbduGfRo1XRsvAyVAv2hCrBLLrDI5Vi7uZZ77Lo5J0PpUUWwyQGt0M4cj8g%3D ``` ## 客户端接入 ### 商家 APP **注意**:App 支付同步通过客户端配置完成回调,return_url 设置不生效。 #### 客户端 iOS 集成流程 详情可点击查看 [iOS 集成流程](https://ideservice.alipay.com/cms/site/0izcsf)。 #### 客户端 Android 集成流程 详情可点击查看 [Android 集成流程](https://ideservice.alipay.com/cms/site/0izcsg)。 #### 客户端 Harmony 单框架 SDK 集成流程 详情可点击查看 [ Harmony 单框架集成流程](https://ideservice.alipay.com/cms/site/0izcsh)。 #### 客户端鸿蒙 SDK 集成流程 详情可点击查看 [鸿蒙 SDK 接入说明](https://ideservice.alipay.com/cms/site/0izcsi)。 ### 异步通知 App 支付异步通知发送到 [alipay.trade.app.pay(app支付接口2.0接口)](https://ideservice.alipay.com/cms/site/02e7gq)加签时入参的公共参数 notify_url 地址中,未设置该参数则不触发异步。通知参数及规则详见 [异步通知说明](https://ideservice.alipay.com/cms/site/0izcsk) 。
**注意**:由于网络异常等原因,可能会导致用户支付成功,但是商户侧未能成功接收到支付结果异步通知。因此当商家未收到支付结果通知时,必须要调用 alipay.trade.query(统一收单交易查询接口)来获取支付结果。 ## 支付结果查询 商家可调用 [alipay.trade.query(统一收单交易查询接口)](https://ideservice.alipay.com/cms/site/02e7gm),通过商家网站唯一订单号 out_trade_no 或支付宝交易号 trade_no 查询对应订单支付情况。 ### 重要入参说明 **注意:**请严格按照接口文档中的参数入参,传入非接口文档中的参数是无效的,并且可能会导致请求被拦截或其它异常。 | **参数名** | **参数说明** | | --- | --- | | out_trade_no | 支付时传入的商户订单号,与 trade_no 必填一个。 | | trade_no | 支付时返回的支付宝交易号,与 out_trade_no 必填一个。 | # 退款流程 交易发生后的一段时间内,由于业务原因(如金额错误、用户退款或者对账不平等)需要退款时,商家可以调用 [alipay.trade.refund(统一收单交易退款接口)](https://ideservice.alipay.com/cms/site/02e7gp),通过 `out_trade_no`(商家网站唯一订单号)或`trade_no`(支付宝交易号),将对应订单支付款退还给买家。支付宝将在收到退款请求并且验证成功之后,按照退款规则将支付款按原路退到买家账号上。
**说明:**支持全额或部分退款。 ## 接口流程 ``` sequenceDiagram participant 商户服务端 participant 支付宝服务端 商户服务端->>支付宝服务端: 1.调用alipay.trade.refund接口发起退款请求 支付宝服务端-->>商户服务端: 2. 返回退款结果 ``` ## 退款结果 - **退款成功**:退款是否成功可以根据同步响应的 `fund_change` 参数来判断,返回值为 `Y` 则表示退款成功。 - **退款失败**:根据 [alipay.trade.refund(统一收单交易退款接口)](https://ideservice.alipay.com/cms/site/02e7gp)中的错误码确认是否要重试,重试时注意 `out_request_no` 需保持一致。 - **系统异常**:无法确认退款结果。 - 方案一:重试,重试时注意 `out_request_no` 需保持一致。 - 方案二:先调用 [alipay.trade.fastpay.refund.query(统一收单交易退款查询接口)](https://ideservice.alipay.com/cms/site/05osv3)确认退款结果,如失败,再发起重试。 ## 退款说明 - **退款周期:**默认12 个月,即交易发生后 12 个月内可发起退款,超过 12 个月则不可发起退款。 - **退款方式:**资金原路返回用户账号。 - **退款退费:**默认退款时手续费不退回。 - 支付渠道为花呗、余额等退款即时到账。 - 银行卡的退款时间以银行退款时间为准,一般情况下 2 小时内可到账(若退款到卡失败,退款金额会退回用户支付宝账户余额)。 - 商家可以在 [商家平台 > 对账中心 > 交易订单](https://b.alipay.com/page/mbillexprod/trade/order/sold) 中退款。 - 退款接口会根据外部请求号 `out_request_no` 幂等返回,因此同一笔交易需要多次部分退款时,必须使用不同的 `out_request_no`。 ### 重要入参说明 **注意:**请严格按照接口文档中的参数入参,传入非接口文档中的参数是无效的,并且可能会导致请求被拦截或其它异常。 | **参数名** | **参数说明** | | --- | --- | | out_trade_no | 支付时传入的商户订单号,与 trade_no 必填一个。 | | trade_no | 支付时返回的支付宝交易号,与 out_trade_no 必填一个。 | | out_request_no | 本次退款请求流水号,部分退款时必传。 | | refund_amount | 本次退款金额。 | ### 重要出参说明 | **参数名** | **参数说明** | | --- | --- | | refund_fee | 该笔交易已退款的总金额。 | ## 退款到银行卡通知 退款存在退到银行卡场景下时,支付宝会调用 [alipay.trade.refund.depositback.completed(收单退款冲退完成通知接口)](https://ideservice.alipay.com/cms/site/05osva)根据银行回执消息发送退款完成信息至应用网关地址。
**重要说明** - 如需触发 alipay.trade.refund.depositback.completed(收单退款冲退完成通知),需要在调用 alipay.trade.refund(统一收单交易退款接口)时,传入参数 "query_options":["deposit_back_info"]。 - 开发者需登录 [开放平台](https://openhome.alipay.com/platform/home.htm) 进入对应应用详情页,在 **开发设置** > **消息服务** > **FROM 平台** 中订阅 alipay.trade.refund.depositback.completed(收单退款冲退完成通知)。 更多 From 平台消息详情可查看 [From 蚂蚁消息服务使用](https://ideservice.alipay.com/cms/site/02km9j)。 ![image.png](https://mdn.alipayobjects.com/afts/img/A*eEbZRIxRFtoAAAAAQxAAAAgAeq8wAA/original?bz=openpt_doc&t=Z4QzmmST7TpumnwnQhqrpLvoV9_EWF2vRh5tm899M5kDAAAAZAAAMK8AAAAA#clientId=ue537aca7-f1ce-4&from=paste&height=280&id=uae0b90e6&originHeight=496&originWidth=1593&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=stroke&taskId=u67a5a6d8-dd50-4a04-b385-aff6f1a90ce&title=&width=900) ### 重要参数说明 | **参数名** | **参数说明** | | --- | --- | | trade_no | 支付宝交易订单号。 | | dback_status | 银行卡冲退状态。
- S - 成功
- F - 失败,银行卡冲退失败,资金自动转入用户支付宝余额。
| | dback_amount | 银行卡冲退金额。 | | bank_ack_time | 银行响应时间,格式为 yyyy-MM-dd HH:mm:ss。 | | est_bank_receipt_time | 预估银行入账时间,格式为 yyyy-MM-dd HH:mm:ss。 | ## 查询退款结果 商家/服务商可调用 [alipay.trade.fastpay.refund.query(统一收单交易退款查询接口)](https://ideservice.alipay.com/cms/site/05osv3)查询对应out_request_no(退款请求号)的退款情况。
**重要说明** 1. 退款查询接口的trade_no、out_trade_no、out_request_no必须和退款接口保持一致,否则交易号一致,out_request_no不同,只会返回10000,success,但是没有具体的退款信息。 2. 该接口的返回10000,仅代表本次查询操作成功,不代表退款成功,当接口返回的refund_status值为REFUND_SUCCESS时表示退款成功,否则表示退款没有执行成功。 ### 重要入参说明 **注意:**请严格按照接口文档中的参数入参,传入非接口文档中的参数是无效的,并且可能会导致请求被拦截或其它异常。 | **参数名** | **参数说明** | | --- | --- | | out_trade_no | 支付时传入的商户订单号,与 trade_no 必填一个。 | | trade_no | 支付时返回的支付宝交易号,与 out_trade_no 必填一个。 | # 对账流程 目前支付宝对外的常用对账方式有两种: - 一种是通过在 [商家平台 > 对账中心](https://mbillexprod.alipay.com/enterprise/mainIndex.htm#/) 下载账单的方式来对账。 - 一种是通过调用接口的方式来实现对账,下文介绍如何通过接口获取对账单下载链接。更多后台下载及账单示例图详情可查看 [对账说明](https://ideservice.alipay.com/cms/site/064jhb)。 商家可通过接口下载指定日期(当天除外)的业务明细账单文件,并结合自身业务系统实现自动对账。 ## 接口流程 ``` sequenceDiagram participant 商户服务端 participant 支付宝服务端 商户服务端->>支付宝服务端: 1.调用alipay.data.dataservice.bill.downloadurl.query接口 支付宝服务端-->>商户服务端: 2. 返回对账单下载地址 商户服务端->>支付宝服务端: 3.通过HTTP请求对账单下载地址 支付宝服务端-->>商户服务端: 4.获得对账单文件流 商户服务端->>商户服务端: 5.读取文件流处理CSV文件自动对账,或保存至本地 ``` 1. 商家系统调用 [alipay.data.dataservice.bill.downloadurl.query(查询对账单下载地址接口)](https://ideservice.alipay.com/cms/site/02byuu),传入指定日期,获得该日期账单文件的下载地址。 2. 商家系统通过 HTTP 方式后台访问账单下载链接,将账单 csv 文件下载到本地后自行处理。注意该下载链接仅 30 秒,在得到链接后系统需要立刻下载账单文件。 ## 重要入参说明 **注意:**请严格按照接口文档中的参数入参,传入非接口文档中的参数是无效的,并且可能会导致请求被拦截或其它异常。 | **参数名** | **参数说明** | | --- | --- | | bill_type | 固定传入 trade。 | | bill_date | 需要下载的账单日期,最晚是当期日期的前一天。 | ## 下载账单文件示例代码 ```java //将接口返回的对账单下载地址传入urlStr String urlStr = "下载地址"; //指定希望保存的文件路径 String filePath = "/Users/fund_bill_20160405.csv.zip"; URL url = null; HttpURLConnection httpUrlConnection = null; InputStream fis = null; FileOutputStream fos = null; try { url = new URL(urlStr); httpUrlConnection = (HttpURLConnection) url.openConnection(); httpUrlConnection.setConnectTimeout(5 * 1000); httpUrlConnection.setDoInput(true); httpUrlConnection.setDoOutput(true); httpUrlConnection.setUseCaches(false); httpUrlConnection.setRequestMethod("GET"); httpUrlConnection.setRequestProperty("CHARSET", "UTF-8"); httpUrlConnection.connect(); fis = httpUrlConnection.getInputStream(); byte[] temp = new byte[1024]; int b; fos = new FileOutputStream(new File(filePath)); while ((b = fis.read(temp)) != -1) { fos.write(temp, 0, b); fos.flush(); } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { if(fis!=null) fis.close(); if(fos!=null) fos.close(); if(httpUrlConnection!=null) httpUrlConnection.disconnect(); } catch (IOException e) { e.printStackTrace(); } } ``` # 附录:自定义参数说明 1. 商家在请求参数中,自己附加的一些额外参数,**请勿和支付宝系统中约定的 key**(如  alipay.trade.app.pay(app支付接口2.0)等接口 **公共请求参数**/**请求参数**)**重名**,否则将可能导致未知的异常。 1. 例如以下示例中 `app_id=2014072300007148**&version=1.0&biz_content` 的 key 是公共请求参数,商家/服务商自己的扩展参数需要放在 biz_content 内部,例如示例中 tips 属性,很显然下面 total_amount 属性是商家按照自己的业务属性赋值的,但是由于 total_amount 同时也是支付宝关键 key ,支付宝将会认为这个 total_amount 是支付宝业务的参数应该是金额,这个最终将导致误解析。 2. **注意:**下列请求串为了展示清晰,未进行 encode 并且做了格式化处理。 ```json app_id=2014072300007148&charset=UTF-8&version=1.0×tamp=2016-07-01 08:08:08&method=alipay.trade.app.pay¬ify_url=https://api.**.com/pay_receive_notify.html&sign_type=RSA2&sign=ERITJKEIJKJHKKKKKKKHJEREEEEEEEEEEE&version=1.0&biz_content= { "body":"对一笔交易的具体描述信息。如果是多种商品,请将商品描述字符串累加传给body。", "subject":"大乐透", "out_trade_no":"70501111111S001111119", "timeout_express":"90m", "total_amount":"一共花费了10元", "product_code":"QUICK_MSECURITY_PAY", "tips":"测试一笔支付" } ``` 2. 商家的请求参数中,所有的 key(支付宝关键 key 或者商家自己的 key),其对应的 value 中都不应该出现支付宝关键 key,否则该类交易将可能被支付宝拦截禁止支付。 1. 例如以下的请求中 `"subject":"大乐透 这个辣条不错 out_trade_no=123 total_fee=123.5"`,其 value 值中有支付宝关键 key 值`out_trade_no`、`total_fee`,这样的业务请求参数支付宝将会拦截。 2. **注意:**下列请求串为了展示清晰,未进行 encode 并且做了格式化处理。 ```json app_id=2014072300007148&charset=UTF-8&version=1.0×tamp=2016-07-01 08:08:08&method=alipay.trade.app.pay¬ify_url=https://api.**.com/pay_receive_notify.htm&sign_type=RSA2&sign=ERITJKEIJKJHKKKKKKKHJEREEEEEEEEEEE&version=1.0&biz_content= { "body":"对一笔交易的具体描述信息。如果是多种商品,请将商品描述字符串累加传给body。", "subject":"大乐透 这个辣条不错 out_trade_no=123 total_fee=123.5", "out_trade_no":"70501111111S001111119", "timeout_express":"90m", "total_amount":10.0, "product_code":"QUICK_MSECURITY_PAY" } ``` 3. 商家支付请求参数的安全注意点 1. 请求参数的 sign 字段请务必在服务端完成签名生成(不要在客户端本地签名)。 2. 支付请求中的 `total_amount`(订单金额) ,请务必依赖服务端,不要轻信客户端上行的数据(客户端本地上行数据在用户手机环境中无法确保一定安全)。