国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Restfual api 架構的第三方登錄

cyqian / 1130人閱讀

摘要:需求分析用的架構實現第三方登錄,如,微信登錄等。好了,到這里架構的第三方登錄已經實現了微博,淘寶等第三方登錄實現的思路也如此,就是要對傳入的參數進行改進一下就了。

序言

第三方登錄的使用在當今非常普遍,不管是PC端還是手機端都很常見。因為它有著一號多用的特點,不管是在什么網站什么軟件上只要有了這個第三方登錄的功能就無需再次走注冊步驟,直接用第三方的賬號登錄就可以了,方便吧?開發程序看重的是用戶體驗,為用戶打造一款“麻雀雖小,五臟俱全”,使用便利的產品是我們的職責。那么話又說回來,在Restfual api 上如何實現第三方登錄呢?我在Segmentfault上找不到我想要的答案,不過最終我也實現了,我把我的實現思路寫出來,當然這只是我的一種實現方式,要是大家有更好的方法呢,樂意交流。

需求分析

1、用Restfual api的架構實現第三方登錄,如QQ,微信登錄等。

效果圖

實現思路

1、建兩個表,user表和user_login表。user表我就不詳說了,這是基本表,我重點說一下user_login表。
user_login表字段:

id                    id
user_id               用戶id
type                  登錄類型(如:QQ,weixin)  
qq_access_token       QQ授權access_token
qq_openid             QQ openid
wx_access_token       微信授權access_token
wx_openid             微信openid

要是還有微博或者淘寶之類的其他第三方登錄就如以上的規律加上對應的字段就行了。

2、gii生成UserLogin.php model如下:

 30],
            [["qq_access_token", "wx_access_token"], "string", "max" => 220],
            [["qq_openid", "wx_openid"], "string", "max" => 100]
        ];
    }

    /**
     * @inheritdoc
     */
    public function attributeLabels()
    {
        return [
            "id" => Yii::t("yii", "ID"),
            "user_id" => Yii::t("yii", "User ID"),
            "type" => Yii::t("yii", "Type"),
            "qq_access_token" => Yii::t("yii", "Qq Access Token"),
            "qq_openid" => Yii::t("yii", "Qq Openid"),
            "wx_access_token" => Yii::t("yii", "Wx Access Token"),
            "wx_openid" => Yii::t("yii", "Wx Openid"),
        ];
    }
     
}

3、控制器里的方法如下:
QQ登錄

  public function actionQqLogin()
      { 
          $_model = new UserLogin();
          $model = new TUser();
          $post = Yii::$app->request->post();
          if(!empty($post))
          {
             $t_nickname = !empty($post["t_nickname"]) ? trim($post["t_nickname"]) : "";
             $access_token = !empty($post["access_token"]) ? trim($post["access_token"]) : "";
             $openid = !empty($post["openid"]) ? trim($post["openid"]) : "";
             $t_photo = !empty($post["t_photo"]) ? trim($post["t_photo"]) : "";//頭像
             $res = UserLogin::find()
                      ->where(["type"=>"qq","qq_openid"=>$openid])
                      ->one();
            //判斷是否已存在用戶信息,存在則返回該條用戶信息
             if(!empty($res))
             {
                 $res->qq_access_token = $access_token;
                 $res->save();
                //獲取一條用戶信息
                 $user = $model->getUserrow($res->user_id);
                 if(!empty($user)){

                    return $user;
                 }else{
                     ErrorMsg::Info(Yii::t("yii","Login fail"));
                 }               
             }else{ 
                  //保存新用戶
                  $user = $this->saveUser($t_nickname,$t_nickname,$openid,"","",$t_photo);

                  if(empty($return["error_code"])){ 
                      $_model->user_id = $user->t_id;
                      $_model->type = "qq";
                      $_model->qq_access_token = $access_token;
                      $_model->qq_openid = $openid; 
                      $_model->save();
                      $user = $model->getUserrow($user->t_id); //保證返回數據字段一致
                  }

                  return $user;
              }
          }else{
              ErrorMsg::Info(Yii::t("yii","Login fail"));
          } 
      }

微信登錄

 public function actionWxLogin()
      { 
          $_model = new UserLogin();
          $model = new TUser();
          $post = Yii::$app->request->post();
          if(!empty($post))
          {
             $t_nickname = !empty($post["t_nickname"]) ? trim($post["t_nickname"]) : "";
             $access_token = !empty($post["access_token"]) ? trim($post["access_token"]) : "";
             $openid = !empty($post["openid"]) ? trim($post["openid"]) : "";
             $t_photo = !empty($post["t_photo"]) ? trim($post["t_photo"]) : "";//頭像
             $res = UserLogin::find()
                      ->where(["type"=>"weixin","wx_openid"=>$openid])
                      ->one(); 
            //判斷是否已存在用戶信息,存在則返回該條用戶信息
             if(!empty($res))
             { 
                 $res->wx_access_token = $access_token;
                 $res->save();
                 //獲取一條用戶信息
                 $user = $model->getUserrow($res->user_id);
                 if(!empty($user)){

                    return $user;
                 }else{
                     ErrorMsg::Info(Yii::t("yii","Login fail"));
                 }               
             }else{
                   //保存新用戶
                  $user = $this->saveUser($t_nickname,$t_nickname,$openid,"","",$t_photo);

                  if(empty($return["error_code"])){
                      $_model->user_id = $user->t_id;
                      $_model->type = "weixin";
                      $_model->wx_access_token = $access_token;
                      $_model->wx_openid = $openid;
                      $_model->save();
                      $user = $model->getUserrow($user->t_id);//保證返回數據字段一致
                  }
                  return $user;
              }
          }else{
              ErrorMsg::Info(Yii::t("yii","Login fail"));
          } 
      }

