文档章节

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

diligency
 diligency
发布于 08/08 16:05
字数 944
阅读 240
收藏 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,坑你没商量😤
微信 JSSDK 报 config:invalid signature 错误

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

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

微信接口开发问题重现: 已经开发好签名方法 测试1: 成功分享 进行sha1签名的原始字符串为,注意url不带参数 测试2:失败, jssdk报invalid signature错误 与上述区别在于进行sha1签名的原始...

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

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

lanceli
2017/02/17
441
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

没有更多内容

加载失败,请刷新页面

加载更多

起薪2万的爬虫工程师,Python需要学到什么程度才可以就业?

爬虫工程师的的薪资为20K起,当然,因为大数据,薪资也将一路上扬。那么,Python需要学到什么程度呢?今天我们来看看3位前辈的回答。 1、前段时间快要毕业,而我又不想找自己的老本行Java开发...

糖宝lsh
13分钟前
1
0
携手开发者共建云生态 首届腾讯云+社区开发者大会在京举办

本文由云+社区发表 北京时间12月15日,由腾讯云主办,极客邦科技、微信、腾讯TEG协办的首届腾讯云+社区开发者大会在北京朝阳悠唐皇冠假日酒店举办。在会上,腾讯云发布了重磅产品开发者平台以...

腾讯云加社区
34分钟前
1
0
人工智能时代员工如何证明其IT工作价值

机器人可以取代你的工作吗?你能帮助机器人完成它的工作吗?如果你正在考虑自己的职业生涯以及今后将如何发展,那么应该询问自己这些问题了。 机器人可以取代你的工作吗?你能帮助机器人完成它的...

Linux就该这么学
35分钟前
2
0
CPU性能过剩提升乏力影响未来行业发展吗?

虽然CPU仍然在不断发展,但是它的性能已经不再仅仅受限于单个处理器类型或制造工艺上了。和过去相比,CPU性能提升的步伐明显放缓了,接下来怎么办,成为横亘在整个行业面前的大问题。 自201...

linuxCool
46分钟前
2
0
使用Autowired和Qualifier解决多个相同类型的bean如何共存的问题

注意: 实现类UserServiceImpl,MyUserServiceImpl 需要区分:@Service("userServicel") @Service("myUserService") https://blog.csdn.net/russle/article/details/80287763......

qimh
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部