【iOS】微信第三方登錄

一:下載SDK

https://open.weixin.qq.com/cgi-bin/frame?t=resource/res_main_tmpl&verify=1&lang=zh_CN&target=res/app_download_ios

二:配置環(huán)境

將文件拖入工程

圖片發(fā)自簡(jiǎn)書App

配置URL scheme

圖片發(fā)自簡(jiǎn)書App

三:DEFINE

1 #ifndef LoginDemo_Define_h

2 #define LoginDemo_Define_h

3

4 #define kAppDescription ? @“*******"

5

6 #define kWeiXinAppId ? ? ? ? ? ? ? @“wx**************"

7 #define kWeiXinAppSecret ? ? ? ? ? @“4f85d************011afa8a23d5a"

8

9 #define kWeiXinAccessToken ? @"WeiXinAccessToken"

10 #define kWeiXinOpenId ? ? ? ? ? ? @"WeiXinOpenId"

11 #define kWeiXinRefreshToken ?@"WeiXinRefreshToken"

12

13

14 #endif

四:AppDelegate.h

1 #import

2

3 #import "WeChatSDK_64/WXApi.h"

4

5 @interface AppDelegate : UIResponder

6

7 @property (strong, nonatomic) UIWindow *window;

8

9 @end

五:AppDelegate.m

1 #import "AppDelegate.h"

2 #import "RootViewController.h"

3 #import "Define.h"

4

5 @interface AppDelegate ()

6 {

7 ? ? RootViewController *root;

8 }

9 @end

10

11 @implementation AppDelegate

12

13

14 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

15 {

16 ? ? //….

17

18 ? ? root = [[RootViewController alloc]init];

19 ? ? self.window.rootViewController = root;

20

21 ? ? [WXApi registerApp:kWeiXinAppId withDescription:kAppDescription];

22

23 ? ? return YES;

24 }

25

26 - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url

27 {

28 ? ? return [WXApi handleOpenURL:url delegate:self];

29 }

30

31 - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation

32 {

33 ? ? return [WXApi handleOpenURL:url delegate:self];

34 }

35

36 - (void)onReq:(BaseReq*)req

37 {

38 ? ? /*

39 ? ? ?onReq是微信終端向第三方程序發(fā)起請(qǐng)求浑侥,要求第三方程序響應(yīng)。第三方程序響應(yīng)完后必須調(diào)用sendRsp返回抵怎。在調(diào)用sendRsp返回時(shí)陋率,會(huì)切回到微信終端程序界面佩番。

40 ? ? ?*/

41 }

42

43 - (void)onResp:(BaseResp*)resp

44 {

45 ? ? /*

46 ? ? ?如果第三方程序向微信發(fā)送了sendReq的請(qǐng)求蔓挖,那么onResp會(huì)被回調(diào)附帽。sendReq請(qǐng)求調(diào)用后埠戳,會(huì)切到微信終端程序界面。

47 ? ? ?*/

48 ? ? [root.weixinViewController getWeiXinCodeFinishedWithResp:resp];

49 }

六:發(fā)起授權(quán)請(qǐng)求

1 - (void)loginButtonClicked

2 {

3 ? ? SendAuthReq* req =[[SendAuthReq alloc ] init];

4 ? ? req.scope = @"snsapi_userinfo";

5 ? ? req.state = kAppDescription;

6 ? ? [WXApi sendReq:req];

7 }

調(diào)用方法后會(huì)彈出授權(quán)頁面蕉扮,完成授權(quán)后調(diào)用AppDelegate中的- (void)onResp:(BaseResp*)resp

七:處理返回?cái)?shù)據(jù)整胃,獲取code

1 - (void)getWeiXinCodeFinishedWithResp:(BaseResp *)resp

2 {

3 ? ? if (resp.errCode == 0)

4 ? ? {

5 ? ? ? ? statusCodeLabel.text = @"用戶同意";

6 ? ? ? ? SendAuthResp *aresp = (SendAuthResp *)resp;

7 ? ? ? ? [self getAccessTokenWithCode:aresp.code];

8

9 ? ? }else if (resp.errCode == -4){

10 ? ? ? ? statusCodeLabel.text = @"用戶拒絕";

11 ? ? }else if (resp.errCode == -2){

12 ? ? ? ? statusCodeLabel.text = @"用戶取消";

13 ? ? }

14 }

? ?八:使用code獲取access token

1 - (void)getAccessTokenWithCode:(NSString *)code

2 {

3 ? ? NSString *urlString =[NSString stringWithFormat:@"https://api.weixin.qq.com/sns/oauth2/access_token?appid=%@&secret=%@&code=%@&grant_type=authorization_code",kWeiXinAppId,kWeiXinAppSecret,code];

4 ? ? NSURL *url = [NSURL URLWithString:urlString];

5

6 ? ? dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

7

8 ? ? ? ? NSString *dataStr = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];

