首先我明确的一点是,要实现微信分享我的好友,分享朋友圈需要两个步骤(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;
}
}