微信链接分享给好友时能够自定义标题、简介和logo,现将ThinkPHP5集成JS-SDK实现微信自定义分享功能的过程整理成文。
Jssdk类库
1、文件名及位置
名字:Jssdk.php
位置:extend\util\Jssdk.php
2、代码
<?php namespace util; class Jssdk { protected $appid = 'xxxx'; protected $secret = 'xxxx'; /** * 获取access_token方法 */ public function getAccessToken(){ //定义文件名称 $name = 'token_' . md5($this->appid . $this->secret); //定义存储文件路径 // $filename = __DIR__ . '/cache/' . $name . '.php'; $filename = '../runtime/temp/' . $name . '.php'; //判断文件是否存在,如果存在,就取出文件中的数据值,如果不存在,就向微信端请求 if (is_file($filename) && filemtime($filename) + 7100 > time()){ $result = include $filename; //定义需要返回的内容$data $data = $result['access_token']; }else{ // https请求方式: GET // https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET // 调用curl方法完成请求 $url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$this->appid.'&secret=' . $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['access_token']; } //将得到的access_token的值返回 return $data; } /** * * 获取临时票据方法 * * @return mixed */ public function getJsapiTicket(){ //存入文件中,定义文件的名称和路径 $name = 'ticket_' . md5($this->appid . $this->secret); //定义存储文件路径 //$filename = __DIR__ . '/cache/' . $name . '.php'; $filename = '../runtime/temp/' . $name . '.php'; //判断是否存在临时票据的文件,如果存在,就直接取值,如果不存在,就发送请求获取并保存 if (is_file($filename) && filemtime($filename) + 7100 > time()){ $result = include $filename; }else{ //定义请求地址 $url = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token='.$this ->getAccessToken().'&type=jsapi'; //使用curl方法发送请求,获取临时票据 $result = $this->curl($url); //转换成php数组 $result = json_decode($result,true); //将获取到的值存入文件中 file_put_contents($filename,"<?php\nreturn " . var_export($result,true) . ";\n?>"); } //定义返回的数据 $data = $result['ticket']; //将得到的临时票据结果返回 return $data; } /** * 获取签名方法 */ public function sign(){ //需要定义4个参数,分别包括随机数,临时票据,时间戳和当前url地址 $nonceStr = $this->makeStr(); $ticket = $this->getJsapiTicket(); $time = time(); //组合url //$url = $_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI']; $url = 'http://' . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI']; //将4个参数放入一个数组中 $arr = [ 'noncestr=' . $nonceStr, 'jsapi_ticket=' . $ticket, 'timestamp=' . $time, 'url=' . $url ]; //对数组进行字段化排序 sort($arr,SORT_STRING); //对数组进行组合成字符串 $string = implode('&',$arr); //将字符串加密生成签名 $sign = sha1($string); //由于调用签名方法的时候不只需要签名,还需要生成签名的时候的随机数,时间戳,所以我们应该返回由这些内容组成的一个数组 $reArr = [ 'appId' => $this->appid, 'timestamp' => $time, 'nonceStr' => $nonceStr, 'signature' => $sign, 'url' => $url ]; //将数组返回 return $reArr; } /** * * 生成随机数 * * @return string */ protected function makeStr(){ //定义字符串组成的种子 $seed = 'www512wayanbao1qasxianrendong5tgblaochaguan8ik9500net'; //通过循环来组成一个16位的随机字符串 //定义一个空字符串 用来接收组合成的字符串内容 $str = ''; for ($i = 0;$i < 16; $i++){ //定义一个随机数 $num = rand(0,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 = ''; 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 '<pre>'; //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('id',0);//ID $catid = input('catid',0);//分类ID $modelInfo = getModInfoById($catid); $info = Db::name($modelInfo['tablename'])->where('id',$id)->find(); $catinfo = getCatInfoById($catid); $p_catname = getCatInfoById($catinfo['parentid'],'catname'); $obj = new Jssdk(); $data = $obj->sign(); $this->assign('infos',$info); $this->assign('catids',$catid); $this->assign('catnames',$catinfo['catname']); $this->assign('p_catnames',$p_catname); $this->assign('data',$data); return view('../application/index/view/default/index/' . $modelInfo['show_template']); } } ?>
微信事件响应
<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: '{$data.appId}', timestamp: '{$data.timestamp}', nonceStr: '{$data.nonceStr}', signature: '{$data.signature}', jsApiList: [ 'onMenuShareTimeline', 'onMenuShareAppMessage' ] }); // 通过ready接口处理成功验证 wx.ready(function(){ // 分享到朋友圈 wx.onMenuShareTimeline({ title: '{$info.title}', link: '{$data.url}', imgUrl: 'http://m.psnav.com/uploads/image/{$info.thumb}', success: function () { // 用户点击了分享后执行的回调函数 } }); // 分享给朋友 wx.onMenuShareAppMessage({ title: '{$info.title}', desc: '{$info.description}', link: '{$data.url}', imgUrl: 'http://m.psnav.com/uploads/image/{$info.thumb}', type: 'link', // 分享类型,music、video或link,不填默认为link dataUrl: '', // 如果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: '{$data.appId}', timestamp: '{$data.timestamp}', nonceStr: '{$data.nonceStr}', signature: '{$data.signature}', jsApiList: [ 'onMenuShareTimeline', 'onMenuShareAppMessage', 'onMenuShareQQ', 'onMenuShareWeibo', 'onMenuShareQZone' ] }); // 通过ready接口处理成功验证 wx.ready(function(){ // 分享到朋友圈 wx.onMenuShareTimeline({ title: '{$info.title}', link: '{$data.url}', imgUrl: 'http://m.psnav.com/uploads/image/{$info.thumb}', success: function () { // 用户点击了分享后执行的回调函数 } }); // 分享给朋友 wx.onMenuShareAppMessage({ title: '{$info.title}', desc: '{$info.description}', link: '{$data.url}', imgUrl: 'http://m.psnav.com/uploads/image/{$info.thumb}', type: 'link', // 分享类型,music、video或link,不填默认为link dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空 success: function () { // 用户点击了分享后执行的回调函数 } }); // 分享到QQ wx.onMenuShareQQ({ title: '{$info.title}', desc: '{$info.description}', link: '{$data.url}', imgUrl: 'http://m.psnav.com/uploads/image/{$info.thumb}', success: function () { // 用户确认分享后执行的回调函数 }, cancel: function () { // 用户取消分享后执行的回调函数 } }); // 分享到腾讯微博 wx.onMenuShareWeibo({ title: '{$info.title}', desc: '{$info.description}', link: '{$data.url}', imgUrl: 'http://m.psnav.com/uploads/image/{$info.thumb}', success: function () { // 用户确认分享后执行的回调函数 }, cancel: function () { // 用户取消分享后执行的回调函数 } }); // 分享到QQ空间 wx.onMenuShareQZone({ title: '{$info.title}', desc: '{$info.description}', link: '{$data.url}', imgUrl: 'http://m.psnav.com/uploads/image/{$info.thumb}', success: function () { // 用户确认分享后执行的回调函数 }, cancel: function () { // 用户取消分享后执行的回调函数 } }); }); </script>