123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238 |
- <?php
- /**
- * Created by PhpStorm.
- * User: tandunzhao
- * Date: 2017/12/4
- * Time: 上午11:49
- */
- namespace App\Modules\Book\Services;
- use Redis;
- use EasyWeChat\Foundation\Application;
- class ChapterShareWechatConfigService
- {
- private $appId;
- private $appSecret;
- public function __construct($appId,$appSecret)
- {
- $this->appId = $appId ? $appId : env('JS_AppID');
- $this->appSecret = $appSecret ? $appSecret : env('JS_AppSecret');
- //\Log::info('appId:'.($this->appId).'appSecret:'.($this->appSecret));
- }
- public function getSignPackage($url='',$is_force = true , $only_cache= false)
- {
- $jsapiTicket = $this->getJsApiTicket($is_force , $only_cache );
- $protocol = (! empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
- $url = $url?$url:"$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
- $timestamp = time();
- $nonceStr = $this->createNonceStr();
- // 这里参数的顺序要按照 key 值 ASCII 码升序排序
- $string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr×tamp=$timestamp&url=$url";
- \Log::info($string);
- $signature = sha1($string);
- $signPackage = array(
- "appId" => $this->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($is_force = false , $only_cache= true )
- {
- // jsapi_ticket 应该全局存储与更新,以下代码以写入到文件中做示例
- $data = unserialize(Redis::get(($this->appId)."jsapi_ticket"));
- if (empty($data) || $data['expire_time'] < time())
- {
- $accessToken = $this->getToken($is_force, $only_cache);
- \Log::info(($this->appId).':'.$accessToken);
- // 如果是企业号用以下 URL 获取 ticket
- $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token={$accessToken}";
- $res = json_decode($this->httpGet($url));
- $ticket = $res->ticket;
- if ($ticket)
- {
- $data['expire_time'] = time() + 7000;
- $data['jsapi_ticket'] = $ticket;
- Redis::setex(($this->appId)."jsapi_ticket", 7000, serialize($data));
- }
- } else
- {
- $ticket = $data['jsapi_ticket'];
- }
- \Log::info(($this->appId).':'.'jsapi_tiket:'.$ticket);
- return $ticket;
- }
- private function httpGet($url)
- {
- $curl = curl_init();
- curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
- curl_setopt($curl, CURLOPT_TIMEOUT, 3);
- curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
- curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
- curl_setopt($curl, CURLOPT_URL, $url);
- $res = curl_exec($curl);
- curl_close($curl);
- return $res;
- }
- /**
- * 获取access token
- *
- * @param string $is_force
- * @return unknown|unknown|mixed|object|boolean
- */
- public function getToken($is_force = true , $only_cache= true )
- {
- if ($is_force == false)
- {
- $data = unserialize(Redis::get(($this->appId)."access_token"));
- if ($data)
- {
- if (is_array($data) && $data['expire_time'] > time())
- {
- $access_token = $data['access_token'];
- return $access_token;
- } else if (is_string($data))
- {
- $access_token = $data;
- return $access_token;
- }
- }
- if( $only_cache ){
- // 非强制获取access_token,cache没有就直接返回false,防止获取access_token的接口在高并发下被滥用
- return false;
- }
- }
- $appId = $this->appId;
- $appSecret = $this->appSecret;
- $url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=' . $appId . '&secret=' . $appSecret;
- $rs1 = self::https_request($url);
- \Log::info(($this->appId).'get_token-'.$rs1);
- if ($rs1)
- {
- $rs = json_decode($rs1, true);
- if (is_array($rs) && $rs['access_token'])
- {
- $access_token = $rs['access_token'];
- $expires_in = intval($rs['expires_in'], 10);
- if ($expires_in <= 0)
- {
- $expires_in = 5;
- } else if ($expires_in >= 7200)
- {
- $expires_in = 7000;
- }
- $data = array();
- $data['expire_time'] = time() + $expires_in;
- $data['access_token'] = $access_token;
- Redis::setex(($this->appId).'access_token', $expires_in, serialize($data));
- return $access_token;
- } else
- {
- $content = "get access token error:" . $rs1;
- \Log::info(($this->appId).$content);
- }
- } else
- {
- $content = "get access token error:" . $rs1;
- \Log::info(($this->appId).$content);
- }
- return false;
- }
- /**
- * 抓https数据
- *
- * @param unknown $url
- * @param string $data
- * @param string $timeout
- */
- static function https_request($url, $data = null, $timeout = 5000)
- {
- $curl = curl_init();
- curl_setopt($curl, CURLOPT_URL, $url);
- curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
- curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
- if (! empty($data)) {
- curl_setopt($curl, CURLOPT_POST, 1);
- curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
- }
- if ($timeout) {
- curl_setopt($curl, CURLOPT_TIMEOUT, $timeout);
- }
- curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
- $output = curl_exec($curl);
- if ($output === false) {
- \Log::error('Curl error: ' . curl_error($curl).". url:".$url);
- }
- curl_close($curl);
- return $output;
- }
- public static function getConfig($url){
- $options = [
- 'debug' => false,
- 'app_id' => env('JS_AppId'),
- 'secret' => env('JS_AppSecret'),
- //'token' => 'easywechat',
- // 'aes_key' => null, // 可选
- 'log' => [
- 'level' => 'debug',
- 'file' => storage_path('easywechat.log'), // XXX: 绝对路径!!!!
- ],
- ];
- $app = new Application($options);
- $js = $app->js;
- $js->setUrl($url);
- $config =$js ->Config([
- 'onMenuShareTimeline',
- 'onMenuShareAppMessage',
- 'onMenuShareQQ',
- 'onMenuShareWeibo',
- 'showOptionMenu',
- 'hideOptionMenu',
- 'hideMenuItems',
- 'hideAllNonBaseMenuItem'
- ],$debug = false, $beta = false, $json = false);
- return $config;
- }
- }
|