mirror of
https://gitee.com/zoujingli/ThinkAdmin.git
synced 2025-04-06 03:58:04 +08:00
123 lines
4.9 KiB
PHP
123 lines
4.9 KiB
PHP
<?php
|
||
|
||
namespace Wechat;
|
||
|
||
use Wechat\Lib\Common;
|
||
use Wechat\Lib\Tools;
|
||
|
||
/**
|
||
* 微信前端 JavaScript 签名SDK
|
||
*
|
||
* @author Anyon <zoujingli@qq.com>
|
||
* @date 2016/06/28 11:24
|
||
*/
|
||
class WechatScript extends Common {
|
||
|
||
/**
|
||
* JSAPI授权TICKET
|
||
* @var string
|
||
*/
|
||
public $jsapi_ticket;
|
||
|
||
/**
|
||
* 删除JSAPI授权TICKET
|
||
* @param string $appid
|
||
* @return bool
|
||
*/
|
||
public function resetJsTicket($appid = '') {
|
||
$this->jsapi_ticket = '';
|
||
$authname = 'wechat_jsapi_ticket_' . empty($appid) ? $this->appid : $appid;
|
||
Tools::removeCache($authname);
|
||
return true;
|
||
}
|
||
|
||
/**
|
||
* 获取JSAPI授权TICKET
|
||
* @param string $appid 用于多个appid时使用,可空
|
||
* @param string $jsapi_ticket 手动指定jsapi_ticket,非必要情况不建议用
|
||
* @param string $access_token 获取 jsapi_ticket 指定 access_token
|
||
* @return bool|string
|
||
*/
|
||
public function getJsTicket($appid = '', $jsapi_ticket = '', $access_token = '') {
|
||
if (empty($access_token)) {
|
||
if (!$this->access_token && !$this->getAccessToken()) {
|
||
return false;
|
||
}
|
||
$access_token = $this->access_token;
|
||
}
|
||
if (empty($appid)) {
|
||
$appid = $this->appid;
|
||
}
|
||
# 手动指定token,优先使用
|
||
if ($jsapi_ticket) {
|
||
$this->jsapi_ticket = $jsapi_ticket;
|
||
return $this->jsapi_ticket;
|
||
}
|
||
# 尝试从缓存中读取
|
||
$cache = 'wechat_jsapi_ticket_' . $appid;
|
||
$jt = Tools::getCache($cache);
|
||
if ($jt) {
|
||
return $this->jsapi_ticket = $jt;
|
||
}
|
||
# 检测事件注册
|
||
if (isset(Loader::$callback[__FUNCTION__])) {
|
||
return $this->jsapi_ticket = call_user_func_array(Loader::$callback[__FUNCTION__], array(&$this, &$cache));
|
||
}
|
||
# 调接口获取
|
||
$result = Tools::httpGet(self::API_URL_PREFIX . self::GET_TICKET_URL . "access_token={$access_token}" . '&type=jsapi');
|
||
if ($result) {
|
||
$json = json_decode($result, true);
|
||
if (!$json || !empty($json['errcode'])) {
|
||
$this->errCode = $json['errcode'];
|
||
$this->errMsg = $json['errmsg'];
|
||
return $this->checkRetry(__FUNCTION__, func_get_args());
|
||
}
|
||
$this->jsapi_ticket = $json['ticket'];
|
||
Tools::setCache($cache, $this->jsapi_ticket, $json['expires_in'] ? intval($json['expires_in']) - 100 : 3600);
|
||
return $this->jsapi_ticket;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
/**
|
||
* 获取JsApi使用签名
|
||
* @param string $url 网页的URL,自动处理#及其后面部分
|
||
* @param int $timestamp 当前时间戳 (为空则自动生成)
|
||
* @param string $noncestr 随机串 (为空则自动生成)
|
||
* @param string $appid 用于多个appid时使用,可空
|
||
* @param string $access_token 获取 jsapi_ticket 指定 access_token
|
||
* @return array|bool 返回签名字串
|
||
*/
|
||
public function getJsSign($url, $timestamp = 0, $noncestr = '', $appid = '', $access_token = '') {
|
||
if (!$this->jsapi_ticket && !$this->getJsTicket($appid, '', $access_token) || empty($url)) {
|
||
return false;
|
||
}
|
||
$data = array(
|
||
"jsapi_ticket" => $this->jsapi_ticket,
|
||
"timestamp" => empty($timestamp) ? time() : $timestamp,
|
||
"noncestr" => '' . empty($noncestr) ? Tools::createNoncestr(16) : $noncestr,
|
||
"url" => trim($url),
|
||
);
|
||
return array(
|
||
"url" => $url,
|
||
'debug' => false,
|
||
"appId" => empty($appid) ? $this->appid : $appid,
|
||
"nonceStr" => $data['noncestr'],
|
||
"timestamp" => $data['timestamp'],
|
||
"signature" => Tools::getSignature($data, 'sha1'),
|
||
'jsApiList' => array(
|
||
'onMenuShareTimeline', 'onMenuShareAppMessage', 'onMenuShareQQ', 'onMenuShareWeibo', 'onMenuShareQZone',
|
||
'hideOptionMenu', 'showOptionMenu', 'hideMenuItems', 'showMenuItems', 'hideAllNonBaseMenuItem', 'showAllNonBaseMenuItem',
|
||
'chooseImage', 'previewImage', 'uploadImage', 'downloadImage', 'closeWindow', 'scanQRCode', 'chooseWXPay',
|
||
'translateVoice', 'getNetworkType', 'openLocation', 'getLocation',
|
||
'openProductSpecificView', 'addCard', 'chooseCard', 'openCard',
|
||
'startRecord', 'stopRecord', 'onVoiceRecordEnd', 'playVoice', 'pauseVoice', 'stopVoice', 'onVoicePlayEnd', 'uploadVoice', 'downloadVoice',
|
||
'openWXDeviceLib', 'closeWXDeviceLib', 'getWXDeviceInfos', 'sendDataToWXDevice', 'disconnectWXDevice', 'getWXDeviceTicket', 'connectWXDevice',
|
||
'startScanWXDevice', 'stopScanWXDevice', 'onWXDeviceBindStateChange', 'onScanWXDeviceResult', 'onReceiveDataFromWXDevice',
|
||
'onWXDeviceBluetoothStateChange', 'onWXDeviceStateChange'
|
||
)
|
||
);
|
||
}
|
||
|
||
}
|