ホームページ  >  記事  >  バックエンド開発  >  (2) Web ページにユーザーの基本情報を取得する権限を与える

(2) Web ページにユーザーの基本情報を取得する権限を与える

WBOY
WBOYオリジナル
2016-06-13 12:28:18860ブラウズ

(2) 基本的なユーザー情報を取得するための Web ページの承認

パブリック アカウントの構成プロセス中に、多くの開発者は HTML5 ページをメニューに追加することがあります。ページのユーザー情報にアクセスする必要があります。現時点では、基本的なユーザー情報を取得するには Web ページの認証が必要です

追記: このブログ投稿で説明されている WeChat 開発は Yii2.0 フレームワークに基づいています

1. 承認コールバック ドメイン名を設定します: 開発---> インターフェイスのアクセス許可

「ユーザーの基本情報を取得するための Web ページの承認」を検索します。 「」をクリックし、ポップアップ ボックスで対応する「変更」をクリックします。応答位置に承認されたコールバック ドメイン名を入力するだけです。ここでのドメイン名に http:// を追加する必要はありません (詳細については、 Web ページの承認されたコールバック ドメイン名については、パブリック プラットフォームの開発者ドキュメントを参照してください)

2. 認証を取得します

OAuth2.0 ブロガーについては、Fangbei Studio のブログ投稿を参照してください。 cnblogs.com/txw1958/p/weixin71-oauth20.html (追記: Fangbei は WeChat 開発者マスターです。WeChat 開発内容は比較的詳細であり、参考資料として推奨されます)。これは、WeChat 公式文書の関連内容を詳細に分析し、また、認可を取得するためのより詳細なアイデアとソリューション。

実際、ユーザー情報を取得するための鍵は、ユーザーの openid を取得することです。ブロガーは、ユーザーに対してデータベース操作を実行するために、公式アカウントのメニューをクリックしてページを開くことをユーザーに自動的に許可したいので、次の 2 つの方法があります:

(1) カスタムメニューを使用して認証ページをリクエストします

カスタムメニューの後に別途ブログ記事を書きます ここではカスタムメニューによる認証について簡単に説明します。 . この方法には高度なインターフェイスが必要です。 インターフェイスの権限は、公式アカウントをフォローし、メニューから直接ページに入るユーザーに限定されます。

<span style="color: #008080;"> 1</span> <span style="color: #800080;">$menu</span> = '<span style="color: #000000;">{</span><span style="color: #008080;"> 2</span> <span style="color: #000000;">  "button":[</span><span style="color: #008080;"> 3</span> <span style="color: #000000;">    {</span><span style="color: #008080;"> 4</span> <span style="color: #000000;">      "type": "view",</span><span style="color: #008080;"> 5</span> <span style="color: #000000;">      "name": "商城",</span><span style="color: #008080;"> 6</span> <span style="color: #000000;">      "url": "https://open.weixin.qq.com/connect/oauth2/authorize?appid=xxx&redirect_uri=http://tx.heivr.com/index.php&response_type=code&scope=snsapi_base&state=1#wechat_redirect"</span><span style="color: #008080;"> 7</span> <span style="color: #000000;">    },</span><span style="color: #008080;"> 8</span> <span style="color: #008080;"> 9</span> <span style="color: #000000;">    {</span><span style="color: #008080;">10</span> <span style="color: #000000;">      "name":"快递服务",</span><span style="color: #008080;">11</span> <span style="color: #000000;">      "sub_button":[</span><span style="color: #008080;">12</span> <span style="color: #000000;">        {</span><span style="color: #008080;">13</span> <span style="color: #000000;">           "type":"click",</span><span style="color: #008080;">14</span> <span style="color: #000000;">           "name":"发快递",</span><span style="color: #008080;">15</span> <span style="color: #000000;">           "key":"express"</span><span style="color: #008080;">16</span> <span style="color: #000000;">        },</span><span style="color: #008080;">17</span> <span style="color: #000000;">        {</span><span style="color: #008080;">18</span> <span style="color: #000000;">           "type":"click",</span><span style="color: #008080;">19</span> <span style="color: #000000;">           "name":"快递查询",</span><span style="color: #008080;">20</span> <span style="color: #000000;">           "key":"ww"</span><span style="color: #008080;">21</span> <span style="color: #000000;">        }</span><span style="color: #008080;">22</span> <span style="color: #000000;">      ]</span><span style="color: #008080;">23</span> <span style="color: #000000;">    },</span><span style="color: #008080;">24</span> <span style="color: #000000;">  ]</span><span style="color: #008080;">25</span> }';

