118 行
3.5 KiB
PHP
可执行文件
118 行
3.5 KiB
PHP
可执行文件
<?php
|
|
/**
|
|
* App优化JSSDK
|
|
*/
|
|
|
|
namespace Util\Wx;
|
|
class Jssdk
|
|
{
|
|
private $appid;
|
|
private $token;//access_token
|
|
private $url;
|
|
|
|
public function __construct($options)
|
|
{
|
|
$this->appid = isset($options['appid']) ? $options['appid'] : '';
|
|
$this->token = isset($options['token']) ? $options['token'] : '';
|
|
$this->url = isset($options['url']) ? $options['url'] : '';
|
|
}
|
|
|
|
public function getSignPackage()
|
|
{
|
|
$appid = $this->appid;
|
|
$token = $this->token;
|
|
$url = $this->url;
|
|
if (!$appid || !$token || !$url) {
|
|
return FALSE;
|
|
}
|
|
//处理超链接#
|
|
$ret = strpos($url, '#');
|
|
if ($ret) {
|
|
$url = substr($url, 0, $ret);
|
|
}
|
|
$url = trim($url);
|
|
$jsapiTicket = $this->getJsApiTicket($token);
|
|
$timestamp = time();
|
|
$nonceStr = $this->createNonceStr();
|
|
|
|
// 这里参数的顺序要按照 key 值 ASCII 码升序排序
|
|
$string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr×tamp=$timestamp&url=$url";
|
|
|
|
$signature = sha1($string);
|
|
|
|
$signPackage = array(
|
|
"appId" => $appid,
|
|
"nonceStr" => $nonceStr,
|
|
"timestamp" => $timestamp,
|
|
"url" => $url,
|
|
"signature" => $signature,
|
|
"rawString" => $string
|
|
);
|
|
|
|
return $signPackage;
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
private function getJsApiTicket($accessToken)
|
|
{
|
|
// jsapi_ticket 应该全局存储与更新,以下代码以写入到文件中做示例
|
|
$data = json_decode(file_get_contents("./Data/jsapi_ticket.json"));
|
|
//dump($data);
|
|
if ($data->expire_time < time()) {
|
|
// $accessToken = $this->getAccessToken();
|
|
$url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=$accessToken";
|
|
$res = json_decode($this->http_get($url));
|
|
//dump($res);
|
|
$ticket = $res->ticket;
|
|
if ($ticket) {
|
|
$data->expire_time = time() + 7000;
|
|
$data->jsapi_ticket = $ticket;
|
|
file_put_contents("./Data/jsapi_ticket.json", json_encode($data));
|
|
//$fp = fopen("./Data/jsapi_ticket.json", "w");
|
|
//fwrite($fp, json_encode($data));
|
|
//fclose($fp);
|
|
} else {
|
|
die('no ticket!');
|
|
}
|
|
} else {
|
|
$ticket = $data->jsapi_ticket;
|
|
}
|
|
|
|
return $ticket;
|
|
}
|
|
|
|
/**
|
|
* GET 请求
|
|
* @param string $url
|
|
*/
|
|
private function http_get($url)
|
|
{
|
|
$oCurl = curl_init();
|
|
if (stripos($url, "https://") !== FALSE) {
|
|
curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, FALSE);
|
|
curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, FALSE);
|
|
curl_setopt($oCurl, CURLOPT_SSLVERSION, 1); //CURL_SSLVERSION_TLSv1
|
|
}
|
|
curl_setopt($oCurl, CURLOPT_URL, $url);
|
|
curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1);
|
|
$sContent = curl_exec($oCurl);
|
|
$aStatus = curl_getinfo($oCurl);
|
|
curl_close($oCurl);
|
|
if (intval($aStatus["http_code"]) == 200) {
|
|
return $sContent;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
}
|