# CloudPay.profitSharing()

> 支持端：[云函数 2.0.2](/miniprogram/dev/wxcloudservice/wxcloud/reference/changelog-server-sdk)

请求单次分账

## 说明

单次分账请求按照传入的分账接收方账号和资金进行分账，同时会将订单剩余的待分账金额解冻给特约商户。故操作成功后，订单不能再进行分账，也不能进行分账完结。
**接口说明**

此接口与微信支付原分账接口（[文档](https://pay.weixin.qq.com/doc/v2/partner/4011984565)）的不同点在于：
- 私有安全链路，免证书管理，免签名计算
- 商户号填入 sub_mch_id 字段，小程序/公众号 appid 填入 sub_appid 字段
- 免填写以下字段：mch_id、appid、sign、sign_type
- 接口入参和返回值都为 JSON 而不是 XML
**接口限频**

接口限频：
1、单个服务商（请求分账） 300QPS，如果超过频率限制，会报错FREQUENCY_LIMITED，请降低频率请求。

2、单个交易收款商户（请求分账） 30QPS，如果超过频率限制，会报错FREQUENCY_LIMITED，请降低频率请求。同时，建议对同一主体的商户拆分多个商户号进行交易，避免交易集中到单个商户。

### 参数说明

| 名称             | 变量名         | 必填 | 类型          | 示例值                                                                                                                                                                                                                                                                                                               | 描述                                                                                                                                                                |
|------------------|----------------|------|---------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 子商户号         | sub_mch_id     | 是   | string(32)    | 1900000109                                                                                                                                                                                                                                                                                                           | 微信支付分配的子商户号                                                                                                                                              |
| 子商户公众账号ID | sub_appid      | 否   | string(32)    | wx8888888888888888                                                                                                                                                                                                                                                                                                   | 微信分配的子商户公众账号ID                                                                                                                                          |
| 随机字符串       | nonce_str      | 是   | string(32)    | 5K8264ILTKCH16CQ2502SI8ZNMTM67VS                                                                                                                                                                                                                                                                                     | 随机字符串，不长于32位。推荐随机数生成算法                                                                                                                          |
| 微信订单号       | transaction_id | 是   | string(32)    | 4208450740201411110007820472                                                                                                                                                                                                                                                                                         | 微信支付订单号                                                                                                                                                      |
| 商户分账单号     | out_order_no   | 是   | string(64)    | P20150806125346                                                                                                                                                                                                                                                                                                      | 服务商系统内部的分账单号，在服务商系统内部唯一（单次分账、多次分账、完结分账应使用不同的商户分账单号），同一分账单号多次请求等同一次。只能是数字、大小写字母_-\|*@  |
|  分账接收方列表  | receivers      | 是   | String(10240) | [
    {
         "type": "MERCHANT_ID",
         "account":"190001001",
         "amount":100,
         "description": "分到商户"
},
    {
         "type": "PERSONAL_OPENID",
         "account":"86693952",
         "amount":888,
         "description": "分到个人"
}
] | 分账接收方列表，不超过50个json对象，不能设置出资子商户作为分账接受方
点击行前的+展开字段详情                                                                     |

receivers 是个 JSON 序列化后的字符串，JSON 序列化前是个对象数组，其中的对象的定义如下：

| 名称                | 变量名      | 必填 | 类型       | 示例值      | 描述                                                                                                                                                                 |
|---------------------|-------------|------|------------|-------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| -分账接收方类型     | type        | 是   | string(32) | MERCHANT_ID | MERCHANT_ID：商户ID
PERSONAL_OPENID：个人openid（由父商户APPID转换得到）
PERSONAL_SUB_OPENID: 个人sub_openid（由子商户APPID转换得到）                              |
| -分账接收方账号     | account     | 是   | string(64) | 86693852    | 类型是MERCHANT_ID时，是商户ID
类型是PERSONAL_OPENID时，是个人openid
类型是PERSONAL_SUB_OPENID时，是个人sub_openid                                              |
| -分账金额           | amount      | 是   | int        | 888         | 分账金额，单位为分，只能为整数，不能超过原订单支付金额及最大分账比例金额                                                                                             |
| -分账描述           | description | 是   | string(80) | 分给商户A   | 分账的原因描述，分账账单中需要体现                                                                                                                                   |
| -分账个人接收方姓名 | name        | 否   | string(64) | 张三        | 可选项，在接收方类型为个人的时可选填，若有值，会检查与 name 是否实名匹配，不匹配会拒绝分账请求
1、分账接收方类型是PERSONAL_OPENID时，是个人姓名（选传，传则校验） |

### 返回值说明

| 字段名     | 变量名      | 必填 | 类型        | 示例值   | 描述                                                                             |
|------------|-------------|------|-------------|----------|----------------------------------------------------------------------------------|
| 返回状态码 | return_code | 是   | String(16)  | SUCCESS  | SUCCESS/FAIL  |
| 返回信息   | return_msg  | 否   | String(128) | 签名失败 | 返回信息，如非空，为错误原因。如 签名失败、参数格式校验错误                      |

以下字段在return_code为SUCCESS的时候有返回

| 名称             | 变量名       | 必填 | 类型        | 示例值                           | 描述                                                                       |
|------------------|--------------|------|-------------|----------------------------------|----------------------------------------------------------------------------|
| 业务结果         | result_code  | 是   | string(32)  | SUCCESS                          | SUCCESS：分账申请接收成功，结果通过分账查询接口查询
FAIL ：提交业务失败 |
| 错误代码         | err_code     | 否   | string(32)  | SYSTEMERROR                      | 列表详见错误码列表                                                         |
| 错误代码描述     | err_code_des | 否   | String(128) | 系统超时                         | 结果信息描述                                                               |
| 商户号           | mch_id       | 是   | string(32)  | 1900000100                       | 调用接口时提供的商户号                                                     |
| 子商户号         | sub_mch_id   | 是   | string(32)  | 1900000109                       | 微信支付分配特约商户的商户号                                               |
| 公众账号ID       | appid        | 是   | string(32)  | wx8888888888888888               | 调用接口提供的公众账号ID                                                   |
| 子商户公众账号ID | sub_appid    | 否   | string(32)  | wx8888888888888888               | 微信分配的子商户公众账号ID                                                 |
| 随机字符串       | nonce_str    | 是   | string(32)  | 5K8264ILTKCH16CQ2502SI8ZNMTM67VS | 微信返回的随机字符串                                                       |
| 签名             | sign         | 是   | string(64)  | C380BEC2BFD727A4B6845133519F3AD6 | 微信返回的签名，详见签名算法                                               |

以下字段在return_code和result_code都为SUCCESS的时候返回

| 名称         | 变量名         | 必填 | 类型       | 示例值                       | 描述                                 |
|--------------|----------------|------|------------|------------------------------|--------------------------------------|
| 微信订单号   | transaction_id | 是   | string(32) | 4208450740201411110007820472 | 微信支付订单号                       |
| 商户分账单号 | out_order_no   | 是   | string(64) | P20150806125346              | 调用接口提供的商户系统内部的分账单号 |
| 微信分账单号 | order_id       | 是   | string(64) | 3008450740201411110007820472 | 微信分账单号，微信系统返回的唯一标识 |

### 错误码

| 名称                  | 描述                 | 原因                                   | 解决方案                                                                |
|-----------------------|----------------------|----------------------------------------|-------------------------------------------------------------------------|
| SYSTEMERROR           | 接口返回错误         | 系统超时                               | 请不要更换商户分账单号，请使用相同参数再次调用API。否则可能造成资金损失 |
| AMOUNT_OVERDUE        | 分账金额超限         | 分账金额大于可分金额或大于分账最大比例 | 分账金额不能大于可分金额或大于最大分账比例金额，请调整分账金额          |
| RECEIVER_INVALID      | 分账接收方非法       | 未配置分账接收方                       | 分账接收方在分账之前需要进行添加                                        |
| INVALID_TRANSACTIONID | 无效的微信支付订单号 | 请求参数未按指引进行填写               | 请求参数错误，检查原交易号是否存在或发起支付交易接口返回失败            |
| PARAM_ERROR           | 参数错误             | 请求参数未按指引进行填写               | 请求参数错误，请重新检查再调用分账接口                                  |
| INVALID_REQUEST       | 请求不合法           | 参数中APPID或 MCHID不存在等            | 请检查请求参数                                                          |
| OPENID_MISMATCH       | Openid错误           | Openid 与Appid不匹配                   | 请检查Openid 是否正确                                                   |
| FREQUENCY_LIMITED     | 频率限制             | 请求过多被频率限制                     | 该笔请求未受理，请降低频率后原单重试，请勿更换商户分账单号              |
| ORDER_NOT_READY       | 订单处理中           | 订单处理中，暂时无法分账               | 订单处理中，暂时无法分账，请稍后再试                                    |
| NOAUTH                | 无分账权限           | 未开通分账权限                         | 请先开通分账                                                            |
| NOT_SHARE_ORDER       | 非分账订单           | 不是分账订单 无法分账                  | 下单时请用分账的合适参数                                                |

## 代码示例

```js
// 云函数代码
const cloud = require('wx-server-sdk')
cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV })

exports.main = async (event, context) => {
  const res = await cloud.cloudPay.profitSharing({
    subMchId: '1900000109',
    transactionId: '4208450740201411110007820472',
    outOrderNo: 'P20150806125346',
    receivers: JSON.stringify([
      { type: 'MERCHANT_ID', account: '190001001', amount: 100, description: '分到商户' }
    ]),
    nonceStr: '5K8264ILTKCH16CQ2502SI8ZNMTM67VS'
  })
  return res
}
```

如果是共享小程序调用，appid需要按如下方式传入`cloud.cloudPay({ appid: 'xxxxx' }).profitSharing({其他参数...})`，详情参考[环境共享指引文档](/miniprogram/dev/wxcloudservice/wxcloud/guide/resource-sharing/index)
