検索
ホームページバックエンド開発PHPチュートリアルeaglephp は WeChat API インターフェースを使用して WeChat フレームワークを開発します_PHP チュートリアル

eaglephp は WeChat API インターフェースを使用して WeChat フレームワークを開発します_PHP チュートリアル

Jul 13, 2016 am 10:41 AM
apilinuxwindow使用頼るプラットホーム開発する微信インターフェースフレーム当てはまることプロジェクト

適用可能なプラットフォーム: window/Linux
依存プロジェクト: EaglePHP フレームワーク

以下の WeChat 5.0 API 基本インターフェイス、カスタム メニュー、および高度なインターフェイスが含まれます:
1. ユーザー メッセージを受信します。
2. ユーザーに返信します。
3. イベントプッシュを受け入れます。
4. 会話インターフェースのカスタムメニュー。
5. 音声認識。
6. カスタマーサービスインターフェース。
7. OAuth2.0 Web 認証。
8. パラメータを使用して QR コードを生成します。
9. ユーザーの地理的位置を取得します。
10. 基本的なユーザー情報を取得します。
11. フォロワーリストを取得します。
12. ユーザーのグループ化。

コードをコピーします コードは次のとおりです:

/**
 * 微信公众平台API
 */
class WeixinChat
{

 private $token;

 private $appid;

 private $appsecret;

 private $access_token;

 // 接收的数据
 private $_receive = array();

 private $_reply = '';

 // 接口错误码
 private $errCode = '';

 // 接口错误信息
 private $errMsg = '';

 // 微信oauth登陆获取code
 const CONNECT_OAUTH_AUTHORIZE_URL = 'https://open.weixin.qq.com/connect/oauth2/authorize?';

 // 微信oauth登陆通过code换取网页授权access_token
 const SNS_OAUTH_ACCESS_TOKEN_URL = 'https://api.weixin.qq.com/sns/oauth2/access_token?';

 // 微信oauth登陆刷新access_token(如果需要)
 const SNS_OAUTH_REFRESH_TOKEN_URL = 'https://api.weixin.qq.com/sns/oauth2/refresh_token?';

 // 通过ticket换取二维码
 const SHOW_QRCODE_URL = 'https://mp.weixin.qq.com/cgi-bin/showqrcode?';

