123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214 |
- <?php
- /**
- * [WeEngine System] Copyright (c) 2014 WE7.CC
- * WeEngine is NOT a free software, it under the license terms, visited http://www.we7.cc/ for more details.
- */
- defined('IN_IA') or exit('Access Denied');
-
- class YiXinAccount extends WeAccount {
- private $account = null;
-
- public function __construct($account) {
- $sql = 'SELECT * FROM ' . tablename('account_yixin') . ' WHERE `acid`=:acid';
- $this->account = pdo_fetch($sql, array(':acid' => $account['acid']));
- if(empty($this->account)) {
- trigger_error('error uniAccount id, can not construct ' . __CLASS__, E_USER_WARNING);
- }
- $this->account['access_token'] = iunserializer($this->account['access_token']);
- }
-
- public function checkSign() {
- $token = $this->account['token'];
- $signkey = array($token, $_GET['timestamp'], $_GET['nonce']);
- sort($signkey, SORT_STRING);
- $signString = implode($signkey);
- $signString = sha1($signString);
- return $signString == $_GET['signature'];
- }
-
- public function fetchAccountInfo() {
- return $this->account;
- }
-
- public function checkIntoManage() {
-
- }
-
- public function queryAvailableMessages() {
- $messages = array('text', 'image', 'voice', 'video', 'location', 'subscribe', 'unsubscribe');
- if(!empty($this->account['key']) && !empty($this->account['secret'])) {
- $messages[] = 'click';
- if(!empty($this->account['key'])) {
- $messages[] = 'qr';
- $messages[] = 'trace';
- $messages[] = 'enter';
- }
- }
- return $messages;
- }
-
- public function queryAvailablePackets() {
- $packets = array('text', 'music', 'news');
- if(!empty($this->account['key']) && !empty($this->account['secret'])) {
- if(!empty($this->account['key'])) {
- $packets[] = 'image';
- $packets[] = 'voice';
- $packets[] = 'video';
- $packets[] = 'link';
- $packets[] = 'card';
- }
- }
- return $packets;
- }
-
- public function isMenuSupported() {
- return !empty($this->account['key']) && !empty($this->account['secret']);
- }
-
- private function menuResponseParse($content) {
- if(!is_array($content)) {
- return error(-1, '接口调用失败,请重试!' . (is_string($content) ? "易信公众平台返回元数据: {$content}" : ''));
- }
- $dat = $content['content'];
- $result = @json_decode($dat, true);
- if(is_array($result) && $result['errcode'] == '0') {
- return true;
- } else {
- if(is_array($result)) {
- return error(-1, "易信公众平台返回接口错误. \n错误代码为: {$result['errcode']} \n错误信息为: {$result['errmsg']} \n错误描述为: " . $this->errorCode($result['errcode']));
- } else {
- return error(-1, '易信公众平台未知错误');
- }
- }
- }
-
- private function menuBuildMenuSet($menu) {
- $set = array();
- $set['button'] = array();
- foreach($menu as $m) {
- $entry = array();
- $entry['name'] = urlencode($m['title']);
- if(!empty($m['subMenus'])) {
- $entry['sub_button'] = array();
- foreach($m['subMenus'] as $s) {
- $e = array();
- $e['type'] = $s['type'] == 'url' ? 'view' : 'click';
- $e['name'] = urlencode($s['title']);
- if($e['type'] == 'view') {
- $e['url'] = $s['url'];
- } else {
- $e['key'] = urlencode($s['forward']);
- }
- $entry['sub_button'][] = $e;
- }
- } else {
- $entry['type'] = $m['type'] == 'url' ? 'view' : 'click';
- if($entry['type'] == 'view') {
- $entry['url'] = $m['url'];
- } else {
- $entry['key'] = urlencode($m['forward']);
- }
- }
- $set['button'][] = $entry;
- }
- $dat = json_encode($set);
- $dat = urldecode($dat);
- return $dat;
- }
-
- public function menuCreate($menu) {
- $dat = $this->menuBuildMenuSet($menu);
- $token = $this->fetch_token();
- $url = "https://api.yixin.im/cgi-bin/menu/create?access_token={$token}";
- $content = ihttp_post($url, $dat);
- return $this->menuResponseParse($content);
- }
-
- public function menuDelete() {
- $token = $this->fetch_token();
- $url = "https://api.yixin.im/cgi-bin/menu/delete?access_token={$token}";
- $content = ihttp_get($url);
- return $this->menuResponseParse($content);
- }
-
- public function menuModify($menu) {
- return $this->menuCreate($menu);
- }
-
- public function menuQuery() {
- $token = $this->fetch_token();
- $url = "https://api.yixin.im/cgi-bin/menu/get?access_token={$token}";
- $content = ihttp_get($url);
- if(!is_array($content)) {
- return error(-1, '接口调用失败,请重试!' . (is_string($content) ? "易信公众平台返回元数据: {$content}" : ''));
- }
- $dat = $content['content'];
- $result = @json_decode($dat, true);
- if(is_array($result) && !empty($result['menu'])) {
- $menus = array();
- foreach($result['menu']['button'] as $val) {
- $m = array();
- $m['type'] = $val['type'] == 'click' ? 'forward' : 'url';
- $m['title'] = $val['name'];
- if($m['type'] == 'forward') {
- $m['forward'] = $val['key'];
- } else {
- $m['url'] = $val['url'];
- }
- $m['subMenus'] = array();
- if(!empty($val['sub_button'])) {
- foreach($val['sub_button'] as $v) {
- $s = array();
- $s['type'] = $v['type'] == 'click' ? 'forward' : 'url';
- $s['title'] = $v['name'];
- if($s['type'] == 'forward') {
- $s['forward'] = $v['key'];
- } else {
- $s['url'] = $v['url'];
- }
- $m['subMenus'][] = $s;
- }
- }
- $menus[] = $m;
- }
- return $menus;
- } else {
- if(is_array($result)) {
- if($result['errcode'] == '46003') {
- return array();
- }
- return error(-1, "易信公众平台返回接口错误. \n错误代码为: {$result['errcode']} \n错误信息为: {$result['errmsg']} \n错误描述为: " . $this->errorCode($result['errcode']));
- } else {
- return error(-1, '易信公众平台未知错误');
- }
- }
- }
-
- private function fetch_token() {
- load()->func('communication');
- if(is_array($this->account['access_token']) && !empty($this->account['access_token']['token']) && !empty($this->account['access_token']['expire']) && $this->account['access_token']['expire'] > TIMESTAMP) {
- return $this->account['access_token']['token'];
- } else {
- if (empty($this->account['key']) || empty($this->account['secret'])) {
- itoast('请填写公众号的appid及appsecret, (需要你的号码为易信服务号)!', url('account/post', array('acid' => $this->account['acid'], 'uniacid' => $this->account['uniacid'])), 'error');
- }
- $url = "https://api.yixin.im/cgi-bin/token?grant_type=client_credential&appid={$this->account['key']}&secret={$this->account['secret']}";
- $content = ihttp_get($url);
- if(is_error($content)) {
- itoast('获取微信公众号授权失败, 请稍后重试!错误详情: ' . $content['message'], '', 'error');
- }
- $token = @json_decode($content['content'], true);
- if(empty($token) || !is_array($token) || empty($token['access_token']) || empty($token['expires_in'])) {
- itoast('获取微信公众号授权失败, 请稍后重试! 公众平台返回原始数据为: <br />' . $content['meta'], '', 'error');
- }
- $record = array();
- $record['token'] = $token['access_token'];
- $record['expire'] = TIMESTAMP + $token['expires_in'];
- $row = array();
- $row['access_token'] = iserializer($record);
- pdo_update('account_yixin', $row, array('acid' => $this->account['acid']));
- return $record['token'];
- }
- }
- }
|