首先我明确的一点是,要实现微信分享我的好友,分享朋友圈需要两个步骤(1)前端js调用(2)后台参数等设置。
第一部分:前端js调用
第一部分十分简单,按照微信公众平台的手册去做,就没有问题。
第一步很简单,但是容易忘记。第二步,要看手册最新的js版本,之前网上大部分是1.0.0.js。第三步,这里debug最好先弄成true,开启调试模式,方便测试。
第二部分 后台参数等设置
后台配置主要是获得这四个参数。
1.第一个参数,是随机字符串,可以写死,就是16位,大小写数字都可以有。
2第二个参数,是通过票据接口,获得了,它的前提条件是获取到access_toke。
3第三个参数,时间戳,直接time() 就可以
4第四个参数,是当前页面地址。可以通过全局数组获得,例如PHP,就直接填写,
'http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'];
然后把这四个参数填写进字符串
jsapi_ticket=sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg&noncestr=Wm3WZYTPz0wzccnW×tamp=1414587457&url=http://mp.weixin.qq.com?params=value
进行sha1加密,并把参数$this->assign到前端页面就可以了。
示例代码如下:
前端页面
<script type="text/javascript"> wx.config({ debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId: 'wx2ca4b0ef4a3a99c2', // 必填,公众号的唯一标识 timestamp:"{$timestamp}" , // 必填,生成签名的时间戳 nonceStr: '{$noncestr}', // 必填,生成签名的随机串 signature: '{$signature}',// 必填,签名,见附录1 jsApiList: [ 'onMenuShareTimeline', 'onMenuShareAppMessage' ] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。 wx.onMenuShareTimeline({ title: 'tt', // 分享标题 link: 'http://rbs.shaseng999.com/fenxiang.html', // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致 imgUrl: 'https://www.baidu.com/img/bd_logo1.png', // 分享图标 success: function () { // 用户确认分享后执行的回调函数 }, cancel: function () { // 用户取消分享后执行的回调函数 } }); wx.onMenuShareAppMessage({ title: 'tt', // 分享标题 desc: 'dd', // 分享描述 link: 'http://rbs.shaseng999.com/fenxiang.html', // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致 imgUrl: 'https://www.baidu.com/img/bd_logo1.png', // 分享图标 type: '', // 分享类型,music、video或link,不填默认为link dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空 success: function () { // 用户确认分享后执行的回调函数 }, cancel: function () { // 用户取消分享后执行的回调函数 } }); }); wx.error(function(res){ // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。 }); </script>
2后台代码
<?php namespace App\Controller; use Common\Controller\HomebaseController; class ShareController extends HomebaseController { public function index(){ $ticket=$this->get_ticket(); $timestamp=time(); $noncestr=$this->get_code(); $url="http://rbs.shaseng999.com/index.php?g=app&m=share&a=index"; $signature="jsapi_ticket=".$ticket."&noncestr=".$noncestr."×tamp=".$timestamp."&url=".$url; $oo=$signature; $signature=sha1($signature); $this->assign('timestamp',$timestamp); $this->assign('noncestr',$noncestr); $this->assign('oo',$oo); $this->assign('signature',$signature); $this->display(); } public function get_ticket(){ if($_SESSION['ticket_time']>time()&&$_SESSION['ticket']){ $ticket=$_SESSION['ticket']; }else{ $access_token=$this->get_token(); $url="https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=".$access_token."&type=jsapi"; $res = $this->https_request($url); $res = json_decode($res, true); $_SESSION['ticket']=$res['ticket']; $_SESSION['ticket_time']=time()+7000; $ticket=$_SESSION['ticket']; } return $ticket; } public function get_token(){ $appid='wx2ca4b0ef4a3a99c2'; $appsecret='f540c03eff6bfd5a2753b763bb0cb05a'; $url="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appid."&secret=".$appsecret; $res = $this->https_request($url); $res = json_decode($res, true); return $res['access_token']; } public function get_code(){ $arr=array( 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z', 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z', '0','1','2','3','4','5','6','7','8','9' ); $str=''; for($i=1;$i<=16;$i++){ $key=rand(0,62); $str.=$arr[$key]; } return $str; } // cURL函数简单封装 public function https_request($url, $data = null) { $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE); if (!empty($data)){ curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_POSTFIELDS, $data); } curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $output = curl_exec($curl); curl_close($curl); return $output; } }