V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
makuta
V2EX  ›  Node.js

微信 js sdk 签名错误

  •  1
     
  •   makuta · 2015-01-27 13:53:09 +08:00 · 11291 次点击
    这是一个创建于 3592 天前的主题,其中的信息可能已经有所发展或是发生改变。

    获取的signature在 http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign 做了验证通过 但是通过微信访问的时候 老报 invalid signature

    我的服务端是nodejs

    var access_token = function() {
    return function(done) {
    var token_url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=' + appId + '&secret=' + appSecret
    var self = this;
    request(token_url, function(error, response, body) {
    if (!error && response.statusCode == 200) {
    logger.info('access_token');
    token = JSON.parse(body).access_token;
    }
    done();
    })
    }
    }

    var get_jsapi_ticket = function() {
    return function(done) {
    var jsapi_ticket_url = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=' + token + '&type=jsapi';
    request(jsapi_ticket_url, function(error, response, body) {
    if (!error && response.statusCode == 200) {
    logger.info('get_jsapi_ticket');
    ticket = JSON.parse(body).ticket;
    done();
    }
    })
    }
    }

    求帮助谢谢~~~~~

    25 条回复    2015-05-30 18:58:01 +08:00
    raquelken
        1
    raquelken  
       2015-01-27 14:05:57 +08:00
    你这里只是获取ticket,还要用ticket, noncestr, timestamp还有你要调用这个js的页面的url生成一个signature, 返回给前端js,然后通过config接口注入权限验证配置啊 具体算法看这里 http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html#.E6.AD.A5.E9.AA.A4.E4.B8.80.EF.BC.9A.E7.BB.91.E5.AE.9A.E5.9F.9F.E5.90.8D
    makuta
        2
    makuta  
    OP
       2015-01-27 14:15:44 +08:00
    @raquelken 我有那一段
    var fetch = function() {
    return function(done) {
    var config = sign(ticket, 'http://example.com')我的域名就不方便写了 用example代替
    this.result = {
    ret_code: 0,
    config: _.extend(config, {
    appId: appId
    })
    };

    done();
    }
    };
    raquelken
        3
    raquelken  
       2015-01-27 14:23:43 +08:00
    用这个校验下你的signature是否正确 http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign
    makuta
        4
    makuta  
    OP
       2015-01-27 14:26:00 +08:00
    @raquelken 验证了也通过了
    raquelken
        5
    raquelken  
       2015-01-27 14:59:34 +08:00
    你url传到后台是不是encode过的?然后生成signature的时候需要decode的
    makuta
        6
    makuta  
    OP
       2015-01-27 15:08:03 +08:00
    @raquelken
    url 我是在后台写死的 没有传 你也是nodejs 弄的吗?
    raquelken
        7
    raquelken  
       2015-01-27 15:11:39 +08:00
    不是,我是ruby,不过应该都差不多吧
    我的 noncestr是随机的16位字符串
    还有就是url的问题,看看附录5的第六条
    66beta
        8
    66beta  
       2015-01-27 15:12:27 +08:00
    我PHP也发生过,本机测试好的,放到服务器就拿不到,后来发现是客户端网络不好~
    makuta
        9
    makuta  
    OP
       2015-01-27 15:14:59 +08:00
    @66beta 我服务端可以拿到东西 我在Log里看到了 但是不知道 为啥 签名老 invalid
    makuta
        10
    makuta  
    OP
       2015-01-27 15:16:24 +08:00
    @raquelken noncetr 我是用的官网提供的node模块 只用ticket 然后就可以返回 对应的认证参数
    makuta
        11
    makuta  
    OP
       2015-01-27 15:17:06 +08:00
    @66beta 你说的本地测试是什么意思???
    66beta
        12
    66beta  
       2015-01-27 15:18:01 +08:00
    @makuta 后端拿到几个参数写到前端,客户端JS不是也要验证一次的么,就是这里拿不到
    有几次虽然提示invalid了,但是过一会还是生效了
    66beta
        13
    66beta  
       2015-01-27 15:18:39 +08:00
    @makuta 本地测试就是用ngrok代理
    makuta
        14
    makuta  
    OP
       2015-01-27 16:16:39 +08:00
    @66beta 我本地启了一个 8080端口 为什么启ngrok后 访问那个地址 老是404啊
    sb
        15
    sb  
       2015-01-27 17:15:28 +08:00
    既然你说了你用那个签名工具做了签名验证测试了,想必你的代码已经没有问题了。
    你现在要仔细确认下你的微信内的app的所在url是否跟你后台传入的url一致 或者是否在同一个域下,基本就是这个url的问题,慢慢调下吧
    Had
        16
    Had  
       2015-01-27 21:46:13 +08:00
    @66beta
    看到ngrok我就默默进来了...
    如果觉得ngrok速度不佳的话,可以试试https://www.tunnel.mobi ...
    ariesjia
        17
    ariesjia  
       2015-01-28 09:15:52 +08:00
    你这里拿了token 签名需要 timestamp nonceStr 还有 url ,这个url是你公众号配置了的url
    66beta
        18
    66beta  
       2015-01-28 10:11:22 +08:00
    @Had 你是tunnel.mobi作者?域名备案过,好贴心~
    yunshansimon
        19
    yunshansimon  
       2015-01-28 12:54:14 +08:00
    @makuta 检查你的string的形式,utf-8还是gb2312。如果之前没有设定,查一下文档,默认值是什么,然后改成另外一个试一下。我没用过node.js,但通常什么都对的情况下还抱错,就是string编码问题了。
    leecheung
        20
    leecheung  
       2015-02-03 15:59:31 +08:00
    我的用微信提供的js签名校验工具测试通过了,可是还是报签名错误
    nasa
        21
    nasa  
       2015-02-08 00:05:25 +08:00
    我来告诉你们为什么吧,我是被腾讯坑惨了。 文档中的这个参数 noncestr s是小写的,实际上你要nonceStr 大写S才行。 哎 这个问题害的我们年会都没过好。
    henzil
        22
    henzil  
       2015-02-13 09:46:34 +08:00
    @makuta var config = sign(ticket, 'http://example.com')每个页面都是一个url,都需要获取sign。这个地方传的url是你当前的页面的url。
    lujiajing1126
        23
    lujiajing1126  
       2015-02-15 20:58:15 +08:00
    你是不是url传错了啊。。。官方推荐用location.href.split('#')[0]
    makuta
        24
    makuta  
    OP
       2015-02-15 21:36:28 +08:00
    @lujiajing1126 恩 是的 我前几天发现 就是这个问题
    xiaoguidan
        25
    xiaoguidan  
       2015-05-30 18:58:01 +08:00
    楼主解决了吗?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1034 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 20:14 · PVG 04:14 · LAX 12:14 · JFK 15:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.