美文网首页
【iOS】微信第三方登录

【iOS】微信第三方登录

作者: JzRo | 来源:发表于2016-04-27 15:49 被阅读552次

    一:下载SDK

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

    二:配置环境

    将文件拖入工程

    【iOS】微信第三方登录

    配置URL scheme

    【iOS】微信第三方登录

    三: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是微信终端向第三方程序发起请求,要求第三方程序响应。第三方程序响应完后必须调用sendRsp返回。在调用sendRsp返回时,会切回到微信终端程序界面。

    40      */

    41 }

    42

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

    44 {

    45     /*

    46      如果第三方程序向微信发送了sendReq的请求,那么onResp会被回调。sendReq请求调用后,会切到微信终端程序界面。

    47      */

    48     [root.weixinViewController getWeiXinCodeFinishedWithResp:resp];

    49 }

    六:发起授权请求

    1 - (void)loginButtonClicked

    2 {

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

    4     req.scope = @"snsapi_userinfo";

    5     req.state = kAppDescription;

    6     [WXApi sendReq:req];

    7 }

    调用方法后会弹出授权页面,完成授权后调用AppDelegate中的- (void)onResp:(BaseResp*)resp

    七:处理返回数据,获取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错误

    20                 }else{

    21 //存储AccessToken OpenId RefreshToken以便下次直接登陆

    22 //AccessToken有效期两小时,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      错误返回

    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 //获取需要的数据

    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      错误代码

    44      errcode = 42001;

    45      errmsg = "access_token expired";

    46      */

    47 }

        十:使用RefreshToken刷新AccessToken

    该接口调用后,如果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 //授权过期

    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      错误代码

    39      "errcode":40030,

    40      "errmsg":"invalid refresh_token"

    41      */

    42 }    

       

       

    相关文章

      网友评论

          本文标题:【iOS】微信第三方登录

          本文链接:https://www.haomeiwen.com/subject/sdpcrttx.html