亲测:ThinkPHP 调用微信JS-SDK 开发详解(转)
摘要 项目中使用THinkPHP框架开发微信,需要进行自定义微信分享,前段时间微信的分享不能用了,小编尝试各种网络上的办法均失效,后面才知道微信在酝酿发布JS-SDK,现在调用安全性更高了,需要绑定你关联的域名! 下面就看我如何在PHP中运用最新的JS-SDK进行微信自定义分享吧!
一:准备文件,并将文件置于网站根目录下
access_token.json
1
|
{ "access_token" : "" , "expire_time" :0} |
jsapi_ticket.json
1
|
{ "jsapi_ticket" : "" , "expire_time" :0} |
jssdk.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
<?php class JSSDK { private $appId ; private $appSecret ; public function __construct( $appId , $appSecret ) { $this ->appId = $appId ; $this ->appSecret = $appSecret ; } public function getSignPackage() { $jsapiTicket = $this ->getJsApiTicket(); $url = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]" ; $timestamp = time(); $nonceStr = $this ->createNonceStr(); // 这里参数的顺序要按照 key 值 ASCII 码升序排序 $string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr×tamp=$timestamp&url=$url" ; $signature = sha1( $string ); $signPackage = array ( "appId" => $this ->appId, "nonceStr" => $nonceStr , "timestamp" => $timestamp , "url" => $url , "signature" => $signature , "rawString" => $string ); return $signPackage ; } private 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 ; } private function getJsApiTicket() { // jsapi_ticket 应该全局存储与更新,以下代码以写入到文件中做示例 $data = json_decode( file_get_contents ( "jsapi_ticket.json" )); if ( $data ->expire_time < time()) { $accessToken = $this ->getAccessToken(); $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=$accessToken" ; $res = json_decode( $this ->httpGet( $url )); $ticket = $res ->ticket; if ( $ticket ) { $data ->expire_time = time() + 7000; $data ->jsapi_ticket = $ticket ; $fp = fopen ( "jsapi_ticket.json" , "w" ); fwrite( $fp , json_encode( $data )); fclose( $fp ); } } else { $ticket = $data ->jsapi_ticket; } return $ticket ; } private function getAccessToken() { // access_token 应该全局存储与更新,以下代码以写入到文件中做示例 $data = json_decode( file_get_contents ( "access_token.json" )); if ( $data ->expire_time < time()) { $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->appId&secret=$this->appSecret" ; $res = json_decode( $this ->httpGet( $url )); $access_token = $res ->access_token; if ( $access_token ) { $data ->expire_time = time() + 7000; $data ->access_token = $access_token ; $fp = fopen ( "access_token.json" , "w" ); fwrite( $fp , json_encode( $data )); fclose( $fp ); } } else { $access_token = $data ->access_token; } return $access_token ; } private function httpGet( $url ) { $curl = curl_init(); curl_setopt( $curl , CURLOPT_RETURNTRANSFER, true); curl_setopt( $curl , CURLOPT_TIMEOUT, 500); curl_setopt( $curl , CURLOPT_SSL_VERIFYPEER, false); curl_setopt( $curl , CURLOPT_SSL_VERIFYHOST, false); curl_setopt( $curl , CURLOPT_URL, $url ); $res = curl_exec( $curl ); curl_close( $curl ); return $res ; } } |
二:编辑显示页面对应的后台PHP文件,添加如下代码
1
2
3
4
5
|
include ( 'jssdk.php' ); $jssdk = new JSSDK( "APPID" , "APPSECRET" ); $signPackage = $jssdk ->GetSignPackage(); $this ->signPackage = $signPackage ; |
请将APPID和APPSECRET换成您自己微信账号的信息
三:编辑显示页面模板html文件,添加如下代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
< script src = "http://res.wx.qq.com/open/js/jweixin-1.0.0.js" ></ script > < script > wx.config({ appId: '{suetech:$signPackage.appId}', timestamp: {suetech:$signPackage.timestamp}, nonceStr: '{suetech:$signPackage.nonceStr}', signature: '{suetech:$signPackage.signature}', jsApiList: [ 'checkJsApi', 'onMenuShareTimeline', 'onMenuShareAppMessage', 'onMenuShareQQ', 'onMenuShareWeibo' ] }); /* * 注意: * 1. 所有的JS接口只能在公众号绑定的域名下调用,公众号开发者需要先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。 * 2. 如果发现在 Android 不能分享自定义内容,请到官网下载最新的包覆盖安装,Android 自定义分享接口需升级至 6.0.2.58 版本及以上。 * 3. 完整 JS-SDK 文档地址:http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html * * 如有问题请通过以下渠道反馈: * 邮箱地址:weixin-open@qq.com * 邮件主题:【微信JS-SDK反馈】具体问题 * 邮件内容说明:用简明的语言描述问题所在,并交代清楚遇到该问题的场景,可附上截屏图片,微信团队会尽快处理你的反馈。 */ wx.ready(function () { // 1 判断当前版本是否支持指定 JS 接口,支持批量判断 wx.checkJsApi({ jsApiList: [ 'getNetworkType', 'previewImage', 'onMenuShareTimeline', 'onMenuShareAppMessage', 'onMenuShareQQ', 'onMenuShareWeibo' ], success: function (res) { alert(JSON.stringify(res)); } }); var shareData = { title: '标题', desc: '描述', link: '链接', imgUrl: '图片', trigger: function (res) { alert('用户点击发送给朋友'); }, success: function (res) { alert('已分享'); }, cancel: function (res) { alert('已取消'); }, fail: function (res) { alert(JSON.stringify(res)); } }; wx.onMenuShareAppMessage(shareData); wx.onMenuShareTimeline(shareData); wx.onMenuShareQQ(shareData); wx.onMenuShareWeibo(shareData); }); wx.error(function (res) { alert(res.errMsg); }); </ script > |
到此已经能够正常进行微信自定义分享了
需要注意的地方是在微信公众账号中配置您的域名,设置方法:
登陆微信公众账号->公众号设置->功能设置->JS接口安全域名->设置