承認が必要なビューの場合は、WeChat によって提供される承認リクエストのアドレスを URL に直接入力します。

  • appid: WeChat パブリック プラットフォームの基本設定の AppID を入力します。
  • redirect_uri: 承認後にジャンプするページのアドレスを入力します。完成した、つまり独自の HTML5 ページ。
  • state: コールバック ページにジャンプするためのパラメータ。
  • response_type: 2 WeChat 公式ドキュメントで次のように説明されているように、Web ページ認証のスコープ:
    1<span style="color: #000000;">、以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(往往是业务页面)</span>2、以snsapi_userinfo为scope发起的网页授权,是用来获取用户的基本信息的。但这种授权需要用户手动同意,并且由于用户同意过,所以无须关注,就可在授权后获取该用户的基本信息。

    返された openid を受け取るには、このメソッドに従って「モール」をクリックします。次に、ユーザー情報を取得する次のステップに進みます。

    (2) JSを利用して認可ページを自動リクエストする

    この方法は比較的不器用で、手順が少し複雑ですが、ページジャンプのため、ほとんどの場合、ページにアクセスする時間が増加します。 , 前の方法と比較して、この方法ではフォローしていないユーザーに関する基本的な情報を取得できます。一部のプログラムでは、ページの共有が強制されませんが、共有を通じてページに直接アクセスした他のユーザーもユーザー情報を記録する必要があります。 (WeChat 開発に関連するコード ブロガーはツール クラス呼び出しにカプセル化されています。使用したパーツは最初にここに掲載されます。手配が完了したら、すべてダウンロード リンクとともに掲載されます)

    このメソッドのアイデア: js リクエスト リンクのコードを取得 ---> openid と引き換えにコードを使用 ---> 基本的なユーザー情報を取得

    構成

    別のクラスで使用される一部の WeChat パラメーターの記述を容易にするために、

    <span style="color: #008080;"> 1</span> <?<span style="color: #000000;">php</span><span style="color: #008080;"> 2</span> <span style="color: #000000;">namespace common\tools\wechat;</span><span style="color: #008080;"> 3</span> <span style="color: #008080;"> 4</span> <span style="color: #008000;">/*</span><span style="color: #008000;">*</span><span style="color: #008080;"> 5</span> <span style="color: #008000;"> * 微信请求相关配置类库</span><span style="color: #008080;"> 6</span>  <span style="color: #008000;">*/</span><span style="color: #008080;"> 7</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> ConfigTool {</span><span style="color: #008080;"> 8</span> <span style="color: #008080;"> 9</span>     <span style="color: #008000;">/*</span><span style="color: #008000;">*</span><span style="color: #008080;">10</span> <span style="color: #008000;">     * 微信配置参数</span><span style="color: #008080;">11</span> <span style="color: #008000;">     * @return array 配置参数</span><span style="color: #008080;">12</span>      <span style="color: #008000;">*/</span><span style="color: #008080;">13</span>     <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> setConfig() {</span><span style="color: #008080;">14</span> <span style="color: #008080;">15</span>         <span style="color: #008000;">//</span><span style="color: #008000;"> 用于验证微信接口配置信息的Token,可以任意填写</span><span style="color: #008080;">16</span>         <span style="color: #800080;">$config</span>['token'] = '自己的token'<span style="color: #000000;">;</span><span style="color: #008080;">17</span>          <span style="color: #008080;">18</span>         <span style="color: #008000;">//</span><span style="color: #008000;"> appID</span><span style="color: #008080;">19</span>         <span style="color: #800080;">$config</span>['appid'] = '自己的appid'<span style="color: #000000;">;</span><span style="color: #008080;">20</span>          <span style="color: #008080;">21</span>         <span style="color: #008000;">//</span><span style="color: #008000;"> appSecret</span><span style="color: #008080;">22</span>         <span style="color: #800080;">$config</span>['secret'] = '自己的secret'<span style="color: #000000;">;</span><span style="color: #008080;">23</span>          <span style="color: #008080;">24</span>         <span style="color: #008000;">//</span><span style="color: #008000;"> 回调链接地址</span><span style="color: #008080;">25</span>         <span style="color: #800080;">$config</span>['redirect_uri'] = 'http://tx.heivr.com/index.php?'<span style="color: #000000;">;</span><span style="color: #008080;">26</span>          <span style="color: #008080;">27</span>         <span style="color: #008000;">//</span><span style="color: #008000;"> 是否以 HTTPS 安全协议访问接口</span><span style="color: #008080;">28</span>         <span style="color: #800080;">$config</span>['https_request'] = <span style="color: #0000ff;">false</span><span style="color: #000000;">;</span><span style="color: #008080;">29</span>          <span style="color: #008080;">30</span>         <span style="color: #008000;">//</span><span style="color: #008000;"> 授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),</span><span style="color: #008080;">31</span> <span style="color: #008000;">        // snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,</span><span style="color: #008080;">32</span> <span style="color: #008000;">        // 即使在未关注的情况下,只要用户授权,也能获取其信息)</span><span style="color: #008080;">33</span>         <span style="color: #800080;">$config</span>['scope'] = 'snsapi_userinfo'<span style="color: #000000;">;</span><span style="color: #008080;">34</span>          <span style="color: #008080;">35</span>         <span style="color: #008000;">//</span><span style="color: #008000;"> 语言</span><span style="color: #008080;">36</span>         <span style="color: #800080;">$config</span>['lang'] = 'zh_CN'; <span style="color: #008000;">//</span><span style="color: #008000;"> zh_CN 简体,zh_TW 繁体,en 英语</span><span style="color: #008080;">37</span>          <span style="color: #008080;">38</span> <span style="color: #008000;">        // 微信公众账户授权地址</span><span style="color: #008080;">39</span>         <span style="color: #800080;">$config</span>['mp_authorize_url'] = 'https://api.weixin.qq.com/cgi-bin/token'<span style="color: #000000;">;</span><span style="color: #008080;">40</span>         <span style="color: #008000;">//</span><span style="color: #008000;"> 微信公众账户js临时票据地址</span><span style="color: #008080;">41</span>         <span style="color: #800080;">$config</span>['jsapi_ticket_url'] = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket'<span style="color: #000000;">;</span><span style="color: #008080;">42</span>         <span style="color: #008000;">//</span><span style="color: #008000;"> 授权地址</span><span style="color: #008080;">43</span>         <span style="color: #800080;">$config</span>['authorize_url'] = 'https://open.weixin.qq.com/connect/oauth2/authorize'<span style="color: #000000;">;</span><span style="color: #008080;">44</span>         <span style="color: #008000;">//</span><span style="color: #008000;"> 获取access token 的地址</span><span style="color: #008080;">45</span>         <span style="color: #800080;">$config</span>['access_token_url'] = 'https://api.weixin.qq.com/sns/oauth2/access_token'<span style="color: #000000;">;</span><span style="color: #008080;">46</span>         <span style="color: #008000;">//</span><span style="color: #008000;"> 刷新 token 的地址</span><span style="color: #008080;">47</span>         <span style="color: #800080;">$config</span>['refresh_token_url'] = 'https://api.weixin.qq.com/sns/oauth2/refresh_token'<span style="color: #000000;">;</span><span style="color: #008080;">48</span>         <span style="color: #008000;">//</span><span style="color: #008000;"> 获取用户信息地址</span><span style="color: #008080;">49</span>         <span style="color: #800080;">$config</span>['userinfo_url'] = 'https://api.weixin.qq.com/sns/userinfo'<span style="color: #000000;">;</span><span style="color: #008080;">50</span>         <span style="color: #008000;">//</span><span style="color: #008000;"> 验证access token</span><span style="color: #008080;">51</span>         <span style="color: #800080;">$config</span>['valid_token_url'] = 'https://api.weixin.qq.com/sns/auth'<span style="color: #000000;">;</span><span style="color: #008080;">52</span>         <span style="color: #008000;">//</span><span style="color: #008000;"> 上传临时素材地址</span><span style="color: #008080;">53</span>         <span style="color: #800080;">$config</span>['media_temp_upload_url'] = 'https://api.weixin.qq.com/cgi-bin/media/upload?'<span style="color: #000000;">;</span><span style="color: #008080;">54</span>         <span style="color: #008000;">//</span><span style="color: #008000;"> 上传永久素材地址</span><span style="color: #008080;">55</span>         <span style="color: #800080;">$config</span>['media_forever_upload_url'] = 'https://api.weixin.qq.com/cgi-bin/material/add_material?'<span style="color: #000000;">;</span><span style="color: #008080;">56</span> <span style="color: #008080;">57</span>         <span style="color: #0000ff;">return</span> <span style="color: #800080;">$config</span><span style="color: #000000;">;</span><span style="color: #008080;">58</span>         <span style="color: #008080;">59</span> <span style="color: #000000;">    }</span><span style="color: #008080;">60</span> }
    を変更、追加、呼び出しすると便利です。

    b. https リクエストツール

    <span style="color: #008080;"> 1</span> <?<span style="color: #000000;">php</span><span style="color: #008080;"> 2</span> <span style="color: #000000;">namespace common\tools;</span><span style="color: #008080;"> 3</span> <span style="color: #008080;"> 4</span> <span style="color: #008000;">/*</span><span style="color: #008000;">*</span><span style="color: #008080;"> 5</span> <span style="color: #008000;"> * https请求相关类库</span><span style="color: #008080;"> 6</span>  <span style="color: #008000;">*/</span><span style="color: #008080;"> 7</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> HttpsTool {</span><span style="color: #008080;"> 8</span> <span style="color: #008080;"> 9</span>     <span style="color: #0000ff;">const</span> TIMEOUT = 5;                        <span style="color: #008000;">//</span><span style="color: #008000;"> 设置超时时间</span><span style="color: #008080;">10</span> <span style="color: #008080;">11</span>     <span style="color: #0000ff;">private</span> <span style="color: #800080;">$ch</span>;                                <span style="color: #008000;">//</span><span style="color: #008000;"> curl对象</span><span style="color: #008080;">12</span> <span style="color: #008080;">13</span>     <span style="color: #008000;">/*</span><span style="color: #008000;">*</span><span style="color: #008080;">14</span> <span style="color: #008000;">     * 发送curl请求,并获取请求结果</span><span style="color: #008080;">15</span> <span style="color: #008000;">     * @param string 请求地址</span><span style="color: #008080;">16</span> <span style="color: #008000;">     * @param array 如果是post请求则需要传入请求参数</span><span style="color: #008080;">17</span> <span style="color: #008000;">     * @param string 请求方法,get 或者 post, 默认为get</span><span style="color: #008080;">18</span> <span style="color: #008000;">     * @param bool 是否以https协议请求</span><span style="color: #008080;">19</span>      <span style="color: #008000;">*/</span><span style="color: #008080;">20</span>     <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> send_request(<span style="color: #800080;">$requests</span>, <span style="color: #800080;">$params</span> = <span style="color: #0000ff;">null</span>, <span style="color: #800080;">$method</span> = 'get', <span style="color: #800080;">$https</span> = <span style="color: #0000ff;">true</span><span style="color: #000000;">) {</span><span style="color: #008080;">21</span>         <span style="color: #008000;">//</span><span style="color: #008000;"> 以get方式提交</span><span style="color: #008080;">22</span>         <span style="color: #0000ff;">if</span> (<span style="color: #800080;">$method</span> == 'get'<span style="color: #000000;">) {</span><span style="color: #008080;">23</span>             <span style="color: #0000ff;">if</span>(<span style="color: #800080;">$params</span><span style="color: #000000;">){</span><span style="color: #008080;">24</span>                 <span style="color: #800080;">$request</span> = <span style="color: #800080;">$requests</span> . <span style="color: #800080;">$this</span>->create_url(<span style="color: #800080;">$params</span><span style="color: #000000;">);</span><span style="color: #008080;">25</span>             }<span style="color: #0000ff;">else</span><span style="color: #000000;">{</span><span style="color: #008080;">26</span>                 <span style="color: #800080;">$request</span> = <span style="color: #800080;">$requests</span><span style="color: #000000;">;</span><span style="color: #008080;">27</span> <span style="color: #000000;">            }</span><span style="color: #008080;">28</span>         }<span style="color: #0000ff;">else</span><span style="color: #000000;">{</span><span style="color: #008080;">29</span>             <span style="color: #800080;">$request</span> = <span style="color: #800080;">$requests</span><span style="color: #000000;">;</span><span style="color: #008080;">30</span> <span style="color: #000000;">        }</span><span style="color: #008080;">31</span> <span style="color: #008080;">32</span>         <span style="color: #800080;">$this</span>->ch = curl_init(<span style="color: #800080;">$request</span><span style="color: #000000;">);</span><span style="color: #008080;">33</span>         curl_setopt(<span style="color: #800080;">$this</span>->ch, CURLOPT_RETURNTRANSFER, 1);<span style="color: #008000;">//</span><span style="color: #008000;"> 设置不显示结果,储存入变量</span><span style="color: #008080;">34</span>         curl_setopt(<span style="color: #800080;">$this</span>->ch, CURLOPT_TIMEOUT, self::TIMEOUT); <span style="color: #008000;">//</span><span style="color: #008000;"> 设置超时限制防止死循环</span><span style="color: #008080;">35</span> <span style="color: #008080;">36</span> <span style="color: #008000;">        // 判断是否以https方式访问</span><span style="color: #008080;">37</span>         <span style="color: #0000ff;">if</span> (<span style="color: #800080;">$https</span><span style="color: #000000;">) {</span><span style="color: #008080;">38</span>             curl_setopt(<span style="color: #800080;">$this</span>->ch, CURLOPT_SSL_VERIFYPEER, 0); <span style="color: #008000;">//</span><span style="color: #008000;"> 对认证证书来源的检查</span><span style="color: #008080;">39</span>             curl_setopt(<span style="color: #800080;">$this</span>->ch, CURLOPT_SSL_VERIFYHOST, 0); <span style="color: #008000;">//</span><span style="color: #008000;"> 从证书中检查SSL加密算法是否存在</span><span style="color: #008080;">40</span> <span style="color: #000000;">        }</span><span style="color: #008080;">41</span> <span style="color: #008080;">42</span>         <span style="color: #0000ff;">if</span> (<span style="color: #800080;">$method</span> == 'post') {        <span style="color: #008000;">//</span><span style="color: #008000;"> 以post方式提交</span><span style="color: #008080;">43</span> <span style="color: #008000;">            //curl_setopt($this->ch, CURLOPT_SAFE_UPLOAD, false);     //php 5.6文件上传必加内容,5.4不需要</span><span style="color: #008080;">44</span>             curl_setopt(<span style="color: #800080;">$this</span>->ch, CURLOPT_POST, 1); <span style="color: #008000;">//</span><span style="color: #008000;"> 发送一个常规的Post请求</span><span style="color: #008080;">45</span>             curl_setopt(<span style="color: #800080;">$this</span>->ch, CURLOPT_POSTFIELDS, <span style="color: #800080;">$params</span>); <span style="color: #008000;">//</span><span style="color: #008000;"> Post提交的数据包</span><span style="color: #008080;">46</span>             curl_setopt(<span style="color: #800080;">$this</span>->ch, CURLOPT_RETURNTRANSFER, 1<span style="color: #000000;">);</span><span style="color: #008080;">47</span> <span style="color: #000000;">        }</span><span style="color: #008080;">48</span>         <span style="color: #008080;">49</span>         <span style="color: #800080;">$tmpInfo</span> = curl_exec(<span style="color: #800080;">$this</span>->ch); <span style="color: #008000;">//</span><span style="color: #008000;"> 执行操作</span><span style="color: #008080;">50</span>         <span style="color: #0000ff;">if</span> (curl_errno(<span style="color: #800080;">$this</span>-><span style="color: #000000;">ch)) {</span><span style="color: #008080;">51</span>             <span style="color: #0000ff;">echo</span> 'Errno:'.curl_error(<span style="color: #800080;">$this</span>->ch);<span style="color: #008000;">//</span><span style="color: #008000;">捕抓异常</span><span style="color: #008080;">52</span> <span style="color: #000000;">        }</span><span style="color: #008080;">53</span>         curl_close(<span style="color: #800080;">$this</span>->ch); <span style="color: #008000;">//</span><span style="color: #008000;"> 关闭CURL会话</span><span style="color: #008080;">54</span> <span style="color: #008000;">        //var_dump($tmpInfo);exit;</span><span style="color: #008080;">55</span>         <span style="color: #0000ff;">return</span> <span style="color: #800080;">$tmpInfo</span>; <span style="color: #008000;">//</span><span style="color: #008000;"> 返回数据</span><span style="color: #008080;">56</span> <span style="color: #000000;">    }</span><span style="color: #008080;">57</span> <span style="color: #008080;">58</span>     <span style="color: #008000;">/*</span><span style="color: #008000;">*</span><span style="color: #008080;">59</span> <span style="color: #008000;">     * 生成url</span><span style="color: #008080;">60</span>      <span style="color: #008000;">*/</span><span style="color: #008080;">61</span>     <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> create_url(<span style="color: #800080;">$data</span><span style="color: #000000;">) {</span><span style="color: #008080;">62</span>         <span style="color: #800080;">$temp</span> = '?'<span style="color: #000000;">;</span><span style="color: #008080;">63</span>         <span style="color: #0000ff;">foreach</span> (<span style="color: #800080;">$data</span> <span style="color: #0000ff;">as</span> <span style="color: #800080;">$key</span> => <span style="color: #800080;">$item</span><span style="color: #000000;">) {</span><span style="color: #008080;">64</span>             <span style="color: #800080;">$temp</span> = <span style="color: #800080;">$temp</span> . <span style="color: #800080;">$key</span> . '=' . <span style="color: #800080;">$item</span> . '&'<span style="color: #000000;">;</span><span style="color: #008080;">65</span> <span style="color: #000000;">        }</span><span style="color: #008080;">66</span>         <span style="color: #0000ff;">return</span> <span style="color: #008080;">substr</span>(<span style="color: #800080;">$temp</span>, 0, -1<span style="color: #000000;">);</span><span style="color: #008080;">67</span> <span style="color: #000000;">    }</span><span style="color: #008080;">68</span> }
    <span style="font-family: 宋体; font-size: 16px;">关于curl_setopt($this->ch, CURLOPT_SAFE_UPLOAD, false)会在微信图片资源上传博文中详细讲述它出现的心酸史,这里暂时用不到,不做解释</span>

                 c. 授权基类

    <span style="color: #008080;"> 1</span> <?<span style="color: #000000;">php  </span><span style="color: #008080;"> 2</span> <span style="color: #000000;">namespace common\tools\wechat;</span><span style="color: #008080;"> 3</span> <span style="color: #008080;"> 4</span> <span style="color: #0000ff;">use</span><span style="color: #000000;"> common\tools\wechat\ConfigTool;</span><span style="color: #008080;"> 5</span> <span style="color: #0000ff;">use</span><span style="color: #000000;"> common\tools\HttpsTool;</span><span style="color: #008080;"> 6</span> <span style="color: #008000;">/*</span><span style="color: #008000;">*</span><span style="color: #008080;"> 7</span> <span style="color: #008000;">* Weixin_oauth 类库</span><span style="color: #008080;"> 8</span> <span style="color: #008000;">*/</span><span style="color: #008080;"> 9</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> OauthTool {</span><span style="color: #008080;">10</span> <span style="color: #008080;">11</span>     <span style="color: #0000ff;">public</span> <span style="color: #800080;">$conf</span><span style="color: #000000;">;</span><span style="color: #008080;">12</span> <span style="color: #008080;">13</span>     <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> __construct(){</span><span style="color: #008080;">14</span>         <span style="color: #800080;">$re</span> = <span style="color: #0000ff;">new</span><span style="color: #000000;"> ConfigTool;               </span><span style="color: #008080;">15</span>         <span style="color: #800080;">$this</span>->conf = <span style="color: #800080;">$re</span>-><span style="color: #000000;">setConfig();</span><span style="color: #008080;">16</span> <span style="color: #000000;">    } </span><span style="color: #008080;">17</span> <span style="color: #008080;">18</span>     <span style="color: #008000;">/*</span><span style="color: #008000;">*</span><span style="color: #008080;">19</span> <span style="color: #008000;">     * 生成用户授权的地址</span><span style="color: #008080;">20</span> <span style="color: #008000;">     * @param string 自定义需要保持的信息</span><span style="color: #008080;">21</span> <span style="color: #008000;">     * @param sting 请求的路由</span><span style="color: #008080;">22</span> <span style="color: #008000;">     * @param bool 是否是通过公众平台方式认真</span><span style="color: #008080;">23</span>      <span style="color: #008000;">*/</span><span style="color: #008080;">24</span>     <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> authorize_addr(<span style="color: #800080;">$route</span>, <span style="color: #800080;">$state</span>='', <span style="color: #800080;">$mp</span>=<span style="color: #0000ff;">false</span><span style="color: #000000;">) {</span><span style="color: #008080;">25</span> <span style="color: #008080;">26</span>         <span style="color: #0000ff;">if</span> (<span style="color: #800080;">$mp</span><span style="color: #000000;">) {</span><span style="color: #008080;">27</span>             <span style="color: #800080;">$data</span> =<span style="color: #000000;"> [</span><span style="color: #008080;">28</span>                 'appid' => <span style="color: #800080;">$this</span>->conf['appid'],<span style="color: #008080;">29</span>                 'secret' => <span style="color: #800080;">$this</span>->conf['token'],<span style="color: #008080;">30</span>                 'grant_type' => 'client_credential'<span style="color: #008080;">31</span> <span style="color: #000000;">            ];</span><span style="color: #008080;">32</span>             <span style="color: #800080;">$url</span> = <span style="color: #800080;">$this</span>->conf['mp_authorize_url'<span style="color: #000000;">];</span><span style="color: #008080;">33</span>         } <span style="color: #0000ff;">else</span><span style="color: #000000;"> {</span><span style="color: #008080;">34</span>             <span style="color: #800080;">$data</span> =<span style="color: #000000;"> [</span><span style="color: #008080;">35</span>                 'appid' => <span style="color: #800080;">$this</span>->conf['appid'],                                <span style="color: #008000;">//</span><span style="color: #008000;">公众号唯一标识</span><span style="color: #008080;">36</span>                 'redirect_uri' => <span style="color: #008080;">urlencode</span>(<span style="color: #800080;">$this</span>->conf['redirect_uri'] . <span style="color: #800080;">$route</span>),       <span style="color: #008000;">//</span><span style="color: #008000;">授权后重定向的回调链接地址</span><span style="color: #008080;">37</span>                 'response_type' => 'code',                                      <span style="color: #008000;">//</span><span style="color: #008000;">返回类型,此处填写code</span><span style="color: #008080;">38</span>                 'scope'=><span style="color: #800080;">$this</span>->conf['scope'],                                  <span style="color: #008000;">//</span><span style="color: #008000;">应用授权作用域</span><span style="color: #008080;">39</span>                 'state'=><span style="color: #800080;">$state</span>,                                                <span style="color: #008000;">//</span><span style="color: #008000;">重定向后带上state参数,开发者可以填写任意参数</span><span style="color: #008080;">40</span>                 '#wechat_redirect'=>''                                          <span style="color: #008000;">//</span><span style="color: #008000;">直接在微信打开链接,可不填,做页面302重定向时必须带此参数</span><span style="color: #008080;">41</span> <span style="color: #000000;">            ];</span><span style="color: #008080;">42</span>             <span style="color: #800080;">$url</span> = <span style="color: #800080;">$this</span>->conf['authorize_url'<span style="color: #000000;">];</span><span style="color: #008080;">43</span> <span style="color: #000000;">        }</span><span style="color: #008080;">44</span>         <span style="color: #008080;">45</span>         <span style="color: #800080;">$send</span> = <span style="color: #0000ff;">new</span><span style="color: #000000;"> HttpsTool;</span><span style="color: #008080;">46</span>         <span style="color: #008000;">//</span><span style="color: #008000;">var_dump($url . $send->create_url($data));exit;</span><span style="color: #008080;">47</span>         <span style="color: #0000ff;">return</span>  <span style="color: #800080;">$url</span> . <span style="color: #800080;">$send</span>->create_url(<span style="color: #800080;">$data</span><span style="color: #000000;">);</span><span style="color: #008080;">48</span> <span style="color: #000000;">    }</span><span style="color: #008080;">49</span> <span style="color: #008080;">50</span>     <span style="color: #008000;">/*</span><span style="color: #008000;">*</span><span style="color: #008080;">51</span> <span style="color: #008000;">     * 获取 access token</span><span style="color: #008080;">52</span> <span style="color: #008000;">     * @param string 用于换取access token的code,微信提供</span><span style="color: #008080;">53</span>      <span style="color: #008000;">*/</span><span style="color: #008080;">54</span>     <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> access_token(<span style="color: #800080;">$code</span><span style="color: #000000;">) {</span><span style="color: #008080;">55</span> <span style="color: #008080;">56</span>         <span style="color: #800080;">$data</span> =<span style="color: #000000;"> [</span><span style="color: #008080;">57</span>             'appid' => <span style="color: #800080;">$this</span>->conf['appid'],<span style="color: #008080;">58</span>             'secret' => <span style="color: #800080;">$this</span>->conf['secret'],<span style="color: #008080;">59</span>             'code' => <span style="color: #800080;">$code</span>,<span style="color: #008080;">60</span>             'grant_type' => 'authorization_code'<span style="color: #008080;">61</span> <span style="color: #000000;">        ];</span><span style="color: #008080;">62</span>         <span style="color: #008000;">//</span><span style="color: #008000;"> 生成授权url</span><span style="color: #008080;">63</span>         <span style="color: #800080;">$url</span> = <span style="color: #800080;">$this</span>->conf['access_token_url'<span style="color: #000000;">];</span><span style="color: #008080;">64</span>         <span style="color: #008080;">65</span>         <span style="color: #800080;">$send</span> = <span style="color: #0000ff;">new</span><span style="color: #000000;"> HttpsTool;</span><span style="color: #008080;">66</span>         <span style="color: #0000ff;">return</span> <span style="color: #800080;">$send</span>->send_request(<span style="color: #800080;">$url</span>, <span style="color: #800080;">$data</span><span style="color: #000000;">);</span><span style="color: #008080;">67</span> <span style="color: #000000;">    }</span><span style="color: #008080;">68</span> <span style="color: #008080;">69</span>     <span style="color: #008000;">/*</span><span style="color: #008000;">*</span><span style="color: #008080;">70</span> <span style="color: #008000;">     * 获取用户信息</span><span style="color: #008080;">71</span> <span style="color: #008000;">     * @param string access token</span><span style="color: #008080;">72</span> <span style="color: #008000;">     * @param string 用户的open id</span><span style="color: #008080;">73</span>      <span style="color: #008000;">*/</span><span style="color: #008080;">74</span>     <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> userinfo(<span style="color: #800080;">$token</span>, <span style="color: #800080;">$openid</span><span style="color: #000000;">) {</span><span style="color: #008080;">75</span> <span style="color: #008080;">76</span>         <span style="color: #800080;">$data</span> =<span style="color: #000000;"> [</span><span style="color: #008080;">77</span>             'access_token' => <span style="color: #800080;">$token</span>,<span style="color: #008080;">78</span>             'openid' => <span style="color: #800080;">$openid</span>,<span style="color: #008080;">79</span>             'lang' => <span style="color: #800080;">$this</span>->conf['lang'<span style="color: #000000;">]</span><span style="color: #008080;">80</span> <span style="color: #000000;">        ];</span><span style="color: #008080;">81</span>         <span style="color: #008000;">//</span><span style="color: #008000;"> 生成授权url</span><span style="color: #008080;">82</span>         <span style="color: #800080;">$url</span> = <span style="color: #800080;">$this</span>->conf['userinfo_url'<span style="color: #000000;">];</span><span style="color: #008080;">83</span> <span style="color: #008080;">84</span>         <span style="color: #800080;">$send</span> = <span style="color: #0000ff;">new</span><span style="color: #000000;"> HttpsTool;</span><span style="color: #008080;">85</span>         <span style="color: #0000ff;">return</span> <span style="color: #800080;">$send</span>->send_request(<span style="color: #800080;">$url</span>, <span style="color: #800080;">$data</span><span style="color: #000000;">);</span><span style="color: #008080;">86</span> <span style="color: #000000;">    }</span><span style="color: #008080;">87</span> <span style="color: #008080;">88</span> }

                 d. 授权基类调用及用户数据处理(在控制器调用前,先对用户数据存入或更新)

    <span style="color: #008080;"> 1</span> <?<span style="color: #000000;">php</span><span style="color: #008080;"> 2</span> <span style="color: #000000;">namespace wechat\controllers\classes;</span><span style="color: #008080;"> 3</span> <span style="color: #008080;"> 4</span> <span style="color: #0000ff;">use</span><span style="color: #000000;"> common\tools\wechat\OauthTool;</span><span style="color: #008080;"> 5</span> <span style="color: #0000ff;">use</span><span style="color: #000000;"> common\models\User;</span><span style="color: #008080;"> 6</span> <span style="color: #0000ff;">use</span><span style="color: #000000;"> common\tools\EmojiTool;</span><span style="color: #008080;"> 7</span> <span style="color: #008080;"> 8</span> <span style="color: #008000;">/*</span><span style="color: #008000;">*</span><span style="color: #008080;"> 9</span> <span style="color: #008000;"> * 微信用户基本信息获取</span><span style="color: #008080;">10</span>  <span style="color: #008000;">*/</span><span style="color: #008080;">11</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> UserinfoClass {</span><span style="color: #008080;">12</span>  <span style="color: #008080;">13</span>     <span style="color: #008000;">/*</span><span style="color: #008000;">*</span><span style="color: #008080;">14</span> <span style="color: #008000;">     * 用户授权并获取code </span><span style="color: #008080;">15</span> <span style="color: #008000;">     * @return string 用户code</span><span style="color: #008080;">16</span>      <span style="color: #008000;">*/</span><span style="color: #008080;">17</span>     <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> getCode(<span style="color: #800080;">$route</span>, <span style="color: #800080;">$state</span><span style="color: #000000;">){</span><span style="color: #008080;">18</span> <span style="color: #008080;">19</span>         <span style="color: #800080;">$re</span> = <span style="color: #0000ff;">new</span><span style="color: #000000;"> OauthTool;</span><span style="color: #008080;">20</span>         <span style="color: #800080;">$request</span> = <span style="color: #800080;">$re</span>->authorize_addr(<span style="color: #800080;">$route</span>, <span style="color: #800080;">$state</span><span style="color: #000000;">);</span><span style="color: #008080;">21</span>         <span style="color: #800080;">$code</span> = <span style="color: #0000ff;">isset</span>(<span style="color: #800080;">$_GET</span>['code']) ? <span style="color: #800080;">$_GET</span>['code'] : ''<span style="color: #000000;">;</span><span style="color: #008080;">22</span>         <span style="color: #008080;">23</span>         <span style="color: #0000ff;">return</span> [<span style="color: #800080;">$request</span>,<span style="color: #800080;">$code</span><span style="color: #000000;">];</span><span style="color: #008080;">24</span> <span style="color: #000000;">    }</span><span style="color: #008080;">25</span>     <span style="color: #008080;">26</span>     <span style="color: #008000;">/*</span><span style="color: #008000;">*</span><span style="color: #008080;">27</span> <span style="color: #008000;">     * 获取用户信息并写入数据库(之后加参数传给code)</span><span style="color: #008080;">28</span>      <span style="color: #008000;">*/</span><span style="color: #008080;">29</span>     <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> info(<span style="color: #800080;">$code</span><span style="color: #000000;">) {</span><span style="color: #008080;">30</span>         <span style="color: #800080;">$re</span> = <span style="color: #0000ff;">new</span><span style="color: #000000;"> OauthTool;</span><span style="color: #008080;">31</span>         <span style="color: #008000;">//</span><span style="color: #008000;">获取access token</span><span style="color: #008080;">32</span>         <span style="color: #800080;">$access</span> = <span style="color: #800080;">$re</span>->access_token(<span style="color: #800080;">$code</span><span style="color: #000000;">);</span><span style="color: #008080;">33</span>         <span style="color: #800080;">$token</span> = json_decode(<span style="color: #800080;">$access</span>,<span style="color: #0000ff;">true</span><span style="color: #000000;">);</span><span style="color: #008080;">34</span>         <span style="color: #008000;">//</span><span style="color: #008000;">header("Content-type: text/html; charset=gbk"); </span><span style="color: #008080;">35</span> <span style="color: #008000;">        //获取用户信息</span><span style="color: #008080;">36</span>         <span style="color: #0000ff;">if</span>(<span style="color: #008080;">count</span>(<span style="color: #800080;">$token</span>) != 2<span style="color: #000000;">) {</span><span style="color: #008080;">37</span>             <span style="color: #800080;">$response</span> = <span style="color: #800080;">$re</span>->userinfo(<span style="color: #800080;">$token</span>['access_token'], <span style="color: #800080;">$token</span>['openid'<span style="color: #000000;">]);</span><span style="color: #008080;">38</span>             <span style="color: #800080;">$user</span> = json_decode(<span style="color: #800080;">$response</span>,<span style="color: #0000ff;">true</span><span style="color: #000000;">);</span><span style="color: #008080;">39</span>             <span style="color: #008000;">//</span><span style="color: #008000;">用户昵称转换</span><span style="color: #008080;">40</span> <span style="color: #008000;">            //$user['nickname'] = EmojiTool::emoji_trans($user['nickname']);</span><span style="color: #008080;">41</span> <span style="color: #008080;">42</span>             <span style="color: #0000ff;">if</span>(<span style="color: #800080;">$model</span> = User::findOne(['openid' => <span style="color: #800080;">$user</span>['openid'] ])) {            <span style="color: #008000;">//</span><span style="color: #008000;">用户已存在更新数据</span><span style="color: #008080;">43</span>                 <span style="color: #800080;">$model</span>->attributes = <span style="color: #800080;">$user</span><span style="color: #000000;">;</span><span style="color: #008080;">44</span>                 <span style="color: #800080;">$model</span>->modify_time = <span style="color: #008080;">time</span><span style="color: #000000;">();</span><span style="color: #008080;">45</span>                 <span style="color: #800080;">$model</span>->save(<span style="color: #0000ff;">false</span><span style="color: #000000;">);</span><span style="color: #008080;">46</span>             }<span style="color: #0000ff;">else</span>{                                                                  <span style="color: #008000;">//</span><span style="color: #008000;">用户不存在写入</span><span style="color: #008080;">47</span>                 <span style="color: #800080;">$model</span> = <span style="color: #0000ff;">new</span><span style="color: #000000;"> User;</span><span style="color: #008080;">48</span>                 <span style="color: #800080;">$model</span>->attributes = <span style="color: #800080;">$user</span><span style="color: #000000;">;</span><span style="color: #008080;">49</span>                 <span style="color: #800080;">$model</span>->create_time = <span style="color: #008080;">time</span><span style="color: #000000;">();</span><span style="color: #008080;">50</span>                 <span style="color: #800080;">$model</span>->save(<span style="color: #0000ff;">false</span><span style="color: #000000;">);</span><span style="color: #008080;">51</span> <span style="color: #000000;">            }</span><span style="color: #008080;">52</span> <span style="color: #000000;">        }</span><span style="color: #008080;">53</span>         <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">isset</span>(<span style="color: #800080;">$model</span>->id) ? <span style="color: #800080;">$model</span>->id : ''<span style="color: #000000;">;</span><span style="color: #008080;">54</span> <span style="color: #000000;">    }</span><span style="color: #008080;">55</span>     <span style="color: #008080;">56</span> }

                 e. 控制器调用(这里只贴其中一个方法)

    <span style="color: #008080;"> 1</span> <span style="color: #008000;">/*</span><span style="color: #008000;">*</span><span style="color: #008080;"> 2</span> <span style="color: #008000;">     * 产品列表</span><span style="color: #008080;"> 3</span> <span style="color: #008000;">     * @return object 所有可用产品信息</span><span style="color: #008080;"> 4</span>      <span style="color: #008000;">*/</span><span style="color: #008080;"> 5</span>     <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> actionIndex(){</span><span style="color: #008080;"> 6</span>         <span style="color: #008000;">//</span><span style="color: #008000;">判断页面是否自动刷新</span><span style="color: #008080;"> 7</span>         <span style="color: #0000ff;">if</span>(<span style="color: #0000ff;">isset</span>(<span style="color: #800080;">$_GET</span>['state'<span style="color: #000000;">])) {</span><span style="color: #008080;"> 8</span>             <span style="color: #800080;">$refresh</span> = 0<span style="color: #000000;">;</span><span style="color: #008080;"> 9</span>         }<span style="color: #0000ff;">else</span><span style="color: #000000;">{</span><span style="color: #008080;">10</span>             <span style="color: #800080;">$refresh</span> = 1<span style="color: #000000;">;</span><span style="color: #008080;">11</span> <span style="color: #000000;">        }</span><span style="color: #008080;">12</span> <span style="color: #008080;">13</span>         <span style="color: #008000;">//</span><span style="color: #008000;">获取用户code</span><span style="color: #008080;">14</span>         <span style="color: #800080;">$user</span> = <span style="color: #0000ff;">new</span><span style="color: #000000;"> UserinfoClass;</span><span style="color: #008080;">15</span>         <span style="color: #800080;">$request</span> = <span style="color: #800080;">$user</span>->getCode('r=store/index', 1<span style="color: #000000;">);</span><span style="color: #008080;">16</span> <span style="color: #008080;">17</span>         <span style="color: #008000;">//</span><span style="color: #008000;">该用户userid</span><span style="color: #008080;">18</span>         <span style="color: #800080;">$userid</span> = <span style="color: #800080;">$user</span>->info(<span style="color: #800080;">$request</span>[1<span style="color: #000000;">]);</span><span style="color: #008080;">19</span> <span style="color: #008080;">20</span>         <span style="color: #800080;">$model</span> = <span style="color: #0000ff;">new</span><span style="color: #000000;"> Product;</span><span style="color: #008080;">21</span>         <span style="color: #800080;">$list</span> = <span style="color: #800080;">$model</span>->find()->where(['status' => 1])-><span style="color: #000000;">all();</span><span style="color: #008080;">22</span> <span style="color: #008080;">23</span>         <span style="color: #0000ff;">return</span> <span style="color: #800080;">$this</span>->render('index',['list' => <span style="color: #800080;">$list</span>, 'refresh' => <span style="color: #800080;">$refresh</span>, 'userid' => <span style="color: #800080;">$userid</span>, 'request' => <span style="color: #800080;">$request</span><span style="color: #000000;">]);</span><span style="color: #008080;">24</span>     }

                 程序要求用户打开产品列表即获取用户信息并存入数据库,其中设计了几个变量作用如下:

            $refresh:判断页面是否刷新,由于首次打开页面未进行oauth验证时才自动请求验证,避免反复刷新,这里用回调的state参数作为判断依据且设state=1(若有特定参数需要可将state赋值为所需值);

            $request:即为验证请求地址

            f. 视图自动刷新

            只需要在视图中添加以下js代码即可

    <span style="color: #008080;"> 1</span> <script type="text/javascript"><span style="color: #008080;"> 2</span> <span style="color: #008080;"> 3</span>     <span style="color: #008000;">//</span><span style="color: #008000;">自动请求获取code</span><span style="color: #008080;"> 4</span>     $(<span style="color: #0000ff;">function</span><span style="color: #000000;">(){</span><span style="color: #008080;"> 5</span>         <span style="color: #0000ff;">var</span> refresh = <?= <span style="color: #800080;">$refresh</span>; ?><span style="color: #000000;">;</span><span style="color: #008080;"> 6</span>         <span style="color: #0000ff;">var</span> request = '<?= $request[0]; ?>'<span style="color: #000000;">;</span><span style="color: #008080;"> 7</span>         <span style="color: #0000ff;">if</span>(refresh == 1<span style="color: #000000;">){</span><span style="color: #008080;"> 8</span>             console.<span style="color: #008080;">log</span>(1<span style="color: #000000;">);</span><span style="color: #008080;"> 9</span>             location =<span style="color: #000000;"> request;</span><span style="color: #008080;">10</span> <span style="color: #000000;">        }</span><span style="color: #008080;">11</span> <span style="color: #000000;">    });</span><span style="color: #008080;">12</span> </script>

     

    特此声明:相关文章均为查阅资料、阅读大神博文后结合实际开发情况遇到的问题整理而成,能找到原博的必会署名,找不到原博而引用的内容还望原博主海涵

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。