Swift_微信第三方登錄

一、接入微信第三方登錄準備工作。

移動應用微信登錄是基于OAuth2.0協(xié)議標準構建的微信OAuth2.0授權登錄系統(tǒng)絮姆。

1. 在微信開放平臺注冊開發(fā)者帳號,并擁有一個已審核通過的移動應用秩霍,并獲得相應的AppID和AppSecret篙悯,申請微信登錄且通過審核后,可開始接入流程

注意:

1.審核需要提供一個28*28和108*108的圖標
2.審核需要提供Bundle ID
3.審核需要一點時間铃绒,我之前一天就審核通過了
2. 下載iOS微信SDK

下載最新的SDK 地址: 點擊打開鏈接

Paste_Image.png

3. 將SDK放到工程目錄中
Paste_Image.png
4. 補充導入一些依賴框架:Target - Build Phases - Link Binary With Libraries
Paste_Image.png
5. 添加URL Types:Target - Info - URL Types
Paste_Image.png
6. 添加iOS9 URL Schemes

**注意: 當程序出現(xiàn)以下錯誤鸽照,說明沒有針對iOS9 增加白名單。在info.plist文件中加入 LSApplicationQueriesSchemes **

-canOpenURL: failed for URL: "weixin://app/wx9**********dfd30/" - error: "This app is not allowed to query for scheme weixin"
Paste_Image.png
7. iOS9中新增App Transport Security(簡稱ATS)特性, 主要使到原來請求的時候用到的HTTP匿垄,都轉向TLS1.2協(xié)議進行傳輸移宅。這也意味著所有的HTTP協(xié)議都強制使用了HTTPS協(xié)議進行傳輸。需要在Info.plist新增App Transport Security Settings用于控制ATS的配置:
<key>NSAppTransportSecurity</key>
<dict> 
       <key>NSAllowsArbitraryLoads</key>
       <true/>
</dict>

如果我們在iOS9下直接進行HTTP請求是會收到如下錯誤提示椿疗,需要在Info.plist新增App Transport Security Settings

**App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.**
Paste_Image.png
8. 現(xiàn)在編譯應該沒有問題
二漏峰、代碼部分
1. 第一步:在橋接文件中引入"WXApi.h"頭文件,然后在中AppDelegate.m寫入如下代碼:
import UIKit

@UIApplicationMain
// 在Appdelegate里面添加微信代理
class AppDelegate: UIResponder, UIApplicationDelegate, WXApiDelegate {

    var window: UIWindow?

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
       //向微信注冊應用
       // @param1 微信開發(fā)者ID
       // @param2 應用附加信息届榄,長度不超過1024字節(jié)
      WXApi.registerApp("wxed8b3e67969559b5", withDescription: "wechat")
        return true
    }
    
    // 這個方法是用于從微信返回第三方App 處理微信通過URL啟動App時傳遞的數(shù)據(jù)
    // @param url 微信啟動第三方應用時傳遞過來的URL
    // @param delegate WXApiDelegate對象浅乔,用來接收微信觸發(fā)的消息。
    func application(application: UIApplication, handleOpenURL url: NSURL) -> Bool {
        if url.scheme == "wxed8b3e67969559b5" {
            WXApi.handleOpenURL(url, delegate: self)
        }
        return true
    }

    func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool {
        if url.scheme == "wxed8b3e67969559b5" {
            WXApi.handleOpenURL(url, delegate: self)
        }
        return true
    }

    func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool {
        Tools.logPrint("openURL:\(url.absoluteString)")
        if url.scheme == "wxed8b3e67969559b5" {
            return WXApi.handleOpenURL(url, delegate: self)
        }
        return true
    }
}
2. 第二步:請求CODE

開發(fā)者需要配合使用微信開放平臺提供的SDK進行授權登錄請求接入。正確接入SDK后并擁有相關授權域(scope靖苇,什么是授權域席噩?)權限后,開發(fā)者移動應用會在終端本地拉起微信應用進行授權登錄贤壁,微信用戶確認后微信將拉起開發(fā)者移動應用悼枢,并帶上授權臨時票據(jù)(code)。

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)
        
        if WXApi.isWXAppInstalled() {
            print("weixin ready")
        } else {
            // 把微信登錄的按鈕隱藏掉
        }
    }

    // 請求CODE
    @IBAction func wechatLoginClick(sender: UIButton) {
        // 如果在這里判斷是否安裝了微信脾拆,會報-canOpenURL: failed for URL: "weixin://app/wx5efead4057f98bc0/" - error: "This app is not allowed to query for scheme weixin"錯誤
            let req = SendAuthReq()
            req.scope = "snsapi_userinfo"
            req.state = "App"
        //第三方向微信終端發(fā)送一個SendAuthReq消息結構
            if !WXApi.sendReq(req) {
                print("weixin sendreq failed")
       }
    }
}

執(zhí)行完上面那一步后馒索,如果客戶端安裝了微信,那么就會向微信請求相應的授權名船,圖如下:

Paste_Image.png

返回說明
用戶點擊授權后绰上,微信客戶端會被拉起,跳轉至授權界面渠驼,用戶在該界面點擊允許或取消蜈块,SDK通過SendAuth的Resp返回數(shù)據(jù)給調用方。

Paste_Image.png

