收藏
回答

小程序订单支付和商户号关联问题,“sub_mch_id is empty”问题怎么解决?

AppID
wx7c20b41f505d6282

在开发微信小程序云开发环境中的支付功能时,遇到了以下问题:

1. **特约商户身份与配置不匹配**:

   - 商户号:XXXX

   - 在尝试使用`cloud.cloudPay.unifiedOrder`接口发起支付时,系统要求提供`subMchId`参数

   - 当不提供`subMchId`时,错误信息为:`"sub_mch_id is empty"`

   - 当提供`subMchId`(使用我们自己的商户号)时,错误信息为:`"受理关系不存在"`

2. **微信官方反馈与实际情况矛盾**:

   - 微信官方建议按普通商户进行处理

   - 但系统仍然要求提供`subMchId`参数,表明系统将我们的商户视为特约商户

3. **时间格式问题**:

   - 还遇到过时间格式验证错误:`"交易结束时间"字符串规则校验失败,字节数20,大于最大值14"`

   - 已通过使用14位数字字符串格式(yyyyMMddHHmmss)解决该问题

## 当前配置

目前的配置如下:

```javascript

const payParams = {

  body: body,

  outTradeNo: outTradeNo,

  spbillCreateIp: '127.0.0.1',

  totalFee: parseInt(totalFee * 100),

  subMchId: '', // 我们的商户号

  envId: 'cloud1-1gj8lmjh1f89fc5a',

  functionName: 'paymentCallback',

  timeExpire: timeExpireStr,

  attach: orderId

};

```

云函数日志返回:

返回结果

{"code":500,"message":"创建支付订单失败: OK, 错误代码: 受理关系不存在"}

日志

Init Report RequestId: ********-****-****-****-*********** Coldstart: ***ms (InitRuntime: *ms InitFunction: ***ms) Memory: ***MB MemUsage: **.**MB

START RequestId: ********-****-****-****-***********

Event RequestId: ********-****-****-****-***********

2025-04-23T02:29:27.008Z  准备创建支付订单: {

  body: '***商城-订单***********',

  outTradeNo: '***********',

  totalFee: ***,

  timeExpire: '20250423042927'

}

2025-04-23T02:29:27.010Z  支付相关配置: { subMchId: '**********', appId: 'wx***************' }

2025-04-23T02:29:27.011Z  支付参数: {

  body: '***商城-订单***********',

  outTradeNo: '***********',

  spbillCreateIp: '***.***.***.***',

  totalFee: ***,

  subMchId: '**********',

  envId: 'cloud*-***********',

  functionName: 'paymentCallback',

  timeExpire: '20250423042927',

  attach: '****************************'

}

2025-04-23T02:29:27.348Z  统一下单结果: {

  sign: '****************',

  payment: {

    timeStamp: '**********',

    nonceStr: '**************',

    package: 'prepay_id=',

    signType: 'MD5',

    paySign: '****************'

  },

  returnCode: 'SUCCESS',

  returnMsg: 'OK',

  nonceStr: '**************',

  resultCode: 'FAIL',

  errCode: *,

  errCodeDes: '受理关系不存在',

  errMsg: 'cloudPay.unifiedOrder:ok'

}

Response RequestId: ********-****-****-****-*********** RetMsg: {"code":500,"message":"创建支付订单失败: OK, 错误代码: 受理关系不存在"}


## 尝试过的解决方案

1. **按普通商户处理**:移除`subMchId`参数 → 失败,错误:`"sub_mch_id is empty"`

2. **按特约商户处理**:添加`subMchId`参数并使用我们自己的商户号 → 失败,错误:`"受理关系不存在"`

3. **修复时间格式**:将ISO时间格式改为14位数字格式 → 成功解决时间格式问题,但支付问题仍存在


## 需要确认的问题

1. 我们的商户号是普通商户还是特约商户?微信支付官方说是因为开通了企业微信收款码导致从普通商户变成特约商户,但小程序调起支付还是按照普通商户的方法进行,但报错返回错误:`"sub_mch_id is empty"`,说明还是需要提供子商户号

2. 如果是特约商户:

   - 我们需要服务商的商户号吗?该如何获取?

   - 如何在微信支付商户平台上建立正确的"受理关系"?

3. 如果是普通商户:

   - 为什么`cloud.cloudPay.unifiedOrder`接口要求提供`subMchId`参数?

   - 有没有特定的云开发环境配置可以绕过这一要求?







最后一次编辑于  星期三 14:20
回答关注问题邀请回答
收藏

3 个回答

  • drop
    drop
    星期三 11:00

    特约商户是说通过服务商进件获取的商户号,但是有时候特约商户可以自己直接当普通商户去调接口 走直连模式的。所以不用管类型 直接聚焦你接口的参数传递问题就行按流程接入

    星期三 11:00
    有用
    回复
  • Memory (私信不回复)
    Memory (私信不回复)
    星期二 16:53

    没看懂你表达的什么,贴代码吧

    星期二 16:53
    有用
    回复 3
    • Gwen
      Gwen
      星期三 14:09
      好的,我重新编辑了一下,麻烦看看
      星期三 14:09
      回复
    • Memory (私信不回复)
      Memory (私信不回复)
      星期三 14:37回复Gwen
      星期三 14:37
      回复
    • Gwen
      Gwen
      星期三 14:51
      谢谢
      星期三 14:51
      回复
  • 智能回答 智能回答 该问答由AI生成
    星期二 15:53
    有用
登录 后发表内容