文档章节

记一次微信分享接口报invalid signature

diligency
 diligency
发布于 08/08 16:05
字数 944
阅读 215
收藏 1
SPA

根据微信接口文档写了一个分享功能,结果一开始就报invalid signature 签名错误,搞得很头大,卡了三天,期间一直百度,几乎各种错误调试都试了,最后在一篇文章中看到:前端传递的url地址是经过 encodeURIComponent的,所以后台接收到需要 decode 一下,才恍然大明白了。因为微信获取code值的时候就是需要encodeURI的,然后经过调试,通车了。今天把可能的情况都罗列一下;

invalid signature签名错误建议按如下顺序检查:

(1)确认签名算法正确,可用 http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign 页面工具进行校验。

(2)确认config中nonceStr(js中驼峰标准大写S), timestamp与用以签名中的对应noncestr, timestamp一致。

(3)确认url是页面完整的url(请在当前页面alert(location.href.split('#')[0])确认),包括'http(s)://'部分,以及'?'后面的GET参数部分,但不包括'#'hash后面的部分。

(4)确认 config 中的 appid 与用来获取 jsapi_ticket 的 appid 一致。

(5)确保一定缓存access_token和jsapi_ticket。

(6)如果是卡劵调用接口为:

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

平常接口:

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

如果以上方法都试过了,还是报签名错误,以下方法或许可以解决

1、查一下反向代理服务器,有可能映射的地址和实际地址是有出入的

2、如果你用的是静态页面,在你配置wx.config之前,先通过location.href.split('#')[0]把当前url编码传递到后台,后台通过

URLDecoder.decode(url, "UTF-8");解码,解码是必须的;

