php+微信分享(jsonp)

2018-01-22 18:49:54 查看 1378 回复 0

看到新浪的文章微信里可以自己设置分享参数,再看看自己文章。感觉low死了,所以看了看微信的文档写一个。

先上php:

class wxController extends Controller
{
    public $appid='wx-------';
    public $secret='--------';

    function share(){
       $data=[];
       $callback = I('get.callback','callback');
        //获取AccessToken
       $actoken =  $this->getAccessToken();
       if($actoken===false){
           $data['error']='get Access_Token false';
           echo $callback.'('.json_encode($data).')';
           exit;
       }

       $ticket = $this->getTicket($actoken);
        if($ticket===false){
            $data['error']='get Ticket false';
            echo $callback.'('.json_encode($data).')';
            exit;
        }

        $url = I('get.url');
        $singStr = 'jsapi_ticket='.$ticket.'&noncestr='.NOW_TIME.'×tamp='.NOW_TIME.'&url='.$url;
        $data['appid']=$this->appid;
        $data['noncestr']=NOW_TIME;
        $data['timestamp']=NOW_TIME;
        $data['url']=$url;
        $data['signature']=sha1($singStr);


        echo $callback.'('.json_encode($data).')';
        exit;

    }
    /**
     * 获取 AccessToken
     */
    protected function  getAccessToken(){
        $acctoken = F('wx_share_AccessToken');
        if($acctoken){
            return $acctoken;
        }
        $accesstoken = file_get_contents('https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$this->appid.'&secret='.$this->secret.'');
        $accesstokenArr=json_decode($accesstoken,true);

        if(isset($accesstokenArr['errcode']) && $accesstokenArr['errcode']>0 ){
            return false;
        }
       if(isset($accesstokenArr['access_token'])){
           F('wx_share_AccessToken',$accesstokenArr['access_token'],7100);
       }
       return  $accesstokenArr['access_token'];

    }

    /**
     * 获取 AccessToken
     */
    protected function  getTicket($AccessToken){

        $acctoken = F('wx_share_Ticket');
        if($acctoken){
            return $acctoken;
        }

        $accesstoken = file_get_contents('https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token='.$AccessToken.'&type=jsapi');
        $accesstokenArr=json_decode($accesstoken,true);

        if(isset($accesstokenArr['errcode']) && $accesstokenArr['errcode']>0 ){
            return false;
        }
        if(isset($accesstokenArr['ticket'])){
            F('wx_share_Ticket',$accesstokenArr['ticket'],7100);
        }
        return  $accesstokenArr['ticket'];

    }
	 
}

再上js:

$(function(){
    $.ajax({
        type: "get",
        async: false,
        url: "http://******.com/api/wx/share?url="+encodeURIComponent(location.href.split('#')[0]),
        dataType: "jsonp",
        jsonp: "callback",//传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(一般默认为:callback)
        jsonpCallback:"flightHandler",//自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名,也可以写"?",jQuery会自动为你处理数据
        success: function(json){
            console.log(json);
            _wx_config(json);
        },
        error: function(){
            alert('fail');
        }
    });
});

//设置分享参数
function initShare(option){
    var settings = {
        title: document.title,//分享标题
        link: document.URL,//分享地址
        imgUrl: '', //分享图标
        desc:'',//分享描述
        type: '', // 分享类型,music、video或link,不填默认为link
        dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空
    };
    if (option) {
        $.extend(settings, option);
    }
    window['shareInfo']=settings;
    return settings;
}
//获取分享参数
function getShare(){
    if(typeof(window['shareInfo'])=="undefined"){
        initShare();
    }
    return window['shareInfo'];
}

//微信分享主函数
function _wx_config(n){
    wx.config({
        debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
        appId: n.appid, // 必填,公众号的唯一标识
        timestamp: n.timestamp, // 必填,生成签名的时间戳
        nonceStr: n.timestamp+'', // 必填,生成签名的随机串
        signature: n.signature,// 必填,签名,见附录1
        jsApiList: ['onMenuShareTimeline',
            'onMenuShareAppMessage',
            'onMenuShareQQ',
            'onMenuShareWeibo',
            'onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
    });

    var w = getShare();
    console.log(w);

    wx.ready(function(){
        //朋友圈
        wx.onMenuShareTimeline({
            title:  w.title, // 分享标题
            link: w.link, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
            imgUrl: w.imgUrl, // 分享图标
            success: function () {
                console.log('用户点击了分享');
            },
            cancel: function () {
                // 用户取消分享后执行的回调函数
                console.log('用户取消分享后执行的回调函数');
            }
        });



        //分享给朋友
        wx.onMenuShareAppMessage({
            title: w.title, // 分享标题
            desc:  w.desc, // 分享描述
            link: w.link, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
            imgUrl: w.imgUrl, // 分享图标
            type: w.type, // 分享类型,music、video或link,不填默认为link
            dataUrl:w.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空
            success: function () {
                // 用户确认分享后执行的回调函数
                console.log('用户点击了分享');
            },
            cancel: function () {
                // 用户取消分享后执行的回调函数
                console.log('用户取消分享后执行的回调函数');
            }
        });
        //分享到qq
        wx.onMenuShareQQ({
            title: w.title, // 分享标题
            desc:  w.desc, // 分享描述
            link: w.link, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
            imgUrl: w.imgUrl, // 分享图标
            success: function () {
                // 用户确认分享后执行的回调函数
                console.log('用户点击了分享');
            },
            cancel: function () {
                // 用户取消分享后执行的回调函数
                console.log('用户取消分享后执行的回调函数');
            }
        });
    });

}

页面上:

引入微信的文件:http://res.wx.qq.com/open/js/jweixin-1.2.0.js

设置页面分享参数(非必须,如果不设置,js会默认读取页面参数):

       initShare({
            "title":'需要分享的标题',
            "desc":'分享的说明',
            "link":'http://******.com/'
        })

当然如果,是异步获取数据的话。就把设置分享参数和获取签名的放在jsonp写在回调里,就可以了。

中间如果踩到坑的话,请注意看微信文档!
文档地址:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115