使用PHP对微信服务号JSSDK签名授权的开发实录

准备工作
1. 配置微信公众平台域名白名单
2. 前端引入JSSDK
PHP服务器端配置
使用PHP脚本获取token及签名的代码如下:
<?php // curl获取数据 function curl_get_contents($url, $timeout = 8) { $curlHandle = curl_init(); curl_setopt($curlHandle, CURLOPT_URL, $url); curl_setopt($curlHandle, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curlHandle, CURLOPT_TIMEOUT, $timeout); $result = curl_exec($curlHandle); curl_close($curlHandle); return $result; } // 获取token function getToken () { $appid = 'wx************';; $appsecret = '************'; return curl_get_contents('https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$appid.'&secret='.$appsecret); } // 获取ticket function getTicket ($token) { return curl_get_contents('https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token='.$token.'&type=jsapi'); } // 生成无序字符串 function genNonceStr ($length = 16) { $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; $str = ""; for ($i = 0; $i < $length; $i++) { $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1); } return $str; } // 生成配置 function genConfig () { // 获取 access_token $access_token = json_decode(getToken(), true)['access_token']; // 获取 ticket $ticket = json_decode(getTicket($access_token), true)['ticket']; // 生成签名 $nonstr = genNonceStr(); $url = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : ''; $time = time(); $query = [ 'jsapi_ticket' => $ticket, 'noncestr' => $nonstr, 'timestamp' => $time, 'url' => $url ]; $signStr = "jsapi_ticket=$ticket&noncestr=$nonstr×tamp=$time&url=$url"; $signature = sha1($signStr); $appid = 'wx************'; return json_encode([ 'code' => 1, 'data' => [ 'query' => $query, 'signStr' => $signStr, 'appId' => $appid, 'timestamp' => $time, 'nonceStr' => $nonstr, 'signature' => $signature, 'url' => $url ] ]); } echo genConfig();
获取签名的方法:先获取ticket,然后使用ticket换取token,最后使用获取到的token计算出签名(signature)。
客户端配置
1. 获取服务器端签名
2. 配置wx.config参数
3. 配置权限列表
weixinInit () { const time = new Date().getTime() axiosBase.get(`/wechat/genConfig?t=${time}`).then(function (response) { if (response.data.code !== 1) { return } let parm = response.data.data wx.config({ debug: false, appId: parm.appId, timestamp: parm.timestamp, nonceStr: parm.nonceStr, signature: parm.signature, jsApiList: [ 'getLocation', 'checkJsApi', 'chooseWXPay', 'closeWindow', 'openLocation', 'onMenuShareTimeline', 'onMenuShareAppMessage', 'onMenuShareQQ', 'onMenuShareWeibo', 'onMenuShareQZone', 'hideMenuItems', 'scanQRCode' ] }) }) } // 封装微信各种分享 weixinShare (title, link, imgUrl, desc) { this.weixinInit() wx.ready(() => { wx.hideMenuItems({ menuList: [ 'menuItem:copyUrl', 'menuItem:openWithQQBrowser', 'menuItem:openWithSafari', 'menuItem:share:email', 'menuItem:share:brand' ] }) // 分享到朋友圈 wx.onMenuShareTimeline({ title: title, // 分享标题 link: link, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致 imgUrl: imgUrl, // 分享图标 success: function () {}, cancel: function () {} }) // 分享给朋友 wx.onMenuShareAppMessage({ title: title, // 分享标题 desc: desc, // 分享描述 link: link, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致 imgUrl: imgUrl, // 分享图标 type: '', // 分享类型,music、video或link,不填默认为link dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空 success: function () {}, cancel: function () {} }) // 分享到QQ wx.onMenuShareQQ({ title: title, // 分享标题 desc: desc, // 分享描述 link: link, // 分享链接 imgUrl: imgUrl, // 分享图标 success: function () {}, cancel: function () {} }) // 分享到腾讯微博 wx.onMenuShareWeibo({ title: title, // 分享标题 desc: desc, // 分享描述 link: link, // 分享链接 imgUrl: imgUrl, // 分享图标 success: function () {}, cancel: function () {} }) // 分享到QQ空间 wx.onMenuShareQZone({ title: title, // 分享标题 desc: desc, // 分享描述 link: link, // 分享链接 imgUrl: imgUrl, // 分享图标 success: function () {}, cancel: function () {} }) }) }
常用接口的使用
菜单相关:
- wx.hideMenuItems 隐藏菜单项
- wx.showMenuItems 显示菜单项
分享相关:
- wx.onMenuShareTimeline 分享到朋友圈
- wx.onMenuShareAppMessage 分享给朋友
- wx.onMenuShareQQ 分享到QQ
- wx.onMenuShareWeibo 分享到腾讯微博
- wx.onMenuShareQZone 分享到QQ空间
位置相关:
- wx.openLocation 使用微信内置地图查看位置接口
- wx.getLocation 获取地理位置接口
其他常用:
- wx.chooseWXPay 支付
- wx.scanQRCode 扫一扫
注意事项
关于iOS单页应用分享失败的解决
在iOS中使用JSSDK的时候,使用单页应用的方式开发,会发现微信只认入口页面的配置,如果路由改变,复制链接,仍然还是入口页面路径,因此导致微信分享等等功能也无效,分享出去的配置仍然还是入口页面配置的分享参数。
要解决此问题,必须在每次使用微信接口之前都重新初始化微信JSSDK。
结束语
更新有点晚, 这篇文章是我以前博客里面的一篇文章, 主要是微信JSSDK的一些使用记录, 至于前面的Docker系列文章实战部分将隔段时间再继续发表, 一次性发完也不是那么容易消化, 敬请期待。
相关推荐
-
第18问:MySQL CPU 高了,怎么办?2025-02-24 10:27:18
-
mysql索引类型 normal, unique, full text
mysql索引类型 normal, unique, full text2025-02-24 10:05:05 -
uwsgi+django+nginx 搭建部分总结2025-02-24 10:03:33
-
使用Docker配置Nginx环境部署Nextcloud2025-02-24 10:02:03
-
Nginx安装和怎么使用2025-02-24 10:00:45