-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathWx_service.php
More file actions
137 lines (133 loc) · 4.95 KB
/
Wx_service.php
File metadata and controls
137 lines (133 loc) · 4.95 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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
<?php
class Wx_service extends Base_Service
{
public function __construct()
{
parent::__construct();
}
public function get_wx_params($params){
$url = urldecode($params['url']);
$timestamp = time();
$wxConfig = $this->config->item('wx');
$appId = $wxConfig['AppID'];
$nonceStr = $this->getNonceStr();
$accessToken = $this->GetAcessToken($wxConfig['AppID'],$wxConfig['AppSecret']);
if(empty($accessToken)){
return false;
}
$ticket = $this->GetJsApiTicket($accessToken);
if(empty($ticket)){
return false;
}
$signature_param_arr = array(//字典序
'jsapi_ticket' => $ticket,
'noncestr' => $nonceStr,
'timestamp' => $timestamp,
'url' => $url,
);
$signature_params = array();
foreach ($signature_param_arr as $key => $value) {
$signature_params[] = $key.'='.$value;
}
$str1 = implode('&', $signature_params);
$signature = sha1($str1);
$return_data = array(
'appId' => $appId,
'timestamp' => $timestamp,
'nonceStr' => $nonceStr,
'signature' => $signature,
'url' => $url,
'access_token' => $accessToken,
'ticket' => $ticket,
);
return $return_data;
}
/**
*
* 产生随机字符串,不长于32位
* @param int $length
* @return 产生的随机字符串
*/
public function getNonceStr($length = 32)
{
$chars = "abcdefghijklmnopqrstuvwxyz0123456789";
$str ="";
for ( $i = 0; $i < $length; $i++ ) {
$str .= substr($chars, mt_rand(0, strlen($chars)-1), 1);
}
return $str;
}
/**
* [http_curl 通用Curl方法]
* @param [type] $url [传入请求url地址]
* @param string $request_type [发送请求类型,默认get]
* @param string $data_type [返回数据格式,默认json]
* @param any $arr [post可能传入参数,默认为空]
* @return [type] [返回值]
*/
public function http_curl($url,$request_type='get',$data_type='json',$arr='')
{
$ch=curl_init();//初始化curl
curl_setopt($ch, CURLOPT_URL, $url);//定义一些curl参数
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
if ($request_type=='post') {//如果是post请求
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $arr);
}
$output=curl_exec($ch);//执行请求
if ($data_type=='json') {
if ( curl_errno($ch) ) {//如果请求出错,返回错误信息
return curl_error($ch);
}
else{//请求成功获取数据
$res=json_decode($output,true);
}
curl_close($ch);//curl关闭
return $res;//返回数据
}
}
/**
*
* 获取accesstoken
* @return 字符串
*/
public function GetAcessToken($appid,$appsecret)
{
if (@$_SESSION['access_token']&&@$_SESSION['alive']>time()) {//token存在且未过期
$access_token=$_SESSION['access_token'];
}else{//token不存在或已过期
$url='https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$appid.'&secret='.$appsecret;
$res = $this->http_curl($url);//这是自己写的curl方法,用于调用接口
if(isset($res['access_token'])&&$res['access_token']){
$_SESSION['access_token']= $access_token = $res['access_token'];
$_SESSION['alive']=time()+7000;
}else{
$access_token = '';
log_message('error','get wx access_token fail.error message:'.$res['errmsg']);
}
}
return $access_token;
}
/**
*
* 获取ticket
* @return 字符串
*/
public function GetJsApiTicket($access_token)
{
if (@$_SESSION['ticket']&&@$_SESSION['alive']>time()) {//ticket存在且未过期
$ticket=$_SESSION['ticket'];
}else{//ticket不存在或已过期
$url = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token='.$access_token.'&type=jsapi';
$res = $this->http_curl($url);
if(isset($res['ticket'])&&!empty($res['ticket'])){
$_SESSION['ticket']= $ticket = $res['ticket'];
$_SESSION['alive']=time()+7000;
}else{
$ticket = '';
log_message('error','get wx jsapiticket fail.error message:'.$res['errmsg']);
}
}
return $ticket;
}
}