JSSDK.class.php
3.98 KB
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
<?php
class Lib_Wechat_JSSDK {
public static $appId = YOHO_WECHAT_APPID;
public static $appSecret = YOHO_WECHAT_APPSECRET;
public static function getSignPackage($url = '')
{
$jsapiTicket = self::getJsApiTicket();
// 注意 URL 一定要动态获取,不能 hardcode.
/* $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
$url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; */
// 确保你获取用来签名的url是动态获取的,动态页面可参见实例代码中php的实现方式。如果是html的静态页面在前端通过ajax将url传到后台签名,前端需要用js获取当前页面除去'#'hash部分的链接(可用location.href.split('#')[0]获取),因为页面一旦分享,微信客户端会在你的链接末尾加入其它参数,如果不是动态获取当前链接,将导致分享后的页面签名失败。
$timestamp = time();
$nonceStr = self::createNonceStr();
// 这里参数的顺序要按照 key 值 ASCII 码升序排序
$string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr×tamp=$timestamp&url=$url";
$signature = sha1($string);
$signPackage = array(
"appId" => self::$appId,
"nonceStr" => $nonceStr,
"timestamp" => $timestamp,
"url" => $url,
"signature" => $signature,
"rawString" => $string
);
return $signPackage;
}
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;
}
public static function getJsApiTicket()
{
// jsapi_ticket 应该全局存储与更新,以下代码以写入到文件中做示例
$jsapi_ticket = Lib_Utils_Cache_Data::get("WEICHAT_JSAPI_TICK_1");
if (empty($jsapi_ticket))
{
//$accessToken = $this->getAccessToken();
$accessToken = self::getAccessToken();
// 如果是企业号用以下 URL 获取 ticket
// $url = "https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=$accessToken";
$url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=$accessToken";
$res = json_decode(self::httpGet($url));
$ticket = $res->ticket;
if ($ticket)
{
Lib_Utils_Cache_Data::set("WEICHAT_JSAPI_TICK_1", $ticket, 3600);
}
}
else
{
$ticket = $jsapi_ticket;
}
return $ticket;
}
public static function getAccessToken()
{
$http_url = 'https://api.weixin.qq.com/cgi-bin/token?';
$params = array('appid'=> YOHO_WECHAT_APPID,'secret' => YOHO_WECHAT_APPSECRET,'grant_type'=>'client_credential');
$access_token = Lib_Utils_Cache_Data::get("WEICHAT_ACCESSTOKEN");
if(empty( $access_token ))
{
$result = json_decode(self::httpGet($http_url.http_build_query($params)), true);
$access_token = $result['access_token'];
$expire = $result['expires_in'];
Lib_Utils_Cache_Data::set("WEICHAT_ACCESSTOKEN", $access_token, 3600);
}
if($access_token)
{
return $access_token;
}
else
{
return '';
}
}
public static 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;
}
}