https://developers.weixin.qq.com/minigame/dev/api-backend/open-api/login/auth.checkSessionKey.html
到底怎么加密?
像jssdk会有非常详细的拼字符串,等等非常详细。
你们这文档写的不清不楚。只告诉加密方式hmacsha256就没了。。。用hmacsha256加密什么?只加密session就可以了吗?
但是我不管怎么加密出来,都无限返回
invalid signature hint: [82oAkA03451090]
具体到底是怎么加密的??尝试了所有有可能有问题的点。所有结果都是invalid signature....
我加密之后得到的字符串和你们文档提供的示例长度是一样的:
这是我的结果:
b8b6065192421b94937f0c0b3b8fe690ecb8721fc5e192eba54af5860e60bbf4 |
你们文档里的:
fefce01bfba4670c85b228e6ca2b493c90971e7c442f54fc448662eb7cd72509 |
我的加密代码:
private string GetHmacSha256CodeString( string raw, string secret) { secret = string .IsNullOrEmpty(secret) ? "" : secret; byte [] keyByte = Encoding.UTF8.GetBytes(secret); byte [] messageBytes = Encoding.UTF8.GetBytes(raw); using ( var hmacsha256 = new HMACSHA256(keyByte)) { byte [] outBytes = hmacsha256.ComputeHash(messageBytes); string result = BitConverter.ToString(outBytes).Replace( "-" , "" ).ToLower(); return result; } } |
麻烦指出问题所在。文档写得太不清楚了实在没招了。谢谢。
已经试出来了。 当经验分享吧。。。。
正确的方法是
把session_key当hmac的密钥,对“”(空字符串)加密!!!!得到的结果!!
示例:GetHmacSha256CodeString("", "0oXdWVe2GEzM8SeHPp1L35==")
我能说什么??编程全靠猜。。。滑稽。。。
给我气笑了,我从hmacsha256算法研究了一天,要怎么不输入密钥进行加密,张x龙你出来
PHP的代码:
$data = [
"access_token" => $access_token,//必填 接口调用凭证,该参数为 URL 参数,非 Body 参数。使用access_token或者authorizer_access_token
"openid" => $openid,//必填 用户唯一标识符
"signature" => hash_hmac("sha256", "", $session_key, false),//必填 用户登录态签名,用session_key对空字符串签名得到的结果。即 signature = hmac_sha256(session_key, "")
"sig_method" => "hmac_sha256",//必填 用户登录态签名的哈希方法,目前只支持 hmac_sha256
];
楼上老哥说的对,我这儿补一段nodejs版本的代码:
const crypto = require('crypto'); // 对数据 进行签名 function sign(secKey, msg){ const hmac = crypto.createHmac('sha256', secKey); const data = hmac.update(msg); const gen_hmac= data.digest('hex'); return gen_hmac; } const signature = sign("oAvl9nPf/cacJKQ/Zuwdsg==",""); console.log(signature); // 输出: 9bce8b6bdd7038f3856a6b2e3a03f13cdcba7c210ae8248ce4d3273029b9d064