# CloudPay.closeOrder()

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

关闭订单

## 说明

以下情况需要调用关单接口：商户订单支付失败需要生成新单号重新发起支付，要对原订单号调用关单，避免重复支付；系统下单后，用户支付超时，系统退出不再受理，避免用户继续，请调用关单接口。
**注意：订单生成后不能马上调用关单接口，最短调用时间间隔为5分钟。**

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

### 参数说明

| 字段名        | 变量名       | 必填 | 类型       | 示例值                           | 描述                                                                                       |
|---------------|--------------|------|------------|----------------------------------|--------------------------------------------------------------------------------------------|
| 子商户号      | sub_mch_id   | 是   | String(32) | 1900000109                       | 微信支付分配的子商户号                                                                     |
| 商户订单号    | out_trade_no | 是   | String(32) | 1217752501201407033233368018     | 商户系统内部订单号，要求32个字符内，只能是数字、大小写字母_-|*@ ，且在同一个商户号下唯一。 |
| 随机字符串    | nonce_str    | 是   | String(32) | 5K8264ILTKCH16CQ2502SI8ZNMTM67VS | 随机字符串，不长于32位。推荐随机数生成算法, 其他说明见[安全规范](https://pay.weixin.qq.com/doc/v2/partner/4011985884)                                                    |

### 返回值说明

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

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

| 字段名        | 变量名       | 必填 | 类型        | 示例值                           | 描述                   |
|---------------|--------------|------|-------------|----------------------------------|------------------------|
| 服务商的APPID | appid        | 是   | String(32)  | wxd678efh567hg6787               | 服务商商户的APPID      |
| 商户号        | mch_id       | 是   | String(32)  | 1230000109                       | 微信支付分配的商户号   |
| 小程序的APPID | sub_appid    | 是   | String(32)  | wx8888888888888888               | 微信分配的小程序ID     |
| 子商户号      | sub_mch_id   | 是   | String(32)  | 1900000109                       | 微信支付分配的子商户号 |
| 随机字符串    | nonce_str    | 是   | String(32)  | 5K8264ILTKCH16CQ2502SI8ZNMTM67VS | 随机字符串，不长于32位 |
| 签名          | sign         | 是   | String(32)  | C380BEC2BFD727A4B6845133519F3AD6 | 签名，[验证签名算法](https://pay.weixin.qq.com/doc/v2/partner/4011985884)       |
| 业务结果      | result_code  | 是   | String(16)  | SUCCESS                          | SUCCESS/FAIL           |
| 业务结果描述  | result_msg   | 是   | String(32)  | OK                               | 对于业务执行的详细描述 |
| 错误代码      | err_code     | 否   | String(32)  | SYSTEMERROR                      | 详细参见下文错误列表   |
| 错误代码描述  | err_code_des | 否   | String(128) | 系统错误                         | 结果信息描述           |

### 错误码

| 名称                | 描述           | 原因                     | 解决方案                                         |
|---------------------|----------------|--------------------------|--------------------------------------------------|
| ORDERPAID           | 订单已支付     | 订单已支付，不能发起关单 | 订单已支付，不能发起关单，请当作已支付的正常交易 |
| SYSTEMERROR         | 系统错误       | 系统错误                 | 系统异常，请重新调用该API                        |
| ORDERCLOSED         | 订单已关闭     | 订单已关闭，无法重复关闭 | 订单已关闭，无需继续调用                         |
| SIGNERROR           | 签名错误       | 参数签名结果不正确       | 请检查签名参数和方法是否都符合签名算法要求       |
| REQUIRE_POST_METHOD | 请使用post方法 | 未使用post传递参数       | 请检查请求参数是否通过post方法提交               |
| XML_FORMAT_ERROR    | XML格式错误    | XML格式错误              | 请检查XML参数格式是否正确                        |

## 代码示例

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

exports.main = async (event, context) => {
  const res = await cloud.cloudPay.closeOrder({
    subMchId: '1900000109',
    outTradeNo: '1217752501201407033233368018',
    nonceStr: '5K8264ILTKCH16CQ2502SI8ZNMTM67VS'
  })
  return res
}
```

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