插件窝 干货文章 ThinkPHP5怎么集成JS-SDK实现微信自定义分享功能

ThinkPHP5怎么集成JS-SDK实现微信自定义分享功能

amp 39 data function 761    来源:    2024-10-25

jssdk类库

1、文件名及位置

名字:Jssdk.php
位置:extend\util\Jssdk.php

2、代码

<?php
namespace util;

class Jssdk {

    protected $appid = &#39;xxxx&#39;;
    protected $secret = &#39;xxxx&#39;;

    /**
     * 获取access_token方法
     */
    public function getAccessToken(){
        //定义文件名称
        $name = &#39;token_&#39; . md5($this->appid . $this->secret);
        //定义存储文件路径
        // $filename = __DIR__ . &#39;/cache/&#39; . $name . &#39;.php&#39;;
        $filename = &#39;../runtime/temp/&#39; . $name . &#39;.php&#39;;
        //判断文件是否存在,如果存在,就取出文件中的数据值,如果不存在,就向微信端请求
        if (is_file($filename) && filemtime($filename) + 7100 > time()){
            $result = include $filename;
            //定义需要返回的内容$data
            $data = $result[&#39;access_token&#39;];
        }else{
            // https请求方式: GET
            // https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
            // 调用curl方法完成请求
            $url = &#39;https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=&#39;.$this->appid.&#39;&secret=&#39; . $this->secret;
            $result = $this->curl($url);
            //将返回得到的json数据转成php数组
            $result = json_decode($result,true);
            //将内容写入文件中
            file_put_contents($filename,"<?php\nreturn " . var_export($result,true) . ";\n?>");
            //定义需要返回的内容
            $data = $result[&#39;access_token&#39;];
        }

        //将得到的access_token的值返回
        return $data;

    }

    /**
     *
     * 获取临时票据方法
     *
     * @return mixed
     */
    public function getJsapiTicket(){
        //存入文件中,定义文件的名称和路径
        $name = &#39;ticket_&#39; . md5($this->appid . $this->secret);
        //定义存储文件路径
        //$filename = __DIR__ . &#39;/cache/&#39; . $name . &#39;.php&#39;;
        $filename = &#39;../runtime/temp/&#39; . $name . &#39;.php&#39;;
        //判断是否存在临时票据的文件,如果存在,就直接取值,如果不存在,就发送请求获取并保存
        if (is_file($filename) && filemtime($filename) + 7100 > time()){
            $result = include $filename;
        }else{
            //定义请求地址
            $url = &#39;https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=&#39;.$this
                    ->getAccessToken().&#39;&type=jsapi&#39;;
            //使用curl方法发送请求,获取临时票据
            $result = $this->curl($url);
            //转换成php数组
            $result = json_decode($result,true);
            //将获取到的值存入文件中
            file_put_contents($filename,"<?php\nreturn " . var_export($result,true) . ";\n?>");

        }
        //定义返回的数据
        $data = $result[&#39;ticket&#39;];
        //将得到的临时票据结果返回
        return $data;
    }

    /**
     * 获取签名方法
     */
    public function sign(){
        //需要定义4个参数,分别包括随机数,临时票据,时间戳和当前url地址
        $nonceStr = $this->makeStr();
        $ticket = $this->getJsapiTicket();
        $time = time();
        //组合url
        //$url = $_SERVER[&#39;REQUEST_SCHEME&#39;] . &#39;://&#39; . $_SERVER[&#39;SERVER_NAME&#39;] . $_SERVER[&#39;REQUEST_URI&#39;];
        $url = &#39;http://&#39; . $_SERVER[&#39;SERVER_NAME&#39;] . $_SERVER[&#39;REQUEST_URI&#39;];
        //将4个参数放入一个数组中
        $arr = [
            &#39;noncestr=&#39; . $nonceStr,
            &#39;jsapi_ticket=&#39; . $ticket,
            &#39;timestamp=&#39; . $time,
            &#39;url=&#39; . $url
        ];
        //对数组进行字段化排序
        sort($arr,SORT_STRING);
        //对数组进行组合成字符串
        $string = implode(&#39;&&#39;,$arr);
        //将字符串加密生成签名
        $sign = sha1($string);
        //由于调用签名方法的时候不只需要签名,还需要生成签名的时候的随机数,时间戳,所以我们应该返回由这些内容组成的一个数组
        $reArr = [
            &#39;appId&#39; => $this->appid,
            &#39;timestamp&#39; => $time,
            &#39;nonceStr&#39; => $nonceStr,
            &#39;signature&#39; => $sign,
            &#39;url&#39; => $url
        ];
        //将数组返回
        return $reArr;
    }

    /**
     *
     * 生成随机数
     *
     * @return string
     */
    protected function makeStr(){
        //定义字符串组成的种子
        $seed = &#39;www512wayanbao1qasxianrendong5tgblaochaguan8ik9500net&#39;;
        //通过循环来组成一个16位的随机字符串
        //定义一个空字符串 用来接收组合成的字符串内容
        $str = &#39;&#39;;
        for ($i = 0;$i < 16; $i++){
            //定义一个随机数
            $num = rand(null,strlen($seed) - 1);
            //循环连接随机生成的字符串
            $str .= $seed[$num];
        }
        //将随机数返回
        return $str;
    }


    /**
     *
     * 服务器之间请求的curl方法
     *
     * @param $url 请求地址
     * @param array $field post参数
     * @return string
     */
    public function curl($url,$field = []){
        //初始化curl
        $ch = curl_init();
        //设置请求的地址
        curl_setopt($ch,CURLOPT_URL,$url);
        //设置接收返回的数据,不直接展示在页面
        curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
        //设置禁止证书校验
        curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
        curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);
        //判断是否为post请求方式,如果传递了第二个参数,就代表是post请求,如果么有传递,第二个参数为空,就是get请求
        if (!empty($field)){
            //设置请求超时时间
            curl_setopt($ch,CURLOPT_TIMEOUT,30);
            //设置开启post
            curl_setopt($ch,CURLOPT_POST,1);
            //传递post数据
            curl_setopt($ch,CURLOPT_POSTFIELDS,$field);
        }
        //定义一个空字符串,用来接收请求的结果
        $data = &#39;&#39;;
        if (curl_exec($ch)){
            $data = curl_multi_getcontent($ch);
        }
        //关闭curl
        curl_close($ch);
        //将得到的结果返回
        return $data;
    }

}
//测试获取access_token值的方法
//$obj = new Wx();
//$data = $obj->getAccessToken();
//echo $data;

//测试获取jsapiticket方法
//$obj = new Wx();
//$data = $obj->getJsapiTicket();
//echo $data;

//测试生成签名方法
//$obj = new Wx();
//$data = $obj->sign();
//echo &#39;<pre class="brush:php;toolbar:false">&#39;;
//print_r($data);

?>

后台控制器处理

<?php
namespace app\index\controller;
use think\Controller;
use think\Db;
use app\admin\model\Menu;
use util\Jssdk;

class Index extends Controller {
    public function demo(){
        $id = input(&#39;id&#39;,0);//ID
        $catid = input(&#39;catid&#39;,0);//分类ID

        $modelInfo = getModInfoById($catid);

        $info = Db::name($modelInfo[&#39;tablename&#39;])->where(&#39;id&#39;,$id)->find();
        $catinfo = getCatInfoById($catid);
        $p_catname = getCatInfoById($catinfo[&#39;parentid&#39;],&#39;catname&#39;);

        $obj = new Jssdk();
        $data = $obj->sign();

        $this->assign(&#39;infos&#39;,$info);
        $this->assign(&#39;catids&#39;,$catid);
        $this->assign(&#39;catnames&#39;,$catinfo[&#39;catname&#39;]);
        $this->assign(&#39;p_catnames&#39;,$p_catname);
        $this->assign(&#39;data&#39;,$data);

        return view(&#39;../application/index/view/default/index/&#39; . $modelInfo[&#39;show_template&#39;]);
    }
}
?>

微信事件响应

<script src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>
<script type="text/javascript">
    // 通过config接口注入权限验证配置
    wx.config({
        debug: false, 
        appId: &#39;{$data.appId}&#39;,
        timestamp: &#39;{$data.timestamp}&#39;,
        nonceStr: &#39;{$data.nonceStr}&#39;, 
        signature: &#39;{$data.signature}&#39;,
        jsApiList: [
            &#39;onMenuShareTimeline&#39;,
            &#39;onMenuShareAppMessage&#39;
        ]
    });
    // 通过ready接口处理成功验证
    wx.ready(function(){
        // 分享到朋友圈
        wx.onMenuShareTimeline({
            title: &#39;{$info.title}&#39;,
            link: &#39;{$data.url}&#39;, 
            imgUrl: &#39;http://m.psnav.com/uploads/image/{$info.thumb}&#39;, 
            success: function () {
                // 用户点击了分享后执行的回调函数
            }
        });
        // 分享给朋友
        wx.onMenuShareAppMessage({
            title: &#39;{$info.title}&#39;, 
            desc: &#39;{$info.description}&#39;, 
            link: &#39;{$data.url}&#39;, 
            imgUrl: &#39;http://m.psnav.com/uploads/image/{$info.thumb}&#39;, 
            type: &#39;link&#39;, // 分享类型,music、video或link,不填默认为link
            dataUrl: &#39;&#39;, // 如果type是music或video,则要提供数据链接,默认为空
            success: function () {
                // 用户点击了分享后执行的回调函数
            }
        });
    });
</script>

全部分享接口

<script src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>
<script type="text/javascript">
    // 通过config接口注入权限验证配置
    wx.config({
        debug: true, 
        appId: &#39;{$data.appId}&#39;,
        timestamp: &#39;{$data.timestamp}&#39;,
        nonceStr: &#39;{$data.nonceStr}&#39;, 
        signature: &#39;{$data.signature}&#39;,
        jsApiList: [
            &#39;onMenuShareTimeline&#39;,
            &#39;onMenuShareAppMessage&#39;,
            &#39;onMenuShareQQ&#39;,
            &#39;onMenuShareWeibo&#39;,
            &#39;onMenuShareQZone&#39;
        ]
    });
    // 通过ready接口处理成功验证
    wx.ready(function(){
        // 分享到朋友圈
        wx.onMenuShareTimeline({
            title: &#39;{$info.title}&#39;,
            link: &#39;{$data.url}&#39;, 
            imgUrl: &#39;http://m.psnav.com/uploads/image/{$info.thumb}&#39;, 
            success: function () {
                // 用户点击了分享后执行的回调函数
            }
        });
        // 分享给朋友
        wx.onMenuShareAppMessage({
            title: &#39;{$info.title}&#39;, 
            desc: &#39;{$info.description}&#39;, 
            link: &#39;{$data.url}&#39;, 
            imgUrl: &#39;http://m.psnav.com/uploads/image/{$info.thumb}&#39;, 
            type: &#39;link&#39;, // 分享类型,music、video或link,不填默认为link
            dataUrl: &#39;&#39;, // 如果type是music或video,则要提供数据链接,默认为空
            success: function () {
                // 用户点击了分享后执行的回调函数
            }
        });
        // 分享到QQ
        wx.onMenuShareQQ({
            title: &#39;{$info.title}&#39;, 
            desc: &#39;{$info.description}&#39;, 
            link: &#39;{$data.url}&#39;, 
            imgUrl: &#39;http://m.psnav.com/uploads/image/{$info.thumb}&#39;, 
            success: function () {
                // 用户确认分享后执行的回调函数
            },
            cancel: function () {
                // 用户取消分享后执行的回调函数
            }
        });
        // 分享到腾讯微博
        wx.onMenuShareWeibo({
            title: &#39;{$info.title}&#39;,
            desc: &#39;{$info.description}&#39;, 
            link: &#39;{$data.url}&#39;, 
            imgUrl: &#39;http://m.psnav.com/uploads/image/{$info.thumb}&#39;, 
            success: function () {
                // 用户确认分享后执行的回调函数
            },
            cancel: function () {
                // 用户取消分享后执行的回调函数
            }
        });
        // 分享到QQ空间
        wx.onMenuShareQZone({
            title: &#39;{$info.title}&#39;, 
            desc: &#39;{$info.description}&#39;, 
            link: &#39;{$data.url}&#39;, 
            imgUrl: &#39;http://m.psnav.com/uploads/image/{$info.thumb}&#39;, 
            success: function () {
                // 用户确认分享后执行的回调函数
            },
            cancel: function () {
                // 用户取消分享后执行的回调函数
            }
        });
    });
</script>