ホームページ バックエンド開発 PHPチュートリアル EaglePHP フレームワーク v2.7 に基づいて開発された WeChat 5.0 の最新かつ最も包括的な API インターフェイス

EaglePHP フレームワーク v2.7 に基づいて開発された WeChat 5.0 の最新かつ最も包括的な API インターフェイス

Jul 25, 2016 am 08:49 AM

コード ソース: 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. ユーザーのグループ化。
  1. /**
  2. * WeChat パブリック プラットフォーム API
  3. *
  4. * @author maojianlw@139.com
  5. * [url=home.php?mod=space&uid=17823]@LINK[/url] http://www.eaglephp.com
  6. */
  7. class WeixinChat
  8. {
  9. private $token;
  10. private $appid;
  11. private $appsecret;
  12. private $access_token;
  13. //受信データ
  14. private $_receive = array();
  15. private $_reply = '';
  16. // インターフェースエラーコード
  17. private $errCode = '';
  18. // インターフェースエラーメッセージ
  19. private $errMsg = '' ;
  20. // WeChat oauth でログインしてコードを取得します
  21. const CONNECT_OAUTH_AUTHORIZE_URL = 'https://open.weixin.qq.com/connect/oauth2/authorize?';
  22. // WeChat oauth でログインし、 Web ページ認証のコード access_token
  23. const SNS_OAUTH_ACCESS_TOKEN_URL = 'https://api.weixin.qq.com/sns/oauth2/access_token?';
  24. // WeChat oauth ログイン更新 access_token (必要な場合)
  25. const SNS_OAUTH_REFRESH_TOKEN_URL = 'https: //api.weixin.qq .com/sns/oauth2/refresh_token?';
  26. // チケットを QR コードに交換
  27. const SHOW_QRCODE_URL = 'https://mp.weixin.qq.com/cgi-bin/showqrcode? ';
  28. // WeChat oauth ログインはユーザー情報を取得します (スコープは snsapi_userinfo である必要があります)
  29. const SNS_USERINFO_URL = 'https://api.weixin.qq.com/sns/userinfo?';
  30. // API プレフィックスをリクエストします
  31. const API_URL_PREFIX = 'https://api.weixin.qq.com/cgi-bin';
  32. // カスタムメニューの作成
  33. const MENU_CREATE_URL = '/menu/create?';
  34. // カスタムメニューのクエリ
  35. const MENU_GET_URL = '/menu /get?';
  36. // カスタムメニューの削除
  37. const MENU_DELETE_URL = '/menu/delete?';
  38. // access_token
  39. を取得 const AUTH_URL = '/token?grant_type=client_credential&';
  40. //ユーザーの基本情報を取得
  41. const USER_INFO_URL = '/user/info?';
  42. // フォロワーリストを取得
  43. const USER_GET_URL = '/user/get?';
  44. // グループをクエリ
  45. const GROUPS_GET_URL = '/groups /get? ';
  46. // グループを作成する
  47. const GROUPS_CREATE_URL = '/groups/create?';
  48. // グループ名を変更する
  49. const GROUPS_UPDATE_URL = '/groups/update?'; groups
  50. const GROUPS_MEMBERS_UPDATE_URL = '/groups/members/update?';
  51. //カスタマーサービスメッセージを送信
  52. const MESSAGE_CUSTOM_SEND_URL = '/message/custom/send?';
  53. //QRコードチケットを作成
  54. const QRCODE_CREATE_URL = ' /qrcode/create? ';
  55. /**
  56. * 初期化設定データ
  57. * @param array $options
  58. */
  59. パブリック関数 __construct($options)
  60. {
  61. $this->token = isset($options['token']) ? ['トークン'] : '';
  62. $this->appid = isset($options['appid']) ? $options['appid'] : '';
  63. $this->appsecret = isset($ options['appsecret' ]) ? $options['appsecret'] : '';
  64. }
  65. /**
  66. * 受信メッセージを取得する
  67. * 一般の WeChat ユーザーが公開アカウントにメッセージを送信すると、WeChat サーバーは、開発者が入力した URL にメッセージの XML データ パケットを POST します。
  68. */
  69. public function getRev()
  70. {
  71. $postStr = file_get_contents('php:/ /input');
  72. if($postStr)
  73. {
  74. $this->_receive = (array)simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
  75. //Log::info(var_export($this->) ;_receive, true) );
  76. }
  77. return $this;
  78. }
  79. /**
  80. * WeChatサーバーから送信されたメッセージを取得します
  81. */
  82. public function getRevData()
  83. {
  84. return $this->_receive;
  85. }
  86. / **
  87. * 受信機を入手します
  88. */
  89. public function getRevTo()
  90. {
  91. return isset($this->_receive['ToUserName']) $this->_receive['ToUserName'] : false;
  92. }
  93. /**
  94. * メッセージ送信者 (OpenID) を取得します
  95. */
  96. public function getRevFrom()
  97. {
  98. return isset($this->_receive['FromUserName']) $this->_receive['FromUserName'] : false;
  99. }
  100. /* *
  101. * 受信メッセージの作成時刻を取得(整数型)
  102. */
  103. public function getRevCTime()
  104. {
  105. return isset($this->_receive['CreateTime']) $this->_receive['CreateTime'] : false;
  106. }
  107. /**
  108. * 受信したメッセージの種類(テキスト、画像、音声、ビデオ、場所、リンク、イベント)を取得します
  109. */
  110. public function getRevType()
  111. {
  112. return isset($this->_receive['MsgType']) $this->_receive['MsgType'] : false;
  113. }
  114. /**
  115. * 受信したメッセージ番号を取得します
  116. */
  117. public function getRevId()
  118. {
  119. return isset($this->_receive['MsgId']) $this->_receive['MsgId' ] : false;
  120. }
  121. /**
  122. * 受信したメッセージテキストを取得します
  123. * 音声認識インターフェイスを通じて、ユーザーが送信した音声には、音声認識によって認識されたテキストの内容も表示されます。(サービスアカウントの高度なインターフェース権限を申請する必要があります)
  124. */
  125. public function getRevText()
  126. {
  127. if(isset($this->_receive['Content'])) returnrim($this- >_receive[' コンテンツ']);
  128. elseif(isset($this->_receive['認識'])) return trim($this->_receive['認識']);
  129. else return false;
  130. }
  131. / **
  132. * 画像メッセージの送受信
  133. */
  134. public function getRevImage()
  135. {
  136. if(isset($this->_receive['PicUrl'])){
  137. return array(
  138. 'picUrl' => $this-> _receive['PicUrl'], //画像リンク
  139. 'mediaId' => $this->_receive['MediaId'] //画像メッセージのメディア ID、マルチメディア ファイル ダウンロード インターフェイスを呼び出してプルできますデータ。 }
  140. return false;
  141. }
  142. /**
  143. * 音声メッセージを送受信する
  144. */
  145. public function getRevVoice()
  146. {
  147. if(isset($this->_receive['MediaId'])){
  148. return array(
  149. 'mediaId' => $this->_receive['MediaId'], //音声メッセージのメディア ID。マルチメディア ファイル ダウンロード インターフェイスを呼び出してデータを取得できます。
  150. 'format' => $this- >_receive[' Format'] //amr、speex などの音声形式
  151. );
  152. }
  153. return false;
  154. }
  155. /**
  156. *ビデオメッセージを受信できるようになります
  157. */
  158. public function getRevVideo()
  159. {
  160. if(isset($this ->_receive['MediaId'])){
  161. return array(
  162. 'mediaId' => $this->_receive['MediaId'], //ビデオ メッセージ メディア ID,これは、マルチメディア ファイル ダウンロード インターフェイス データを呼び出すことで取得できます。
  163. 'thumbMediaId' => $this->_receive['ThumbMediaId'] //ビデオ メッセージのサムネイルのメディア ID。マルチメディア ファイル ダウンロード インターフェイスを呼び出してデータを取得できます。
  164. );
  165. }
  166. return false;
  167. }
  168. /**
  169. * ユーザーの地理的位置を取得します
  170. */
  171. public function getRevLocation()
  172. {
  173. if(isset($this->_receive['Location_X'])){
  174. return array(
  175. 'locationX' => $this->_receive['Location_X'], //地理的位置の次元
  176. 'locationY' => $this->_receive['Location_Y'], //地理的位置経度
  177. 'scale' => $this->_receive['Scale'], //地図のズームサイズ
  178. 'label' => $this->_receive['Label'] // 地理的位置情報
  179. ) ;
  180. }
  181. //地理的位置レポート インターフェイスを開いているパブリック アカウントの場合、ユーザーがフォローした後にパブリック アカウント セッションに入ると、パブリック アカウントの使用を許可するかどうかをユーザーに確認するボックスがポップアップ表示されます。地理上の位置。
  182. //ポップアップボックスはフォロー後に一度だけ表示され、今後は公式アカウントの詳細ページで操作できるようになります。
  183. elseif(isset($this->_receive['緯度']))
  184. {
  185. return array(
  186. '緯度' => $this->_receive['緯度'], //地理的位置の緯度
  187. ' longitude' => $this->_receive['Longitude'], //地理的位置の経度
  188. 'precision' => $this->_receive['Precision'] //地理的位置の精度
  189. );
  190. }
  191. return false;
  192. }
  193. /**
  194. * 受信リンクメッセージを取得します
  195. */
  196. public function getRevLink()
  197. {
  198. if(isset($this->_receive['Title'])){
  199. return array(
  200. ' title' => $this->_receive['Title'], //メッセージタイトル
  201. 'description' => $this->_receive['Description'], //メッセージ説明
  202. 'url' => ; $this->_receive['Url'] //メッセージリンク
  203. );
  204. }
  205. return false;
  206. }
  207. /**
  208. * 受信イベント タイプを取得します
  209. * 購読、購読解除、クリックなどのイベント タイプ
  210. */
  211. public function getRevEvent()
  212. {
  213. if(isset ($this->_receive['Event']))
  214. {
  215. return array(
  216. 'event' => strto lower($this->_receive['Event']),
  217. 'key'=> isset ($this->_receive['EventKey']) ? $this->_receive['EventKey'] : ''
  218. );
  219. }
  220. return false;
  221. }
  222. /**
  223. * 返信テキストメッセージを設定します
  224. * @param string $content
  225. * @param string $openid
  226. */
  227. public function text($content='')
  228. {
  229. $textTpl = "
  230. < ;![CDATA[%s]]>
  231. %s
  232. ";
  233. $this->_reply = sprintf($textTpl,
  234. $this->getRevFrom (),
  235. $this->getRevTo(),
  236. Date::getTimeStamp(),
  237. 'text',
  238. $content
  239. );
  240. return $this;
  241. }
  242. /**
  243. * 返信音楽情報を設定します
  244. * @param string $title
  245. * @param string $desc
  246. * @param string $musicurl
  247. * @param string $hgmusicurl
  248. */
  249. public function music($title, $desc, $musicurl, $hgmusicurl='')
  250. {
  251. $textTpl = '
  252. < /ToUserName>
  253. %s
  254. <音楽>
  255. <タイトル>
  256. <説明>
  257. ';
  258. //
  259. $this->_reply = sprintf( $textTpl、
  260. $this->getRevFrom()、
  261. $this->getRevTo()、
  262. Date::getTimeStamp()、
  263. '音楽'、
  264. $title、
  265. $desc、
  266. $musicurl、
  267. $ hgmusicurl
  268. );
  269. return $this;
  270. }
  271. /**
  272. * テキストメッセージに返信
  273. * @param array
  274. */
  275. public function news($data)
  276. {
  277. $count = count($data);
  278. $subText = '';
  279. if($count > 0)
  280. {
  281. foreach($data as $v)
  282. {
  283. $tmpText = '
  284. <![CDATA[%s]]></タイトル> </li> <li> <説明><![CDATA[%s]]></説明></li> <li> <PicUrl><![CDATA[%s]]></PicUrl></li> <li> <URL> ;<![CDATA[%s]]></Url></li> <li> </item>';</li> <li> </li> <li> $subText .= sprintf(</li> <li> $tmpText, $v['title'], </li> <li> isset($ v['説明']) ? $v['説明'] : '', </li> <li> isset($v['picUrl']) : '', </li> <li> isset($v['url] ']) ? $v['url'] : ''</li> <li> );</li> <li> }</li> <li> }</li> <li> </li> <li> $textTpl = '<xml></li> <li> <ToUserName><![CDATA[%s]]></ToUserName></li> <li> <FromUserName><![CDATA[%s]]>< ;/FromUserName></li> <li> <CreateTime><![CDATA[%s]]></CreateTime></li> <li> <MsgType><![CDATA[news]]></MsgType></li> <li> < ArticleCount><![CDATA[%d]]></ArticleCount></li> <li> <Articles>%s</Articles></li> <li> </xml>';</li> <li> </li> <li> $this->_reply = sprintf(</li> <li> $textTpl, </li> <li> $this->getRevFrom(), </li> <li> $this->getRevTo(), </li> <li> Date::getTimeStamp(), </li> <li> $count, </li> <li> $subText</li> <li> );</li> <li> return $this;</li> <li> }</li> <li> </li> <li> </li> <li> /**</li> <li> * 返信メッセージ </li> <li> * @param array $msg</li> <li> * @param bool $return</li> <li>*/</li> <li> public function Reply()</li> <li> {</li> <li> header('Content-Type:text/xml');</li> <li> echo $this->_reply;</li> <li> exit;</li> <li> }</li> <li> </li> <li> </li> <li> /* *</li> <li> * カスタムメニュー作成 </li> <li> * @param配列メニューデータ </li> <li>*/</li> <li> public function createMenu($data)</li> <li> {</li> <li> if(!$this->access_token && !$this->checkAuth()) return false;</li> <li> </li> <li> $result =curlRequest(self:: API_URL_PREFIX.self::MENU_CREATE_URL.'access_token='.$this->access_token, $this->jsonEncode($data), 'post');</li> <li> if($result)</li> <li> {</li> <li> $jsonArr = json_decode($結果、true);</li> <li> if(!$jsonArr || (isset($jsonArr['errcode']) && $jsonArr['errcode'] > 0)) $this->error($jsonArr);</li> <li> else return true;</li> <li> }</li> <li> </li> <li> return false;</li> <li> }</li> <li> </li> <li> </li> <li> /**</li> <li> *カスタマイズされたメニュークエリ</li> <li>*/</li> <li> public function getMenu()</li> <li> {</li> <li> if(!$this->access_token && !$this->checkAuth()) return false;</li> <li> </li> <li> $result =curlRequest(self ::API_URL_PREFIX.self::MENU_GET_URL.'access_token='.$this->access_token);</li> <li> if($result)</li> <li> {</li> <li> $jsonArr = json_decode($result, true);</li> <li> if(!$jsonArr || (isset($jsonArr['errcode']) && $jsonArr['errcode'] > 0)) $this->error($jsonArr);</li> <li> else return $jsonArr;</li> <li> }</li> <li> </li> <li> return false;</li> <li> } </li> <li> </li> <li> </li> <li> /**</li> <li> *カスタムメニューは削除されました</li> <li>*/</li> <li> public function deleteMenu()</li> <li> {</li> <li> if(!$this->access_token && !$this->checkAuth()) return false;</li> <li> </li> <li> $result =curlRequest( self::API_URL_PREFIX.self::MENU_DELETE_URL.'access_token='.$this->access_token);</li> <li> if($result)</li> <li> {</li> <li> $jsonArr = json_decode($result, true);</li> <li> if(!$jsonArr | | (isset($jsonArr['errcode']) && $jsonArr['errcode'] > 0)) $this->error($jsonArr);</li> <li> else return true;</li> <li> }</li> <li> </li> <li> return false;</li> <li> } </li> <li> </li> <li> </li> <li> /**</li> <li> * 基本的なユーザー情報を取得します </li> <li> * @param string $openid 現在の公開アカウントに固有の、一般ユーザーの識別子 </li> <li>*/</li> <li> public function getUserInfo($openid)</li> <li> {</li> <li> if(!$this->access_token && !$this->checkAuth()) return false;</li> <li> </li> <li> $result = curlRequest(self::API_URL_PREFIX.self::USER_INFO_URL.'access_token='.$this->access_token.'&openid='.$openid);</li> <li> if($result)</li> <li> {</li> <li> $jsonArr = json_decode($result, true);</li> <li> if(!$jsonArr || (isset($jsonArr['errcode']) && $jsonArr['errcode'] > 0)) $this->error($jsonArr);</li> <li> else return $jsonArr;</li> <li> }</li> <li> </li> <li> return false;</li> <li> } </li> <li> </li> <li> </li> <li> /**</li> <li> * フォロワーリストを取得します </li> <li> * @param string $next_openid プルする最初の OPENID、入力されていない場合は、デフォルトで最初からプルを開始します </li> <li>*/</li> <li> public function getUserList($next_openid='')</li> <li> {</li> <li> if(!$this->access_token && !$this->checkAuth()) return false;</li> <li> </li> <li> $result =curlRequest(self::API_URL_PREFIX.self::USER_GET_URL.'access_token='.$this->access_token.'&next_openid='.$next_openid);</li> <li> if($result)</li> <li> {</li> <li> $jsonArr = json_decode( $result, true);</li> <li> if(!$jsonArr || (isset($jsonArr['errcode']) && $jsonArr['errcode'] > 0)) $this->error($jsonArr);</li> <li> else return $jsonArr;</li> <li> }</li> <li> </li> <li> return false;</li> <li> }</li> <li> </li> <li> </li> <li> /**</li> <li> * クエリのグループ化 </li> <li>*/</li> <li> public function getGroup()</li> <li> {</li> <li> if(!$this->access_token && !$this-> checkAuth()) return false;</li> <li> </li> <li> $result =curlRequest(self::API_URL_PREFIX.self::GROUPS_GET_URL.'access_token='.$this->access_token);</li> <li> if($result)</li> <li> {</li> <li> $jsonArr = json_decode ($result, true);</li> <li> if(!$jsonArr || (isset($jsonArr['errcode']) && $jsonArr['errcode'] > 0)) $this->error($jsonArr); </li> <li>それ以外の場合は return $jsonArr;</li> <li> }</li> <li> </li> <li> return false;</li> <li> }</li> <li> </li> <li> </li> <li> /**</li> <li> * グループを作成する </li> <li> * @param string $name グループ名(30文字以内) </li> <li>*/</li> <li> public function createGroup($name)</li> <li> {</li> <li> if(!$this->access_token && !$this->checkAuth()) return false;</li> <li> $data = array ('group' => array('name' => $name));</li> <li> $result =curlRequest(self::API_URL_PREFIX.self::GROUPS_CREATE_URL.'access_token='.$this->access_token, $this ->jsonEncode($data), 'post');</li> <li> if($result)</li> <li> {</li> <li> $jsonArr = json_decode($result, true);</li> <li> if(!$jsonArr || (isset($jsonArr['errcode ']) && $jsonArr['errcode'] > 0)) $this->error($jsonArr);</li> <li> else return true;</li> <li> }</li> <li> </li> <li> return false;</li> <li> }</li> <li> </li> <li> </li> <li> /**</li> <li> * グループ名を変更します </li> <li> * @param int $id WeChat によって割り当てられるグループ ID </li> <li> * @param string $name グループ名 (30 文字以内) </li> <li> */</li> <li> public function updateGroup($id, $name)</li> <li> {</li> <li> if(!$this->access_token && !$this->checkAuth()) return false;</li> <li> </li> <li> $data = array('group' = > array('id' => $id, 'name' => $name));</li> <li> $result =curlRequest(self::API_URL_PREFIX.self::GROUPS_UPDATE_URL.'access_token='.$this-> access_token, $this->jsonEncode($data), 'post');</li> <li> if($result)</li> <li> {</li> <li> $jsonArr = json_decode($result, true);</li> <li> if(!$jsonArr || (isset($ jsonArr['errcode']) && $jsonArr['errcode'] > 0)) $this->error($jsonArr);</li> <li> else return true;</li> <li> }</li> <li> </li> <li> return false;</li> <li> }</li> <li> </li> <li> </li> <li> /**</li> <li> * モバイルユーザーグループ</li> <li> * </li> <li> * @param string $openid ユーザー固有の識別子</li> <li> * @param int $to_groupid グループ ID</li> <li>*/</li> <li> public function updateGroupMembers($openid, $to_groupid) </li> <li> {</li> <li> if(!$this->access_token && !$this->checkAuth()) return false;</li> <li> </li> <li> $data = array('openid' => $openid, 'to_groupid' => $to_groupid );</li> <li> $result =curlRequest(self::API_URL_PREFIX.self::GROUPS_MEMBERS_UPDATE_URL.'access_token='.$this->access_token, $this->jsonEncode($data), 'post');</li> <li> if($ result)</li> <li> {</li> <li> $jsonArr = json_decode($result, true);</li> <li> if(!$jsonArr || (isset($jsonArr['errcode']) && $jsonArr['errcode'] > 0)) $this ->error($jsonArr);</li> <li> else return true;</li> <li> }</li> <li> </li> <li> return false;</li> <li> }</li> <li> </li> <li> </li> <li> /**</li> <li> * 発信客メッセージ</li> <li> *当用户主活動発信メッセージ给公众号的時刻(発信送信情報を含む) 、点击自定义菜单clikeイベント、订阅イベント、扫描二维コードイベント、支付成功イベント、用户维权)、</li> <li> * 微信将会はメッセージデータ推送を送信者、送信者は一段階の時間内(現在は24時間)ゲスト メッセージ インターフェイスを使用して、JSON データ パケットの POST を介して一般ユーザーにメッセージを送信し、24 時間以内に送信回数を制限することができます。よりお得なサービスを提供します。</li> <li> * </li> <li> * @param string $touser 通常ユーザー openid</li> <li> */</li> <li> public function sendCustomMessage($touser, $data, $msgType = 'text')</li> <li> {</li> <li> $arr = array();</li> <li> $arr['touser' ] = $touser;</li> <li> $arr['msgtype'] = $msgType;</li> <li> switch ($msgType)</li> <li> {</li> <li> case 'text': // テキストメッセージを送信します</li> <li> $arr['text']['content'] = $data; </li> <li> Break;</li> <li> </li> <li> case 'image': // 画像メッセージを送信します </li> <li> $arr['image']['media_id'] = $data;</li> <li> Break;</li> <li> </li> <li> case 'voice': // 画像メッセージを送信します音声メッセージ </li> <li> $arr['voice']['media_id'] = $data;</li> <li> Break;</li> <li> </li> <li> case 'video': // ビデオメッセージを送信 </li> <li> $arr['video']['media_id'] = $data [' media_id'] // 送信されたビデオのメディア ID </li> <li> $arr['video']['thumb_media_id'] = $data['thumb_media_id'] // ビデオのサムネイルのメディア ID </li> <li>; </li> <li> case 'music ': //音楽メッセージを送信</li> <li> $arr['music']['title'] = $data['title'];//音楽タイトル</li> <li> $arr['music']['description'] = $data[ 'description'];// 音楽の説明</li> <li> $arr['music']['musicurl'] = $data['musicurl'];// 音楽リンク</li> <li> $arr['music']['hqmusicurl '] = $ data['hqmusicurl'];// 高品質の音楽リンク。Wi-Fi 環境では、このリンクを使用して音楽を再生することが優先されます</li> <li> $arr['music']['thumb_media_id'] = $data[' title'];// サムネイル メディア ID</li> <li> Break;</li> <li> </li> <li> case 'news': // グラフィック メッセージを送信</li> <li> $arr['news']['articles'] = $data; // タイトル、説明、URL、picurl; </li> <li> Break;</li> <li> } </li> <li> </li> <li> if(!$this->access_token && !$this->checkAuth()) return false;</li> <li> </li> <li> $result =curlRequest(self::API_URL_PREFIX.self::MESSAGE_CUSTOM_SEND_URL.'access_token= '.$this->access_token, $this->jsonEncode($arr), 'post');</li> <li> if($result)</li> <li> {</li> <li> $jsonArr = json_decode($result, true);</li> <li> if(!$ jsonArr || (isset($ jsonArr['errcode']) && $jsonArr['errcode'] > 0)) $this->error($jsonArr);</li> <li> else return true;</li> <li> }</li> <li> return false; </li> <li> }</li> <li> </li> <li> </li> <li> </li> <li> / **</li> <li> * access_token を取得します</li> <li>*/</li> <li> public function checkAuth()</li> <li> {</li> <li> </li> <li> // キャッシュから access_token を取得します</li> <li> $cache_flag = 'weixin_access_token';</li> <li> $access_token =cache($cache_flag);</li> <li> if ($access_token) </li> <li> { </li> <li> $this->access_token = $access_token;</li> <li> return true;</li> <li> }</li> <li> </li> <li> // WeChat サーバーに access_token の取得をリクエストします </li> <li> $result =curlRequest(self::API_URL_PREFIX.self::AUTH_URL. 'appid='.$this->appid.'&secret='.$this->appsecret);</li> <li> if($result)</li> <li> {</li> <li> $jsonArr = json_decode($result, true);</li> <li> if(!$ jsonArr || (isset($jsonArr ['errcode']) && $jsonArr['errcode'] > 0))</li> <li> {</li> <li> $this->error($jsonArr);</li> <li> }</li> <li> else</li> <li> {</li> <li> $this ->access_token = $jsonArr['access_token'];</li> <li> $expire = isset($jsonArr['expires_in']) intval($jsonArr['expires_in'])-100 : 3600;</li> <li> // access_token をキャッシュに保存します</li> <li>ache($cache_flag, $this->access_token, $expire, Cache::FILE); </li> <li> return true;</li> <li> }</li> <li> }</li> <li> return false;</li> <li> }</li> <li> </li> <li> </li> <li> /**</li> <li> * WeChat oauth ログイン->ステップ 1: ユーザーの同意 認可、コードを取得します</li> <li> * アプリケーション認可スコープ、snsapi_base (認可ページはポップアップしません。直接ジャンプします。ユーザーの openid のみを取得できます)、</li> <li> * snsapi_userinfo (認可ページがポップアップします。 openid を通じてニックネーム、性別、場所を取得します)。また、ユーザーをフォローしていない場合でも、ユーザーが許可している限り、その情報を取得することができます)</li> <li> * WeChat上で直接リンクを開く場合、このパラメータを入力する必要はありません。ページ 302 リダイレクトを行うときは、このパラメータを指定する必要があります</li> <li> * </li> <li> * @param string $redirect_uri 認可後のリダイレクトのコールバック リンク アドレス</li> <li> * @param string $scope アプリケーション認可スコープ 0 は snsapi_base、1 は snsapi_userinfo</li> <li> * @param string $state はリダイレクト後の状態パラメーターをもたらします。開発者は任意のパラメーター値を入力できます</li> <li> */</li> <li> public function redirectGetOauthCode($redirect_uri, $scope=0, $state='')</li> <li> {</li> <li> $scope = ($scope ==) 0) ? 'snsapi_base' : 'snsapi_userinfo';</li> <li> $url = self::CONNECT_OAUTH_AUTHORIZE_URL.'appid='.$this->appid.'&redirect_uri='.urlencode($redirect_uri).'&response_type=code&scope= '。 $scope.'&state='.$state.'#wechat_redirect';</li> <li> redirect($url);</li> <li> }</li> <li> </li> <li> </li> <li> /**</li> <li> * WeChat oauth ログイン-> ステップ 2: Web ページ認証用のコードを交換します access_token</li> <li> * </li> <li> * @param string $code</li> <li>*/</li> <li> public function getSnsAccessToken($code)</li> <li> {</li> <li> $ result = curlRequest(self::SNS_OAUTH_ACCESS_TOKEN_URL.'appid='.$this->appid.'&secret='.$this->appsecret.'&code='.$code.'&grant_type=authorization_code');</li> <li> if ($ result)</li> <li> {</li> <li> $jsonArr = json_decode($result, true);</li> <li> if(!$jsonArr || (isset($jsonArr['errcode']) && $jsonArr['errcode'] > 0)) $this ->error($jsonArr);</li> <li> else return $jsonArr;</li> <li> }</li> <li> </li> <li> return false;</li> <li> }</li> <li> </li> <li> </li> <li> /**</li> <li> * WeChat oauth ログイン -> ステップ 3: access_token を更新する (必要な場合) </li> <li> * access_token の有効期間が短いため、access_token がタイムアウトになった場合は、refresh_token を使用して更新できます </li> <li> * fresh_token の有効期間は長くなります (7日、30 日、60 日、90 日)、refresh_token の有効期限が切れると、ユーザーは再認証する必要があります。 </li> <li> * </li> <li> * @param string $refresh_token access_token</li> <li>で取得したrefresh_tokenパラメータを記入します*/</li> <li> public function RefershToken($refresh_token)</li> <li> {</li> <li> $result =curlRequest (self::SNS_OAUTH_REFRESH_TOKEN_URL.'appid='.$this->appid.'&grant_type=refresh_token&refresh_token='.$refresh_token);</li> <li> if($result)</li> <li> {</li> <li> $jsonArr = json_decode($result, true) ;</li> <li> if(!$jsonArr || (isset($jsonArr['errcode']) && $jsonArr['errcode'] > 0)) $this->error($jsonArr);</li> <li> else return $jsonArr; } </li> <li> </li> <li> return false;</li> <li> }</li> <li> </li> <li> </li> <li> /**</li> <li> * WeChat oauth ログイン -> ステップ 4: ユーザー情報を取得します (スコープ snsapi_userinfo が必要です)</li> <li> * Web ページの認証スコープが snsapi_userinfo の場合、開発者は access_token と openid を通じてユーザー情報を取得できるようになります。 </li> <li> * </li> <li> * @param string $access_token Web ページ認証インターフェイス呼び出し証明書、注意: この access_token は、サポートされている基本的な access_token とは異なります</li> <li> * @param string $openid ユーザーの一意の識別子</li> <li>*/</li> <li> public function getSnsUserInfo($access_token, $openid)</li> <li> {</li> <li> $result =curlRequest(self::SNS_USERINFO_URL.'access_token='.$ access_token. '&openid='.$openid);</li> <li> if($result)</li> <li> {</li> <li> $jsonArr = json_decode($result, true);</li> <li> if(!$jsonArr || (isset($jsonArr['errcode']) && $ jsonArr['errcode'] > 0)) $this->error($jsonArr);</li> <li> else return $jsonArr;</li> <li> }</li> <li> </li> <li> return false;</li> <li> }</li> <li> </li> <li> </li> <li> /**</li> <li> * QRコードチケットを作成します</li> <li> * QRコードチケットを作成するたびに、開発者によって設定されたパラメータ(scene_id)を提供する必要があります 一時的なQRコードと永続的なQRコードのQRコードチケットを作成するプロセスが紹介されています。それぞれ。 </li> <li> * </li> <li> * @param int $scene_id シーン値 ID、一時的な QR コードの場合は 32 ビット整数、永続的な QR コードの場合は最大値は 1000 です</li> <li> * @param int $type QR コードのタイプ、0 は一時的、1 は永続的です</li> <li> * @param int $expire この QR コードの有効期間 (秒単位)。 最大数は 1800 を超えません。 </li> <li>*/ </li> <li> public function createQrcode($scene_id, $type=0, $expire=1800)</li> <li> {</li> <li> if(!$this->access_token && !$this->checkAuth()) return false;</li> <li> </li> <li> $data = array () ;</li> <li> $data['action_info'] = array('scene' => array('scene_id' => $scene_id));</li> <li> $data['action_name'] = ($type == 0 ? ' QR_SCENE' : 'QR_LIMIT_SCENE');</li> <li> if($type == 0) $data['expire_秒'] = $expire;</li> <li> </li> <li> $result =curlRequest(self::API_URL_PREFIX.self::QRCODE_CREATE_URL.'access_token='. $this ->access_token, $this->jsonEncode($data), 'post');</li> <li> if($result)</li> <li> {</li> <li> $jsonArr = json_decode($result, true);</li> <li> if(!$jsonArr | | ( isset($jsonArr['errcode']) && $jsonArr['errcode'] > 0)) $this->error($jsonArr);</li> <li> else return $jsonArr;</li> <li> }</li> <li> </li> <li> return false;</li> <li> }</li> <li> </li> <li> </li> <li> /**</li> <li> * チケットを QR コードに交換</li> <li> * QR コード チケットを取得した後、開発者はチケットを QR コード画像と交換できます。このインターフェースはログインせずに呼び出すことができることに注意してください。 </li> <li> * リマインダー: UrlEncode TICKET を忘れないでください</li> <li> * チケットが正しい場合、http リターン コードは 200 です。これは画像であり、直接表示またはダウンロードできます。 </li> <li> ※エラー(無効なチケット等)の場合はHTTPエラーコード404が返されます。</li> <li> * </li> <li> * @param string $ticket</li> <li> */</li> <li> public function getQrcodeUrl($ticket)</li> <li> {</li> <li> return self::SHOW_QRCODE_URL.'ticket='.urlencode($ticket);</li> <li> }</li> <li> </li> <li> </li> <li> /**</li> <li> * インターフェースによって生成されたエラーログを記録します</li> <li>*/</li> <li> public function error($data)</li> <li> {</li> <li> $this->errCode = $data['errcode'];</li> <li> $this->errMsg = $data['errmsg'];</li> <li> Log::info ('WEIXIN API errcode:['.$this->errCode.'] errmsg:['.$this->errMsg.']');</li> <li> }</li> <li> </li> <li> </li> <li> /**</li> <li> * 配列内の中国語をjsonデータに変換します</li> <li> * @param array $arr</li> <li>*/</li> <li> public function jsonEncode($arr) {</li> <li> $parts = array ();</li> <li> $is_list = false;</li> <li> //指定された配列が数値配列かどうかを調べます</li> <li> $keys = array_keys ( $arr );</li> <li> $max_length = count ( $arr ) - 1;</li> <li> if (($keys [0] === 0) && ($keys [$max_length] === $max_length )) { //最初のキーが 0 で最後のキーが length であるかどうかを確認します- 1</li> <li> $is_list = true;</li> <li> for($i = 0; $i < count ( $keys ); $i ++) { //各キーがその位置に対応するかどうかを確認します<li> if ($i != $ keys [$i]) { //キーは位置チェックに失敗します<li> $is_list = false; //連想配列です<li> Break;<li> }<li> }<li> }<li> foreach ( $arr as $key => $value ) {</li> <li> if (is_array ( $value )) { // 配列のカスタム処理</li> <li> if ($is_list)</li> <li> $parts [] = $this->jsonEncode ( $value ); /* :RECURSION: */</li> <li> else</li> <li> $parts [] = '"' . $key . '":' . $this->jsonEncode ( $value ); /* :RECURSION: */</li> <li> } else {</li> <li> $str = '';</li> <li> if (! $is_list)</li> <li> $str = '"' . $key . '":';</li> <li> //複数のデータ型のカスタム処理</li> <li> if (is_numeric ( $value ) && $value $str .= $value; //数値</li> <li> elseif ($value === false)</li> <li> $str .= 'false'; //ブール値</li> <li> elseif ($value === true)</li> <li> $str .= 'true';</li> <li> else</li> <li> $str .= '"' .addlashes ( $value ) . '"'; //その他すべて</li> <li> // :TODO: 他に注意すべきデータ型はありますか? (オブジェクト?)</li> <li> $parts [] = $str;</li> <li> }</li> <li> }</li> <li> $json = implode ( ',', $parts );</li> <li> if ($is_list)</li> <li> return '[' 。 $json 。 ']'; //数値の JSON</li> <li> return '{' を返します。 $json 。 '}'; //連想JSONを返す</li> <li> }</li> <li> <li> </li> <li> /**</li> <li> * 署名を確認します </li> <li>*/</li> <li> public function checkSignature()</li> <li> {</li> <li> $signature = HttpRequest::getGet('signature');</li> <li> $timestamp = HttpRequest::getGet('タイムスタンプ');</li> <li> $nonce = HttpRequest::getGet('nonce');</li> <li> </li> <li> $token = $this->token;</li> <li> $tmpArr = array($token, $timestamp, $nonce);</li> <li> sort($ tmpArr);</li> <li> $tmpStr = implode($tmpArr);</li> <li> $tmpStr = sha1($tmpStr);</li> <li> </li> <li> return ($tmpStr == $signature ? true : false);</li> <li> }</li> <li> </li> <li> </li> <li> /**</li> <li> * トークンが有効かどうかを確認します</li> <li> */</li> <li> public function valid()</li> <li> {</li> <li> if($this->checkSignature()) exit(HttpRequest::getGet('echostr'));</li> <li> }</li> <li> </li> <li>}</li> </ol></div> <em onclick="copycode($('code_ZWw'));">复制代</em> </div> </td></tr></table> <div id="comment_51454" class="cm"> </div> <div id="post_rate_div_51454"></div> <br><br> </div> </div> <div class="wzconShengming_sp"> <div class="bzsmdiv_sp">このウェブサイトの声明</div> <div>この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。</div> </div> </div> <ins class="adsbygoogle" style="display:block" data-ad-format="autorelaxed" data-ad-client="ca-pub-5902227090019525" data-ad-slot="2507867629"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> <div class="AI_ToolDetails_main4sR"> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-5902227090019525" data-ad-slot="3653428331" data-ad-format="auto" data-full-width-responsive="true"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> <!-- <div class="phpgenera_Details_mainR4"> <div class="phpmain1_4R_readrank"> <div class="phpmain1_4R_readrank_top"> <img onerror="this.onerror=''; this.src='/static/imghw/default1.png'" onerror="this.onerror=''; this.src='/static/imghw/default1.png'" src="/static/imghw/hotarticle2.png" alt="" /> <h2>人気の記事</h2> </div> <div class="phpgenera_Details_mainR4_bottom"> <div class="phpgenera_Details_mainR4_bottoms"> <a href="https://www.php.cn/ja/faq/1796773439.html" title="レポ:チームメイトを復活させる方法" class="phpgenera_Details_mainR4_bottom_title">レポ:チームメイトを復活させる方法</a> <div class="phpgenera_Details_mainR4_bottoms_info"> <span>1 か月前</span> <span>By 尊渡假赌尊渡假赌尊渡假赌</span> </div> </div> <div class="phpgenera_Details_mainR4_bottoms"> <a href="https://www.php.cn/ja/faq/1796780570.html" title="R.E.P.O.説明されたエネルギー結晶と彼らが何をするか(黄色のクリスタル)" class="phpgenera_Details_mainR4_bottom_title">R.E.P.O.説明されたエネルギー結晶と彼らが何をするか(黄色のクリスタル)</a> <div class="phpgenera_Details_mainR4_bottoms_info"> <span>2週間前</span> <span>By 尊渡假赌尊渡假赌尊渡假赌</span> </div> </div> <div class="phpgenera_Details_mainR4_bottoms"> <a href="https://www.php.cn/ja/faq/1796774171.html" title="ハローキティアイランドアドベンチャー:巨大な種を手に入れる方法" class="phpgenera_Details_mainR4_bottom_title">ハローキティアイランドアドベンチャー:巨大な種を手に入れる方法</a> <div class="phpgenera_Details_mainR4_bottoms_info"> <span>1 か月前</span> <span>By 尊渡假赌尊渡假赌尊渡假赌</span> </div> </div> <div class="phpgenera_Details_mainR4_bottoms"> <a href="https://www.php.cn/ja/faq/1796775427.html" title="スプリットフィクションを打ち負かすのにどれくらい時間がかかりますか?" class="phpgenera_Details_mainR4_bottom_title">スプリットフィクションを打ち負かすのにどれくらい時間がかかりますか?</a> <div class="phpgenera_Details_mainR4_bottoms_info"> <span>4週間前</span> <span>By DDD</span> </div> </div> <div class="phpgenera_Details_mainR4_bottoms"> <a href="https://www.php.cn/ja/faq/1796775336.html" title="R.E.P.O.ファイルの保存場所:それはどこにあり、それを保護する方法は?" class="phpgenera_Details_mainR4_bottom_title">R.E.P.O.ファイルの保存場所:それはどこにあり、それを保護する方法は?</a> <div class="phpgenera_Details_mainR4_bottoms_info"> <span>4週間前</span> <span>By DDD</span> </div> </div> </div> <div class="phpgenera_Details_mainR3_more"> <a href="https://www.php.cn/ja/article.html">もっと見る</a> </div> </div> </div> --> <div class="phpgenera_Details_mainR3"> <div class="phpmain1_4R_readrank"> <div class="phpmain1_4R_readrank_top"> <img onerror="this.onerror=''; this.src='/static/imghw/default1.png'" onerror="this.onerror=''; this.src='/static/imghw/default1.png'" src="/static/imghw/hottools2.png" alt="" /> <h2>ホットAIツール</h2> </div> <div class="phpgenera_Details_mainR3_bottom"> <div class="phpmain_tab2_mids_top"> <a href="https://www.php.cn/ja/ai/undresserai-undress" title="Undresser.AI Undress" class="phpmain_tab2_mids_top_img"> <img onerror="this.onerror=''; this.src='/static/imghw/default1.png'" onerror="this.onerror=''; this.src='/static/imghw/default1.png'" class="lazy" data-src="https://img.php.cn/upload/ai_manual/001/246/273/173411540686492.jpg?x-oss-process=image/resize,m_fill,h_50,w_50" src="/static/imghw/default1.png" alt="Undresser.AI Undress" /> </a> <div class="phpmain_tab2_mids_info"> <a href="https://www.php.cn/ja/ai/undresserai-undress" title="Undresser.AI Undress" class="phpmain_tab2_mids_title"> <h3>Undresser.AI Undress</h3> </a> <p>リアルなヌード写真を作成する AI 搭載アプリ</p> </div> </div> <div class="phpmain_tab2_mids_top"> <a href="https://www.php.cn/ja/ai/ai-clothes-remover" title="AI Clothes Remover" class="phpmain_tab2_mids_top_img"> <img onerror="this.onerror=''; this.src='/static/imghw/default1.png'" onerror="this.onerror=''; this.src='/static/imghw/default1.png'" class="lazy" data-src="https://img.php.cn/upload/ai_manual/001/246/273/173411552797167.jpg?x-oss-process=image/resize,m_fill,h_50,w_50" src="/static/imghw/default1.png" alt="AI Clothes Remover" /> </a> <div class="phpmain_tab2_mids_info"> <a href="https://www.php.cn/ja/ai/ai-clothes-remover" title="AI Clothes Remover" class="phpmain_tab2_mids_title"> <h3>AI Clothes Remover</h3> </a> <p>写真から衣服を削除するオンライン AI ツール。</p> </div> </div> <div class="phpmain_tab2_mids_top"> <a href="https://www.php.cn/ja/ai/undress-ai-tool" title="Undress AI Tool" class="phpmain_tab2_mids_top_img"> <img onerror="this.onerror=''; this.src='/static/imghw/default1.png'" onerror="this.onerror=''; this.src='/static/imghw/default1.png'" class="lazy" data-src="https://img.php.cn/upload/ai_manual/001/246/273/173410641626608.jpg?x-oss-process=image/resize,m_fill,h_50,w_50" src="/static/imghw/default1.png" alt="Undress AI Tool" /> </a> <div class="phpmain_tab2_mids_info"> <a href="https://www.php.cn/ja/ai/undress-ai-tool" title="Undress AI Tool" class="phpmain_tab2_mids_title"> <h3>Undress AI Tool</h3> </a> <p>脱衣画像を無料で</p> </div> </div> <div class="phpmain_tab2_mids_top"> <a href="https://www.php.cn/ja/ai/clothoffio" title="Clothoff.io" class="phpmain_tab2_mids_top_img"> <img onerror="this.onerror=''; this.src='/static/imghw/default1.png'" onerror="this.onerror=''; this.src='/static/imghw/default1.png'" class="lazy" data-src="https://img.php.cn/upload/ai_manual/001/246/273/173411529149311.jpg?x-oss-process=image/resize,m_fill,h_50,w_50" src="/static/imghw/default1.png" alt="Clothoff.io" /> </a> <div class="phpmain_tab2_mids_info"> <a href="https://www.php.cn/ja/ai/clothoffio" title="Clothoff.io" class="phpmain_tab2_mids_title"> <h3>Clothoff.io</h3> </a> <p>AI衣類リムーバー</p> </div> </div> <div class="phpmain_tab2_mids_top"> <a href="https://www.php.cn/ja/ai/ai-hentai-generator" title="AI Hentai Generator" class="phpmain_tab2_mids_top_img"> <img onerror="this.onerror=''; this.src='/static/imghw/default1.png'" onerror="this.onerror=''; this.src='/static/imghw/default1.png'" class="lazy" data-src="https://img.php.cn/upload/ai_manual/001/246/273/173405034393877.jpg?x-oss-process=image/resize,m_fill,h_50,w_50" src="/static/imghw/default1.png" alt="AI Hentai Generator" /> </a> <div class="phpmain_tab2_mids_info"> <a href="https://www.php.cn/ja/ai/ai-hentai-generator" title="AI Hentai Generator" class="phpmain_tab2_mids_title"> <h3>AI Hentai Generator</h3> </a> <p>AIヘンタイを無料で生成します。</p> </div> </div> </div> <div class="phpgenera_Details_mainR3_more"> <a href="https://www.php.cn/ja/ai">もっと見る</a> </div> </div> </div> <script src="https://sw.php.cn/hezuo/cac1399ab368127f9b113b14eb3316d0.js" type="text/javascript"></script> <div class="phpgenera_Details_mainR4"> <div class="phpmain1_4R_readrank"> <div class="phpmain1_4R_readrank_top"> <img onerror="this.onerror=''; this.src='/static/imghw/default1.png'" onerror="this.onerror=''; this.src='/static/imghw/default1.png'" src="/static/imghw/hotarticle2.png" alt="" /> <h2>人気の記事</h2> </div> <div class="phpgenera_Details_mainR4_bottom"> <div class="phpgenera_Details_mainR4_bottoms"> <a href="https://www.php.cn/ja/faq/1796773439.html" title="レポ:チームメイトを復活させる方法" class="phpgenera_Details_mainR4_bottom_title">レポ:チームメイトを復活させる方法</a> <div class="phpgenera_Details_mainR4_bottoms_info"> <span>1 か月前</span> <span>By 尊渡假赌尊渡假赌尊渡假赌</span> </div> </div> <div class="phpgenera_Details_mainR4_bottoms"> <a href="https://www.php.cn/ja/faq/1796780570.html" title="R.E.P.O.説明されたエネルギー結晶と彼らが何をするか(黄色のクリスタル)" class="phpgenera_Details_mainR4_bottom_title">R.E.P.O.説明されたエネルギー結晶と彼らが何をするか(黄色のクリスタル)</a> <div class="phpgenera_Details_mainR4_bottoms_info"> <span>2週間前</span> <span>By 尊渡假赌尊渡假赌尊渡假赌</span> </div> </div> <div class="phpgenera_Details_mainR4_bottoms"> <a href="https://www.php.cn/ja/faq/1796774171.html" title="ハローキティアイランドアドベンチャー:巨大な種を手に入れる方法" class="phpgenera_Details_mainR4_bottom_title">ハローキティアイランドアドベンチャー:巨大な種を手に入れる方法</a> <div class="phpgenera_Details_mainR4_bottoms_info"> <span>1 か月前</span> <span>By 尊渡假赌尊渡假赌尊渡假赌</span> </div> </div> <div class="phpgenera_Details_mainR4_bottoms"> <a href="https://www.php.cn/ja/faq/1796775427.html" title="スプリットフィクションを打ち負かすのにどれくらい時間がかかりますか?" class="phpgenera_Details_mainR4_bottom_title">スプリットフィクションを打ち負かすのにどれくらい時間がかかりますか?</a> <div class="phpgenera_Details_mainR4_bottoms_info"> <span>4週間前</span> <span>By DDD</span> </div> </div> <div class="phpgenera_Details_mainR4_bottoms"> <a href="https://www.php.cn/ja/faq/1796775336.html" title="R.E.P.O.ファイルの保存場所:それはどこにあり、それを保護する方法は?" class="phpgenera_Details_mainR4_bottom_title">R.E.P.O.ファイルの保存場所:それはどこにあり、それを保護する方法は?</a> <div class="phpgenera_Details_mainR4_bottoms_info"> <span>4週間前</span> <span>By DDD</span> </div> </div> </div> <div class="phpgenera_Details_mainR3_more"> <a href="https://www.php.cn/ja/article.html">もっと見る</a> </div> </div> </div> <div class="phpgenera_Details_mainR3"> <div class="phpmain1_4R_readrank"> <div class="phpmain1_4R_readrank_top"> <img onerror="this.onerror=''; this.src='/static/imghw/default1.png'" onerror="this.onerror=''; this.src='/static/imghw/default1.png'" src="/static/imghw/hottools2.png" alt="" /> <h2>ホットツール</h2> </div> <div class="phpgenera_Details_mainR3_bottom"> <div class="phpmain_tab2_mids_top"> <a href="https://www.php.cn/ja/toolset/development-tools/92" title="メモ帳++7.3.1" class="phpmain_tab2_mids_top_img"> <img onerror="this.onerror=''; this.src='/static/imghw/default1.png'" onerror="this.onerror=''; this.src='/static/imghw/default1.png'" class="lazy" data-src="https://img.php.cn/upload/manual/000/000/001/58ab96f0f39f7357.jpg?x-oss-process=image/resize,m_fill,h_50,w_72" src="/static/imghw/default1.png" alt="メモ帳++7.3.1" /> </a> <div class="phpmain_tab2_mids_info"> <a href="https://www.php.cn/ja/toolset/development-tools/92" title="メモ帳++7.3.1" class="phpmain_tab2_mids_title"> <h3>メモ帳++7.3.1</h3> </a> <p>使いやすく無料のコードエディター</p> </div> </div> <div class="phpmain_tab2_mids_top"> <a href="https://www.php.cn/ja/toolset/development-tools/93" title="SublimeText3 中国語版" class="phpmain_tab2_mids_top_img"> <img onerror="this.onerror=''; this.src='/static/imghw/default1.png'" onerror="this.onerror=''; this.src='/static/imghw/default1.png'" class="lazy" data-src="https://img.php.cn/upload/manual/000/000/001/58ab97a3baad9677.jpg?x-oss-process=image/resize,m_fill,h_50,w_72" src="/static/imghw/default1.png" alt="SublimeText3 中国語版" /> </a> <div class="phpmain_tab2_mids_info"> <a href="https://www.php.cn/ja/toolset/development-tools/93" title="SublimeText3 中国語版" class="phpmain_tab2_mids_title"> <h3>SublimeText3 中国語版</h3> </a> <p>中国語版、とても使いやすい</p> </div> </div> <div class="phpmain_tab2_mids_top"> <a href="https://www.php.cn/ja/toolset/development-tools/121" title="ゼンドスタジオ 13.0.1" class="phpmain_tab2_mids_top_img"> <img onerror="this.onerror=''; this.src='/static/imghw/default1.png'" onerror="this.onerror=''; this.src='/static/imghw/default1.png'" class="lazy" data-src="https://img.php.cn/upload/manual/000/000/001/58ab97ecd1ab2670.jpg?x-oss-process=image/resize,m_fill,h_50,w_72" src="/static/imghw/default1.png" alt="ゼンドスタジオ 13.0.1" /> </a> <div class="phpmain_tab2_mids_info"> <a href="https://www.php.cn/ja/toolset/development-tools/121" title="ゼンドスタジオ 13.0.1" class="phpmain_tab2_mids_title"> <h3>ゼンドスタジオ 13.0.1</h3> </a> <p>強力な PHP 統合開発環境</p> </div> </div> <div class="phpmain_tab2_mids_top"> <a href="https://www.php.cn/ja/toolset/development-tools/469" title="ドリームウィーバー CS6" class="phpmain_tab2_mids_top_img"> <img onerror="this.onerror=''; this.src='/static/imghw/default1.png'" onerror="this.onerror=''; this.src='/static/imghw/default1.png'" class="lazy" data-src="https://img.php.cn/upload/manual/000/000/001/58d0e0fc74683535.jpg?x-oss-process=image/resize,m_fill,h_50,w_72" src="/static/imghw/default1.png" alt="ドリームウィーバー CS6" /> </a> <div class="phpmain_tab2_mids_info"> <a href="https://www.php.cn/ja/toolset/development-tools/469" title="ドリームウィーバー CS6" class="phpmain_tab2_mids_title"> <h3>ドリームウィーバー CS6</h3> </a> <p>ビジュアル Web 開発ツール</p> </div> </div> <div class="phpmain_tab2_mids_top"> <a href="https://www.php.cn/ja/toolset/development-tools/500" title="SublimeText3 Mac版" class="phpmain_tab2_mids_top_img"> <img onerror="this.onerror=''; this.src='/static/imghw/default1.png'" onerror="this.onerror=''; this.src='/static/imghw/default1.png'" class="lazy" data-src="https://img.php.cn/upload/manual/000/000/001/58d34035e2757995.png?x-oss-process=image/resize,m_fill,h_50,w_72" src="/static/imghw/default1.png" alt="SublimeText3 Mac版" /> </a> <div class="phpmain_tab2_mids_info"> <a href="https://www.php.cn/ja/toolset/development-tools/500" title="SublimeText3 Mac版" class="phpmain_tab2_mids_title"> <h3>SublimeText3 Mac版</h3> </a> <p>神レベルのコード編集ソフト(SublimeText3)</p> </div> </div> </div> <div class="phpgenera_Details_mainR3_more"> <a href="https://www.php.cn/ja/ai">もっと見る</a> </div> </div> </div> <div class="phpgenera_Details_mainR4"> <div class="phpmain1_4R_readrank"> <div class="phpmain1_4R_readrank_top"> <img onerror="this.onerror=''; this.src='/static/imghw/default1.png'" onerror="this.onerror=''; this.src='/static/imghw/default1.png'" src="/static/imghw/hotarticle2.png" alt="" /> <h2>ホットトピック</h2> </div> <div class="phpgenera_Details_mainR4_bottom"> <div class="phpgenera_Details_mainR4_bottoms"> <a href="https://www.php.cn/ja/faq/gmailyxdlrkzn" title="Gmailメールのログイン入り口はどこですか?" class="phpgenera_Details_mainR4_bottom_title">Gmailメールのログイン入り口はどこですか?</a> <div class="phpgenera_Details_mainR4_bottoms_info"> <div class="phpgenera_Details_mainR4_bottoms_infos"> <img src="/static/imghw/eyess.png" alt="" /> <span>7366</span> </div> <div class="phpgenera_Details_mainR4_bottoms_infos"> <img src="/static/imghw/tiezi.png" alt="" /> <span>15</span> </div> </div> </div> <div class="phpgenera_Details_mainR4_bottoms"> <a href="https://www.php.cn/ja/faq/java-tutorial" title="Java チュートリアル" class="phpgenera_Details_mainR4_bottom_title">Java チュートリアル</a> <div class="phpgenera_Details_mainR4_bottoms_info"> <div class="phpgenera_Details_mainR4_bottoms_infos"> <img src="/static/imghw/eyess.png" alt="" /> <span>1628</span> </div> <div class="phpgenera_Details_mainR4_bottoms_infos"> <img src="/static/imghw/tiezi.png" alt="" /> <span>14</span> </div> </div> </div> <div class="phpgenera_Details_mainR4_bottoms"> <a href="https://www.php.cn/ja/faq/cakephp-tutor" title="CakePHP チュートリアル" class="phpgenera_Details_mainR4_bottom_title">CakePHP チュートリアル</a> <div class="phpgenera_Details_mainR4_bottoms_info"> <div class="phpgenera_Details_mainR4_bottoms_infos"> <img src="/static/imghw/eyess.png" alt="" /> <span>1353</span> </div> <div class="phpgenera_Details_mainR4_bottoms_infos"> <img src="/static/imghw/tiezi.png" alt="" /> <span>52</span> </div> </div> </div> <div class="phpgenera_Details_mainR4_bottoms"> <a href="https://www.php.cn/ja/faq/laravel-tutori" title="Laravel チュートリアル" class="phpgenera_Details_mainR4_bottom_title">Laravel チュートリアル</a> <div class="phpgenera_Details_mainR4_bottoms_info"> <div class="phpgenera_Details_mainR4_bottoms_infos"> <img src="/static/imghw/eyess.png" alt="" /> <span>1266</span> </div> <div class="phpgenera_Details_mainR4_bottoms_infos"> <img src="/static/imghw/tiezi.png" alt="" /> <span>25</span> </div> </div> </div> <div class="phpgenera_Details_mainR4_bottoms"> <a href="https://www.php.cn/ja/faq/php-tutorial" title="PHP チュートリアル" class="phpgenera_Details_mainR4_bottom_title">PHP チュートリアル</a> <div class="phpgenera_Details_mainR4_bottoms_info"> <div class="phpgenera_Details_mainR4_bottoms_infos"> <img src="/static/imghw/eyess.png" alt="" /> <span>1214</span> </div> <div class="phpgenera_Details_mainR4_bottoms_infos"> <img src="/static/imghw/tiezi.png" alt="" /> <span>29</span> </div> </div> </div> </div> <div class="phpgenera_Details_mainR3_more"> <a href="https://www.php.cn/ja/faq/zt">もっと見る</a> </div> </div> </div> </div> </div> <div class="Article_Details_main2"> <div class="phpgenera_Details_mainL4"> <div class="phpmain1_2_top"> <a href="javascript:void(0);" class="phpmain1_2_top_title">Related knowledge<img src="/static/imghw/index2_title2.png" alt="" /></a> </div> <div class="phpgenera_Details_mainL4_info"> <div class="phphistorical_Version2_mids"> <a href="https://www.php.cn/ja/faq/1796778251.html" title="Laravelでフラッシュセッションデータを使用します" class="phphistorical_Version2_mids_img"> <img onerror="this.onerror=''; this.src='/static/imghw/default1.png'" src="/static/imghw/default1.png" class="lazy" data-src="https://img.php.cn/upload/article/001/253/068/174177050399455.png?x-oss-process=image/resize,m_fill,h_207,w_330" alt="Laravelでフラッシュセッションデータを使用します" /> </a> <a href="https://www.php.cn/ja/faq/1796778251.html" title="Laravelでフラッシュセッションデータを使用します" class="phphistorical_Version2_mids_title">Laravelでフラッシュセッションデータを使用します</a> <span class="Articlelist_txts_time">Mar 12, 2025 pm 05:08 PM</span> <p class="Articlelist_txts_p">Laravelは、直感的なフラッシュメソッドを使用して、一時的なセッションデータの処理を簡素化します。これは、アプリケーション内に簡単なメッセージ、アラート、または通知を表示するのに最適です。 データは、デフォルトで次の要求のためにのみ持続します。 $リクエスト - </p> </div> <div class="phphistorical_Version2_mids"> <a href="https://www.php.cn/ja/faq/1796773565.html" title="LaravelのバックエンドでReactアプリを構築する:パート2、React" class="phphistorical_Version2_mids_img"> <img onerror="this.onerror=''; this.src='/static/imghw/default1.png'" src="/static/imghw/default1.png" class="lazy" data-src="https://img.php.cn/upload/article/001/242/473/174105199680987.jpg?x-oss-process=image/resize,m_fill,h_207,w_330" alt="LaravelのバックエンドでReactアプリを構築する:パート2、React" /> </a> <a href="https://www.php.cn/ja/faq/1796773565.html" title="LaravelのバックエンドでReactアプリを構築する:パート2、React" class="phphistorical_Version2_mids_title">LaravelのバックエンドでReactアプリを構築する:パート2、React</a> <span class="Articlelist_txts_time">Mar 04, 2025 am 09:33 AM</span> <p class="Articlelist_txts_p">これは、LaravelバックエンドとのReactアプリケーションの構築に関するシリーズの2番目と最終部分です。シリーズの最初の部分では、基本的な製品上場アプリケーションのためにLaravelを使用してRESTFUL APIを作成しました。このチュートリアルでは、開発者になります</p> </div> <div class="phphistorical_Version2_mids"> <a href="https://www.php.cn/ja/faq/1796779059.html" title="PHPのカール:REST APIでPHPカール拡張機能を使用する方法" class="phphistorical_Version2_mids_img"> <img onerror="this.onerror=''; this.src='/static/imghw/default1.png'" src="/static/imghw/default1.png" class="lazy" data-src="https://img.php.cn/upload/article/000/000/080/67d3a4f0ef568156.png?x-oss-process=image/resize,m_fill,h_207,w_330" alt="PHPのカール:REST APIでPHPカール拡張機能を使用する方法" /> </a> <a href="https://www.php.cn/ja/faq/1796779059.html" title="PHPのカール:REST APIでPHPカール拡張機能を使用する方法" class="phphistorical_Version2_mids_title">PHPのカール:REST APIでPHPカール拡張機能を使用する方法</a> <span class="Articlelist_txts_time">Mar 14, 2025 am 11:42 AM</span> <p class="Articlelist_txts_p">PHPクライアントURL(CURL)拡張機能は、開発者にとって強力なツールであり、リモートサーバーやREST APIとのシームレスな対話を可能にします。尊敬されるマルチプロトコルファイル転送ライブラリであるLibcurlを活用することにより、PHP Curlは効率的なexecuを促進します</p> </div> <div class="phphistorical_Version2_mids"> <a href="https://www.php.cn/ja/faq/1796778255.html" title="Laravelテストでの簡略化されたHTTP応答のモッキング" class="phphistorical_Version2_mids_img"> <img onerror="this.onerror=''; this.src='/static/imghw/default1.png'" src="/static/imghw/default1.png" class="lazy" data-src="https://img.php.cn/upload/article/001/253/068/174177056555028.png?x-oss-process=image/resize,m_fill,h_207,w_330" alt="Laravelテストでの簡略化されたHTTP応答のモッキング" /> </a> <a href="https://www.php.cn/ja/faq/1796778255.html" title="Laravelテストでの簡略化されたHTTP応答のモッキング" class="phphistorical_Version2_mids_title">Laravelテストでの簡略化されたHTTP応答のモッキング</a> <span class="Articlelist_txts_time">Mar 12, 2025 pm 05:09 PM</span> <p class="Articlelist_txts_p">Laravelは簡潔なHTTP応答シミュレーション構文を提供し、HTTP相互作用テストを簡素化します。このアプローチは、テストシミュレーションをより直感的にしながら、コード冗長性を大幅に削減します。 基本的な実装は、さまざまな応答タイプのショートカットを提供します。 Illuminate \ support \ facades \ httpを使用します。 http :: fake([[ 'google.com' => 'hello world'、 'github.com' => ['foo' => 'bar']、 'forge.laravel.com' =></p> </div> <div class="phphistorical_Version2_mids"> <a href="https://www.php.cn/ja/faq/1796778636.html" title="Codecanyonで12の最高のPHPチャットスクリプト" class="phphistorical_Version2_mids_img"> <img onerror="this.onerror=''; this.src='/static/imghw/default1.png'" src="/static/imghw/default1.png" class="lazy" data-src="https://img.php.cn/upload/article/001/242/473/174183889317163.jpg?x-oss-process=image/resize,m_fill,h_207,w_330" alt="Codecanyonで12の最高のPHPチャットスクリプト" /> </a> <a href="https://www.php.cn/ja/faq/1796778636.html" title="Codecanyonで12の最高のPHPチャットスクリプト" class="phphistorical_Version2_mids_title">Codecanyonで12の最高のPHPチャットスクリプト</a> <span class="Articlelist_txts_time">Mar 13, 2025 pm 12:08 PM</span> <p class="Articlelist_txts_p">顧客の最も差し迫った問題にリアルタイムでインスタントソリューションを提供したいですか? ライブチャットを使用すると、顧客とのリアルタイムな会話を行い、すぐに問題を解決できます。それはあなたがあなたのカスタムにより速いサービスを提供することを可能にします</p> </div> <div class="phphistorical_Version2_mids"> <a href="https://www.php.cn/ja/faq/1796773554.html" title="Laravelの通知" class="phphistorical_Version2_mids_img"> <img onerror="this.onerror=''; this.src='/static/imghw/default1.png'" src="/static/imghw/default1.png" class="lazy" data-src="https://img.php.cn/upload/article/001/242/473/174105133356039.jpg?x-oss-process=image/resize,m_fill,h_207,w_330" alt="Laravelの通知" /> </a> <a href="https://www.php.cn/ja/faq/1796773554.html" title="Laravelの通知" class="phphistorical_Version2_mids_title">Laravelの通知</a> <span class="Articlelist_txts_time">Mar 04, 2025 am 09:22 AM</span> <p class="Articlelist_txts_p">この記事では、Laravel Webフレームワークの通知システムを検討します。 Laravelの通知システムを使用すると、さまざまなチャネルでユーザーに通知を送信できます。今日は、通知ovを送信する方法について説明します</p> </div> <div class="phphistorical_Version2_mids"> <a href="https://www.php.cn/ja/faq/1796782794.html" title="PHPにおける後期静的結合の概念を説明します。" class="phphistorical_Version2_mids_img"> <img onerror="this.onerror=''; this.src='/static/imghw/default1.png'" src="/static/imghw/default1.png" class="lazy" data-src="https://img.php.cn/upload/article/202503/21/2025032113332596253.jpg?x-oss-process=image/resize,m_fill,h_207,w_330" alt="PHPにおける後期静的結合の概念を説明します。" /> </a> <a href="https://www.php.cn/ja/faq/1796782794.html" title="PHPにおける後期静的結合の概念を説明します。" class="phphistorical_Version2_mids_title">PHPにおける後期静的結合の概念を説明します。</a> <span class="Articlelist_txts_time">Mar 21, 2025 pm 01:33 PM</span> <p class="Articlelist_txts_p">記事では、PHP 5.3で導入されたPHPの後期静的結合(LSB)について説明し、より柔軟な継承を求める静的メソッドコールのランタイム解像度を可能にします。 LSBの実用的なアプリケーションと潜在的なパフォーマ</p> </div> <div class="phphistorical_Version2_mids"> <a href="https://www.php.cn/ja/faq/1796776700.html" title="PHPロギング:PHPログ分析のベストプラクティス" class="phphistorical_Version2_mids_img"> <img onerror="this.onerror=''; this.src='/static/imghw/default1.png'" src="/static/imghw/default1.png" class="lazy" data-src="https://img.php.cn/upload/article/000/000/080/67ce86fb248f0637.png?x-oss-process=image/resize,m_fill,h_207,w_330" alt="PHPロギング:PHPログ分析のベストプラクティス" /> </a> <a href="https://www.php.cn/ja/faq/1796776700.html" title="PHPロギング:PHPログ分析のベストプラクティス" class="phphistorical_Version2_mids_title">PHPロギング:PHPログ分析のベストプラクティス</a> <span class="Articlelist_txts_time">Mar 10, 2025 pm 02:32 PM</span> <p class="Articlelist_txts_p">PHPロギングは、Webアプリケーションの監視とデバッグ、および重要なイベント、エラー、ランタイムの動作をキャプチャするために不可欠です。システムのパフォーマンスに関する貴重な洞察を提供し、問題の特定に役立ち、より速いトラブルシューティングをサポートします</p> </div> </div> <a href="https://www.php.cn/ja/be/" class="phpgenera_Details_mainL4_botton"> <span>See all articles</span> <img src="/static/imghw/down_right.png" alt="" /> </a> </div> </div> </div> </main> <footer> <div class="footer"> <div class="footertop"> <img src="/static/imghw/logo.png" alt=""> <p>福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!</p> </div> <div class="footermid"> <a href="https://www.php.cn/ja/about/us.html">私たちについて</a> <a href="https://www.php.cn/ja/about/disclaimer.html">免責事項</a> <a href="https://www.php.cn/ja/update/article_0_1.html">Sitemap</a> </div> <div class="footerbottom"> <p> © php.cn All rights reserved </p> </div> </div> </footer> <input type="hidden" id="verifycode" value="/captcha.html"> <script>layui.use(['element', 'carousel'], function () {var element = layui.element;$ = layui.jquery;var carousel = layui.carousel;carousel.render({elem: '#test1', width: '100%', height: '330px', arrow: 'always'});$.getScript('/static/js/jquery.lazyload.min.js', function () {$("img").lazyload({placeholder: "/static/images/load.jpg", effect: "fadeIn", threshold: 200, skip_invisible: false});});});</script> <script src="/static/js/common_new.js"></script> <script type="text/javascript" src="/static/js/jquery.cookie.js?1743751092"></script> <script src="https://vdse.bdstatic.com//search-video.v1.min.js"></script> <link rel='stylesheet' id='_main-css' href='/static/css/viewer.min.css?2' type='text/css' media='all' /> <script type='text/javascript' src='/static/js/viewer.min.js?1'></script> <script type='text/javascript' src='/static/js/jquery-viewer.min.js'></script> <script type="text/javascript" src="/static/js/global.min.js?5.5.53"></script> <script> var _paq = window._paq = window._paq || []; /* tracker methods like "setCustomDimension" should be called before "trackPageView" */ _paq.push(['trackPageView']); _paq.push(['enableLinkTracking']); (function () { var u = "https://tongji.php.cn/"; _paq.push(['setTrackerUrl', u + 'matomo.php']); _paq.push(['setSiteId', '9']); var d = document, g = d.createElement('script'), s = d.getElementsByTagName('script')[0]; g.async = true; g.src = u + 'matomo.js'; s.parentNode.insertBefore(g, s); })(); </script> <script> // top layui.use(function () { var util = layui.util; util.fixbar({ on: { mouseenter: function (type) { layer.tips(type, this, { tips: 4, fixed: true, }); }, mouseleave: function (type) { layer.closeAll("tips"); }, }, }); }); document.addEventListener("DOMContentLoaded", (event) => { // 定义一个函数来处理滚动链接的点击事件 function setupScrollLink(scrollLinkId, targetElementId) { const scrollLink = document.getElementById(scrollLinkId); const targetElement = document.getElementById(targetElementId); if (scrollLink && targetElement) { scrollLink.addEventListener("click", (e) => { e.preventDefault(); // 阻止默认链接行为 targetElement.scrollIntoView({ behavior: "smooth" }); // 平滑滚动到目标元素 }); } else { console.warn( `Either scroll link with ID '${scrollLinkId}' or target element with ID '${targetElementId}' not found.` ); } } // 使用该函数设置多个滚动链接 setupScrollLink("Article_Details_main1L2s_1", "article_main_title1"); setupScrollLink("Article_Details_main1L2s_2", "article_main_title2"); setupScrollLink("Article_Details_main1L2s_3", "article_main_title3"); setupScrollLink("Article_Details_main1L2s_4", "article_main_title4"); setupScrollLink("Article_Details_main1L2s_5", "article_main_title5"); setupScrollLink("Article_Details_main1L2s_6", "article_main_title6"); // 可以继续添加更多的滚动链接设置 }); window.addEventListener("scroll", function () { var fixedElement = document.getElementById("Article_Details_main1Lmain"); var scrollTop = window.scrollY || document.documentElement.scrollTop; // 兼容不同浏览器 var clientHeight = window.innerHeight || document.documentElement.clientHeight; // 视口高度 var scrollHeight = document.documentElement.scrollHeight; // 页面总高度 // 计算距离底部的距离 var distanceToBottom = scrollHeight - scrollTop - clientHeight; // 当距离底部小于或等于300px时,取消固定定位 if (distanceToBottom <= 980) { fixedElement.classList.remove("Article_Details_main1Lmain"); fixedElement.classList.add("Article_Details_main1Lmain_relative"); } else { // 否则,保持固定定位 fixedElement.classList.remove("Article_Details_main1Lmain_relative"); fixedElement.classList.add("Article_Details_main1Lmain"); } }); </script> </body> </html>