微信分享朋友圈,好友,qq, 微博 前端和后端,亲测好用 thinkphp

1. wx.share_data.js 获取时间戳,签名,等

var wxdata = {
    wx_account : new Array(4),
    wx_share : new Array(4),
    wx_myuser : "wxa6124505106149b3",
    access_token : "", // 凭证
    token_expires_in : "" , // 凭证过期时间 单位:s
    jsapi_ticket : "", // 凭证
    ticket_expires_in : "" , // 凭证过期时间 单位:s
    signature:'',
    url : "https://wx.zhixiaobing.com/index.php?m=&c=api&a=accessToken"    
    }

//获取ticket
get_jsapi_ticket();  //3

var timestamp = create_timestamp();   // timestamp
var noncestr = create_noncestr();  // noncestr
var url = window.location.href;
console.log(wxdata.jsapi_ticket)
create_signature(noncestr,wxdata.jsapi_ticket,timestamp,url);
wxdata.wx_account[0] = wxdata.wx_myuser;  // appid
wxdata.wx_account[1] = timestamp;   // timestamp
wxdata.wx_account[2] = noncestr; // noncestr
wxdata.wx_account[3] = wxdata.signature//signature

    // 获取jsapi_ticket
    // *注意* 经过实际开发测试,微信分享不支持跨域请求,因此获取jsapi_ticket的请求必须从服务器发起,否则无法获取到jsapi_ticket
     function get_jsapi_ticket (){
         var access_token='';
        // 获取access_token  
    // *注意* 经过实际开发测试,微信分享不支持跨域请求,因此获取access_token的请求必须从服务器发起,否则无法获取到access_token

       $.ajax({
            type : "GET",
            url :  wxdata.url,
            // dataType : "jsonp",  // 解决跨域问题,jsonp不支持同步操作
            // cache : false,    
            async : false,    
            success : function(res) {
                // console.log(res)
                // res = JSON.parse(res);
                access_token = res.access_token;  // 获取到的交互凭证  需要缓存,存活时间token_expires_in  默认为7200s
                if (wxdata.access_token != "" || wxdata.access_token != null) {
                    console.log("get access_token  success: " + wxdata.access_token);
                } else {
                    console.log("get access_token  fail " +wxdata.access_token);
                }

                $.ajax({
                    type : "GET",
                    url : "https://www.abc.com?access_token="+access_token,
                    // dataType : "jsonp",
                    // cache : false,
                    async : false,
                    // jsonp :'callback',
                    success : function(res) {

                        if(res.ticket){
                            console.log(wxdata.jsapi_ticket )
                            wxdata.jsapi_ticket = res.ticket;  //
                            console.log("get jsapi_ticket  success");
                        } else {
                            console.log("get jsapi_ticket  fail");
                        }
                    },
                    error : function(res){
                        console.log("get jsapi_ticket  error!!! ");
                    }
                });
            },
            error : function(res){
                console.log("get access_token error!! ");
            }
        });

        
    }
    // 数据签名
     function create_signature(noncestr,ticket,timestamp,url){
         console.log(ticket)
        // 这里参数的顺序要按照 key 值 ASCII 码升序排序
        var s = "jsapi_ticket=" + ticket + "&noncestr=" + noncestr + "&timestamp=" + timestamp + "&url=" + url;
        $.ajax({
            // 这时必须是post 否则地址会出错
            type : "post",
            url : "https://www.abc.com",
            data:{signature:s},
            // dataType : "jsonp",
            // cache : false,
             async : false,
            // jsonp :'callback',
            success : function(res) {
                console.log(res)
                wxdata.signature=res.signature;
                
            },
            error : function(res){
                console.log("get signature  error!!! ");
            }
        });
        return
    }
 
    // 自定义创建随机串 自定义个数0 < ? < 32
    function create_noncestr() {
             var str= "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
             var val = "";
            for (var i = 0; i < 16; i++) {
                 val += str.substr(Math.round((Math.random() * 10)), 1);
             }
        return val;
    }
    
    // 自定义创建时间戳
     function create_timestamp() {
        return new Date().getSeconds();
    }
    

扫描二维码关注公众号,回复: 2472582 查看本文章

2、htlml 里这样写

