-
Notifications
You must be signed in to change notification settings - Fork 1
/
Script.php
109 lines (102 loc) · 4.14 KB
/
Script.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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
<?php
namespace WeChat;
use WeChat\Contracts\Tools;
use WeChat\Contracts\BasicWeChat;
use WeChat\Exceptions\InvalidResponseException;
/**
* 微信前端支持
* Class Script
* @package WeChat
*/
class Script extends BasicWeChat
{
/**
* 删除JSAPI授权TICKET
* @param string $type TICKET类型(wx_card|jsapi)
* @param string $appid 强制指定有效APPID
* @return void
*/
public function delTicket($type = 'jsapi', $appid = null)
{
is_null($appid) && $appid = $this->config->get('appid');
$cache_name = "{$appid}_ticket_{$type}";
Tools::delCache($cache_name);
}
/**
* 获取JSAPI_TICKET接口
* @param string $type TICKET类型(wx_card|jsapi)
* @param string $appid 强制指定有效APPID
* @return string
* @throws Exceptions\InvalidResponseException
* @throws Exceptions\LocalCacheException
*/
public function getTicket($type = 'jsapi', $appid = null)
{
is_null($appid) && $appid = $this->config->get('appid');
$cache_name = "{$appid}_ticket_{$type}";
$ticket = Tools::getCache($cache_name);
if (empty($ticket)) {
$url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type={$type}";
$this->registerApi($url, __FUNCTION__, func_get_args());
$result = $this->httpGetForJson($url);
if (empty($result['ticket'])) {
throw new InvalidResponseException('Invalid Resoponse Ticket.', '0');
}
$ticket = $result['ticket'];
Tools::setCache($cache_name, $ticket, 5000);
}
return $ticket;
}
/**
* 获取JsApi使用签名
* @param string $url 网页的URL
* @param string $appid 用于多个appid时使用(可空)
* @param string $ticket 强制指定ticket
* @return array
* @throws Exceptions\LocalCacheException
* @throws InvalidResponseException
*/
public function getJsSign($url, $appid = null, $ticket = null)
{
list($url,) = explode('#', $url);
is_null($ticket) && $ticket = $this->getTicket('jsapi');
is_null($appid) && $appid = $this->config->get('appid');
$data = ["url" => $url, "timestamp" => '' . time(), "jsapi_ticket" => $ticket, "noncestr" => Tools::createNoncestr(16)];
return [
'debug' => false,
"appId" => $appid,
"nonceStr" => $data['noncestr'],
"timestamp" => $data['timestamp'],
"signature" => $this->getSignature($data, 'sha1'),
'jsApiList' => [
'onWXDeviceBluetoothStateChange', 'onWXDeviceStateChange',
'openProductSpecificView', 'addCard', 'chooseCard', 'openCard',
'translateVoice', 'getNetworkType', 'openLocation', 'getLocation',
'onMenuShareTimeline', 'onMenuShareAppMessage', 'onMenuShareQQ', 'onMenuShareWeibo', 'onMenuShareQZone',
'chooseImage', 'previewImage', 'uploadImage', 'downloadImage', 'closeWindow', 'scanQRCode', 'chooseWXPay',
'hideOptionMenu', 'showOptionMenu', 'hideMenuItems', 'showMenuItems', 'hideAllNonBaseMenuItem', 'showAllNonBaseMenuItem',
'startScanWXDevice', 'stopScanWXDevice', 'onWXDeviceBindStateChange', 'onScanWXDeviceResult', 'onReceiveDataFromWXDevice',
'startRecord', 'stopRecord', 'onVoiceRecordEnd', 'playVoice', 'pauseVoice', 'stopVoice', 'onVoicePlayEnd', 'uploadVoice', 'downloadVoice',
'openWXDeviceLib', 'closeWXDeviceLib', 'getWXDeviceInfos', 'sendDataToWXDevice', 'disconnectWXDevice', 'getWXDeviceTicket', 'connectWXDevice',
],
];
}
/**
* 数据生成签名
* @param array $data 签名数组
* @param string $method 签名方法
* @return bool|string 签名值
*/
protected function getSignature($data, $method = "sha1")
{
if (!function_exists($method)) {
return false;
}
ksort($data);
$params = [];
foreach ($data as $key => $value) {
$params[] = "{$key}={$value}";
}
return $method(join('&', $params));
}
}