微信分享笔记(第二版)
: https://blog.youkuaiyun.com/qq_28018283/article/details/80642842微信分享首先需要的条件
首先,公众号需要是认证过的,服务号。
开发前需要在微信公众号,填写安全域名。
当然,你需要知道你的appid和appsecret。
——————————————1 根据自己的业务逻辑,定义一个微信jssdk类,获得分享需要用到的数据—————————————————————
/**
** @author 坏人小明
** @jssdk 集成类
**
*/
class JSSDK {
public function outWeixin() {
define("APPID", "你的APPID");
define("APPSECRET", "你的 APPSECRET ");
$jsapi_ticket = $this->getJsApiTicket();
$nonceStr = '固定或自己定义的随机生成字段';
$url = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";//获取当前不带#和hash值的url
$timestamp = NOW_TIME;//当前时间戳
$string1 = "jsapi_ticket=".$jsapi_ticket."&noncestr=".$nonceStr."×tamp=".$timestamp."&url=".$url;//按微信规定连接的字串
$signature = sha1($string1);//加密
$srcjs = '<script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>'; //加载js
$wxJsConfig = "wx.config({//配置验证参数
debug:false,
appId:'".APPID."',
timestamp:".$timestamp.",
nonceStr:'".$nonceStr."',
signature:'".$signature."',
jsApiList: [ //与步骤3中api列表对应
'onMenuShareTimeline',
'onMenuShareAppMessage'
]
})";
return array('srcjs'=>$srcjs,'wxJsConfig'=>$wxJsConfig);
}
private function getJsApiTicket() {
$data = D('存放的表名')->where()->find();
if ($data['ticket_time'] < time()) {
$access_token = $this->getAccessToken();
$jsapi_ticket = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=".$access_token."&type=jsapi" ;
$res = file_get_contents($jsapi_ticket); //获取文件内容或获取网络请求的内容
//echo $res;
$result = json_decode($res, true); //接受一个 JSON 格式的字符串并且把它转换为 PHP 变量
$jsapi_ticket = $result['ticket'];
$wxdata['jsapi_ticket'] = $result['ticket'];
$wxdata['ticket_time'] = time()+7000;
//存储access_token
$data = D('<span style="font-family: Arial, Helvetica, sans-serif;">存放的表名</span><span style="font-family: Arial, Helvetica, sans-serif;">')->where()->save($wxdata);</span>
$jsapi_ticket = $wxdata['jsapi_ticket'];
// var_dump($jsapi_ticket);die();
} else {
$jsapi_ticket = $data['jsapi_ticket'];
}
return $jsapi_ticket;
}
private function getAccessToken() {
$data = D('<span style="font-family: Arial, Helvetica, sans-serif;">存放的表名</span><span style="font-family: Arial, Helvetica, sans-serif;">')->where(array('id'=>1))->find();</span>
if ($data['expire_time'] < time()) {
// var_dump(time());die();
$token_access_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" . APPID . "&secret=" . APPSECRET;
$res = file_get_contents($token_access_url); //获取文件内容或获取网络请求的内容
$result = json_decode($res, true); //接受一个 JSON 格式的字符串并且把它转换为 PHP 变量
$wxdata['access_token'] = $result['access_token'];
$wxdata['expire_time'] = time()+7000;
$data = D('<span style="font-family: Arial, Helvetica, sans-serif;">存放的表名</span><span style="font-family: Arial, Helvetica, sans-serif;">')->where(array('id'=>1))->save($wxdata);</span>
$access_token = $wxdata['access_token'];
} else {
$access_token = $data['access_token'];
}
return $access_token;
}
}
——————————————2 在需要用到的方法里引入jssdk,并传值到页面,根据各个框架不同方法不同—————————————————————
require_once 'jssdk的路径';
$jssdk = new JSSDK();
$data = $jssdk->outWeixin();
——————————————3 在需要分享的页面,加载方法传过来的值,写出调用的api—————————————————————————————
<span> </span>wx.ready(function () {
wx.onMenuShareTimeline({
title: '分享标题', // 分享标题
link: '2222', // 分享链接
imgUrl: 'weixinshare.png', // 分享图标
success: function () {
// 用户确认分享后执行的回调函数
// alert('1');
},
cancel: function () {
// 用户取消分享后执行的回调函数
// alert('2');
}
});
wx.onMenuShareAppMessage({
title: '分享标题', // 分享标题
desc: '分享描述', // 分享描述
link: 'www.baidi.com', // 分享链接
imgUrl: '122', // 分享图标
type: '', // 分享类型,music、video或link,不填默认为link
dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空
success: function () {
// 用户确认分享后执行的回调函数
},
cancel: function () {
// 用户取消分享后执行的回调函数
}
});
});
总结:
做的过程参考微信开发者文档即可。不多叙述。
遇到如下几个问题:
1 。url的获取,获取当前不带#和hash值的url 容易出错
2 。 签名错误时,先检查各个拼接字段,然后检查string连接是否写错,是否sha1加密。再去查access_token 和jsapi_ticket
3 。需要注意的是,access_token 和jsapi_ticket 这两个值,都是7200有效期,每天的请求上线是2000次,所以需要在服务器进行缓存,可以写文件,可以存入缓存,可以写表等等 。如果超过上限,微信号将被取消使用分享的功能。
3 。 步骤3中调用的api需要写在
wx.ready(function () {
} 中
4 需要在公众号内 绑定微信安全域名,只有域名列表内的,才能使用api。
5 在缓存的时候access_token 和jsapi_ticket 的长度需要注意