コード ソース: http://www.eaglephp.com 適用可能なプラットフォーム: window/Linux 依存プロジェクト: EaglePHP フレームワーク
以下の WeChat 5.0 API 基本インターフェイス、カスタム メニュー、および高度なインターフェイスが含まれます: 1. ユーザー メッセージを受信します。 。 2. ユーザーに返信します。 3. イベントプッシュを受け入れます。 4. 会話インターフェースのカスタムメニュー。 5. 音声認識。 6. カスタマーサービスインターフェース。 7. OAuth2.0 Web 認証。 8. パラメーターを使用して QR コードを生成します。 9. ユーザーの地理的位置を取得します。 10. 基本的なユーザー情報を取得します。 11. フォロワーリストを取得します。 12. ユーザーのグループ化。
- /**
- * WeChat パブリック プラットフォーム API
- *
- * @author maojianlw@139.com
- * [url=home.php?mod=space&uid=17823]@LINK[/url] http://www.eaglephp.com
- */
- class WeixinChat
- {
-
- private $token;
-
- private $appid;
-
- private $appsecret;
-
- private $access_token;
-
- //受信データ
- private $_receive = array();
-
- private $_reply = '';
-
- // インターフェースエラーコード
- private $errCode = '';
-
- // インターフェースエラーメッセージ
- private $errMsg = '' ;
-
- // WeChat oauth でログインしてコードを取得します
- const CONNECT_OAUTH_AUTHORIZE_URL = 'https://open.weixin.qq.com/connect/oauth2/authorize?';
-
- // WeChat oauth でログインし、 Web ページ認証のコード access_token
- const SNS_OAUTH_ACCESS_TOKEN_URL = 'https://api.weixin.qq.com/sns/oauth2/access_token?';
-
- // WeChat oauth ログイン更新 access_token (必要な場合)
- const SNS_OAUTH_REFRESH_TOKEN_URL = 'https: //api.weixin.qq .com/sns/oauth2/refresh_token?';
-
- // チケットを QR コードに交換
- const SHOW_QRCODE_URL = 'https://mp.weixin.qq.com/cgi-bin/showqrcode? ';
-
- // WeChat oauth ログインはユーザー情報を取得します (スコープは snsapi_userinfo である必要があります)
- const SNS_USERINFO_URL = 'https://api.weixin.qq.com/sns/userinfo?';
-
- // API プレフィックスをリクエストします
- const API_URL_PREFIX = 'https://api.weixin.qq.com/cgi-bin';
-
- // カスタムメニューの作成
- const MENU_CREATE_URL = '/menu/create?';
-
- // カスタムメニューのクエリ
- const MENU_GET_URL = '/menu /get?';
-
- // カスタムメニューの削除
- const MENU_DELETE_URL = '/menu/delete?';
-
- // access_token
- を取得 const AUTH_URL = '/token?grant_type=client_credential&';
- //ユーザーの基本情報を取得
- const USER_INFO_URL = '/user/info?';
-
- // フォロワーリストを取得
- const USER_GET_URL = '/user/get?';
-
- // グループをクエリ
- const GROUPS_GET_URL = '/groups /get? ';
-
- // グループを作成する
- const GROUPS_CREATE_URL = '/groups/create?';
-
- // グループ名を変更する
- const GROUPS_UPDATE_URL = '/groups/update?'; groups
- const GROUPS_MEMBERS_UPDATE_URL = '/groups/members/update?';
-
- //カスタマーサービスメッセージを送信
- const MESSAGE_CUSTOM_SEND_URL = '/message/custom/send?';
-
- //QRコードチケットを作成
- const QRCODE_CREATE_URL = ' /qrcode/create? ';
-
-
-
- /**
- * 初期化設定データ
- * @param array $options
- */
- パブリック関数 __construct($options)
- {
- $this->token = isset($options['token']) ? ['トークン'] : '';
- $this->appid = isset($options['appid']) ? $options['appid'] : '';
- $this->appsecret = isset($ options['appsecret' ]) ? $options['appsecret'] : '';
- }
-
-
- /**
- * 受信メッセージを取得する
- * 一般の WeChat ユーザーが公開アカウントにメッセージを送信すると、WeChat サーバーは、開発者が入力した URL にメッセージの XML データ パケットを POST します。
- */
- public function getRev()
- {
- $postStr = file_get_contents('php:/ /input');
- if($postStr)
- {
- $this->_receive = (array)simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
- //Log::info(var_export($this->) ;_receive, true) );
- }
- return $this;
- }
-
-
- /**
- * WeChatサーバーから送信されたメッセージを取得します
- */
- public function getRevData()
- {
- return $this->_receive;
- }
-
-
- / **
- * 受信機を入手します
- */
- public function getRevTo()
- {
- return isset($this->_receive['ToUserName']) $this->_receive['ToUserName'] : false;
- }
-
-
- /**
- * メッセージ送信者 (OpenID) を取得します
- */
- public function getRevFrom()
- {
- return isset($this->_receive['FromUserName']) $this->_receive['FromUserName'] : false;
- }
-
-
- /* *
- * 受信メッセージの作成時刻を取得(整数型)
- */
- public function getRevCTime()
- {
- return isset($this->_receive['CreateTime']) $this->_receive['CreateTime'] : false;
- }
-
-
- /**
- * 受信したメッセージの種類(テキスト、画像、音声、ビデオ、場所、リンク、イベント)を取得します
- */
- public function getRevType()
- {
- return isset($this->_receive['MsgType']) $this->_receive['MsgType'] : false;
- }
-
-
- /**
- * 受信したメッセージ番号を取得します
- */
- public function getRevId()
- {
- return isset($this->_receive['MsgId']) $this->_receive['MsgId' ] : false;
- }
-
-
- /**
- * 受信したメッセージテキストを取得します
- * 音声認識インターフェイスを通じて、ユーザーが送信した音声には、音声認識によって認識されたテキストの内容も表示されます。(サービスアカウントの高度なインターフェース権限を申請する必要があります)
- */
- public function getRevText()
- {
- if(isset($this->_receive['Content'])) returnrim($this- >_receive[' コンテンツ']);
- elseif(isset($this->_receive['認識'])) return trim($this->_receive['認識']);
- else return false;
- }
-
-
- / **
- * 画像メッセージの送受信
- */
- public function getRevImage()
- {
- if(isset($this->_receive['PicUrl'])){
- return array(
- 'picUrl' => $this-> _receive['PicUrl'], //画像リンク
- 'mediaId' => $this->_receive['MediaId'] //画像メッセージのメディア ID、マルチメディア ファイル ダウンロード インターフェイスを呼び出してプルできますデータ。 }
- return false;
- }
-
-
- /**
- * 音声メッセージを送受信する
- */
- public function getRevVoice()
- {
- if(isset($this->_receive['MediaId'])){
- return array(
- 'mediaId' => $this->_receive['MediaId'], //音声メッセージのメディア ID。マルチメディア ファイル ダウンロード インターフェイスを呼び出してデータを取得できます。
- 'format' => $this- >_receive[' Format'] //amr、speex などの音声形式
- );
- }
- return false;
- }
-
-
- /**
- *ビデオメッセージを受信できるようになります
- */
- public function getRevVideo()
- {
- if(isset($this ->_receive['MediaId'])){
- return array(
- 'mediaId' => $this->_receive['MediaId'], //ビデオ メッセージ メディア ID,これは、マルチメディア ファイル ダウンロード インターフェイス データを呼び出すことで取得できます。
- 'thumbMediaId' => $this->_receive['ThumbMediaId'] //ビデオ メッセージのサムネイルのメディア ID。マルチメディア ファイル ダウンロード インターフェイスを呼び出してデータを取得できます。
- );
- }
- return false;
- }
-
-
- /**
- * ユーザーの地理的位置を取得します
- */
- public function getRevLocation()
- {
- if(isset($this->_receive['Location_X'])){
- return array(
- 'locationX' => $this->_receive['Location_X'], //地理的位置の次元
- 'locationY' => $this->_receive['Location_Y'], //地理的位置経度
- 'scale' => $this->_receive['Scale'], //地図のズームサイズ
- 'label' => $this->_receive['Label'] // 地理的位置情報
- ) ;
- }
- //地理的位置レポート インターフェイスを開いているパブリック アカウントの場合、ユーザーがフォローした後にパブリック アカウント セッションに入ると、パブリック アカウントの使用を許可するかどうかをユーザーに確認するボックスがポップアップ表示されます。地理上の位置。
- //ポップアップボックスはフォロー後に一度だけ表示され、今後は公式アカウントの詳細ページで操作できるようになります。
- elseif(isset($this->_receive['緯度']))
- {
- return array(
- '緯度' => $this->_receive['緯度'], //地理的位置の緯度
- ' longitude' => $this->_receive['Longitude'], //地理的位置の経度
- 'precision' => $this->_receive['Precision'] //地理的位置の精度
- );
- }
- return false;
- }
-
-
- /**
- * 受信リンクメッセージを取得します
- */
- public function getRevLink()
- {
- if(isset($this->_receive['Title'])){
- return array(
- ' title' => $this->_receive['Title'], //メッセージタイトル
- 'description' => $this->_receive['Description'], //メッセージ説明
- 'url' => ; $this->_receive['Url'] //メッセージリンク
- );
- }
- return false;
- }
-
-
- /**
- * 受信イベント タイプを取得します
- * 購読、購読解除、クリックなどのイベント タイプ
- */
- public function getRevEvent()
- {
- if(isset ($this->_receive['Event']))
- {
- return array(
- 'event' => strto lower($this->_receive['Event']),
- 'key'=> isset ($this->_receive['EventKey']) ? $this->_receive['EventKey'] : ''
- );
- }
- return false;
- }
-
-
- /**
- * 返信テキストメッセージを設定します
- * @param string $content
- * @param string $openid
- */
- public function text($content='')
- {
- $textTpl = "
-
- < ;![CDATA[%s]]>
- %s
-
-
- ";
-
- $this->_reply = sprintf($textTpl,
- $this->getRevFrom (),
- $this->getRevTo(),
- Date::getTimeStamp(),
- 'text',
- $content
- );
- return $this;
- }
-
-
- /**
- * 返信音楽情報を設定します
- * @param string $title
- * @param string $desc
- * @param string $musicurl
- * @param string $hgmusicurl
- */
- public function music($title, $desc, $musicurl, $hgmusicurl='')
- {
- $textTpl = '
- < /ToUserName>
-
- %s
-
- <音楽>
- <タイトル>タイトル>
- <説明>説明>
-
-
- ';
- //
-
- $this->_reply = sprintf( $textTpl、
- $this->getRevFrom()、
- $this->getRevTo()、
- Date::getTimeStamp()、
- '音楽'、
- $title、
- $desc、
- $musicurl、
- $ hgmusicurl
- );
- return $this;
- }
-
-
- /**
- * テキストメッセージに返信
- * @param array
- */
- public function news($data)
- {
- $count = count($data);
- $subText = '';
- if($count > 0)
- {
- foreach($data as $v)
- {
- $tmpText = '
- タイトル>
- <説明>説明>
-
- ;
- ';
-
- $subText .= sprintf(
- $tmpText, $v['title'],
- isset($ v['説明']) ? $v['説明'] : '',
- isset($v['picUrl']) : '',
- isset($v['url] ']) ? $v['url'] : ''
- );
- }
- }
-
- $textTpl = '
-
- < ;/FromUserName>
-
-
- < ArticleCount>
- %s
- ';
-
- $this->_reply = sprintf(
- $textTpl,
- $this->getRevFrom(),
- $this->getRevTo(),
- Date::getTimeStamp(),
- $count,
- $subText
- );
- return $this;
- }
-
-
- /**
- * 返信メッセージ
- * @param array $msg
- * @param bool $return
- */
- public function Reply()
- {
- header('Content-Type:text/xml');
- echo $this->_reply;
- exit;
- }
-
-
- /* *
- * カスタムメニュー作成
- * @param配列メニューデータ
- */
- public function createMenu($data)
- {
- if(!$this->access_token && !$this->checkAuth()) return false;
-
- $result =curlRequest(self:: API_URL_PREFIX.self::MENU_CREATE_URL.'access_token='.$this->access_token, $this->jsonEncode($data), 'post');
- if($result)
- {
- $jsonArr = json_decode($結果、true);
- if(!$jsonArr || (isset($jsonArr['errcode']) && $jsonArr['errcode'] > 0)) $this->error($jsonArr);
- else return true;
- }
-
- return false;
- }
-
-
- /**
- *カスタマイズされたメニュークエリ
- */
- public function getMenu()
- {
- if(!$this->access_token && !$this->checkAuth()) return false;
-
- $result =curlRequest(self ::API_URL_PREFIX.self::MENU_GET_URL.'access_token='.$this->access_token);
- if($result)
- {
- $jsonArr = json_decode($result, true);
- if(!$jsonArr || (isset($jsonArr['errcode']) && $jsonArr['errcode'] > 0)) $this->error($jsonArr);
- else return $jsonArr;
- }
-
- return false;
- }
-
-
- /**
- *カスタムメニューは削除されました
- */
- public function deleteMenu()
- {
- if(!$this->access_token && !$this->checkAuth()) return false;
-
- $result =curlRequest( self::API_URL_PREFIX.self::MENU_DELETE_URL.'access_token='.$this->access_token);
- if($result)
- {
- $jsonArr = json_decode($result, true);
- if(!$jsonArr | | (isset($jsonArr['errcode']) && $jsonArr['errcode'] > 0)) $this->error($jsonArr);
- else return true;
- }
-
- return false;
- }
-
-
- /**
- * 基本的なユーザー情報を取得します
- * @param string $openid 現在の公開アカウントに固有の、一般ユーザーの識別子
- */
- public function getUserInfo($openid)
- {
- if(!$this->access_token && !$this->checkAuth()) return false;
-
- $result = curlRequest(self::API_URL_PREFIX.self::USER_INFO_URL.'access_token='.$this->access_token.'&openid='.$openid);
- if($result)
- {
- $jsonArr = json_decode($result, true);
- if(!$jsonArr || (isset($jsonArr['errcode']) && $jsonArr['errcode'] > 0)) $this->error($jsonArr);
- else return $jsonArr;
- }
-
- return false;
- }
-
-
- /**
- * フォロワーリストを取得します
- * @param string $next_openid プルする最初の OPENID、入力されていない場合は、デフォルトで最初からプルを開始します
- */
- public function getUserList($next_openid='')
- {
- if(!$this->access_token && !$this->checkAuth()) return false;
-
- $result =curlRequest(self::API_URL_PREFIX.self::USER_GET_URL.'access_token='.$this->access_token.'&next_openid='.$next_openid);
- if($result)
- {
- $jsonArr = json_decode( $result, true);
- if(!$jsonArr || (isset($jsonArr['errcode']) && $jsonArr['errcode'] > 0)) $this->error($jsonArr);
- else return $jsonArr;
- }
-
- return false;
- }
-
-
- /**
- * クエリのグループ化
- */
- public function getGroup()
- {
- if(!$this->access_token && !$this-> checkAuth()) return false;
-
- $result =curlRequest(self::API_URL_PREFIX.self::GROUPS_GET_URL.'access_token='.$this->access_token);
- if($result)
- {
- $jsonArr = json_decode ($result, true);
- if(!$jsonArr || (isset($jsonArr['errcode']) && $jsonArr['errcode'] > 0)) $this->error($jsonArr);
- それ以外の場合は return $jsonArr;
- }
-
- return false;
- }
-
-
- /**
- * グループを作成する
- * @param string $name グループ名(30文字以内)
- */
- public function createGroup($name)
- {
- if(!$this->access_token && !$this->checkAuth()) return false;
- $data = array ('group' => array('name' => $name));
- $result =curlRequest(self::API_URL_PREFIX.self::GROUPS_CREATE_URL.'access_token='.$this->access_token, $this ->jsonEncode($data), 'post');
- if($result)
- {
- $jsonArr = json_decode($result, true);
- if(!$jsonArr || (isset($jsonArr['errcode ']) && $jsonArr['errcode'] > 0)) $this->error($jsonArr);
- else return true;
- }
-
- return false;
- }
-
-
- /**
- * グループ名を変更します
- * @param int $id WeChat によって割り当てられるグループ ID
- * @param string $name グループ名 (30 文字以内)
- */
- public function updateGroup($id, $name)
- {
- if(!$this->access_token && !$this->checkAuth()) return false;
-
- $data = array('group' = > array('id' => $id, 'name' => $name));
- $result =curlRequest(self::API_URL_PREFIX.self::GROUPS_UPDATE_URL.'access_token='.$this-> access_token, $this->jsonEncode($data), 'post');
- if($result)
- {
- $jsonArr = json_decode($result, true);
- if(!$jsonArr || (isset($ jsonArr['errcode']) && $jsonArr['errcode'] > 0)) $this->error($jsonArr);
- else return true;
- }
-
- return false;
- }
-
-
- /**
- * モバイルユーザーグループ
- *
- * @param string $openid ユーザー固有の識別子
- * @param int $to_groupid グループ ID
- */
- public function updateGroupMembers($openid, $to_groupid)
- {
- if(!$this->access_token && !$this->checkAuth()) return false;
-
- $data = array('openid' => $openid, 'to_groupid' => $to_groupid );
- $result =curlRequest(self::API_URL_PREFIX.self::GROUPS_MEMBERS_UPDATE_URL.'access_token='.$this->access_token, $this->jsonEncode($data), 'post');
- if($ result)
- {
- $jsonArr = json_decode($result, true);
- if(!$jsonArr || (isset($jsonArr['errcode']) && $jsonArr['errcode'] > 0)) $this ->error($jsonArr);
- else return true;
- }
-
- return false;
- }
-
-
- /**
- * 発信客メッセージ
- *当用户主活動発信メッセージ给公众号的時刻(発信送信情報を含む) 、点击自定义菜单clikeイベント、订阅イベント、扫描二维コードイベント、支付成功イベント、用户维权)、
- * 微信将会はメッセージデータ推送を送信者、送信者は一段階の時間内(現在は24時間)ゲスト メッセージ インターフェイスを使用して、JSON データ パケットの POST を介して一般ユーザーにメッセージを送信し、24 時間以内に送信回数を制限することができます。よりお得なサービスを提供します。
- *
- * @param string $touser 通常ユーザー openid
- */
- public function sendCustomMessage($touser, $data, $msgType = 'text')
- {
- $arr = array();
- $arr['touser' ] = $touser;
- $arr['msgtype'] = $msgType;
- switch ($msgType)
- {
- case 'text': // テキストメッセージを送信します
- $arr['text']['content'] = $data;
- Break;
-
- case 'image': // 画像メッセージを送信します
- $arr['image']['media_id'] = $data;
- Break;
-
- case 'voice': // 画像メッセージを送信します音声メッセージ
- $arr['voice']['media_id'] = $data;
- Break;
-
- case 'video': // ビデオメッセージを送信
- $arr['video']['media_id'] = $data [' media_id'] // 送信されたビデオのメディア ID
- $arr['video']['thumb_media_id'] = $data['thumb_media_id'] // ビデオのサムネイルのメディア ID
- ;
- case 'music ': //音楽メッセージを送信
- $arr['music']['title'] = $data['title'];//音楽タイトル
- $arr['music']['description'] = $data[ 'description'];// 音楽の説明
- $arr['music']['musicurl'] = $data['musicurl'];// 音楽リンク
- $arr['music']['hqmusicurl '] = $ data['hqmusicurl'];// 高品質の音楽リンク。Wi-Fi 環境では、このリンクを使用して音楽を再生することが優先されます
- $arr['music']['thumb_media_id'] = $data[' title'];// サムネイル メディア ID
- Break;
-
- case 'news': // グラフィック メッセージを送信
- $arr['news']['articles'] = $data; // タイトル、説明、URL、picurl;
- Break;
- }
-
- if(!$this->access_token && !$this->checkAuth()) return false;
-
- $result =curlRequest(self::API_URL_PREFIX.self::MESSAGE_CUSTOM_SEND_URL.'access_token= '.$this->access_token, $this->jsonEncode($arr), 'post');
- if($result)
- {
- $jsonArr = json_decode($result, true);
- if(!$ jsonArr || (isset($ jsonArr['errcode']) && $jsonArr['errcode'] > 0)) $this->error($jsonArr);
- else return true;
- }
- return false;
- }
-
-
-
- / **
- * access_token を取得します
- */
- public function checkAuth()
- {
-
- // キャッシュから access_token を取得します
- $cache_flag = 'weixin_access_token';
- $access_token =cache($cache_flag);
- if ($access_token)
- {
- $this->access_token = $access_token;
- return true;
- }
-
- // WeChat サーバーに access_token の取得をリクエストします
- $result =curlRequest(self::API_URL_PREFIX.self::AUTH_URL. 'appid='.$this->appid.'&secret='.$this->appsecret);
- if($result)
- {
- $jsonArr = json_decode($result, true);
- if(!$ jsonArr || (isset($jsonArr ['errcode']) && $jsonArr['errcode'] > 0))
- {
- $this->error($jsonArr);
- }
- else
- {
- $this ->access_token = $jsonArr['access_token'];
- $expire = isset($jsonArr['expires_in']) intval($jsonArr['expires_in'])-100 : 3600;
- // access_token をキャッシュに保存します
- ache($cache_flag, $this->access_token, $expire, Cache::FILE);
- return true;
- }
- }
- return false;
- }
-
-
- /**
- * WeChat oauth ログイン->ステップ 1: ユーザーの同意 認可、コードを取得します
- * アプリケーション認可スコープ、snsapi_base (認可ページはポップアップしません。直接ジャンプします。ユーザーの openid のみを取得できます)、
- * snsapi_userinfo (認可ページがポップアップします。 openid を通じてニックネーム、性別、場所を取得します)。また、ユーザーをフォローしていない場合でも、ユーザーが許可している限り、その情報を取得することができます)
- * WeChat上で直接リンクを開く場合、このパラメータを入力する必要はありません。ページ 302 リダイレクトを行うときは、このパラメータを指定する必要があります
- *
- * @param string $redirect_uri 認可後のリダイレクトのコールバック リンク アドレス
- * @param string $scope アプリケーション認可スコープ 0 は snsapi_base、1 は snsapi_userinfo
- * @param string $state はリダイレクト後の状態パラメーターをもたらします。開発者は任意のパラメーター値を入力できます
- */
- public function redirectGetOauthCode($redirect_uri, $scope=0, $state='')
- {
- $scope = ($scope ==) 0) ? 'snsapi_base' : 'snsapi_userinfo';
- $url = self::CONNECT_OAUTH_AUTHORIZE_URL.'appid='.$this->appid.'&redirect_uri='.urlencode($redirect_uri).'&response_type=code&scope= '。 $scope.'&state='.$state.'#wechat_redirect';
- redirect($url);
- }
-
-
- /**
- * WeChat oauth ログイン-> ステップ 2: Web ページ認証用のコードを交換します access_token
- *
- * @param string $code
- */
- public function getSnsAccessToken($code)
- {
- $ result = curlRequest(self::SNS_OAUTH_ACCESS_TOKEN_URL.'appid='.$this->appid.'&secret='.$this->appsecret.'&code='.$code.'&grant_type=authorization_code');
- if ($ result)
- {
- $jsonArr = json_decode($result, true);
- if(!$jsonArr || (isset($jsonArr['errcode']) && $jsonArr['errcode'] > 0)) $this ->error($jsonArr);
- else return $jsonArr;
- }
-
- return false;
- }
-
-
- /**
- * WeChat oauth ログイン -> ステップ 3: access_token を更新する (必要な場合)
- * access_token の有効期間が短いため、access_token がタイムアウトになった場合は、refresh_token を使用して更新できます
- * fresh_token の有効期間は長くなります (7日、30 日、60 日、90 日)、refresh_token の有効期限が切れると、ユーザーは再認証する必要があります。
- *
- * @param string $refresh_token access_token
- で取得したrefresh_tokenパラメータを記入します*/
- public function RefershToken($refresh_token)
- {
- $result =curlRequest (self::SNS_OAUTH_REFRESH_TOKEN_URL.'appid='.$this->appid.'&grant_type=refresh_token&refresh_token='.$refresh_token);
- if($result)
- {
- $jsonArr = json_decode($result, true) ;
- if(!$jsonArr || (isset($jsonArr['errcode']) && $jsonArr['errcode'] > 0)) $this->error($jsonArr);
- else return $jsonArr; }
-
- return false;
- }
-
-
- /**
- * WeChat oauth ログイン -> ステップ 4: ユーザー情報を取得します (スコープ snsapi_userinfo が必要です)
- * Web ページの認証スコープが snsapi_userinfo の場合、開発者は access_token と openid を通じてユーザー情報を取得できるようになります。
- *
- * @param string $access_token Web ページ認証インターフェイス呼び出し証明書、注意: この access_token は、サポートされている基本的な access_token とは異なります
- * @param string $openid ユーザーの一意の識別子
- */
- public function getSnsUserInfo($access_token, $openid)
- {
- $result =curlRequest(self::SNS_USERINFO_URL.'access_token='.$ access_token. '&openid='.$openid);
- if($result)
- {
- $jsonArr = json_decode($result, true);
- if(!$jsonArr || (isset($jsonArr['errcode']) && $ jsonArr['errcode'] > 0)) $this->error($jsonArr);
- else return $jsonArr;
- }
-
- return false;
- }
-
-
- /**
- * QRコードチケットを作成します
- * QRコードチケットを作成するたびに、開発者によって設定されたパラメータ(scene_id)を提供する必要があります 一時的なQRコードと永続的なQRコードのQRコードチケットを作成するプロセスが紹介されています。それぞれ。
- *
- * @param int $scene_id シーン値 ID、一時的な QR コードの場合は 32 ビット整数、永続的な QR コードの場合は最大値は 1000 です
- * @param int $type QR コードのタイプ、0 は一時的、1 は永続的です
- * @param int $expire この QR コードの有効期間 (秒単位)。 最大数は 1800 を超えません。
- */
- public function createQrcode($scene_id, $type=0, $expire=1800)
- {
- if(!$this->access_token && !$this->checkAuth()) return false;
-
- $data = array () ;
- $data['action_info'] = array('scene' => array('scene_id' => $scene_id));
- $data['action_name'] = ($type == 0 ? ' QR_SCENE' : 'QR_LIMIT_SCENE');
- if($type == 0) $data['expire_秒'] = $expire;
-
- $result =curlRequest(self::API_URL_PREFIX.self::QRCODE_CREATE_URL.'access_token='. $this ->access_token, $this->jsonEncode($data), 'post');
- if($result)
- {
- $jsonArr = json_decode($result, true);
- if(!$jsonArr | | ( isset($jsonArr['errcode']) && $jsonArr['errcode'] > 0)) $this->error($jsonArr);
- else return $jsonArr;
- }
-
- return false;
- }
-
-
- /**
- * チケットを QR コードに交換
- * QR コード チケットを取得した後、開発者はチケットを QR コード画像と交換できます。このインターフェースはログインせずに呼び出すことができることに注意してください。
- * リマインダー: UrlEncode TICKET を忘れないでください
- * チケットが正しい場合、http リターン コードは 200 です。これは画像であり、直接表示またはダウンロードできます。
- ※エラー(無効なチケット等)の場合はHTTPエラーコード404が返されます。
- *
- * @param string $ticket
- */
- public function getQrcodeUrl($ticket)
- {
- return self::SHOW_QRCODE_URL.'ticket='.urlencode($ticket);
- }
-
-
- /**
- * インターフェースによって生成されたエラーログを記録します
- */
- public function error($data)
- {
- $this->errCode = $data['errcode'];
- $this->errMsg = $data['errmsg'];
- Log::info ('WEIXIN API errcode:['.$this->errCode.'] errmsg:['.$this->errMsg.']');
- }
-
-
- /**
- * 配列内の中国語をjsonデータに変換します
- * @param array $arr
- */
- public function jsonEncode($arr) {
- $parts = array ();
- $is_list = false;
- //指定された配列が数値配列かどうかを調べます
- $keys = array_keys ( $arr );
- $max_length = count ( $arr ) - 1;
- if (($keys [0] === 0) && ($keys [$max_length] === $max_length )) { //最初のキーが 0 で最後のキーが length であるかどうかを確認します- 1
- $is_list = true;
- for($i = 0; $i < count ( $keys ); $i ++) { //各キーがその位置に対応するかどうかを確認します
- if ($i != $ keys [$i]) { //キーは位置チェックに失敗します
- $is_list = false; //連想配列です
- Break;
- }
- }
- }
- foreach ( $arr as $key => $value ) {
- if (is_array ( $value )) { // 配列のカスタム処理
- if ($is_list)
- $parts [] = $this->jsonEncode ( $value ); /* :RECURSION: */
- else
- $parts [] = '"' . $key . '":' . $this->jsonEncode ( $value ); /* :RECURSION: */
- } else {
- $str = '';
- if (! $is_list)
- $str = '"' . $key . '":';
- //複数のデータ型のカスタム処理
- if (is_numeric ( $value ) && $value $str .= $value; //数値
- elseif ($value === false)
- $str .= 'false'; //ブール値
- elseif ($value === true)
- $str .= 'true';
- else
- $str .= '"' .addlashes ( $value ) . '"'; //その他すべて
- // :TODO: 他に注意すべきデータ型はありますか? (オブジェクト?)
- $parts [] = $str;
- }
- }
- $json = implode ( ',', $parts );
- if ($is_list)
- return '[' 。 $json 。 ']'; //数値の JSON
- return '{' を返します。 $json 。 '}'; //連想JSONを返す
- }
-
-
- /**
- * 署名を確認します
- */
- public function checkSignature()
- {
- $signature = HttpRequest::getGet('signature');
- $timestamp = HttpRequest::getGet('タイムスタンプ');
- $nonce = HttpRequest::getGet('nonce');
-
- $token = $this->token;
- $tmpArr = array($token, $timestamp, $nonce);
- sort($ tmpArr);
- $tmpStr = implode($tmpArr);
- $tmpStr = sha1($tmpStr);
-
- return ($tmpStr == $signature ? true : false);
- }
-
-
- /**
- * トークンが有効かどうかを確認します
- */
- public function valid()
- {
- if($this->checkSignature()) exit(HttpRequest::getGet('echostr'));
- }
-
- }
复制代
|