<script src="__STATIC__/js/wxshare/wxShare_data.js"></script>
<script src="https://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>

<script type="text/javascript">
var ShareLink =window.location.href; //默认分享链接
var ShareImgUrl = "图片地址";// 分享图标
var ShareDesc= '分享描述';
var ShareTitle='分享标题';
//var is_distribut = getCookie('is_distribut'); // 是否分销代理

//var user_id = getCookie('user_id'); // 当前用户id
//alert(is_distribut+'=='+user_id);

// 如果已经登录了, 并且是分销商
// if(parseInt(is_distribut) == 1 && parseInt(user_id) > 0)
// {                 
//   ShareLink = ShareLink + "&first_leader="+user_id;                 
// }                 
  var wx_account = wxdata.wx_account; // 自定义数据,见wxShare_data.js

//配置微信信息
wx.config ({
    debug : false,    // true:调试时候弹窗
    appId : wx_account[0],  // 微信appid
    timestamp : wx_account[1], // 时间戳
    nonceStr : wx_account[2],  // 随机字符串
    signature : wx_account[3], // 签名
    jsApiList : [
        // 所有要调用的 API 都要加到这个列表中
        'onMenuShareTimeline',       // 分享到朋友圈接口
        'onMenuShareAppMessage',  //  分享到朋友接口
        'onMenuShareQQ',         // 分享到QQ接口
        'onMenuShareWeibo'      // 分享到微博接口
    ]
});

wx.ready (function () {
    // 微信分享的数据
    var shareData = {
        "imgUrl" : ShareImgUrl,    // 分享显示的缩略图地址
        "link" : ShareLink,    // 分享地址
        "desc" : ShareDesc,   // 分享描述
        "title" :ShareTitle,   // 分享标题
      }
       wx.onMenuShareTimeline (shareData);
       wx.onMenuShareAppMessage (shareData);
       wx.onMenuShareQQ (shareData);
       wx.onMenuShareWeibo (shareData);
     //   success:function () {  
 
     //           // 分享成功可以做相应的数据处理
 
     //          //alert("分享成功"); }
     // }
});
 
 
wx.error(function(res){
     // config信息验证失败会执行error函数,如签名过期导致验证失败,
    // 具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,
     //对于SPA可以在这里更新签名。
    console.log("好像出错了!!");
});
 
</script>

3 、php 代码

// 获取accessToken
    public function accessToken()
    {   

        header("Access-Control-Allow-Origin: *");
        //公众号 appid 和秘钥
        $appid = 'xxxxxxxxxxxxxx';
        $appsecret = 'xxxxxxxx';
        // AppID 和 AppSecret 可登录微信公众平台官网-设置-开发设置中获得(需要已经绑定成为开发者,且帐号没有异常状态)
        $url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$appid.'&secret='.$appsecret;
        $res = httpGet($url);
        $res = json_decode($res);
        // session(array('accessToken'=>$res->access_token,'expire'=>7200));
        // dump($res->access_token);
        $this->ajaxreturn($res) ;
    }

    public function jsapiTicket($value='')
    {   
        header("Access-Control-Allow-Origin: *");
        $accessToken=I('get.access_token');
        $url='https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token='.$accessToken.'&type=jsapi';
        $res = httpGet($url);
        $res = json_decode($res);
       // session(array('jsapiTicket'=>$res->ticket,'expire'=>7200));
        $this->ajaxreturn($res) ;


    }

    public function signature()
    {   
        header("Access-Control-Allow-Origin: *");
        $string = I('post.signature');
    // $string ="jsapi_ticket=".I('get.jsapi_ticket')."&noncestr=".I('get.noncestr')."&timestamp=".I('get.timestamp')."&url=".I('get.url');
        $signature=sha1($string);
        // dump(array('noncestr'=>$noncestr,'jsapi_ticket'=>$jsapi_ticket,'timestamp'=>$timestamp,'signature'=>$signature));
         $this->ajaxreturn(['signature'=>$signature]) ;
    }

httpGet 是自己封装 的curl 函数,网上很多,自己查

完整代码全部在这了,亲测可用

加公众号获取学习资源

猜你喜欢

转载自blog.csdn.net/limingyue0312/article/details/81214383