包括缓存,包括https通讯,获取微信access_token,签名什么的都有。但是防范性编程做得比较少,商业用的话,需要完善下代码。
使用姿势
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
|
^ajax(Common.ServerUrl + "GetWX.php" , {
data: {
Type: "config" ,
url: location.href.split( '#' )[0]
},
dataType: 'json' ,
type: 'get' ,
timeout: 5000,
success: function (data) {
wx.config({
debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: '……' , // 必填,公众号的唯一标识
timestamp: data.timestamp, // 必填,生成签名的时间戳
nonceStr: data.nonceStr, // 必填,生成签名的随机串
signature: data.signature, // 必填,签名,见附录1
jsApiList: [ "getLocation" ] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
});
}
})
wx.ready( function () {
wx.getLocation({
type: 'wgs84' , // 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02'
success: function (res) {
var latitude = res.latitude; // 纬度,浮点数,范围为90 ~ -90
var longitude = res.longitude; // 经度,浮点数,范围为180 ~ -180。
plus2.storage.setItem( "latitude" , latitude);
plus2.storage.setItem( "longitude" , longitude);
}
});
});
|
服务端
GetWX.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
86
87
88
89
90
91
92
93
94
95
|
<?php
include "lib/Cache.php" ;
define( $APPID , "……" );
define( $SECRET , "……" )
if ( $_GET [ 'Type' ] == "access_token" ){
// echo getAccess_token();
}
else if ( $_GET [ 'Type' ] == "jsapi_ticket" ){
// echo getJsapi_ticket();
}
else if ( $_GET [ 'Type' ] == "config" ){
$jsapi_ticket = getJsapi_ticket();
$nonceStr = "x" .rand(10000,100000). "x" ; //随机字符串
$timestamp = time(); //时间戳
$url = $_GET [ 'url' ];
$signature = getSignature( $jsapi_ticket , $nonceStr , $timestamp , $url );
$result = array ( "jsapi_ticket" => $jsapi_ticket , "nonceStr" => $nonceStr , "timestamp" => $timestamp , "url" => $url , "signature" => $signature );
echo json_encode( $result );
}
function getSignature( $jsapi_ticket , $noncestr , $timestamp , $url ){
$string1 = "jsapi_ticket=" . $jsapi_ticket . "&noncestr=" . $noncestr . "×tamp=" . $timestamp . "&url=" . $url ;
$sha1 = sha1( $string1 );
return $sha1 ;
}
function getJsapi_ticket(){
$cache = new Cache();
$cache = new Cache(7000, 'cache/' ); //需要创建cache文件夹存储缓存文件。
//从缓存从读取键值 $key 的数据
$jsapi_ticket = $cache -> get( "jsapi_ticket" );
$access_token = getAccess_token();
//如果没有缓存数据
if ( $jsapi_ticket == false) {
$access_token = getAccess_token();
$url = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket' ;
$data = array ( 'type' => 'jsapi' , 'access_token' => $access_token );
$header = array ();
$response = json_decode(curl_https( $url , $data , $header , 5));
$jsapi_ticket = $response ->ticket;
//写入键值 $key 的数据
$cache -> put( "jsapi_ticket" , $jsapi_ticket );
}
return $jsapi_ticket ;
}
function getAccess_token(){
$cache = new Cache();
$cache = new Cache(7000, 'cache/' );
//从缓存从读取键值 $key 的数据
$access_token = $cache -> get( "access_token" );
//如果没有缓存数据
if ( $access_token == false) {
$url = 'https://api.weixin.qq.com/cgi-bin/token' ;
$data = array ( 'grant_type' => 'client_credential' , 'appid' => $APPID , 'secret' => $SECRET );
$header = array ();
$response = json_decode(curl_https( $url , $data , $header , 5));
$access_token = $response ->access_token;
//写入键值 $key 的数据
$cache -> put( "access_token" , $access_token );
}
return $access_token ;
}
/** curl 获取 https 请求
* @param String $url 请求的url
* @param Array $data 要發送的數據
* @param Array $header 请求时发送的header
* @param int $timeout 超时时间,默认30s
*/
function curl_https( $url , $data = array (), $header = array (), $timeout =30){
$ch = curl_init();
curl_setopt( $ch , CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查
curl_setopt( $ch , CURLOPT_URL, $url );
curl_setopt( $ch , CURLOPT_HTTPHEADER, $header );
curl_setopt( $ch , CURLOPT_POST, true);
curl_setopt( $ch , CURLOPT_POSTFIELDS, http_build_query( $data ));
curl_setopt( $ch , CURLOPT_RETURNTRANSFER, true);
curl_setopt( $ch , CURLOPT_TIMEOUT, $timeout );
$response = curl_exec( $ch );
if ( $error =curl_error( $ch )){
die ( $error );
}
curl_close( $ch );
return $response ;
}
?>
|
Cache.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
|
<?php
class Cache {
private $cache_path ;
//path for the cache
private $cache_expire ;
//seconds that the cache expires
//cache constructor, optional expiring time and cache path
public function Cache( $exp_time = 3600, $path = "cache/" ) {
$this -> cache_expire = $exp_time ;
$this -> cache_path = $path ;
}
//returns the filename for the cache
private function fileName( $key ) {
return $this -> cache_path . md5( $key );
}
//creates new cache files with the given data, $key== name of the cache, data the info/values to store
public function put( $key , $data ) {
$values = serialize( $data );
$filename = $this -> fileName( $key );
$file = fopen ( $filename , 'w' );
if ( $file ) { //able to create the file
fwrite( $file , $values );
fclose( $file );
} else
return false;
}
//returns cache for the given key
public function get( $key ) {
$filename = $this -> fileName( $key );
if (! file_exists ( $filename ) || ! is_readable ( $filename )) { //can't read the cache
return false;
}
if (time() < ( filemtime ( $filename ) + $this -> cache_expire)) { //cache for the key not expired
$file = fopen ( $filename , "r" );
// read data file
if ( $file ) { //able to open the file
$data = fread ( $file , filesize ( $filename ));
fclose( $file );
return unserialize( $data );
//return the values
} else
return false;
} else
return false;
//was expired you need to create new
}
}
?>
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。