iOS 微信第三方登錄文檔說明

標簽(空格分隔): iOS


微信第三方登錄文檔
網址

  1. 移動應用微信登錄開發指南 2.授權后接口調用(UnionID

  • 這篇文章的最終目的是獲取access_token 和微信用戶信息
  1. 第三方發起微信授權登錄請求,微信用戶允許授權第三方應用后,微信會拉起應用或重定向到第三方網站,并且帶上授權臨時票據code參數;
  2. 通過code參數加上AppID和AppSecret等,通過API換取access_token;
  3. 通過access_token進行接口調用,獲取用戶基本數據資源或幫助用戶實現基本操作。
    總結:code+AppID+AppSecret --->access_token
  • scope(授權域):
    snsapi_message:幫助你通過該應用向好友發送消息
    snsapi_userinfo:獲得你的公開信息(昵稱,頭像等)
    snsapi_friend:尋找與你共同使用該應用的好友
    snsapi_contact:獲得你的好友關系

  • 第一步:獲取 code 超時時間為10分鐘

        -(void)sendAuthRequest
        { 
            //構造SendAuthReq結構體 
            SendAuthReq* req =[[[SendAuthReq alloc ] init ] autorelease ];
            req.scope = @"snsapi_userinfo" ;
            req.state = @"123" ;
            //第三方向微信終端發送一個SendAuthReq消息結構
            [WXApi sendReq:req];
            //或者用下面的方法
            //[WXApi sendAuthReq:req viewController:self delegate:self];
        }
    
     *參數說明:*
            appid 必須  應用唯一標識,在微信開放平臺提交應用審核通過后獲得
            scope 必須  應用授權作用域,如獲取用戶個人信息則填寫snsapi_userinfo
            state 非必須 用于保持請求和回調的狀態,授權請求后原樣帶回給第三方。該參數可用于防止csrf攻擊(跨站請求偽造攻擊),建議第三方帶上該參數,可設置為簡單的隨機數加session進行校驗
     *返回參數:*
              ```
              appid: wxd477edab60670232
              scope: snsapi_userinfo
              state: wechat_sdk_demo
              ```
    

    微信用戶授權授權登錄

     用戶授權后,得到數據
     ```
         ErrCode     ERR_OK = 0(用戶同意)
                     ERR_AUTH_DENIED = -4(用戶拒絕授權)
                     ERR_USER_CANCEL = -2(用戶取消)
         code        用戶換取access_token的code,僅在ErrCode為0時有效
         state       第三方程序發送時用來標識其請求的唯一性的標志,由第三方程序調用sendReq時傳入,由微信終端回傳,state字符串長度不能超過1K
         lang        微信客戶端當前語言
         country     微信用戶當前國家信息
     ```
    

  • 獲取access_token

    參數說明:

            appid      是    應用唯一標識,在微信開放平臺提交應用審核通過后獲得
            secret     是    應用密鑰AppSecret,在微信開放平臺提交應用審核通過后獲得
            code       是    填寫第一步獲取的code參數
            grant_type 是    填authorization_code
    
    返回示例:
         { 
            "access_token":"ACCESS_TOKEN", 
            "expires_in":7200, 
            "refresh_token":"REFRESH_TOKEN",
            "openid":"OPENID", 
            "scope":"SCOPE",
            "unionid":"o6_bmasdasdsad6_2sgVt7hMZOPfL"
         }
        access_token    接口調用憑證
        expires_in      access_token接口調用憑證超時時間,單位(秒)
        refresh_token   用戶刷新access_token
        openid          授權用戶唯一標識
        scope           用戶授權的作用域,使用逗號(,)分隔
        unionid         當且僅當該移動應用已獲得該用戶的userinfo授權時,才會出現該字段
    錯誤返回
        {"errcode":40029,"errmsg":"invalid code"}
    

    刷新access_token有效期

    如果用戶量不是很大,就不用考慮access_token的有效期,每次都讓他們從頭登錄一次行,我的demo中就沒有考慮這種情況
    access_token:2小時有效期
    refresh_token:30天有效期
    1. 若access_token已超時,那么進行refresh_token會獲取一個新的access_token,新的超時時間;
    2. 若access_token未超時,那么進行refresh_token不會改變access_token,但超時時間會刷新,相當于續期access_token。

    開始刷新access_token有效期:

    接口
    https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN
    參宿如下:
    appid 是 應用唯一標識
    grant_type 是 填refresh_token
    refresh_token 是 填寫通過access_token獲取到的refresh_token參數

    返回說明:

    {
    "access_token":"ACCESS_TOKEN",
    "expires_in":7200,
    "refresh_token":"REFRESH_TOKEN",
    "openid":"OPENID",
    "scope":"SCOPE"
    }
    access_token 接口調用憑證
    expires_in access_token接口調用憑證超時時間,單位(秒)
    refresh_token 用戶刷新access_token
    openid 授權用戶唯一標識
    scope 用戶授權的作用域,使用逗號(,)分隔
    錯誤返回:{"errcode":40030,"errmsg":"invalid refresh_token"}

注意:
1、Appsecret 是應用接口使用密鑰,泄漏后將可能導致應用數據泄漏、應用的用戶數據泄漏等高風險后果;存儲在客戶端,極有可能被惡意竊取(如反編譯獲取Appsecret);
2、access_token 為用戶授權第三方應用發起接口調用的憑證(相當于用戶登錄態),存儲在客戶端,可能出現惡意獲取access_token 后導致的用戶數據泄漏、用戶微信相關接口功能被惡意發起等行為;
3、refresh_token 為用戶授權第三方應用的長效憑證,僅用于刷新access_token,但泄漏后相當于access_token 泄漏,風險同上。

建議將Appsecret、用戶數據(如access_token)放在App云端服務器,由云端中轉接口調用請求。

  • .通過access_token調用接口
    獲取access_token后,進行接口調用,有以下前提:

    1. access_token有效且未超時;
    2. 微信用戶已授權給第三方應用帳號相應接口作用域(scope)

    對于接口作用域(scope),能調用的接口有以下:

      snsapi_base      /sns/oauth2/access_token   通過code換取access_token、refresh_token和已授權scope
                       /sns/oauth2/refresh_token  刷新或續期access_token使用
                       /sns/auth  檢查access_token有效性
      snsapi_userinfo  /sns/userinfo  獲取用戶個人信息
    

    其中snsapi_base屬于基礎接口,若應用已擁有其它scope權限,則默認擁有snsapi_base的權限。使用snsapi_base可以讓移動端網頁授權繞過跳轉授權登錄頁請求用戶授權的動作,直接跳轉第三方網頁帶上授權臨時票據(code),但會使得用戶已授權作用域(scope)僅為snsapi_base,從而導致無法獲取到需要用戶授權才允許獲得的數據和基礎功能.


  • .獲取用戶個人信息(UnionID機制)
    接口
      https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID
      
      參數          是否必須        說明
      access_token    是      調用憑證
      openid          是   普通用戶的標識,對當前開發者帳號唯一
      lang            否   國家地區語言版本,zh_CN 簡體,zh_TW 繁體,en 英語,默認為zh-CN
    
    數據返回
      { 
      "openid":"OPENID",
      "nickname":"NICKNAME",
      "sex":1,
      "province":"PROVINCE",
      "city":"CITY",
      "country":"COUNTRY",
      "headimgurl": "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0",
      "privilege":[
      "PRIVILEGE1", 
      "PRIVILEGE2"
      ],
      "unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL"
      }
    
      參數          說明
      openid      普通用戶的標識,對當前開發者帳號唯一
      nickname    普通用戶昵稱
      sex         普通用戶性別,1為男性,2為女性
      province    普通用戶個人資料填寫的省份
      city        普通用戶個人資料填寫的城市
      country     國家,如中國為CN
      headimgurl  用戶頭像,最后一個數值代表正方形頭像大小(有0、46、64、96、132數值可選,0代表640*640正方形頭像),用戶沒有頭像時該項為空
      privilege   用戶特權信息,json數組,如微信沃卡用戶為(chinaunicom)
      unionid 用戶統一標識。針對一個微信開放平臺帳號下的應用,同一用戶的unionid是唯一的。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容