如何自定义微信分享页小图标和标题内容

TP框架下如何自定义微信分享页小图标和标题内容,关于设置白名单、安全域名等可以查看官方文档
1、获取公众号的access_token,并保存在服务器缓存(必须,否则重复请求服务器将到达上限,无法继续请求该数据)。

/*获取access_token*/
    function getAccessToken(){
        //我们将access_token全局缓存在文件中,每次获取的时候,先判断是否过期,如果过期重新获取再全局缓存
        //我们缓存的在文件中的数据,包括access_token和该access_token的过期时间戳.
        //获取缓存的access_token
        $access_token_data = json_decode(F('access_token'),true);
        //判断缓存的access_token是否存在和过期,如果不存在和过期则重新获取.
        if($access_token_data !== null && $access_token_data['access_token'] && $access_token_data['expires_in'] > time()){
                
                print_r($access_token_data['access_token']);
            return $access_token_data['access_token'];

        }else{
            //重新获取access_token,并全局缓存
            $curl = curl_init();

            curl_setopt($curl,CURLOPT_URL,'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='
                .C('WECHAT_APPID').'&secret='.C('WECHAT_SECRET'));

            curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);

            //获取access_token
            $data = json_decode(curl_exec($curl),true);
            if($data != null && $data['access_token']){
                //设置access_token的过期时间,有效期是7200s
                $data['expires_in'] = $data['expires_in'] + time();

                //将access_token全局缓存,快速缓存到文件中.
                F('access_token',json_encode($data));
                //返回access_token
                return $data['access_token'];

            }else{
                exit('微信获取access_token失败');
            }
        }
    }

2、通过获取到的access_token,像微信发起请求获取到jsapi_ticket,确保获取access_token和获取jsapi_ticket是使用的appid和appserect是一样的(最好直接全局定义一下)。关于发送请求返回的json可以去官方文档看下

/*获取jsapi_ticket*/
    function getJsapiTicket()
    {
        //jsapi_ticket也必须存在全局缓存文件中,每次获取的时候先判断是否过期,过期则重新获取
        $jsapi_ticket_data = json_decode(F('jsapi_ticket'),true);
        if($jsapi_ticket_data !== null && $jsapi_ticket_data['ticket'] && $jsapi_ticket_data['expires_in'] > time()){
            return $jsapi_ticket_data['ticket'];
        }else{
            $curl = curl_init();
            //获取全局缓存的access_token
            $access_token = getAccessToken();

            curl_setopt($curl,CURLOPT_URL,'https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token='.$access_token.'&type=jsapi');

            curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);

            //获取access_token
            $data = json_decode(curl_exec($curl),true);
            if($data != null && $data['ticket']){
                //设置access_token的过期时间,有效期是7200s
                $data['expires_in'] = $data['expires_in'] + time();

                //将access_token全局缓存,快速缓存到文件中.
                F('jsapi_ticket',json_encode($data));
                //返回access_token
                return $data['ticket'];

            }else{
                exit('微信获取jsapi_ticket失败');
            }
        }
    }

3、创建16位的随机数

/*获取随机字符串*/
    function nonceStr()
    {
        //定义一个字符串
        $chars='ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz';
        //当前的时间戳
        $time = time();
        //从该字符串中获取随机字符串
        $chars = $chars.$time;
        //打乱字符串
        $chars = str_shuffle($chars);
        return substr($chars,0,16);
    }
4、生成签名
/**生成签名
 **$nonceStr 16位随机数
 **$time 获取随机数时的时间戳
*/
    function signature($time,$url,$nonceStr)
    {
        //拼接字符串
        $string = 'jsapi_ticket='.getJsapiTicket().'&noncestr='.$nonceStr.'×tamp='.$time.'&url='.$url;
        //生成签名
        $string = sha1($string);
        return $string;
    }

5、上面是创建生成签名需要的函数,下面是如何验证
6、分享页面的js

	var imgUrl = '小图标,完整地址如:https://xxx.com/images/xxx.png'; 
    var lineLink = '分享的网页,地址完整地址如:https://xxx.com/xxx/xxx.html'; 
    var descContent = '分享的内容';
    var shareTitle = '分享的内标题';
    var appid = '';

    $.ajax({
        type : 'POST',
        url :  "获取wx.config所需参数的函数地址",
        dataType : "json",
        data:{url:window.location.href.split('#')[0]},
        success : function(data){
             	var appId = data['appId'];
                var timestamp = data['timestamp'];
                var nonceStr = data['nonceStr'];
                var signature = data['signature'];
                wx.config({
                    debug: false,
                    appId: appId,
                    timestamp: timestamp,
                    nonceStr: nonceStr,
                    signature: signature,
                    jsApiList: [
                        'updateTimelineShareData',//1.4.0的分享接口,注意:使用新版本的分享功能,一定要在该列表加上对应的老版本功能接口,否则新接口不起作用
			             'updateAppMessageShareData',//1.4.0的分享接口,注意:使用新版本的分享功能,一定要在该列表加上对应的老版本功能接口,否则新接口不起作用
			            'onMenuShareTimeline',
			            'onMenuShareAppMessage'
                    ]
                });
                 wx.ready(function() {
                         
                        wx.updateTimelineShareData({
                            title: shareTitle, // 分享标题
                            link: lineLink, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
                            imgUrl: imgUrl, // 分享图标
                            success: function () {
                                // 用户确认分享后执行的回调函数
                            },
                            cancel: function () {
                                // 用户取消分享后执行的回调函数
                            }
                        });
                        wx.updateAppMessageShareData({
                            title: shareTitle, // 分享标题
                            desc: descContent, // 分享描述
                            link: lineLink, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
                            imgUrl: imgUrl, // 分享图标
                            type: '', // 分享类型,music、video或link,不填默认为link
                            dataUrl:'' , // 如果type是music或video,则要提供数据链接,默认为空
                            success: function () {
                                // 用户确认分享后执行的回调函数
                                
                            },
                            cancel: function () {
                                // 用户取消分享后执行的回调函数
                            }
                        });
                });
        }
    });

7、获取config参数的函数

 public function jsSDKConfig()
    {
        $url =get_value_by_post('url');
        $url = str_replace("&", "&", $url);//必须,否则可能会出现无效签名
        //$array['url'] =$url;//不是必须的参数,但是可以输出url,如果出现无效签名其他也没有问题的时候注意一下这个输出,看下是否和实际当前网页地址一致(不包#后面的),必须每个字符都一样才不会出现无效签名,这里也给自己备注一下。
        $array['appId'] = C('WECHAT_APPID');//定义的appId
        //生成签名的时间戳
        $time = time();
        $array['timestamp'] = $time;
        //签名使用的随机字符串
        $nonceStr = nonceStr();
        $array['nonceStr'] = $nonceStr;
         //生成签名
        $array['signature'] = signature($time,$url,$nonceStr);
        $this->ajaxReturn($array);
    }

8、总的来说,就是进入页面后通过自定义的生成签名方法jsSDKConfig获取到wx.config所需参数用来验证使用中的接口。
9、这个也算是纪录一下自己的学习成果,中途遇到的最大问题就是在将参数输入微信 JS 接口签名校验工具生成的签名与后台输出的签名一样,但是还是提示invalid signature,一直找不到问题,最后发现是ajax在将url传递的过程中将&改为了& amp;所以导致了签名无效,所以在遇到类似问题时一定要查看网页地址和传递到后台的url是否一模一样,必须一样!

你可能感兴趣的:(如何自定义微信分享页小图标和标题内容)