3. 第三步:通過code獲取access_token
獲取code后迷扇,請求以下鏈接獲取access_token:
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&gr
ant_type=authorization_code
Paste_Image.png
// 授權后回調
// AppDelegate.m
    func onReq(req: BaseReq!) {
        //onReq是微信終端向第三方程序發(fā)起請求百揭,要求第三方程序響應。第三方程序響應完后必須調用sendRsp返回谋梭。在調用sendRsp返回時信峻,會切回到微信終端程序界面。
        print(req.type)
    }
    
    func onResp(resp: BaseResp!) {
        //如果第三方程序向微信發(fā)送了sendReq的請求瓮床,那么onResp會被回調盹舞。sendReq請求調用后,會切到微信終端程序界面隘庄。
        if resp.isKindOfClass(SendAuthResp) {
            let authResp = resp as! SendAuthResp
            print("ErrCode : \(authResp.errCode)") // 0
            print("EodeStr : \(authResp.errStr)") // nil
            print("Code : \(authResp.code)") // 0017Avci0BJ0Rj1hIqai0jEsci07AvcI
            print("State : \(authResp.state)") //  State : App
            print("Lang : \(authResp.lang)") // nil
            print("Country : \(authResp.country)") // nil
            if authResp.errCode == 0 {
                let code = authResp.code
                let AFN = AFHTTPSessionManager()
                let params = ["appid": WX_APPID, "secret": WX_APPSECRET_TEST, "code": code, "grant_type": "authorization_code"]
                AFN.GET("https://api.weixin.qq.com/sns/oauth2/access_token", parameters: params, success: { (_, response) in
                    let accessToken = response!["access_token"] as! String
                    let refreshToken = response!["refresh_token"] as! String
                    let openID = response!["openid"] as! String
                    // 本地持久化踢步,以便access_token的使用、刷新或者持續(xù)
                    if (accessToken.isEmpty == false && openID.isEmpty == false) {
                        NSUserDefaults.standardUserDefaults().setObject(accessToken, forKey: "access_token")
                        NSUserDefaults.standardUserDefaults().setObject(refreshToken, forKey: "refresh_token")
                        NSUserDefaults.standardUserDefaults().setObject(openID, forKey: "openid")
                        NSUserDefaults.standardUserDefaults().synchronize() // 命令直接同步到文件里丑掺,來避免數(shù)據(jù)的丟失
                    }
                    self.wechatLoginByRequestForUserInfo()
                    }, failure: { (_, error) in
                        print(error) 
                })
            }
        }
    }
Paste_Image.png
 // 獲取用戶個人信息(UnionID機制)
    func wechatLoginByRequestForUserInfo() {
        let accessToken = NSUserDefaults.standardUserDefaults().objectForKey("access_token")
        let openID = NSUserDefaults.standardUserDefaults().objectForKey("openid")
        // 獲取用戶信息
        let params = ["access_token": accessToken! as! String, "openid": openID! as! String] as Dictionary<String, String>
        let AFN = AFHTTPSessionManager()
        AFN.GET("https://api.weixin.qq.com/sns/userinfo", parameters: params, progress: nil, success: { (_, response) in
            // 這里可以實現(xiàn)公司的要求获印,比如我司是微信登錄成功后,通過segue跳轉到主界面
            print(response)
            }, failure: { (_, error) in
              print(error)
        })
    }
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末街州,一起剝皮案震驚了整個濱河市兼丰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌唆缴,老刑警劉巖鳍征,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異面徽,居然都是意外死亡艳丛,警方通過查閱死者的電腦和手機匣掸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來氮双,“玉大人碰酝,你說我怎么就攤上這事〈鞑睿” “怎么了送爸?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長造挽。 經常有香客問我碱璃,道長弄痹,這世上最難降的妖魔是什么饭入? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮肛真,結果婚禮上谐丢,老公的妹妹穿的比我還像新娘。我一直安慰自己蚓让,他們只是感情好乾忱,可當我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著历极,像睡著了一般窄瘟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上趟卸,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天蹄葱,我揣著相機與錄音,去河邊找鬼锄列。 笑死图云,一個胖子當著我的面吹牛,可吹牛的內容都是我干的邻邮。 我是一名探鬼主播竣况,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼筒严!你這毒婦竟也來了丹泉?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤鸭蛙,失蹤者是張志新(化名)和其女友劉穎摹恨,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體规惰,經...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡睬塌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片揩晴。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡勋陪,死狀恐怖,靈堂內的尸體忽然破棺而出硫兰,到底是詐尸還是另有隱情诅愚,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布劫映,位于F島的核電站违孝,受9級特大地震影響,放射性物質發(fā)生泄漏泳赋。R本人自食惡果不足惜雌桑,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望祖今。 院中可真熱鬧校坑,春花似錦、人聲如沸千诬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽徐绑。三九已至邪驮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間傲茄,已是汗流浹背毅访。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留烫幕,地道東北人俺抽。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像较曼,于是被迫代替她去往敵國和親磷斧。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內容

  • 注意:代碼自己動手寫捷犹,不要復制弛饭! GitHub 一、接入微信第三方登錄準備工作萍歉。 移動應用微信登錄是基于OAuth...
    大沖哥閱讀 15,112評論 0 7
  • 很可能你的應用是與一個支持HTTPS傳輸數(shù)據(jù)的服務器交互侣颂,但是并沒有使用TLS 1.2或更高。在這種情況下枪孩,你定義...
    Www劉閱讀 3,075評論 0 5
  • 世界上有太多的美憔晒,它們都代表一種愛藻肄。而已經美到無法形容的愛琴海小島,代表著——永恒的愛 愛琴海小島是一個體系龐大...
    若熙IRIS閱讀 428評論 0 0
  • 上學時很多女孩追星拒担,常赤谕停看見他們在校服背后寫著李易峰啊什么TF啊,技術含量高點的干脆就把整個人都給畫了上去从撼。 那時...
    紫色的傷懷63129閱讀 486評論 0 0
  • 禪院幽幽夕照隱州弟, 蒼山寂寂露華濃。 鱗云淡靄煙如縷低零, 暮鼓三聲萬物空婆翔。
    靜鈴音閱讀 509評論 42 53