2017-05-10 17:21:03 +08:00

123 lines
4.9 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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'
)
);
}
}