微信支付解决商品描述大于最大值 127 [PARAM_ERROR]

报错

{"code":"PARAM_ERROR","detail":{"location":"body","value":129},"message":"输入源“/body/description”映射到值字段“商品描述”字符串规则校验失败,字节数 129,大于最大值 127"}

这里 129 是一个动态的数字,表示提交的字节数。

尝试解决

对 description 字符串进行截取

description = substringByBytes(description, 127);

定义

function substringByBytes(str, n) {
  let bytes = 0;
  for (let i = 0; i < str.length; i++) {
    // 获取当前字符的字节长度
    const byteLen = str.charCodeAt(i) > 255 ? 2 : 1;
    // 如果当前字符的字节长度加上已经累计的字节数大于 n,则直接返回截取的字符串
    if (bytes + byteLen > n) {
      return str.slice(0, i);
    }
    bytes += byteLen;
  }
  return str;
}

然而报错相同的错误。

原来微信支付可能是将汉字视为 3 个字节。

修复

重新定义 substringByBytes,最终的代码为

function substringByBytes(str, n) {
  let bytes = 0;
  for (let i = 0; i < str.length; i++) {
    // 获取当前字符的字节长度
    const byteLen = str.charCodeAt(i) > 255 ? 3 : 1;
    // 如果当前字符的字节长度加上已经累计的字节数大于 n,则直接返回截取的字符串
    if (bytes + byteLen > n) {
      return str.slice(0, i);
    }
    bytes += byteLen;
  }
  return str;
}

是不是可能跟字符串编码有关系呢?比如

在UTF-8编码下,一个中文字符占3个字节;而使用GBK编码时一个中文字符占2个字节

参考

  • https://blog.csdn.net/u013107634/article/details/104848502
  • https://blog.csdn.net/weixin_39732534/article/details/110743346
  • https://cloud.tencent.com/developer/article/1691166
关于本文如您有任何想法和意见,欢迎与我们联系,邮箱地址zhi@uqugu.com
您对本文有什么看法,喜欢或者不喜欢都可以发表意见。