首先需要確保你的App應用在微信開發平臺上注冊創建并獲得對應的接口,對應登錄、支付等功能還涉及付費,具體申請流程就不再這里說了。到開放平臺->管理中心->移動應用->查看應用,確認你的應用已獲得微信登錄接口(很多小伙伴注冊賬號完成后就開始使用微信登錄和支付,其實這些功能是需要另外申請開通的),應用審核通過后,平臺會給我們兩個字符串,分別為AppID和AppSecret,把它們記下備用。
接下來就是接入SDK,到開發平臺->資源中心->資源下載中,找到iOS資源下載,里面提供了兩套工具包,其中一套不包含支付功能。
微信授權登錄功能是使用的OAuth2.0協議,適用于擁有服務端的應用授權
在開始開發前,建議先仔細閱讀該協議的幾種認證模式中的Authorization Code認證,對后續流程理解上會有很大的幫助
Authorization Code認證模式大概流程如下:
- 第三方APP發起微信授權登錄請求,用戶允許授權后會返回應用并帶上授權的臨時數據也就是“code”參數(前端實現);
- 服務端通過code加上AppID和AppSecret等參數,通過API換取access_token(建議服務端實現);
- 通過access_token進行接口調用,獲取微信用戶的基本數據資源(建議服務端實現)。
微信在官方文檔中給出風險說明:
1、AppSecret 是應用接口使用密鑰,泄漏后將可能導致應用數據泄漏、應用的用戶數據泄漏等高風險后果;存儲在客戶端,極有可能被惡意竊取(如反編譯獲取Appsecret);
2、AccessToken 為用戶授權第三方應用發起接口調用的憑證(相當于用戶登錄態),存儲在客戶端,可能出現惡意獲取AccessToken 后導致的用戶數據泄漏、用戶微信相關接口功能被惡意發起等行為;
3、refresh_token 為用戶授權第三方應用的長效憑證,僅用于刷新AccessToken,但泄漏后相當于AccessToken泄漏,風險同上。
因此,強烈建議將AppSecret放在服務端,并由服務器來完成后續步驟
廢話說的有點多了,下面直接看代碼:
第一步:請求Authorization Code
原生應用集成微信SDK,并發起授權登錄請求
- (void)sendWXAuthReq{
if([WXApi isWXAppInstalled]){//判斷用戶是否已安裝微信App
SendAuthReq *req = [[SendAuthReq alloc] init];
req.state = @"wx_oauth_authorization_state";//用于保持請求和回調的狀態,授權請求會原樣帶回
req.scope = @"snsapi_userinfo";//授權作用域:獲取用戶個人信息
[WXApi sendReq:req];//發起微信授權請求
}else{
//提示:未安裝微信應用或版本過低
}
}
在回調函數中獲取code
- (void)onResp:(id)resp{
if([resp isKindOfClass:[SendAuthResp class]]){//判斷是否為授權登錄類
SendAuthResp *req = (SendAuthResp *)resp;
if([req.state isEqualToString:@"wx_oauth_authorization_state"]){//微信授權成功
req.code //獲得code
}
}
}
第二步:通過Authorization Code請求Access Token
拿到Authorization Code之后,獲取Access Token,發送GET請求到下面這個URL
返回說明:
{
"access_token":"ACCESS_TOKEN", //接口調用憑證
"expires_in":7200, //access_token接口調用憑證超時時間,單位(秒)
"refresh_token":"REFRESH_TOKEN", //用戶刷新access_token
"openid":"OPENID", //授權用戶唯一標識
"scope":"SCOPE" //用戶授權的作用域,使用逗號(,)分隔
}
第三步:通過Access Token請求Union Id
拿到Access Token和OpenID后,獲取用戶個人信息,發送GET請求到下面這個URL:
https://api.weixin.qq.com/sns/userinfo?access_token=[ACCESS_TOKEN]&openid=[OPEN_ID]
返回說明:
{
"openid":"OPENID", //用戶的標識,對當前開發者帳號唯一
"nickname":"NICKNAME", //用戶昵稱
"sex":1, //用戶性別,1為男性,2為女性
"province":"PROVINCE", //用戶個人資料填寫的省份
"city":"CITY", //用戶個人資料填寫的城市
"country":"COUNTRY", //國家,如中國為CN
"headimgurl": "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0", //用戶頭像,最后一個數值代表正方形頭像大小(有0、46、64、96、132數值可選,0代表640*640正方形頭像),用戶沒有頭像時該項為空
"unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL"
}
UnionID(用戶統一標識)針對一個微信開放平臺帳號下的所有應用,同一用戶的UnionID是唯一的,如果需要做賬號第三方登錄綁定業務邏輯,就用這個字段
這里強烈建議開發小伙伴區分集成微信、騰訊、微博SDK,不要使用類似友盟,通常情況下做社會化分享等確實需要用到這三樣,但是問題來了,如果其中某個更新了SDK而友盟沒有同步導致一些問題,那就廢了
由于移動應用上微信登錄只提供了原生的登錄方式,必須配合微信客戶端才能正常使用。所以對iOS應用而言考慮到審核指南中的相關規定,建議在接入SDK時調用WXApi中isWXAppInstalled函數來檢測當前用戶手機是否已安裝微信客戶端,對未安裝的用戶隱藏對應微信登錄按鈕,防止審核被拒絕。
如果本文對你有所幫助記得點個贊哈:)