保存用戶信息方法:

    public function saveUser($t_username,$t_nickname,$openid,$email,$phone,$t_photo)
    {          
        $access_token = sha1(time().$openid);
        $data = array(
          "t_nickname"=> $t_nickname,
          "t_password"=> base64_encode($openid),
          "t_state"   => 0,
          "t_photo"   => $t_photo?$t_photo:"/images/upload/100x100/no_photo.jpg",
          "t_timezone"=> "PRC",
          "t_language"=> "zh_cn",
          "access_token"=> $access_token,
          "rent_user_type"=>"3",
          "t_add_time"=>time(),
        );
        $model = new $this->modelUser;
        $model->attributes = $data;   

       if(!empty($t_nickname) && !empty($openid)){  
            if(!$model->save()){  
               ErrorMsg::Info(Yii::t("yii","Reg fail"));
            }  
           return $model;
        }else{ 
            ErrorMsg::Info(Yii::t("yii","m-log-2"));
        }
    }

第三方登錄獲取用戶基本信息方法,TUser model里:

    public function getUserrow($uid)
     {    
          $user = $this->find()
                ->select(["access_token","t_password"])
                ->where(["t_id"=>$uid])
                ->one();
          if(!empty($user)){
              $result["access_token"]= !empty($access_token=$user->access_token)?$access_token:"";
              $result["appsercert"]  = !empty($t_password=$user->t_password)?$t_password:""; 
              
              return $result;  //返回給手機端用,只返回access_token和appsercert。
          }
     }

好了,到這里Restfual api 架構的第三方登錄已經實現了,微博,淘寶等第三方登錄實現的思路也如此,就是要對傳入的參數進行改進一下就OK了。這是我實現Restfual api架構的第三方登錄的思路,不足的提議,好的點贊哈,我們一起交流。

設想與問題

1、直接在user表里加上QQ、weixin的type,openid和access_token字段,這種做法拓展性不好,以后要是再增加如:微博,淘寶等第三方登錄的話,又要操作user表,對user表操作過于頻繁容易出問題,而且也不是每一個用戶都會使用第三方登錄,會造成大量空缺字段,浪費。我之所以獨立創建user_login表也正是基于這些考慮的。
2、返回給手機端所有的用戶信息。其實手機端不需要那些,你只要返回給手機端access_token和appsercert這兩個字段就可以了,手機端會自己獲取用戶信息。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/79527.html

相關文章

  • Restfual api 架構三方登錄

    摘要:需求分析用的架構實現第三方登錄,如,微信登錄等。好了,到這里架構的第三方登錄已經實現了微博,淘寶等第三方登錄實現的思路也如此,就是要對傳入的參數進行改進一下就了。 序言 第三方登錄的使用在當今非常普遍,不管是PC端還是手機端都很常見。因為它有著一號多用的特點,不管是在什么網站什么軟件上只要有了這個第三方登錄的功能就無需再次走注冊步驟,直接用第三方的賬號登錄就可以了,方便吧?開發程序看重...

    Cheng_Gang 評論0 收藏0
  • Restfual api 架構三方登錄

    摘要:需求分析用的架構實現第三方登錄,如,微信登錄等。好了,到這里架構的第三方登錄已經實現了微博,淘寶等第三方登錄實現的思路也如此,就是要對傳入的參數進行改進一下就了。 序言 第三方登錄的使用在當今非常普遍,不管是PC端還是手機端都很常見。因為它有著一號多用的特點,不管是在什么網站什么軟件上只要有了這個第三方登錄的功能就無需再次走注冊步驟,直接用第三方的賬號登錄就可以了,方便吧?開發程序看重...

    Amio 評論0 收藏0
  • 讓ERP服務更開放! ——用微服務架構搭建一套基于EBSAPI服務系統

    摘要:每個服務運行在其獨立的進程中,服務與服務間采用輕量級的通信機制互相溝通通常是基于的。在微服務架構下,故障會被隔離在單個服務中。 1. 源碼下載地址 源碼鏈接: https://github.com/samt007/xy... 這是用Spring Cloud微服務架構搭建的一套基于EBS的API服務系統如對本文有任何的疑問,請聯系我:samt007@qq.com 2. Introduc...

    JouyPub 評論0 收藏0

發表評論

0條評論

cyqian

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<