 // 微信oauth登陆拉取用户信息(需scope为 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?'; 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 = "

< content>< getRevTo(),
Date::getTimeStamp(),
'text',
$content
'''''


/**
* 音楽情報への返信を設定します
* @param string $title
* @param string $desc
* @param string $musicurl
* @param string $hgmusicurl
*/
public function music($title, $desc, $musicurl, $hgmusicurl='')
{
$textTpl = '


%s


タイトル>




';
//

$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 = '





%s
';

$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 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                                        $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

tru​​e

http://www.bkjia.com/PHPjc/676871.html

適用可能なプラットフォーム: ウィンドウ/Linux 依存プロジェクト: EaglePHP フレームワークには、次のような WeChat 5.0 API 基本インターフェイス、カスタム メニュー、および高度なインターフェイスが含まれています。 1. ユーザー メッセージを受信します。 2. ユーザーに返信します...
声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
誇大広告を超えて:今日のPHPの役割の評価誇大広告を超えて:今日のPHPの役割の評価Apr 12, 2025 am 12:17 AM

PHPは、特にWeb開発の分野で、最新のプログラミングで強力で広く使用されているツールのままです。 1)PHPは使いやすく、データベースとシームレスに統合されており、多くの開発者にとって最初の選択肢です。 2)動的コンテンツ生成とオブジェクト指向プログラミングをサポートし、Webサイトを迅速に作成および保守するのに適しています。 3)PHPのパフォーマンスは、データベースクエリをキャッシュおよび最適化することで改善でき、その広範なコミュニティと豊富なエコシステムにより、今日のテクノロジースタックでは依然として重要になります。

PHPの弱い参照は何ですか、そしていつ有用ですか?PHPの弱い参照は何ですか、そしていつ有用ですか?Apr 12, 2025 am 12:13 AM

PHPでは、弱い参照クラスを通じて弱い参照が実装され、ガベージコレクターがオブジェクトの回収を妨げません。弱い参照は、キャッシュシステムやイベントリスナーなどのシナリオに適しています。オブジェクトの生存を保証することはできず、ごみ収集が遅れる可能性があることに注意する必要があります。

PHPで__invoke Magicメソッドを説明してください。PHPで__invoke Magicメソッドを説明してください。Apr 12, 2025 am 12:07 AM

\ _ \ _ Invokeメソッドを使用すると、オブジェクトを関数のように呼び出すことができます。 1。オブジェクトを呼び出すことができるように\ _ \ _呼び出しメソッドを定義します。 2。$ obj(...)構文を使用すると、PHPは\ _ \ _ Invokeメソッドを実行します。 3。ロギングや計算機、コードの柔軟性の向上、読みやすさなどのシナリオに適しています。

同時性については、PHP 8.1の繊維を説明します。同時性については、PHP 8.1の繊維を説明します。Apr 12, 2025 am 12:05 AM

繊維はPhp8.1で導入され、同時処理機能が改善されました。 1)繊維は、コルーチンと同様の軽量の並行性モデルです。 2)開発者がタスクの実行フローを手動で制御できるようにし、I/O集約型タスクの処理に適しています。 3)繊維を使用すると、より効率的で応答性の高いコードを書き込むことができます。

PHPコミュニティ:リソース、サポート、開発PHPコミュニティ:リソース、サポート、開発Apr 12, 2025 am 12:04 AM

PHPコミュニティは、開発者の成長を支援するための豊富なリソースとサポートを提供します。 1)リソースには、公式のドキュメント、チュートリアル、ブログ、LaravelやSymfonyなどのオープンソースプロジェクトが含まれます。 2)StackOverFlow、Reddit、およびSlackチャネルを通じてサポートを取得できます。 3)開発動向は、RFCに従うことで学ぶことができます。 4)コミュニティへの統合は、積極的な参加、コード共有への貢献、および学習共有への貢献を通じて達成できます。

PHP対Python:違いを理解しますPHP対Python:違いを理解しますApr 11, 2025 am 12:15 AM

PHP and Python each have their own advantages, and the choice should be based on project requirements. 1.PHPは、シンプルな構文と高い実行効率を備えたWeb開発に適しています。 2。Pythonは、簡潔な構文とリッチライブラリを備えたデータサイエンスと機械学習に適しています。

PHP:それは死にかけていますか、それとも単に適応していますか?PHP:それは死にかけていますか、それとも単に適応していますか?Apr 11, 2025 am 12:13 AM

PHPは死にかけていませんが、常に適応して進化しています。 1)PHPは、1994年以来、新しいテクノロジーの傾向に適応するために複数のバージョンの反復を受けています。 2)現在、電子商取引、コンテンツ管理システム、その他の分野で広く使用されています。 3)PHP8は、パフォーマンスと近代化を改善するために、JITコンパイラおよびその他の機能を導入します。 4)Opcacheを使用してPSR-12標準に従って、パフォーマンスとコードの品質を最適化します。

PHPの未来:適応と革新PHPの未来:適応と革新Apr 11, 2025 am 12:01 AM

PHPの将来は、新しいテクノロジーの傾向に適応し、革新的な機能を導入することで達成されます。1)クラウドコンピューティング、コンテナ化、マイクロサービスアーキテクチャに適応し、DockerとKubernetesをサポートします。 2)パフォーマンスとデータ処理の効率を改善するために、JITコンパイラと列挙タイプを導入します。 3)パフォーマンスを継続的に最適化し、ベストプラクティスを促進します。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン