<?php
namespace Cas\Module;
use KIF\Core\Config;
use KIF\String\String;
use KIF\Curl;
use KIF\Cache\Memcached;
use KIF\Data\ResultWrapper;
/**
 * 
 * 刷新 access_token
 * @author lishumingoo@gmail.com
 */
class RefreshAccessToken {
	
	/**
	 * 获取access token接口地址
	 * @var string
	 */
	private $requestAccessTokenUrl = "https://api.weixin.qq.com/cgi-bin/token";
	
	/**
	 * 刷新access_token的key
	 * @var string
	 */
	const ACCESS_TOKEN_KEY = 'jyD#HNC&#27B%2';
	
	/**
	 * 刷新JsApiTicket的key
	 * @var String
	 */
	const JSAPI_TICKET_KEY = 'yD#sdfasd#asdfa%2';
	
	
	public function run() {
		$wechat_cfg = Config::getInstance()->get('wechat_cfg');
		if (!$wechat_cfg) {
			return ResultWrapper::fail('获取微信开发者ID失败');
		}
		
		$appid = $wechat_cfg['appId'];
		$secret = $wechat_cfg['appSecret'];
		$args = array(
				'grant_type'	=> 'client_credential',
				'appid'		=> $appid,
				'secret'	=> $secret,
		);
		
		$url = String::jointUrl($this->requestAccessTokenUrl, $args);
		
		$objCurl = new Curl($url);
		$json = $objCurl->get();
		if (!$json) {
			return ResultWrapper::fail('接口未返回数据');
		}
		
		$result = json_decode($json, true);
		if ($result['errcode']) {
			return ResultWrapper::fail("原因:{$json}");
		}
		
		$access_token = $result['access_token'];
		$expires = $result['expires_in'];
		
		$objMemcached = new Memcached();
		$setResult = $objMemcached->set(self::ACCESS_TOKEN_KEY, $access_token);
		if (!$setResult) {
			return ResultWrapper::fail("将access_token存入memcache失败");
		}
		
		# 新增: 获取微信 JsApiTicket 存入 Memcached
		$this->getJsApiTicket($access_token);
		
		return ResultWrapper::success($access_token);
	}
	
	
	/**
	 * 获取微信 JsApiTicket 存入 Memcached
	 */
	public function getJsApiTicket($accessToken){
		$url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=$accessToken";
		$res = json_decode($this->httpGet($url));
		$jsApiTicket = $res->ticket;
		$objMemcached = new Memcached();
		$objMemcached->set(self::JSAPI_TICKET_KEY, $jsApiTicket);
		return $jsApiTicket;
	}
	
	
	/**
	 * curl 请求
	 */
	private function httpGet($url) {
		$curl = curl_init();
		curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
		curl_setopt($curl, CURLOPT_TIMEOUT, 500);
		curl_setopt($curl, CURLOPT_URL, $url);
		$res = curl_exec($curl);
		curl_close($curl);
		return $res;
	}
	
	
	
}