转自http://my.oschina.net/superkangning/blog/368043
一:准备文件,并将文件置于网站根目录下
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
*
* 如有问题请通过以下渠道反馈:
* 邮箱地址:[email protected]
* 邮件主题:【微信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接口安全域名->设置