9 ? ? ? ? NSData *data = [dataStr dataUsingEncoding:NSUTF8StringEncoding];

10

11 ? ? ? ? dispatch_async(dispatch_get_main_queue(), ^{

12

13 ? ? ? ? ? ? if (data)

14 ? ? ? ? ? ? {

15 ? ? ? ? ? ? ? ? NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];

16

17 ? ? ? ? ? ? ? ? if ([dict objectForKey:@"errcode"])

18 ? ? ? ? ? ? ? ? {

19 //獲取token錯(cuò)誤

20 ? ? ? ? ? ? ? ? }else{

21 //存儲(chǔ)AccessToken OpenId RefreshToken以便下次直接登陸

22 //AccessToken有效期兩小時(shí),RefreshToken有效期三十天

23 ? ? ? ? ? ? ? ? ? ? [self getUserInfoWithAccessToken:[dict objectForKey:@"access_token"] andOpenId:[dict objectForKey:@"openid"]];

24 ? ? ? ? ? ? ? ? }

25 ? ? ? ? ? ? }

26 ? ? ? ? });

27 ? ? });

28

29 ? ? /*

30 ? ? ?正確返回

31 ? ? ?"access_token" = “Oez*****8Q";

32 ? ? ?"expires_in" = 7200;

33 ? ? ?openid = ooVLKjppt7****p5cI;

34 ? ? ?"refresh_token" = “Oez*****smAM-g";

35 ? ? ?scope = "snsapi_userinfo";

36 ? ? ?*/

37

38 ? ? /*

39 ? ? ?錯(cuò)誤返回

40 ? ? ?errcode = 40029;

41 ? ? ?errmsg = "invalid code";

42 ? ? ?*/

43 }

九:使用AccessToken獲取用戶信息

1 - (void)getUserInfoWithAccessToken:(NSString *)accessToken andOpenId:(NSString *)openId

2 {

3 ? ? NSString *urlString =[NSString stringWithFormat:@"https://api.weixin.qq.com/sns/userinfo?access_token=%@&openid=%@",accessToken,openId];

4 ? ? NSURL *url = [NSURL URLWithString:urlString];

5

6 ? ? dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

7

8 ? ? ? ? NSString *dataStr = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];

9 ? ? ? ? NSData *data = [dataStr dataUsingEncoding:NSUTF8StringEncoding];

10

11 ? ? ? ? dispatch_async(dispatch_get_main_queue(), ^{

12

13 ? ? ? ? ? ? if (data)

14 ? ? ? ? ? ? {

15 ? ? ? ? ? ? ? ? NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];

16

17 ? ? ? ? ? ? ? ? if ([dict objectForKey:@"errcode"])

18 ? ? ? ? ? ? ? ? {

19 //AccessToken失效

20 ? ? ? ? ? ? ? ? ? ? [self getAccessTokenWithRefreshToken:[[NSUserDefaults standardUserDefaults]objectForKey:kWeiXinRefreshToken]];

21 ? ? ? ? ? ? ? ? }else{

22 //獲取需要的數(shù)據(jù)

23 ? ? ? ? ? ? ? ? }

24 ? ? ? ? ? ? }

25 ? ? ? ? });

26 ? ? });

27

28 ? /*

29 ? ? ?city = ****;

30 ? ? ?country = CN;

31 ? ? ?headimgurl = "http://wx.qlogo.cn/mmopen/q9UTH59ty0K1PRvIQkyydYMia4xN3gib2m2FGh0tiaMZrPS9t4yPJFKedOt5gDFUvM6GusdNGWOJVEqGcSsZjdQGKYm9gr60hibd/0";

32 ? ? ?language = "zh_CN";

33 ? ? ?nickname = “****";

34 ? ? ?openid = oo*********;

35 ? ? ?privilege = ? ? (

36 ? ? ?);

37 ? ? ?province = *****;

38 ? ? ?sex = 1;

39 ? ? ?unionid = “o7VbZjg***JrExs";

40 ? ? ?*/

41

42 ? ? /*

43 ? ? ?錯(cuò)誤代碼

44 ? ? ?errcode = 42001;

45 ? ? ?errmsg = "access_token expired";

46 ? ? ?*/

47 }

? ? 十:使用RefreshToken刷新AccessToken

該接口調(diào)用后喳钟,如果AccessToken未過期屁使,則刷新有效期,如果已過期奔则,更換AccessToken蛮寂。

1 - (void)getAccessTokenWithRefreshToken:(NSString *)refreshToken

