收藏
回答

【后端】checkSession加密无限失败

框架类型 问题类型 API/组件名称 终端类型 微信版本 基础库版本
小游戏 需求 后端checkSession 微信iOS客户端 UNKNOWN UNKNOWN

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;
    }
}


麻烦指出问题所在。文档写得太不清楚了实在没招了。谢谢。

最后一次编辑于  2019-08-26
回答关注问题邀请回答
收藏

4 个回答

  • J.C
    J.C
    2019-08-26

    已经试出来了。 当经验分享吧。。。。

    正确的方法是

    把session_key当hmac的密钥,对“”(空字符串)加密!!!!得到的结果!!

    示例:GetHmacSha256CodeString("", "0oXdWVe2GEzM8SeHPp1L35==")

    我能说什么??编程全靠猜。。。滑稽。。。

    2019-08-26
    有用 9
    回复 3
    • 林龙
      林龙
      2020-04-23
      最近也被坑了,坑成狗
      2020-04-23
      1
      回复
    • y
      y
      2020-06-19
      官方的文档。。。。。。真的是靠猜
      2020-06-19
      1
      回复
    • 刘敏
      刘敏
      2023-11-16
      最近遇到了这个坑。 服了
      2023-11-16
      回复
  • Jom
    Jom
    06-16

    给我气笑了,我从hmacsha256算法研究了一天,要怎么不输入密钥进行加密,张x龙你出来

    06-16
    有用
    回复
  • momo
    momo
    04-14

    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

            ];


    04-14
    有用
    回复
  • 李旭
    李旭
    2022-11-22

    楼上老哥说的对,我这儿补一段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
    
    
    
    2022-11-22
    有用
    回复
登录 后发表内容
问题标签