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

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

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

適用可能なプラットフォーム: 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
< 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 = '
<![CDATA[%s]]>
<説明>

< ;![CDATA[%s]]>
';

$subText .= sprintf(
$tmpText, $v['title'],
isset($v[ '説明']) ? $v['説明'] : '',
isset($v['picUrl']) ? $v['picUrl'] : '',
isset($v['url'] ) ? $v['url'] : ''
);
}
}

$textTpl = '

< ;/FromUserName>


< ArticleCount>
%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 < 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

tru​​e

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

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

ホット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ヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

CentosとUbuntuの違い CentosとUbuntuの違い Apr 14, 2025 pm 09:09 PM

Centosとubuntuの重要な違いは次のとおりです。起源(CentosはRed Hat、for Enterprises、UbuntuはDebianに由来します。個人用のDebianに由来します)、パッケージ管理(CentosはYumを使用し、安定性に焦点を当てます。チュートリアルとドキュメント)、使用(Centosはサーバーに偏っています。Ubuntuはサーバーやデスクトップに適しています)、その他の違いにはインストールのシンプルさが含まれます(Centos is Thin)

Centosをインストールする方法 Centosをインストールする方法 Apr 14, 2025 pm 09:03 PM

Centosのインストール手順:ISO画像をダウンロードし、起動可能なメディアを燃やします。起動してインストールソースを選択します。言語とキーボードのレイアウトを選択します。ネットワークを構成します。ハードディスクをパーティション化します。システムクロックを設定します。ルートユーザーを作成します。ソフトウェアパッケージを選択します。インストールを開始します。インストールが完了した後、ハードディスクから再起動して起動します。

Dockerデスクトップの使用方法 Dockerデスクトップの使用方法 Apr 15, 2025 am 11:45 AM

Dockerデスクトップの使用方法は? Dockerデスクトップは、ローカルマシンでDockerコンテナを実行するためのツールです。使用する手順には次のものがあります。1。Dockerデスクトップをインストールします。 2。Dockerデスクトップを開始します。 3。Docker Imageを作成します(DockerFileを使用); 4. Docker画像をビルド(Docker Buildを使用); 5。Dockerコンテナを実行します(Docker Runを使用)。

Dockerの原則の詳細な説明 Dockerの原則の詳細な説明 Apr 14, 2025 pm 11:57 PM

DockerはLinuxカーネル機能を使用して、効率的で孤立したアプリケーションランニング環境を提供します。その作業原則は次のとおりです。1。ミラーは、アプリケーションを実行するために必要なすべてを含む読み取り専用テンプレートとして使用されます。 2。ユニオンファイルシステム(UnionFS)は、違いを保存するだけで、スペースを節約し、高速化する複数のファイルシステムをスタックします。 3.デーモンはミラーとコンテナを管理し、クライアントはそれらをインタラクションに使用します。 4。名前空間とcgroupsは、コンテナの分離とリソースの制限を実装します。 5.複数のネットワークモードは、コンテナの相互接続をサポートします。これらのコア概念を理解することによってのみ、Dockerをよりよく利用できます。

Dockerプロセスを表示する方法 Dockerプロセスを表示する方法 Apr 15, 2025 am 11:48 AM

Dockerプロセス表示方法:1。DockerCLIコマンド:Docker PS; 2。SystemDCLIコマンド:SystemCTL Status Docker; 3。CLIコマンドを作成するDocker:Docker-Compose PS。 4。プロセスエクスプローラー(Windows); 5。 /procディレクトリ(Linux)。

VSCODEに必要なコンピューター構成 VSCODEに必要なコンピューター構成 Apr 15, 2025 pm 09:48 PM

VSコードシステムの要件:オペレーティングシステム:オペレーティングシステム:Windows 10以降、MACOS 10.12以上、Linux Distributionプロセッサ:最小1.6 GHz、推奨2.0 GHz以上のメモリ:最小512 MB、推奨4 GB以上のストレージスペース:最低250 MB以上:その他の要件を推奨:安定ネットワーク接続、XORG/WAYLAND(Linux)

Docker画像が失敗した場合はどうすればよいですか Docker画像が失敗した場合はどうすればよいですか Apr 15, 2025 am 11:21 AM

障害のあるDocker画像ビルドのトラブルシューティング手順:DockerFileの構文と依存関係バージョンを確認します。ビルドコンテキストに必要なソースコードと依存関係が含まれているかどうかを確認します。エラーの詳細については、ビルドログを表示します。 -targetオプションを使用して、階層フェーズを構築して障害点を識別します。 Dockerエンジンの最新バージョンを使用してください。 -t [image-name]:デバッグモードで画像を作成して、問題をデバッグします。ディスクスペースを確認し、十分であることを確認してください。 Selinuxを無効にして、ビルドプロセスへの干渉を防ぎます。コミュニティプラットフォームに助けを求め、DockerFilesを提供し、より具体的な提案のためにログの説明を作成します。

Dockerはどのような根本的なテクノロジーを使用していますか? Dockerはどのような根本的なテクノロジーを使用していますか? Apr 15, 2025 am 07:09 AM

Dockerは、コンテナエンジン、ミラー形式、ストレージドライバー、ネットワークモデル、コンテナオーケストールツール、オペレーティングシステム仮想化、コンテナレジストリを使用して、コンテナ化機能をサポートし、軽量でポータブルで自動化されたアプリケーションの展開と管理を提供します。

See all articles