日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

          歡迎訪問 生活随笔!

          生活随笔

          當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

          综合教程

          微信公众平台实现授权登录(不是微信开放平台)

          發布時間:2023/12/15 综合教程 21 生活家
          生活随笔 收集整理的這篇文章主要介紹了 微信公众平台实现授权登录(不是微信开放平台) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

          今天給大家補充一下微信授權登錄的實現方式。如標題,是公眾平臺的實現方式,官方推薦的是微信開放平臺,但因審核問題,我只拿到了微信開放平臺的app_id和app_secret。所以做了這一版,僅供參考

          第一步:

          去微信公眾平臺開通一個微信服務號,地址 https://mp.weixin.qq.com/。審核通過之后,默認就會有獲取的用戶信息的接口權限,這不必擔心,總之拿到對應的app_id和app_secret就可以。

          第二步:

          用戶點擊微信登錄的時候,跳轉到自己的一個靜態頁面,里面有著一張登錄二維碼(自己通過php生成,不懂可以百度),二維碼地址是:https://open.weixin.qq.com/connect/oauth2/authorize?appid=".$app_id."&redirect_uri=".urlencode($my_url)."&response_type=code&scope=snsapi_userinfo&state=".$auth_code."#wechat_redirect。里面的參數自己的即可。

          代碼如下:

              $my_url = "http://".$_SERVER['HTTP_HOST']."/Home/User/wechatLogin?ip=".$_SERVER['REMOTE_ADDR']; //成功授權后的回調地址
              //第一步:用戶同意授權,獲取code $code = $_REQUEST["code"];//存放code $auth_code = md5(uniqid(rand(), TRUE)); //隨機生成字符串,防止csrf(目前并不生效) if(empty($code)){ $url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=".$app_id."&redirect_uri=".urlencode($my_url)."&response_type=code&scope=snsapi_userinfo&state=".$auth_code."#wechat_redirect"; $src = qrcode($url, time().".png", "", "./logo.png", 3); //我調用的一個自己封裝的二維碼生成函數 $this->assign("src", substr($src, 1))->display();  //將他輸出到視圖,就是上圖     }

          第三步:

          這個時候用戶掃碼,其實是手機訪問了這個頁面(上一步中自己設置的$my_url),但是對于拿到數據與入庫并不影響。

          $url1="https://api.weixin.qq.com/sns/oauth2/access_token?appid=".$app_id."&secret=".$app_secret."&code=".$code."&grant_type=authorization_code";
                      $res = file_get_contents($url1);//調用SDK方法獲取到res 從中可以得到openid
                      $res = (json_decode($res, true));//轉換成array 方便調用openid
          
                      //第三步:拉取用戶信息(需scope為 snsapi_userinfo)
                      if(isset($res['access_token'])){
                          $url2 = "https://api.weixin.qq.com/sns/userinfo?access_token=".$res['access_token']."&openid=".$res['openid']."&lang=zh_CN";
                          $row = file_get_contents($url2);
                          $user_data = (json_decode($row, true));
          
                          $m = M("Member");
                          $data = array();
                          $data['sex']              = $user_data['sex'];
                          $data['province']      = $user_data['province'];
                          $data['city']             = $user_data['city'];
                          $data['person_name']   = $user_data['nickname'];
                          $data['wx_number']     = $_REQUEST['ip'];
                          $data['wx_openid']     = $user_data['openid'];
                          $data['wx_name']       = $user_data['nickname'];
                          $data['wx_img']        = $user_data['headimgurl'];
                          $data['addtime']       = date("Y-m-d H:i:s", time());
                          $data['person_img']       = $user_data['headimgurl'];
                          $data['signtime']       = date("Y-m-d H:i:s", time());
          
                          $user = $m->where(array("wx_openid"=> $user_data['openid']))->find();
                          if($user){
                              $res = $m->where(array("wx_openid"=> $user_data['openid']))->setField(array("signtime"=> date("Y-m-d H:i:s", time()), "wx_number"=> $_REQUEST['ip']));
                              if($res){
                                  $this->display("wechatWap");
                              }else{
                                  $this->error("操作異常,拒絕訪問!", U('user/login'));
                              }
                          }else{
                              $res=$m->add($data);
          
                              if($res){
                                  $this->display("wechatWap");
                              }else{
                                  $this->error("操作異常,拒絕訪問!", U('user/login'));
                              }
                          }
                      }

          第四步:

          這個時候數據已經在手機端的訪問中入庫,但是網頁端并不知道,這個時候需要網頁端做一個輪詢(如果想性能好,可以用websokect來實現,這里不做過多介紹)來判斷是否有新的數據入庫,如果有則取出數據,登錄成功!

          靜態頁面代碼如下:

          <script src="__JS__/jquery-1.9.1.min.js" type="text/javascript"></script>
          <body>
          <style>
          body{ background:#333;}
          .headright{ position:relative; color:#fff;}
          .headright a{ color:#fff;}
          </style>
          <include file="Public:menu_u"/>
          <div class="wx_qrcode">
          <dl>
          <dt><img src="{$src}" /></dt>
          <dd>微信掃描二維碼登錄<br>
          “帝格珠寶”</dd>
          </dl>
          </div>
          <!--<include file="Public:foot_u"/>-->
          </body>
          
          <script>
          ajaxSearch();
          function ajaxSearch(){
              $.post("{:U('/Home/User/wechatLogin')}", "", function(data){
          
                  if(data.status==1){
                      location.href='{:U("/Home/User/wxSucLogin/user_id/'+data.user_id+'")}';
          
                  }else{
                      setTimeout(function(){
                          ajaxSearch();
                      },5000)
                  }
              })
          }
          </script>

          php代碼如下:

          //通過當前客戶端的ip地址發送ajax輪詢是否登錄成功
                  if(IS_AJAX){
                      $user = M("Member")->where(array("wx_number"=> $_SERVER['REMOTE_ADDR']))->select();
                      if($user){
                          foreach($user as $key=>$val){
                              $timer = time() - strtotime($val['signtime']);
                              if($timer < 10){
          
                                  $this->ajaxReturn(array("info"=> "登錄成功!", "status"=> 1, "user_id"=> $val['id']));
                              }
                          }
          
                          $this->ajaxReturn(array("info"=> "暫無登錄信息!", "status"=> 0));
                      }else{
                          $this->ajaxReturn(array("info"=> "暫無登錄信息!", "status"=> 0));
                      }
                  }

          這里有一個問題,如果同時有多個用戶都在使用微信登錄,那怎么判斷錄入進去的數據是那一個用戶掃碼登錄的呢?這里可以用客戶端ip來做標識區別開來。

          在最開始第二步$my_url定義的時候加上客戶端ip作為參數帶過去就可以了。然后第三步獲取到ip錄入到數據中,這樣便可以區分開。

          總結

          以上是生活随笔為你收集整理的微信公众平台实现授权登录(不是微信开放平台)的全部內容,希望文章能夠幫你解決所遇到的問題。

          如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。