123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236 |
- <?php
- /*
- |--------------------------------------------------------------------------
- | core.php 微信平台核心类
- |--------------------------------------------------------------------------
- */
- namespace Main\Lib;
- use Dever;
- class Wechat
- {
- /**
- * config
- *
- * @var array
- */
- private $config;
- /**
- * config
- *
- * @var array
- */
- private $token;
-
- /**
- * project
- *
- * @var string
- */
- private $project;
-
- /**
- * 构造函数 初始化
- *
- * @return mixed
- */
- public function __construct($type = 'component', $project = false)
- {
- $this->config = Dever::config('sign')->cAll;
-
- if (!$project) {
- $project = Dever::input('project', 1);
- }
- if (!$project) {
- Dever::alert('project is not exits!');
- }
- $this->project = $project;
- }
-
- /**
- * 获取当前站点的配置
- *
- * @return mixed
- */
- public function project()
- {
- return $this->project;
- }
- /**
- * 获取当前站点的配置
- *
- * @return mixed
- */
- public function config()
- {
- return $this->config['accessToken'][$this->project];
- }
-
- /**
- * 获取签名信息
- *
- * @return mixed
- */
- public function get($url)
- {
- $ticket = $this->ticket($this->token());
-
- if (!$ticket) {
- $return['status'] = 0;
- $return['msg'] = 'error';
- } else {
- $timestamp = time();
- $nonce = $this->nonce();
- $signature = $this->signature($ticket, $url, $timestamp, $nonce);
- $return = array
- (
- 'appId' => $this->config['accessToken'][$this->project]['appid'],
- 'timestamp' => $timestamp,
- 'nonceStr' => $nonce,
- 'signature' => $signature,
- 'status' => 1,
- 'msg' => '成功',
- );
- }
-
- Dever::out($return);
- }
-
- /**
- * 获取nonce
- *
- * @return mixed
- */
- private function nonce()
- {
- return substr(md5(microtime()), rand(10, 15));
- }
-
- /**
- * 获取accessToken
- *
- * @return mixed
- */
- public function token($state = 1)
- {
- $url = $this->config['accessToken']['url'] . '&' . http_build_query($this->config['accessToken'][$this->project]);
-
- $where['where_project'] = $this->project;
- $info = Dever::load('main/token-info', $where);
- $request = $update = false;
-
- if ($info && ((time() - $info['mdate'] >= $info['expires_in']) || $state == 2)) {
- $request = $update = true;
- } elseif ($info) {
- return $info['token'];
- }
- if (!$info) {
- $request = true;
- $update = false;
- }
-
- if ($request == true) {
- $data = json_decode(Dever::curl($url), true);
-
- if ($data && isset($data['access_token'])) {
- $data['expires_in'] = $data['expires_in'] - 2000;
- if ($update == true) {
- $set['set_project'] = $this->project;
- $set['set_token'] = $data['access_token'];
- $set['set_expires_in'] = $data['expires_in'];
- $set['where_id'] = $info['id'];
- Dever::load('main/token-update', $set);
- } else {
- $insert['add_project'] = $this->project;
- $insert['add_token'] = $data['access_token'];
- $insert['add_expires_in'] = $data['expires_in'];
- Dever::load('main/token-insert', $insert);
- }
-
- return $data['access_token'];
- }
- }
- }
-
-
- /**
- * 获取ticket
- *
- * @return mixed
- */
- private function ticket($token)
- {
- $url = $this->config['ticket'] . $token;
-
- $where['where_project'] = $this->project;
- $info = Dever::load('main/ticket-info', $where);
-
- $request = $update = false;
-
- if ($info && time() - $info['mdate'] >= $info['expires_in']) {
- $request = $update = true;
- } elseif($info) {
- return $info['ticket'];
- }
- if (!$info) {
- $request = true;
- $update = false;
- }
-
- if ($request == true) {
- $data = json_decode(Dever::curl($url), true);
-
- if ($data && isset($data['ticket'])) {
- $data['expires_in'] = $data['expires_in'] - 2000;
- if ($update == true) {
- $set['set_project'] = $this->project;
- $set['set_ticket'] = $data['ticket'];
- $set['set_expires_in'] = $data['expires_in'];
- $set['where_name'] = $this->project;
- Dever::load('main/ticket-update', $set);
- } else {
- $insert['add_project'] = $this->project;
- $insert['add_ticket'] = $data['ticket'];
- $insert['add_expires_in'] = $data['expires_in'];
- Dever::load('main/ticket-insert', $insert);
- }
-
- return $data['ticket'];
- }
- }
- }
-
-
- /**
- * 获取signature
- *
- * @return mixed
- */
- private function signature($ticket, $url, $timestamp, $noncestr)
- {
- $info = array();
- $info['jsapi_ticket'] = $ticket;
- $info['url'] = $url;
- $info['timestamp'] = $timestamp;
- $info['noncestr'] = $noncestr;
- ksort($info);
- $signature_string = substr(http_build_query($info), 0, -1);
- /*
- foreach($info as $k => $v)
- {
- $signature_string .= $k . '=' . $v . '&';
- }
-
- $signature_string = substr($signature_string, 0, -1);
- */
- return sha1($signature_string);
- }
- }
|