HarmonyOS鸿蒙Next中华为快游戏如何正确生成支付签名sign[JS篇]

HarmonyOS鸿蒙Next中华为快游戏如何正确生成支付签名sign[JS篇] 问题描述

参考华为快游戏官网文档,生成的sign,结果拉不起支付?咨询技术支持答复是参数错误,可是我看了一圈订单参数orderInfo,只有sign最可疑?可是怎么生成sign呢?

问题原因

查看华为官网,发现他们描述在一起,总结下来生成sign就三点要求。

一:将orderInfo中被标记为需要参与生成sign的签名的参数,用key=value形式按照ASCII码大小用&拼接成字符串S,如下:

S="a=xxxxxx&b=xxxxxxx&c=xxxxxxxxxxx"  

二:将S使用RSA算法(SHA256WithRSA)进行签名。

三:将签名后的字符数组经过Base64编码,生成签名值。

过程总结起来就以上三点,我们一一解开谜底。

解决办法

下面以JS生成sign为实战讲解。

一:找到需要参与signkey/value参数。

先看官网文档,如下:

amountorderInfo中必传参数,也是生成sign的必传参数; 但是country不是orderInfo中必传参数,确是生成sign的必传参数,遇到这种情况怎么处理呢? 需要用到country参与签名码?答案分两种情况讨论:

1:如果orderInfo中非必传参数,你传了,如country,那就需要参与签名 2:如果orderInfo中非必传参数,不传,那即使该参数标记需要参与签名,由于不传就是空参数,所以不需要参与签名。

针对以上这种情况,我们orderInfo中参数能不传就不传,这样也少点参数签名。

二:使用RSA算法(SHA256WithRSA)进行签名

我们当然不可能自己实现一遍SHA256的签名,这里由于使用JS语言,给大家推荐github上的jsrsasign库,可以通过npm导入到项目也可以把JS当插件导入,这里我们把jsrsasign-all-min.js库下载到本地导入为插件使用。导入后再编写以下代码:

注意这里的PRIVATE_KEY要用2.0支付私钥

三:将签名后的字符数组经过Base64编码,生成签名值

经过以上步骤,我们就成功实现了sign的生成,当然生成方法也可以服务端用java进行签名,这个我们下期介绍。相信看完这篇的小伙伴一定明白了生成sign的步骤,期待接入华为支付了。

相关库文档参考: https://github.com/kjur/jsrsasign


更多关于HarmonyOS鸿蒙Next中华为快游戏如何正确生成支付签名sign[JS篇]的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

请教一个问题,你使用jsrsasign-all-min.js的时候,编译会提示navigator报错吗?处理完navigator后,还有别的处理吗?

我导入jsrsasign-all-min.js,手动export { KJUR as default} 并且 处理navigator报错之后,运行new new KJUR.crypto.Signature({ alg: ‘SHA1WithRSA’ }) 直接抛出异常了。

报错日志: Version:1.0.0 Pid:28757 Uid:10208 Lifetime: 30.000000s Js-Engine: ark page: pages/index.js provider not supported: undefined Error message: undefined Stacktrace: undefined

更多关于HarmonyOS鸿蒙Next中华为快游戏如何正确生成支付签名sign[JS篇]的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,生成华为快游戏支付签名sign的步骤如下:

  1. 获取参数:收集所有需要签名的参数,包括appIdcpIdorderIdproductNameamount等。

  2. 排序参数:将参数按字典序排序,确保签名的一致性。

  3. 拼接字符串:将排序后的参数按key=value格式拼接成字符串,用&连接。

  4. 生成签名:使用HMAC-SHA256算法对拼接后的字符串进行加密,密钥为appSecret

  5. Base64编码:将加密后的结果进行Base64编码,得到最终的sign

示例代码:

const crypto = require('crypto');

function generateSign(params, appSecret) {
    const sortedParams = Object.keys(params).sort().map(key => `${key}=${params[key]}`).join('&');
    const hmac = crypto.createHmac('sha256', appSecret);
    hmac.update(sortedParams);
    return hmac.digest('base64');
}

确保appSecret保密,防止泄露。

回到顶部