微信 JSSDK 报 config:invalid signature 错误

在微信公众号开发中遇到自定义分享内容。使用 JSSDK 的时候一直报 config:invalid signature 错误。javascript

你们能够先参考一下腾讯的官方说明。php

而后需注意一下几点:html

  • 签名要用到的jsapi_ticket须要保存的,2小时有效期。若是在2小时内出现问题须要删除才能工做,通常是自身程序的问题,请检查。java

  • nonceStr和noncestr的大小写,小心!ajax

  • url必定要小心,若是是"http://x.com/jspay?oid=0&attr=1#wechat"的形式,那么应该保留的是"http://x.com/jspay?oid=0&attr=1"。json

  • 据此,url在JavaScript中是location.href.split('#')[0]获取。api

  • 据此,url在php中用$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]拼装,微信

  • 听说会有多余的80端口问题,可是记录者没有遇到过,总之请当心。app

  • url在JavaScript中千万别忘记“encodeURIComponent”!不然后果很诡异,遇到过初始化的时候报invalid
    signature,可是API接口又能调用的状况。jsp

一、页面请求的 url 和生成 signature 的 url 必须一致。

二、url 需去除 # 号后面的内容 (  encodeURIComponent(location.href.split('#')[0])  )

个人是经过 ajax 调用生成签名来配置 wx.config({ }) 的

<script type="text/javascript">
        $.ajax({
            type: "Get",
            data: "url=" + encodeURIComponent(location.href.split('#')[0]),
            url: "{:U('Index/getSignPackage')}",
            success: function(res){
                var res = eval("(" + res + ")");
//                alert(JSON.stringify(res));
//                console.log(res);
                if(res.code != 0){
                    wx.config({
                        debug: false,
                        appId: res.appId,
                        timestamp: res.timestamp,
                        nonceStr: res.nonceStr,
                        signature: res.signature,
                        jsApiList: [
                            // 全部要调用的 API 都要加到这个列表中
                            'onMenuShareTimeline',
                            'onMenuShareAppMessage',
                            'onMenuShareQQ',
                            'onMenuShareWeibo',
                            'hideMenuItems',
                            'showMenuItems',
                            'hideOptionMenu',
                            'showOptionMenu'
                        ]
                    });
                    wx.ready(function () {
                        // 在这里调用 API
                        wx.onMenuShareTimeline({
                            title: '丹阳国际眼镜城欢迎您来开红包!\n红包来袭,全民疯抢中!快来参与吧!', // 分享标题
                            link: 'http://dyyj.vxiaoxiao.cn/index.php?s=/Home/Index/index.html', // 分享连接
                            imgUrl: 'http://dyyj.vxiaoxiao.cn/Public/Home/images/danyang/logo.jpg', // 分享图标
                            success: function () {
                                // 用户确认分享后执行的回调函数
                            },
                            cancel: function () {
                                // 用户取消分享后执行的回调函数
                            }
                        });
                        wx.onMenuShareAppMessage({
                            title: '丹阳国际眼镜城欢迎您来开红包!\n红包来袭,全民疯抢中!快来参与吧!', // 分享标题
                            desc: '丹阳国际眼镜城欢迎您来开红包!\n红包来袭,全民疯抢中!快来参与吧!', // 分享描述
                            link: 'http://dyyj.vxiaoxiao.cn/index.php?s=/Home/Index/index.html', // 分享连接
                            imgUrl: 'http://dyyj.vxiaoxiao.cn/Public/Home/images/danyang/logo.jpg', // 分享图标
                            type: '', // 分享类型,music、video或link,不填默认为link
                            dataUrl: '', // 若是type是music或video,则要提供数据连接,默认为空
                            success: function () {
                                // 用户确认分享后执行的回调函数
                            },
                            cancel: function () {
                                // 用户取消分享后执行的回调函数
                            }
                        });
                    });
                }
            }
        })
    </script>

后台php

 //获取微信JSSDK配置信息
    function getSignPackage($url){
        $jssdk = new JSSDK("addId", "appSecret");
        $signPackage = $jssdk->GetSignPackage($url);
        $signPackage['code']=(empty($signPackage))?0:1;
        $this->ajaxReturn(json_encode($signPackage));
        exit();
    }
ps:
具体怎么使用微信自定义的分享功能能够参考
http://www.huceo.com/post/414.html
 
相关文章
相关标签/搜索