ThinkPHP微信公众号自定义分享

步骤:

1、申请Appid、appSecret

2、获取access_token

3、通过access_token获取jsapi_ticket

4、生成签名

5、拼接JS所需参数

6、控制器调用

7、引入JS文件并调用JS

微信分享类

<?php
class WxShare
{
    private $appId;
    private $appSecret;
    
    /**
     * 构造函数
     * @param $appid string 小程序的appid
     * @param $appSecret string 用户在小程序登录后获取的会话密钥
     */
    public function __construct()
    {
        $this->appid = 'xxx';
        $this->appSecret = 'xxx';
    }
    
    /* 
     *    获取分享JSSDKACCESS_TOKEN
     *    @author 董强
     */
    public function getAccessToken(){
        //我们将access_token全局缓存,每次获取的时候,先判断是否过期,如果过期重新获取再全局缓存
        //获取缓存的access_token
        $access_token = cache('share_access_token');
        
        //判断缓存的access_token是否存在和过期,如果不存在和过期则重新获取.
        if($access_token !== null && $access_token){
 
            return $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='.$this->appid.'&secret='.$this->appSecret);
 
            curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
 
            //获取access_token
            $data = json_decode(curl_exec($curl),true);
            if($data != null && $data['access_token']){
                //设置access_token的过期时间,有效期是7200s
                cache('share_access_token',$data['access_token'],7200);
                //返回access_token
                return $data['access_token'];
 
            }else{
                exit('微信获取access_token失败');
            }
        }
    }
    
    /* 
     *    获取jsapi_ticket
     *    @author 董强
     */
    public function getJsApiTicket(){
        
        //我们将jsapi_ticket全局缓存,每次获取的时候,先判断是否过期,如果过期重新获取再全局缓存
        //获取缓存的jsapi_ticket
        $jsapi_ticket = cache('share_jsapi_ticket');
        //判断缓存的access_token是否存在和过期,如果不存在和过期则重新获取.
        if($jsapi_ticket !== null && $jsapi_ticket){
 
            return $jsapi_ticket;
 
        }else{
            //获取access_token
            $access_token = $this->getAccessToken();
            //重新获取jsapi_ticket,并全局缓存
            $curl = curl_init();
            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);
            //获取jsapi_ticket
            $data = json_decode(curl_exec($curl),true);
            if($data != null && $data['ticket']){
                //设置jsapi_ticket的过期时间,有效期是7200s
                cache('share_jsapi_ticket',$data['ticket'],7200);
                //返回jsapi_ticket
                return $data['ticket'];
 
            }else{
                exit('微信获取access_token失败');
            }
        }
    }
    
    /* 
     *    生成签名
     *    @author 董强
     */
    public function getSign(){
        
        //获取当前网址路径
        $url = 'https://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
        //当前时间戳
        $timestamp = strval(time());
        //随机字符串
        $noncestr = $this->createNoncestr();
        $sign = 'jsapi_ticket='.$this->getJsApiTicket().'&noncestr='.$noncestr.'&timestamp='.$timestamp.'&url='.$url;
        //随机时间戳与随机字符串需与签名一致
        $data = array(
            'nonceStr' => $noncestr,
            'timestamp' => $timestamp,
            'sign' => sha1($sign),
        );
        return $data;
    }
    
    /* 
     *    拼接Config所需参数
     *    @author 董强
     */
    public function getConfig(){
        
        //获取签名
        $signature = $this->getSign();
        $data = array(
            'debug' => '',
            'appId' => $this->appid,
            'timestamp' => $signature['timestamp'],
            'nonceStr' => $signature['nonceStr'],
            'signature' => $signature['sign'],
            'jsApiList' => 'updateAppMessageShareData',
        );
        return $data;
    }
    
    /* 
    *    生成随机字符串
    *    @author DongQiang
    */
    private function createNoncestr($length = 32) {
        $chars = "abcdefghijklmnopqrstuvwxyz0123456789";
        $str = "";
        for ($i = 0; $i < $length; $i++) {
            $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
        }
        return $str;
    }
}
 
调用:

//微信分享
        import('WxShare.WxShare');
        $wxshare = new \WxShare();
        
        $this->assign('share_config',$wxshare->getConfig());
前端:

<!-- 分享所需参数 -->
<input type="hidden" id="debug" value="{$share_config.debug}">
<input type="hidden" id="appid" value="{$share_config.appId}">
<input type="hidden" id="timestamp" value="{$share_config.timestamp}">
<input type="hidden" id="nonceStr" value="{$share_config.nonceStr}">
<input type="hidden" id="signature" value="{$share_config.signature}">
<input type="hidden" id="jsApiList" value="{$share_config.jsApiList}">
<input type="hidden" id="title" value="{$info.title}">
<input type="hidden" id="describe" value="{$info.describe}">
<input type="hidden" id="img_url" value="{$info.img_url}">
<input type="hidden" id="url" value="{$url}">
<script>
$(function(){
    wx.config({
        debug: $('#debug').val(),
        appId: $('#appid').val(), // 必填,公众号的唯一标识
        timestamp: $('#timestamp').val(), // 必填,生成签名的时间戳
        nonceStr: $('#nonceStr').val(), // 必填,生成签名的随机串
        signature: $('#signature').val(),// 必填,签名
        jsApiList: ['updateAppMessageShareDatam','onMenuShareAppMessage'], // 必填,需要使用的JS接口列表
        success:function(){
            console.log("success");
        }
    });
    wx.ready(function(){   //需在用户可能点击分享按钮前就先调用
        wx.error(function(res){
            // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
            console.log(res);
        });
        //新接口有BUG,暂不使用
        /*wx.updateAppMessageShareData({ 
            title: 'dsada', // 分享标题
            desc: 'asdsad', // 分享描述
            link: 'https://www.xxx.com/mobile/course/detail/id/78', // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
            imgUrl: '/public/uploads/video/79/thumb/d1fe173d08e959397adf34b1d77e88d7.jpg', // 分享图标
        }, function(res) { 
        //这里是回调函数 
        }); */
        wx.onMenuShareAppMessage({
            title: $('#title').val(), // 分享标题
            desc: $('#describe').val(), // 分享描述
            link: 'https://www.xxx.com'+$('#url').val(), // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
            imgUrl: 'https://www.xxx.com/'+$('#img_url').val(), // 分享图标
            type: '', // 分享类型,music、video或link,不填默认为link
            dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空
            success: function () {
            // 用户点击了分享后执行的回调函数
                //alert('分享成功');
            },
            cancel: function () {
            // 用户取消分享后执行的回调函数
                //alert('分享取消');
            }
        });
    });
});
    
</script>

--------------------- 
作者:叫我董坤坤 
来源:优快云 
原文:https://blog.youkuaiyun.com/qq_25628455/article/details/83031145 
版权声明:本文为博主原创文章,转载请附上博文链接!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值