这里主要是展示了微信分享到朋友圈,分享给好友等接口,同时在thinkphp5中封装了动态获取wx.config需要获取的参数。
jssdk开发文档点击
PHP部分
/**
* 微信JSSDK相关
*/
class Jssdk extends Controller
{
private $appid = APPID;
private $secret = SECRET;
public function options()
{
$url = input('param.url');
// $url = $_SERVER['REQUEST_SCHEME'].'://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
$param = self::sign($url);
$data = [
'debug'=> false, // 是否开启调试
'appId'=> $this->appid, // 必填,公众号的唯一标识
'timestamp'=> $param['time'], // 必填,生成签名的时间戳
'nonceStr'=> $param['nonceStr'], // 必填,生成签名的随机串
'signature'=> $param['signature'],// 必填,签名
'jsApiList'=> [ // 必填,需要使用的JS接口列表
'onMenuShareAppMessage',
'onMenuShareTimeline',
'showOptionMenu',
'hideOptionMenu',
"hideMenuItems",
"showMenuItems",
]
];
return json($data);
}
function getAccessToken(){
// 设置接口参数,这里填写将要设置的公众号的
$config = array(
'appid' => $this->appid,
'secret' => $this->secret,
);
$filename = './application/api/access_token_cache';
// 存在该文件且access_token未过期
if (is_file($filename) && filemtime($filename) + 7100 > time()) {
$data = file_get_contents($filename);
}else{
// 重新获取access_token
$api = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&'.http_build_query($config);
// 发送接口请求,调用发送curl请求的函数(注意在面向对象环境下的引用方式)
$rs = httpRequest($api);
// 将获取的json字符串转成php数组
$result = json_decode($rs, true);
$data = $result['access_token'];
file_put_contents($filename, $data);
}
return $data;
}
public function sign($url)
// public function sign()
{
$nonceStr = self::createNonceStr();
$ticket = self::geticket();
$time = time();
$str = 'jsapi_ticket='.$ticket.'&noncestr='.$nonceStr.'×tamp='.$time.'&url='.$url;
$signature = sha1($str);
$data = [
'time'=>$time,
'signature'=>$signature,
'nonceStr'=>$nonceStr,
];
return $data;
}
// 获取随机字符串
public static function createNonceStr($length = 16)
{
$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$str = '';
for ($i = 0; $i < $length; $i++) {
$str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
}
return $str;
}
// 获取jsapi_ticket(用户生成签名)
function geticket(){
$filename = './application/api/jsapi_ticket_cache';
// 存在该文件且jsapi_ticket未过期
if (is_file($filename) && filemtime($filename) + 7100 > time()) {
$data = file_get_contents($filename);
}else{
// 获取access_token
$access_token = self::getAccessToken();
$api = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token='.$access_token.'&type=jsapi';
// 发送接口请求
$rs = httpRequest($api);
// 将获取的json字符串转成php数组
$result = json_decode($rs, true);
$data = $result['ticket'];
file_put_contents($filename, $data);
}
return $data;
}
}
这里的httpRequest()是封装的一个curl请求作用的函数,点击查看
JavaScript部分
<script type='text/javascript'>
$(document).ready(function(){
// 页面分享
shareOptions();
});
// 获取微信jssdk配置参数
function shareOptions() {
var url = window.location.href; //当前页面url
$.get("/api/jssdk/options.html",{'url':url},function(res){
wx.config(res);
wx.ready(function () { //需在用户可能点击分享按钮前就先调用
// 分享到朋友圈
wx.onMenuShareTimeline({
title: '', // 分享标题
link: url, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
imgUrl: 'http://www.xxx.com/myimg/logo.jpg', // 分享图标
success: function () {
// alert('分享成功');
}
});
// 分享给好友
wx.onMenuShareAppMessage({
title: '', // 分享标题
desc: '', // 分享描述
link: url, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
imgUrl: 'http://www.xxx.com/myimg/logo.jpg', // 分享图标
type: '', // 分享类型,music、video或link,不填默认为link
dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空
success: function () {
}
});
// 隐藏功能
wx.hideMenuItems({
menuList: [
'menuItem:share:qq',
'menuItem:share:weiboApp',
'menuItem:share:QZone',
'menuItem:share:facebook',
] // 要隐藏的菜单项,只能隐藏“传播类”和“保护类”按钮,所有menu项见附录3
});
// 隐藏右上角菜单接口
// wx.hideOptionMenu();
});
// wx.checkJsApi({
// jsApiList: ['onMenuShareTimeline'], // 需要检测的JS接口列表,所有JS接口列表见附录2,
// success: function(res) {
// console.log(res);
// // 以键值对的形式返回,可用的api值true,不可用为false
// // 如:{"checkResult":{"chooseImage":true},"errMsg":"checkJsApi:ok"}
// }
// });
// wx.error(function(res){
// // console.log(res);
// });
});
}