2 {

3 ? ? NSString *urlString =[NSString stringWithFormat:@"https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=%@&grant_type=refresh_token&refresh_token=%@",kWeiXinAppId,refreshToken];

4 ? ? NSURL *url = [NSURL URLWithString:urlString];

5

6 ? ? dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

7

8

9 ? ? ? ? NSString *dataStr = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];

10 ? ? ? ? NSData *data = [dataStr dataUsingEncoding:NSUTF8StringEncoding];

11

12 ? ? ? ? dispatch_async(dispatch_get_main_queue(), ^{

13

14 ? ? ? ? ? ? if (data)

15 ? ? ? ? ? ? {

16 ? ? ? ? ? ? ? ? NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];

17

18 ? ? ? ? ? ? ? ? if ([dict objectForKey:@"errcode"])

19 ? ? ? ? ? ? ? ? {

20 //授權(quán)過期

21 ? ? ? ? ? ? ? ? }else{

22 //重新使用AccessToken獲取信息

23 ? ? ? ? ? ? ? ? }

24 ? ? ? ? ? ? }

25 ? ? ? ? });

26 ? ? });

27

28

29 ? ? /*

30 ? ? ?"access_token" = “Oez****5tXA";

31 ? ? ?"expires_in" = 7200;

32 ? ? ?openid = ooV****p5cI;

33 ? ? ?"refresh_token" = “Oez****QNFLcA";

34 ? ? ?scope = "snsapi_userinfo,";

35 ? ? ?*/

36

37 ? ? /*

38 ? ? ?錯(cuò)誤代碼

39 ? ? ?"errcode":40030,

40 ? ? ?"errmsg":"invalid refresh_token"

41 ? ? ?*/

42 } ? ?

? ?

? ?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市易茬,隨后出現(xiàn)的幾起案子酬蹋,更是在濱河造成了極大的恐慌,老刑警劉巖抽莱,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件范抓,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡食铐,警方通過查閱死者的電腦和手機(jī)匕垫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來虐呻,“玉大人象泵,你說我怎么就攤上這事×蹇叮” “怎么了单芜?”我有些...
    開封第一講書人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)犁柜。 經(jīng)常有香客問我洲鸠,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任扒腕,我火速辦了婚禮绢淀,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘瘾腰。我一直安慰自己皆的,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開白布蹋盆。 她就那樣靜靜地躺著费薄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪栖雾。 梳的紋絲不亂的頭發(fā)上楞抡,一...
    開封第一講書人閱讀 51,198評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音析藕,去河邊找鬼召廷。 笑死,一個(gè)胖子當(dāng)著我的面吹牛账胧,可吹牛的內(nèi)容都是我干的竞慢。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼治泥,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼筹煮!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起居夹,我...
    開封第一講書人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤寺谤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后吮播,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體变屁,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年意狠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了粟关。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡环戈,死狀恐怖闷板,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情院塞,我是刑警寧澤遮晚,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站拦止,受9級(jí)特大地震影響县遣,放射性物質(zhì)發(fā)生泄漏糜颠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一萧求、第九天 我趴在偏房一處隱蔽的房頂上張望其兴。 院中可真熱鬧,春花似錦夸政、人聲如沸元旬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽匀归。三九已至,卻和暖如春耗帕,著一層夾襖步出監(jiān)牢的瞬間朋譬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工兴垦, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人字柠。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓探越,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親窑业。 傳聞我的和親對(duì)象是個(gè)殘疾皇子钦幔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 注意:代碼自己動(dòng)手寫,不要復(fù)制常柄! GitHub 一鲤氢、接入微信第三方登錄準(zhǔn)備工作。 移動(dòng)應(yīng)用微信登錄是基于OAuth...
    大沖哥閱讀 15,094評(píng)論 0 7
  • 這是本人寫的第一篇文章,寫的不好還望見諒!~ 在做項(xiàng)目的時(shí)候,由于本人最先使用原生的微信集成第三方登錄,測(cè)試是沒有...
    哭與行閱讀 2,073評(píng)論 0 0
  • 標(biāo)簽(空格分隔): iOS 我的計(jì)劃1.使用微信SDK實(shí)現(xiàn)微信第三方登錄2.使用友盟實(shí)現(xiàn)第三方登錄3.使用open...
    iOS_愛OS閱讀 5,774評(píng)論 1 9
  • 需求:應(yīng)用需要接入第三方的登錄西潘,這里以微信為例卷玉。前提:申請(qǐng)了應(yīng)用的appID,就是在微信平臺(tái)注冊(cè)了應(yīng)用喷市,并且擁有的...
    xiaofengl閱讀 1,639評(píng)論 1 5
  • 8:17 永不凋零的生命之花 似乎舞文弄墨有條不成文的規(guī)鉅, 發(fā)表正文時(shí)人們都要寫點(diǎn)序戓故事梗概之類的東西, 我亦...
    滄粟筆談閱讀 1,376評(píng)論 1 2