文档章节

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

diligency
 diligency
发布于 08/08 16:05
字数 944
阅读 191
收藏 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
微信js sdk invalid signature签名错误 问题解决。

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

Oscarfff
2015/01/24
0
25
微信js-sdk集成小结

完整的官方文档在此: https://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html 以前有些第三方开发的js库,肯定是不要再用了。 公众号后台配置 这个js-sdk的使用,是必须依附...

isonghui
2016/12/01
285
2

没有更多内容

加载失败,请刷新页面

加载更多

下一页

windbg调试C源码级驱动

联机方式不多说了。我博客里有,英文的。 windbg联机文档 https://docs.microsoft.com/zh-cn/windows-hardware/drivers/debugger/debug-universal-drivers---step-by-step-lab--echo-kernel......

simpower
24分钟前
0
0
redis快照和AOF简介

数据持久化到硬盘:一是快照(snapshotting),二是只追加文件(append-only file AOF) 快照 核心原理:redis某个时间内存内的所有数据写入硬盘 场景:redis快照内存里面的数据 1. 用户发送bgsav...

拐美人
25分钟前
0
0
这个七夕,送你一份程序员教科书级别的告白指南

给广大爱码士们的高能预警: 今天,就是七夕了…… (单身非作战人群请速速退场!) 时常有技术GG向个推君抱怨 经过网民多年的教育 以及技术人持之以恒的自黑 冲锋衣狂热分子·格子衫骨灰级粉...

个推
30分钟前
0
0
python爬虫日志(15)cookie详解

转载:原文地址 早期Web开发面临的最大问题之一是如何管理状态。服务器端没有办法知道两个请求是否来自于同一个浏览器。那时的办法是在请求的页面中插入一个token,并且在下一次请求中将这个...

茫羽行
31分钟前
0
0
qlv视频格式转换器

  腾讯视频中的视频影视资源有很多,小编经常在里面下载视频观看,应该也有很多朋友和小编一样吧,最近热播的电视剧也不少,如《香蜜沉沉烬如霜》、《夜天子》还有已经完结的《扶摇》,这么...

萤火的萤火
34分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部