ホームページ >バックエンド開発 >PHPチュートリアル >eaglephp は WeChat API インターフェースを使用して WeChat フレームワークを開発します_PHP チュートリアル
適用可能なプラットフォーム: window/Linux
依存プロジェクト: EaglePHP フレームワーク
以下の WeChat 5.0 API 基本インターフェイス、カスタム メニュー、および高度なインターフェイスが含まれます:
1. ユーザー メッセージを受信します。
2. ユーザーに返信します。
3. イベントプッシュを受け入れます。
4. 会話インターフェースのカスタムメニュー。
5. 音声認識。
6. カスタマーサービスインターフェース。
7. OAuth2.0 Web 認証。
8. パラメータを使用して QR コードを生成します。
9. ユーザーの地理的位置を取得します。
10. 基本的なユーザー情報を取得します。
11. フォロワーリストを取得します。
12. ユーザーのグループ化。
// 基本的なユーザー情報を取得します
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?'; users Group
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
*/
public function __construct($options)
{
$this->token = isset($options['token']) $ 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']) ? : false;
}
/**
* 受信したメッセージ番号を取得します
*/
public function getRevId()
{
return isset($this->_receive['MsgId']) ? $this->_receive['MsgId] ' ] : false;
}
/**
* 受信したメッセージのテキストを取得します
* 音声認識インターフェースを通じて、ユーザーが送信した音声には、音声認識によって認識されたテキスト内容も与えられます。 (サービスアカウントの高度なインターフェース許可を申請する必要があります)
*/
public function getRevText()
{
if(isset($this->_receive['Content'])) return trim($this- > ;_receive['Content']);
elseif(isset($this->_receive['Recognition'])) return trim($this->_receive['Recognition']);
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' = & GT; $ this- & gt; _Receive ['format'] // amr、spely などの音声フォーマット
}/**
* ビデオメッセージの送受信
*/
public function getRevVideo()
{
if(isset($this->_receive['MediaId'])){
return array(
) 'mediaId' => $this->_receive['MediaId'] , //ビデオ メッセージのメディア ID。データをプルするためにマルチメディア ファイル ダウンロード インターフェイスを呼び出すことができます。
'thumbMediaId' => $this->_receive['ThumbMediaId'] //ビデオ メッセージのサムネイルのメディア ID。マルチメディア ファイルのダウンロード。インターフェイスはデータを取得します。
} ])){
return array(
'locationX' => $this->_receive['Location_X'], //地理的位置のディメンション
'locationY' => ; $this->_receive['Location_Y'] , // 地理的位置の経度 'scale' => $this->_receive['Scale'], // 地図のズームサイズ 'label' => this->_receive['Label'] // 地理的位置情報
);
}
// 地理的位置レポート インターフェイスを開いたパブリック アカウント ユーザーがフォローした後にパブリック アカウント セッションに入ると、ボックスが表示されます。パブリック アカウントがその地理的位置の使用を許可されているかどうかをユーザーに確認するポップアップが表示されます。
//ポップアップボックスはフォロー後に一度だけ表示され、今後は公式アカウントの詳細ページで操作できるようになります。' longitude' => $this->_receive['Longitude'], // 地理的位置の経度
'precision' => $this->_receive['Precision'] // 地理的位置の精度
);
} ' 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;
}
/**
* 受信イベント タイプを取得します
* 購読、購読解除、クリックなどのイベント タイプ
*/
public function text($content='')
{
$textTpl = "
Date::getTimeStamp(),
'text',
$content
'''''
/**
* 音楽情報への返信を設定します
* @param string $title
* @param string $desc
* @param string $musicurl
* @param string $hgmusicurl
*/
public function music($title, $desc, $musicurl, $hgmusicurl='')
{
$textTpl = '
< MsgType>
<音楽>
<タイトル>タイトル>
<説明> ;
//
$this->_reply = sprintf($textTpl,
$this->getRevFrom(),
$this->getRevTo(),
Date::getTimeStamp(), '音楽'、
$title ,
$desc,
$musicurl,
$hgmusicurl
);
return $this;
}
/**
* グラフィックメッセージに返信
* @param array
*/
公開機能ニュース($data)
{
$count = count($データ);
$subText = '';
if($count > 0)
{
foreach($data as $v)
{
$tmpText = '
<説明>説明>
$subText .= sprintf(
$tmpText, $v['title'],
isset($v[ '説明']) ? $v['説明'] : '',
isset($v['picUrl']) ? $v['picUrl'] : '',
isset($v['url'] ) ? $v['url'] : ''
);
}
}
$textTpl = '
< ArticleCount>
$this->_reply = sprintf(
) $textTpl,
$this->getRevFrom(),
$this->getRevTo(),
Date::getTimeStamp(),
$count,
$subText
);
$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);
それ以外の場合は 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);
else 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)
* このインターフェースは主にゲストサービスなどの手動メッセージ処理機能を備えており、送信者に便利です。ユーザにとってより良いサービスを提供するため。
*
* @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'] & gt; 0)
{
$ this-& gt; エラー ($ jsonarr)}
{
$ This- &T; sonarr [ 'access_token'];
$expire = isset($jsonArr['expires_in']) ? intval($jsonArr['expires_in'])-100 : 3600;
// access_token をキャッシュに保存します
queue($cache_flag, $this->access_token, $expire, Cache::FILE);
return true;
}
}
return false;
}
/**
* WeChat oauth ログイン-> 、コードを取得します
* アプリケーションの認可スコープ、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 ReferhToken($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;
}
/**
* 二次元コードを作成ticket
* QRコードチケットを作成するたびに、開発者によって設定されたパラメータ(scene_id)を提供する必要があります。一時的なQRコードと永続的なQRコードのQRコードチケットを作成するプロセスをそれぞれ紹介します。
*
* @param int $scene_id シーン値 ID、一時的な QR コードの 32 ビット整数、永続的な QR コードの最大値は 1000 です
* @param int $type QR コードの種類、0 は一時的、1 はですPermanent
* @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);
}
/**
* インターフェースによって生成されたエラーログを記録します
*/
パブリック関数エラー($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 で最後のキーが長さであるかどうかを確認します- 1
$is_list = true;
for($i = 0; $i < count ( $keys ); $i ++) { //各キーがその位置に対応するかどうかを確認します
if ($i != $キー [$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 . '":';
//Custom handling for multiple data types
if (is_numeric ( $value ) && $value<2000000000)
$str .= $value; //Numbers
elseif ($value === false)
$str .= 'false'; //The booleans
elseif ($value === true)
$str .= 'true';
else
$str .= '"' . addslashes ( $value ) . '"'; //All other things
// :TODO: Is there any more datatype we should be in the lookout for? (Object?)
$parts [] = $str;
}
}
$json = implode ( ',', $parts );
if ($is_list)
return '[' . $json . ']'; //Return numerical JSON
return '{' . $json . '}'; //Return associative JSON
}
public function checkSignature() , ce = 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'));
}
}
http://www.bkjia.com/PHPjc/676871.html
www.bkjia.com
http://www.bkjia.com/PHPjc/676871.html