HarmonyOS 鸿蒙Next中微信支付验证签名失败

HarmonyOS 鸿蒙Next中微信支付验证签名失败 请教下我一直微信支付验证签名失败,有遇到过吗?我是用的调试证书,微信登录没有问题,但是支付一直验证失败,支付的签名我是在APP签名的。

我尝试换了好几个md5加密的方法,但是生成的加密字符串都是一样,感觉跟md5加密应该没有什么区别。md5同步异步都方法都试过

不知道是哪里有问题,安卓是可以支付的。

public async pay(params: WXPayParams): Promise<boolean | null> {
  if (!this.wxApi?.isWXAppInstalled()) {
    return Promise.resolve(null)
  }
  
  return new Promise((resolve) => {
    this.payResolver = resolve
    const req = new wxopensdk.PayReq();
    req.partnerId = params.partnerid
    req.appId = params.appid
    req.packageValue = params.package
    req.prepayId = params.prepayid
    req.nonceStr = params.noncestr
    req.timeStamp = params.timestamp
    let parameters: Map<string, string> = new Map();
    parameters.set("appid", req.appId);
    parameters.set("noncestr", req.nonceStr);
    parameters.set("package", req.packageValue);
    parameters.set("partnerid", req.partnerId);
    parameters.set("prepayid", req.prepayId);
    parameters.set("timestamp", req.timeStamp);
    let pStr = this.createSignFromMaps(parameters)
    let test1111 =  CryptoJS.MD5(pStr).toString().toUpperCase()
    req.sign = test1111
    this.handler.registerOnRespCallback(this._onResp.bind(this))
    this.wxApi?.sendReq(getContext(this) as common.UIAbilityContext, req)
  })
}

static async createSignFromMap(parameters: Map<string, string>): Promise<string> {
  const keys = Array.from(parameters.keys())
    .filter(k => k !== 'sign' && k !== 'key' && parameters.get(k) !== null && parameters.get(k) !== '')
    .sort();
  // 2. 拼接参数
  let sb = '';
  for (const k of keys) {
    sb += `${k}=${parameters.get(k)}&`;
  }
  // 3. 拼接商户秘钥
  sb += `key=${app_key}`;
  sb = sb.trim().replace(/\u200B/g,''); // 去零宽空格
  // 4. 打印调试
 let sign =await HashUtil.md5(sb)
  return sign.toUpperCase();
}

  createSignFromMaps(parameters: Map<string, string>): string{
  const keys = Array.from(parameters.keys())
    .filter(k => k !== 'sign' && k !== 'key' && parameters.get(k) !== null && parameters.get(k) !== '')
    .sort();
  // 2. 拼接参数
  let sb = '';
  for (const k of keys) {
    sb += `${k}=${parameters.get(k)}&`;
  }
  // 3. 拼接商户秘钥
  sb += `key=${app_key}`;
 sb = sb.trim().replace(/\u200B/g,''); // 去零宽空格
  // 4. 打印调试
 return sb
}

更多关于HarmonyOS 鸿蒙Next中微信支付验证签名失败的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

在HarmonyOS Next中,微信支付验证签名失败通常是由于签名算法或密钥配置不一致导致的。请检查应用与微信开放平台配置的签名信息是否完全匹配,包括包名、应用ID及密钥。确保使用正确的签名生成方式,并验证网络请求中的参数顺序及编码是否符合微信API要求。

更多关于HarmonyOS 鸿蒙Next中微信支付验证签名失败的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


签名验证失败通常由参数拼接或密钥处理导致。检查以下几点:

  1. 确认 app_key 是否正确配置,与微信商户平台一致
  2. 参数拼接顺序需按ASCII码排序,代码中已使用 sort(),但需确保所有参数(包括 package)参与签名
  3. 注意 packageValue 字段在微信支付中实际为 package,但签名时需使用原始参数名 “package”
  4. 调试时输出 sb 字符串,与微信官方文档的示例对比,确保拼接格式一致
  5. 检查是否有特殊字符或空格处理,代码中已去除零宽空格,但需验证其他不可见字符

若安卓正常而鸿蒙失败,重点排查环境差异,如密钥存储或字符编码处理。

回到顶部