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
为实战讲解。
一:找到需要参与sign
的key/value
参数。
先看官网文档,如下:
amount
是orderInfo
中必传参数,也是生成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
请教一个问题,你使用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
的步骤如下:
-
获取参数:收集所有需要签名的参数,包括
appId
、cpId
、orderId
、productName
、amount
等。 -
排序参数:将参数按字典序排序,确保签名的一致性。
-
拼接字符串:将排序后的参数按
key=value
格式拼接成字符串,用&
连接。 -
生成签名:使用HMAC-SHA256算法对拼接后的字符串进行加密,密钥为
appSecret
。 -
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
保密,防止泄露。