废话不多说了,直接给大家贴代码了,具体代码如下所示:
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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
|
<?php
namespace Home\Model;
use Think\Model;
class WechatModel extends Model {
private $_token = '' ; //令牌
private $appid ;
private $appsecret ;
public function __construct()
{
$this ->appid = C( 'APPID' ); //公众号的appid
$this ->appsecret = C( 'APPSECRET' ); //公众号的秘钥
}
//调用js-sdk的签名包
public function getSignPackage() {
$jsapiTicket = $this ->getJsApiTicket();
// 注意 URL 一定要动态获取,不能 hardcode.(获取当前网页的url)
$protocol = (! empty ( $_SERVER [ 'HTTPS' ]) && $_SERVER [ 'HTTPS' ] !== 'off' || $_SERVER [ 'SERVER_PORT' ] == 443) ? "https://" : "http://" ;
$url = "$protocol$_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 ;
}
//使用会员卡领取的签名包
public function getHuiYuanSignPackage() {
$apiTicket = $this ->getApiTicket();
// 注意 URL 一定要动态获取,不能 hardcode.(获取当前网页的url)
$protocol = (! empty ( $_SERVER [ 'HTTPS' ]) && $_SERVER [ 'HTTPS' ] !== 'off' || $_SERVER [ 'SERVER_PORT' ] == 443) ? "https://" : "http://" ;
$url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]" ;
//时间戳
$timestamp = time();
//随机字符串获取
// $nonceStr = $this->createNonceStr();
// 这里参数的顺序要按照 key 值 ASCII 码升序排序
$string = $timestamp . $apiTicket . "car_id" ; //card_id为自己创建的会员卡的id
//生成字符串是用来签名用的
$signature = sha1( $string );
$signPackage = array (
"timestamp" => $timestamp ,
"signature" => $signature ,
);
return $signPackage ;
}
//获取会员卡的api_ticket
public function getApiTicket(){
$data = json_decode( file_get_contents ( "api_ticket.json" ));
if ( $data ->expire_time < time()) {
$accessToken = $this ->getAccessToken();
$url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=wx_card&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 ( "api_ticket.json" , "w" );
fwrite( $fp , json_encode( $data ));
fclose( $fp );
}
} else {
$ticket = $data ->jsapi_ticket;
}
return $ticket ;
}
//获取随机字符串
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 ;
}
//获取Access Token
public function getAccessToken(){
//将json字符串转换为json对象(json_encode是将数组转换为json字符串,json_decode("",true) 如果加true是将json字符串转化为php数组,不加true转换为PHP对象)
$data = json_decode( file_get_contents ( "access_token.json" ));
if ( $data ->expire_time < time()) {
// 如果是企业号用以下URL获取access_token
$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 ;
}
//获取jsapi_ticket(jsapi_ticket是公众号用于调用微信JS接口的临时票据)
private function getJsApiTicket() {
// jsapi_ticket 应该全局存储与更新,以下代码以写入到文件中做示例
$data = json_decode( file_get_contents ( "jsapi_ticket.json" ));
if ( $data ->expire_time < time()) {
$accessToken = $this ->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( $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 ;
}
//获取用户的openid
public function openId(){
$url = $_SERVER [ 'HTTP_HOST' ] . $_SERVER [ 'REQUEST_URI' ];
if (!isset( $_GET [ 'code' ])) {
//获取组装的url
$openidUrl = $this ->snsapi_base( $url );
redirect( $openidUrl );
} else {
$openidAccess_token = $this ->openidAccess_token( $_GET [ 'code' ]);
return $openidAccess_token ;
}
}
//获取微信用户的opnid
public function getOpenId( $openid , $access_token )
{
$userInfo = $this ->getUserInfo( $openid , $access_token );
return $userInfo ;
}
public function snsapi_base( $redirect_uri , $scope = "snsapi_userinfo" , $state = 0)
{
$appId = $this ->appid;
$url = "https://open.weixin.qq.com/connect/oauth2/authorize" ;
$url .= "?appid=$appId" ;
$url .= "&redirect_uri=http://$redirect_uri" ;
$url .= "&response_type=code" ;
$url .= "&scope=$scope" ;
$url .= "&state=$state#wechat_redirect" ;
return $url ;
}
public function openidAccess_token( $code ){
$appId = $this ->appid;
$appSecret = $this ->appsecret;
$url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=$appId&secret=$appSecret&code=$code&grant_type=authorization_code" ;
return json_decode( $this ->httpGet( $url ),true);
}
//获取用户信息
public function getUserInfo( $openid , $access_token ){
$url = "https://api.weixin.qq.com/sns/userinfo?access_token=$access_token&openid=$openid&lang=zh_CN " ;
return json_decode( $this ->httpGet( $url ),true);
//请求
}
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 ;
}
}
|
以上所述是小编给大家介绍的微信封装的调用微信签名包的类库,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!
原文链接:http://blog.csdn.net/bj123467/article/details/72910160