> For the complete documentation index, see [llms.txt](https://3tempopay.gitbook.io/pay/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://3tempopay.gitbook.io/pay/1-zhi-fu-api-gai-shu.md).

# 1 支付API概述

### 1.1 产品说明

支付API是我司提供给商户的接口API，商户可以根据API完成相应的支付功能。

### 1.2 用词解释

| 商户      | 接入了平台并开通了API接口服务的商户。                                 |
| ------- | ---------------------------------------------------- |
| 用户/商户用户 | 在商户系统注册的用户，并非我司的用户。                                  |
| 通道      | 商户用户支付的方式，比如微信公众号支付通道。                               |
| 商户订单    | 在商户系统生成的订单，订单号不允许重复，重复提交不同信息，相同订单号的订单，以第一次提交的订单信息为准。 |
| 订单状态    | 订单状态目前有已支付/未支付两种状态。                                  |
| 异步通知    | 支付结果通过异步回调返回给商户发送的异步通知URL。                           |
| 页面返回    | 支付完成后，用户浏览器页面返回到商户发送的页面返回URL。                        |

### 1.3 开发指导

1. 原则上**不推荐**使用单号不变的同一笔商户支付单发起**多次**支付申请。
2. 由于对特殊字符的转义处理，一些字段的长度有时并**不能**达到其**最大长度**。
3. 异步回调通知商户失败或异常后，我司会**再次发起**异步回调通知，当前策略是**失败或异常后重发10次**，*1\~3次间隔约30秒*，*4\~6次间隔约120秒*，*7\~10次间隔约600秒*，每次会发出**1遍**请求。如果商户仍然无法正常响应，我司将不再发起异步回调通知。
4. 为避免风控，***支付金额将随机浮动-0.20元至0.20元***，即，在金额后面加入小数。
5. 必须发送能够**唯一确定的用户账号**，即accounts字段，平台将会将之与微信号进行绑定，从而自动选择合适的通道，否则如果因为该原因而未能分配到有效通道，与本平台无关。注意，如果是**同一微信账号**，发送**不同的accounts**字段，有可能会被**风控**。
6. 支付API模式，API模式下，下单IP必传且尽量保持真实，多次无效IP可能**风控**。
7. 切记不要用表单(Form)提交，用Json提交。
8. 所有 int 参数默认 0参与验签，Code不参与签名。

### 1.4 数据签名

#### 1.4.1 MD5签名

**签名串：**&#x7B7E;名串：所有需要传输的参数，去除sign字段和空字段（INT参数默认为0参与验签），按字母表升序排列成key-value格式(例：key1=val1\&key2=val2…)。

**签名私钥：**&#x6211;司分配给商户的用于签名和验签的`APIKEY`。

**完整签名串：**&#x7531;签名串和签名私钥拼接而成。

使&#x7528;**&**&#x7B26;号连接 发送方把签名串用MD5算法加密生成32位签名（全大写），作为sign字段传输。&#x20;

即：`sign = md5(key1=val1&key2=val2…&apikey)`

**验签：**&#x5F02;步回调通知商户需要检验数据真实性，验签算法和签名算法一致。 Int 类型参数传空默认为0 ，参与验签，Code不参与签名。

String sign = MD5Util.createSign(MD5Util.getObjectSortedMap(request), key);
