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

微信 Web App 开发, js-sdk 遇到 invalid signature 等错误,求帮助赠红包

  •  
  •   learnshare · 2016-08-03 12:49:51 +08:00 · 4372 次点击
    这是一个创建于 3035 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目前的状况:

    暂时规划包括支付和录音,支付已完成,并且一切正常。录音部分被 js-sdk 卡住了。

    错误描述:

    可以确定的是签名算法等后端逻辑没问题。
    然后在不同的页面调用 wx.config(),如果只给 jsApiList 'chooseWXPay' 一个参数,则正常执行;如果再添加 'startRecord' 或者更多参数,会在两个不同的页面遇到不同的问题:

    1. app.com/me "config:invalid url domain"
    2. app.com/resource/[resourceId]/detail "config:invalid signature"

    寻求帮助:

    因为发给 [email protected] 的邮件并没有收到回复,所以在这里呼叫一下腾讯或微信团队的朋友,希望能得到帮助。

    或者有朋友处理过 js-sdk 录音的功能,也希望能够得到你的帮助。

    请联系我 learnshare.hjq#gmail , wechat: LearnShare
    或者留下你的联系方式 :)

    解决问题发红包(个人出,也努力从老板兜里掏几毛)

    感谢各位。

    第 1 条附言  ·  2016-08-04 12:08:24 +08:00

    看来是 URL 的问题。

    解决办法:

    abc.com/path 改成 abc.com/#/path ,通过 abc.com/ 这个 URL 来签名。

    最初是因为微信网页授权跳转无法调到 abc.com/#/ 这个地址,所以设置 Angular.js 的 URL 为 html5Mode(true),也就是 abc.com/path 这种模式了。 看来要再单独处理授权登录跳转的问题了。

    第 2 条附言  ·  2016-08-08 11:34:31 +08:00
    录音等权限好了以后,授权登录跳转页解决了,支付果然又出了问题...

    想做平台,难啊!
    39 条回复    2016-08-04 12:13:24 +08:00
    learnshare
        1
    learnshare  
    OP
       2016-08-03 13:23:51 +08:00
    各位午休结束了么, HELP !
    iloveyou
        2
    iloveyou  
       2016-08-03 13:53:11 +08:00
    公众号后台允许的 url 填对没
    alichen
        3
    alichen  
       2016-08-03 13:54:03 +08:00
    问题无非就是管理后台的安全域名配置和前端参数加密
    learnshare
        4
    learnshare  
    OP
       2016-08-03 14:07:22 +08:00
    @iloveyou
    @alichen 后台配置没有问题,支付都是正常的。

    前端参数加密 指的是?
    xylitolLin
        5
    xylitolLin  
       2016-08-03 14:09:58 +08:00
    支付和其他功能用的 token 是由区别的,这个有没有看清楚
    justfindu
        6
    justfindu  
       2016-08-03 14:11:33 +08:00
    js -jdk 是最不容易出错的...因为只要你填写参数就够了啊
    alex321
        7
    alex321  
       2016-08-03 14:13:23 +08:00
    安全域名检查是否正确,并且确认签名的时候是把完整 url(除了 # 后面的)一起去签名的呃。
    learnshare
        8
    learnshare  
    OP
       2016-08-03 14:22:21 +08:00
    @xylitolLin 步骤三:通过 config 接口注入权限验证配置 这个 token 是一致的,出错的也是这一步;

    @justfindu 现在参数肯定是没问题的,多加了一个 'startRecord' 权限就出问题了,而且不同页面是不同的错误。

    @alex321 根据 URL 生成的签名没有问题,用 http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=cardsign 校验过。
    并且 URL 中没有 # 及之后的内容,安全域名也是检查过多次了
    xylitolLin
        9
    xylitolLin  
       2016-08-03 14:32:03 +08:00
    @learnshare

    ticket 是有两种的。

    https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi

    要用这个去获取 ticket 喔,注意后面的 type=jsapi
    learnshare
        10
    learnshare  
    OP
       2016-08-03 14:37:58 +08:00
    @alichen
    @alex321

    我做了这样的尝试,分别设置安全域名为: abc.comhttp://abc.com

    第一种在 PC 端调试工具及微信的第一个页面中提示 "config:ok",微信第二个页面是 "config:invalid signature";
    第二种在 PC 端调试工具及微信的第一个页面中提示 "config:invalid url domain",微信第二个页面还是 "config:invalid signature"。
    learnshare
        11
    learnshare  
    OP
       2016-08-03 14:40:17 +08:00
    @xylitolLin 后端部分用了现成的 Python 微信开发框架,这部分应该没有问题
    learnshare
        12
    learnshare  
    OP
       2016-08-03 14:46:15 +08:00
    @iloveyou
    @alex321

    我在 segmentfault 看到有朋友说 URL 中存在 "-" 这个字符会影响签名,因为现在用的测试域名是 app-test.xxx.xxx ,所以我再验证一下这个问题。
    alex321
        13
    alex321  
       2016-08-03 14:57:54 +08:00
    微信这个安全域名的生效周期会怪怪的。
    我当年设置的时候,设置好了立马验证提示 config:invalid url domain ,然后第二天就都正常了呃。。
    learnshare
        14
    learnshare  
    OP
       2016-08-03 15:05:27 +08:00
    pubby
        15
    pubby  
       2016-08-03 15:06:19 +08:00
    @learnshare
    安全域名需要完整域名 xxx.domain.com ,不影响 js-sdk 签名,只会影响“输入框防诈骗提示”,“网页被自动转码”之类的

    JS-SDK 的域名 可以只设 domain.com ,不需要完整域名。


    URL 中的"-"不会有问题

    微信支付的签名和 JS-SDK 签名是独立的,而且根本用不到 access_token/jsapi-ticket
    xxxyyy
        16
    xxxyyy  
       2016-08-03 15:26:49 +08:00 via Android
    或许支付不能跟其他的放在一起 config ,你可以试下只传 startRecord 给 jsApiList
    learnshare
        17
    learnshare  
    OP
       2016-08-03 16:02:41 +08:00
    @pubby Thanks ,看来域名这部分不会有问题

    @xxxyyy 单独测试 startRecord 或 hideOptionMenu ,都是第一个页面 OK ,第二个 invalid signature
    pubby
        18
    pubby  
       2016-08-03 16:15:15 +08:00
    @learnshare access_token / jsapi ticket 都缓存起来了吗? access_token 不要每次重新获取,你重新获取后,原来的 jsapi-ticket 都会失效。
    alichen
        19
    alichen  
       2016-08-03 16:24:20 +08:00
    微信 access_token 有失效时间,最好在后端调用的时候存起来
    xxxyyy
        20
    xxxyyy  
       2016-08-03 16:27:46 +08:00 via Android
    @learnshare 第二个页面单独使用 chooseWXPay 正常吗?如果有问题,检查下第二个页面的 URL 。
    learnshare
        21
    learnshare  
    OP
       2016-08-03 16:28:19 +08:00
    @pubby
    @alichen 后端部分没有问题,因为同样的签名,支付是可以正常用的。

    现在是除了 chooseW XPay ,其他 js-sdk 的接口权限都会导致 invalid signature.
    learnshare
        22
    learnshare  
    OP
       2016-08-03 16:28:41 +08:00
    @xxxyyy 单独 chooseWXPay 是正常的
    sxyclint
        23
    sxyclint  
       2016-08-03 17:09:40 +08:00
    首先微信提供了签名的算法,可以比对下结果看看是不是正确;
    页面注入配置的时候, url 申请的签名要和微信在浏览器里的那个域名对应上,也就是一个 url 一个签名
    jdlau
        24
    jdlau  
       2016-08-03 17:13:40 +08:00
    参数顺序对了没
    learnshare
        25
    learnshare  
    OP
       2016-08-03 17:29:55 +08:00
    @sxyclint 签名已经验证过, URL 也没有问题

    @jdlau 参数顺序并不影响这个问题,因为只要是非 chooseWXPay 的权限,都会签名无效
    xxxyyy
        26
    xxxyyy  
       2016-08-03 17:43:28 +08:00 via Android
    信息太少不好判断

    页面是单页面应用,还是传统的页面?
    签名是通过 ajax 获取的,还是直接渲染在页面上的?
    learnshare
        27
    learnshare  
    OP
       2016-08-03 18:09:22 +08:00
    @xxxyyy 基于 Angular.js 的单页应用,通过 Ajax 从后端 API 获取的签名数据
    xxxyyy
        28
    xxxyyy  
       2016-08-03 18:22:39 +08:00 via Android
    @learnshare 那通过 ajax 发送 URL 前是否 encode 了,后端接受到 URL 后是否 decoder 了?
    learnshare
        29
    learnshare  
    OP
       2016-08-03 18:25:30 +08:00
    @xxxyyy 没有 encode 和 decode ,用的是 POST
    xxxyyy
        30
    xxxyyy  
       2016-08-03 18:45:44 +08:00 via Android
    @learnshare POST 的 content-type 是什么? json 还是 formdata?
    xxxyyy
        31
    xxxyyy  
       2016-08-03 18:47:24 +08:00 via Android
    我猜问题可能还是在 URL 上。
    learnshare
        32
    learnshare  
    OP
       2016-08-03 18:54:24 +08:00
    @xxxyyy 当然是 JSON 。

    URL 应该没有问题,因为单纯支付就是正常的,其他 js-sdk 的接口都不正常。
    xi_lin
        33
    xi_lin  
       2016-08-03 19:03:11 +08:00
    chooseWXPay 这个接口很神奇的,我试过不请求支付权限照样可以调起支付。
    你试过设置分享接口吗?
    xiluo
        34
    xiluo  
       2016-08-03 22:37:39 +08:00 via iPhone
    目测楼主在做类分答的应用。
    有一个问题要注意,就是签名的时候传入的 nonstr 要全部小写
    learnshare
        35
    learnshare  
    OP
       2016-08-04 10:35:31 +08:00
    @xi_lin 目前在考虑 Angular.js URL 的问题了,或许 abc.com/path 这个方式会导致签名问题?
    我再尝试换回 abc.com/#/path 这个方式吧
    learnshare
        36
    learnshare  
    OP
       2016-08-04 12:07:39 +08:00
    @iloveyou
    @alichen
    @xylitolLin
    @justfindu
    @alex321
    @pubby
    @xxxyyy
    @sxyclint
    @jdlau
    @xi_lin
    @xiluo

    看来是 URL 的问题。

    解决办法:

    abc.com/path 改成 abc.com/#/path ,通过 abc.com/ 这个 URL 来签名。

    最初是因为微信网页授权跳转无法调到 abc.com/#/ 这个地址,所以设置 Angular.js 的 URL 为 html5Mode(true),也就是 abc.com/path 这种模式了。
    看来要再单独处理授权登录跳转的问题了。

    不过仍然感谢各位。
    pubby
        37
    pubby  
       2016-08-04 12:10:57 +08:00 via Android
    @learnshare 微信文档不是提到你这种单页应用了吗,这种情况要用新 URL 重新签名的
    learnshare
        38
    learnshare  
    OP
       2016-08-04 12:11:57 +08:00
    手动 SEO 一下,帮助更多失足程序员:

    微信 invalid signature
    js sdk invalid signature
    js-sdk invalid signature
    JS-SDK invalid signature
    learnshare
        39
    learnshare  
    OP
       2016-08-04 12:13:24 +08:00
    @pubby 是新的 URL ,但 abc.com/pathabc.com/#/path 是两种不同的 Angular.js 应用 URL 模式,签名也不同。这一点上微信没有测试过吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1339 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 17:27 · PVG 01:27 · LAX 09:27 · JFK 12:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.