贴上我的主要代码 /<![CDATA[*/ var contextPath = /*[[@{/}]]*/ ''; /*]]>/

    $(function(){
        var url=location.href.split('#')[0];
        var req={
            url:url
        }
        $.ajax({
            url:contextPath+'getJSParams',
            data:req,
            dataType:'json',
            type:'post',
            async:true,
            success:function(data){

                console.log(data.appId);
                console.log(data.noncestr);
                console.log(data.signature);
                console.log(data.timestamp);
                console.log(url);

                var appId=data.appId;
                var nonceStr=data.noncestr;
                var signature=data.signature;
                var timestamp=data.timestamp;
                wx.config({
                    debug:false,
                    appId:appId,
                    timestamp:timestamp,
                    nonceStr:nonceStr,
                    signature:signature,
                    jsApiList: [
                        'checkJsApi',
                        'onMenuShareAppMessage'
                    ]
                });
            }
        });
    });


    function shareMessage(){



        wx.ready(function(){

            wx.onMenuShareAppMessage({
                title: '',
                desc: '',
                link: '',
                imgUrl: '',
                trigger: function (res) {
                    // 不要尝试在trigger中使用ajax异步请求修改本次分享的内容,因为客户端分享操作是一个同步操作,这时候使用ajax的回包会还没有返回
                    // alert('用户点击发送给朋友');
                },
                success: function (res) {
                    alert('已分享');
                },
                cancel: function (res) {
                    alert('已取消');
                },
                fail: function (res) {
                    alert(JSON.stringify(res));
                }
            });

            wx.error(function(conf) {
                console.log(conf);
                console.log(conf.errMsg);
                // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
            });
        })
    }
/**
 * 获取微信js接口参数
 *
 * [@param](https://my.oschina.net/u/2303379) request
 * [@param](https://my.oschina.net/u/2303379) model
 * [@return](https://my.oschina.net/u/556800)
 */
@RequestMapping(value = "getJSParams", method = {RequestMethod.POST})
@ResponseBody
public String getJSParams(HttpServletRequest request, Model model) {
    String url = request.getParameter("url");
    WXJSParams wxjsParams = new WXJSParams();
    try {
        url = URLDecoder.decode(url, "UTF-8");
        logger.info("获取微信js接口参数url之一" + url);
        wxjsParams = wechatUserService.getJSParams(model, url);
    } catch (Exception e) {
        logger.info("获取微信js接口参数出错:" + e.getMessage());
    }
    return JSONObject.toJSONString(wxjsParams);
}

/**
 * 获取微信js参数
 *
 * @param model
 * @param url
 * @return
 */
@Override
public WXJSParams getJSParams(Model model, String url) {
    String jsApiTicket = customerJsApiTicketRepository.find();
    //随机字符串
    String noncestr = StringUtil.getStringRandom(16);
    //时间戳
    String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
    //注意这里参数名必须全部小写,且必须有序
    String tempStr = "jsapi_ticket=" + jsApiTicket +
            "&noncestr=" + noncestr +
            "&timestamp=" + timestamp +
            "&url=" + url;
    //sha1加密
    String signature = EncryptUtil.SHA1(tempStr);
    WXJSParams wxjsParams = new WXJSParams();
    wxjsParams.setAppId(appid);
    wxjsParams.setNoncestr(noncestr);
    wxjsParams.setSignature(signature);
    wxjsParams.setTimestamp(timestamp);
    logger.info("微信js参数wxjsParams:" + wxjsParams);
    logger.info("微信js参数jsApiTicket:" + jsApiTicket);
    return wxjsParams;
}

© 著作权归作者所有

共有 人打赏支持
diligency
粉丝 1
博文 2
码字总数 1527
作品 0
济南
程序员
加载中

评论(1)

风吹屁屁凉
风吹屁屁凉
我们团队用完微信之后的总结:微信API,坑你没商量:triumph:
微信 JSSDK 报 config:invalid signature 错误

在微信公众号开发中遇到自定义分享内容。使用 JSSDK 的时候一直报 config:invalid signature 错误。 大家可以先参考一下腾讯的官方说明。 然后需注意一下几点: 签名要用到的jsapi_ticket需要...

Jack088
2016/05/18
162
0
微信 签名 invalid signature 问题

微信接口开发问题重现: 已经开发好签名方法 测试1: 成功分享 进行sha1签名的原始字符串为,注意url不带参数 jsapi_ticket=xxxx&noncestr=yyyy×tamp=1414587457&url=http://kkkk.com/测...

sucanber
2015/10/16
440
4
angularjs的路由url如何实现jssdk的签名?

使用angularjs框架调用微信jssdk的分享接口一直报“errMsg:config:invalid signature"按官方排查步骤排查到最后一步都是正确的。 唯一怀疑的是angularjs的页面访问会带#,不知道这个问题哪个...

lanceli
2017/02/17
362
2
微信分享JSSDK-invalid signature签名错误的解决方案

核对官方步骤,确认签名算法。 确认签名算法正确,可用 http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign 页面工具进行校验。 确认config中nonceStr(js中驼峰标准大写S), times...

王磊的博客
2017/04/19
0
0
微信js sdk invalid signature签名错误 问题解决。

/*最近在做微信js sdk 接口调用说明/***相信很多人都遇见像我这样的问题,再加上自己只能算是半个程序员,所以苦苦摸索了好久终于搞懂了。下面就把自己所遇见的各种问题和大家分享一下,都是...

Oscarfff
2015/01/24
0
25

没有更多内容

加载失败,请刷新页面

加载更多

Synchronize和ReentrantLock区别

目录介绍 1.Synchronize和ReentrantLock区别 1.1 相似点 1.2 区别 1.3 什么是线程安全问题?如何理解 1.4 线程安全需要保证几个基本特性 2.Synchronize在编译时如何实现锁机制 3.ReentrantL...

潇湘剑雨
32分钟前
1
0
ModelMap的用法

ModelMap的用法 ModelMap对象主要用于传递控制方法处理数据到结果页面,也就是说我们把结果页面上需要的数据放到ModelMap对象中即可,他的作用类似于request对象的setAttribute方法的作用,用...

DemonsI
41分钟前
1
0
Hibernate环境搭建过程

B站Hibernate教学视频原网址 下边代码是照着视频一步步写出来的。由于没有视频中老师所写的文件。所以xml文件中的dtd约束是直接在网上搜到复制来的。 和视频中一样,用的MySQL数据库。数据库...

BG2KNT
43分钟前
0
0
Fragment之软件主页面制作

Fragment是一种Android 3.0后引入的API ,它出现的初衷是为了适应平板电脑的大屏幕,手机界面小巧可放下的内容有限,而平板宽阔可以放下手机上的两三个界面一起合起来展示,多个Fragment可以组...

鱼想吃肉
50分钟前
1
0
关于网站恶意注册会员

网站发生恶意注册会员,有图形验证码 ,和短信验证码 但是还是有大量恶意注册: session 和 cookie都是可以随便伪造的。 验证码有打码平台。 短信验证有短信验证平台。 IP限制有虚拟拨号/VP...

妖尾巴
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部