TP框架下如何自定义微信分享页小图标和标题内容,关于设置白名单、安全域名等可以查看官方文档
1、获取公众号的access_token,并保存在服务器缓存(必须,否则重复请求服务器将到达上限,无法继续请求该数据)。
/*获取access_token*/
function getAccessToken(){
//我们将access_token全局缓存在文件中,每次获取的时候,先判断是否过期,如果过期重新获取再全局缓存
//我们缓存的在文件中的数据,包括access_token和该access_token的过期时间戳.
//获取缓存的access_token
$access_token_data = json_decode(F('access_token'),true);
//判断缓存的access_token是否存在和过期,如果不存在和过期则重新获取.
if($access_token_data !== null && $access_token_data['access_token'] && $access_token_data['expires_in'] > time()){
print_r($access_token_data['access_token']);
return $access_token_data['access_token'];
}else{
//重新获取access_token,并全局缓存
$curl = curl_init();
curl_setopt($curl,CURLOPT_URL,'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='
.C('WECHAT_APPID').'&secret='.C('WECHAT_SECRET'));
curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
//获取access_token
$data = json_decode(curl_exec($curl),true);
if($data != null && $data['access_token']){
//设置access_token的过期时间,有效期是7200s
$data['expires_in'] = $data['expires_in'] + time();
//将access_token全局缓存,快速缓存到文件中.
F('access_token',json_encode($data));
//返回access_token
return $data['access_token'];
}else{
exit('微信获取access_token失败');
}
}
}
2、通过获取到的access_token,像微信发起请求获取到jsapi_ticket,确保获取access_token和获取jsapi_ticket是使用的appid和appserect是一样的(最好直接全局定义一下)。关于发送请求返回的json可以去官方文档看下
/*获取jsapi_ticket*/
function getJsapiTicket()
{
//jsapi_ticket也必须存在全局缓存文件中,每次获取的时候先判断是否过期,过期则重新获取
$jsapi_ticket_data = json_decode(F('jsapi_ticket'),true);
if($jsapi_ticket_data !== null && $jsapi_ticket_data['ticket'] && $jsapi_ticket_data['expires_in'] > time()){
return $jsapi_ticket_data['ticket'];
}else{
$curl = curl_init();
//获取全局缓存的access_token
$access_token = getAccessToken();
curl_setopt($curl,CURLOPT_URL,'https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token='.$access_token.'&type=jsapi');
curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
//获取access_token
$data = json_decode(curl_exec($curl),true);
if($data != null && $data['ticket']){
//设置access_token的过期时间,有效期是7200s
$data['expires_in'] = $data['expires_in'] + time();
//将access_token全局缓存,快速缓存到文件中.
F('jsapi_ticket',json_encode($data));
//返回access_token
return $data['ticket'];
}else{
exit('微信获取jsapi_ticket失败');
}
}
}
3、创建16位的随机数
/*获取随机字符串*/
function nonceStr()
{
//定义一个字符串
$chars='ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz';
//当前的时间戳
$time = time();
//从该字符串中获取随机字符串
$chars = $chars.$time;
//打乱字符串
$chars = str_shuffle($chars);
return substr($chars,0,16);
}
4、生成签名
/**生成签名
**$nonceStr 16位随机数
**$time 获取随机数时的时间戳
*/
function signature($time,$url,$nonceStr)
{
//拼接字符串
$string = 'jsapi_ticket='.getJsapiTicket().'&noncestr='.$nonceStr.'×tamp='.$time.'&url='.$url;
//生成签名
$string = sha1($string);
return $string;
}
5、上面是创建生成签名需要的函数,下面是如何验证
6、分享页面的js
var imgUrl = '小图标,完整地址如:https://xxx.com/images/xxx.png';
var lineLink = '分享的网页,地址完整地址如:https://xxx.com/xxx/xxx.html';
var descContent = '分享的内容';
var shareTitle = '分享的内标题';
var appid = '';
$.ajax({
type : 'POST',
url : "获取wx.config所需参数的函数地址",
dataType : "json",
data:{url:window.location.href.split('#')[0]},
success : function(data){
var appId = data['appId'];
var timestamp = data['timestamp'];
var nonceStr = data['nonceStr'];
var signature = data['signature'];
wx.config({
debug: false,
appId: appId,
timestamp: timestamp,
nonceStr: nonceStr,
signature: signature,
jsApiList: [
'updateTimelineShareData',//1.4.0的分享接口,注意:使用新版本的分享功能,一定要在该列表加上对应的老版本功能接口,否则新接口不起作用
'updateAppMessageShareData',//1.4.0的分享接口,注意:使用新版本的分享功能,一定要在该列表加上对应的老版本功能接口,否则新接口不起作用
'onMenuShareTimeline',
'onMenuShareAppMessage'
]
});
wx.ready(function() {
wx.updateTimelineShareData({
title: shareTitle, // 分享标题
link: lineLink, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
imgUrl: imgUrl, // 分享图标
success: function () {
// 用户确认分享后执行的回调函数
},
cancel: function () {
// 用户取消分享后执行的回调函数
}
});
wx.updateAppMessageShareData({
title: shareTitle, // 分享标题
desc: descContent, // 分享描述
link: lineLink, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
imgUrl: imgUrl, // 分享图标
type: '', // 分享类型,music、video或link,不填默认为link
dataUrl:'' , // 如果type是music或video,则要提供数据链接,默认为空
success: function () {
// 用户确认分享后执行的回调函数
},
cancel: function () {
// 用户取消分享后执行的回调函数
}
});
});
}
});
7、获取config参数的函数
public function jsSDKConfig()
{
$url =get_value_by_post('url');
$url = str_replace("&", "&", $url);//必须,否则可能会出现无效签名
//$array['url'] =$url;//不是必须的参数,但是可以输出url,如果出现无效签名其他也没有问题的时候注意一下这个输出,看下是否和实际当前网页地址一致(不包#后面的),必须每个字符都一样才不会出现无效签名,这里也给自己备注一下。
$array['appId'] = C('WECHAT_APPID');//定义的appId
//生成签名的时间戳
$time = time();
$array['timestamp'] = $time;
//签名使用的随机字符串
$nonceStr = nonceStr();
$array['nonceStr'] = $nonceStr;
//生成签名
$array['signature'] = signature($time,$url,$nonceStr);
$this->ajaxReturn($array);
}
8、总的来说,就是进入页面后通过自定义的生成签名方法jsSDKConfig获取到wx.config所需参数用来验证使用中的接口。
9、这个也算是纪录一下自己的学习成果,中途遇到的最大问题就是在将参数输入微信 JS 接口签名校验工具生成的签名与后台输出的签名一样,但是还是提示invalid signature,一直找不到问题,最后发现是ajax在将url传递的过程中将&改为了& amp;所以导致了签名无效,所以在遇到类似问题时一定要查看网页地址和传递到后台的url是否一模一样,必须一样!