美文网首页Swift做产品的经验一二
【第三方】微信授权登录

【第三方】微信授权登录

作者: 刘大帅 | 来源:发表于2015-04-02 15:39 被阅读14635次

    在进行微信OAuth2.0授权登录接入之前,在微信开放平台注册开发者帐号,并拥有一个已审核通过的移动应用,并获得相应的AppID和AppSecret,申请微信登录且通过审核后,可开始接入流程。我是从产品那里得到的,所以就不写这个步骤了。。。

    1、下载SDK

    下载地址

    下载地址

    2、将SDK放入工程

    将SDK放入工程

    我选择的无模拟器版,即“WeChatSDK_1.5_OnlyIphone”,这大约可以省一半的体积(OnlyPhone体积2.2M,兼容模拟器的体积4.2M)

    3、观察微信API

    通过我的观察,微信API大概可以分为两部分,一部分是第三方APP发送信息(文本,图片,音频,链接等等)到微信的会话、朋友圈或者收藏,还有就是微信授权登录(API中多以Resp,response作结尾),这是我常用的;另一部分是微信发送信息给第三方APP,这一部分没尝试过(API中多以Req,request作结尾)。

    4、补充一些框架

    添加一些框架

    我在使用SDK时需要添加libc++.dylib ,否则编译报错,可是官方文档并没有提示,不知为何。

    5、添加URL scheme

    添加URL TYPE

    Identifier中填写自定义的文本。

    6、向微信终端程序注册第三方应用,并在第三方应用实现从微信返回

    在AppDelegate.m中引入"WXApi.h"头文件,然后

    向微信终端程序注册第三方应用,并在第三方应用实现从微信返回

    7、请求CODE

    在要微信授权登录的controller中引入"WXApi.h"头文件,编写请求code的代码,如下图:

    请求CODE

    执行该方法后,如果客户端安装了微信,那么就会向微信请求相应的授权,如图:

    请求Code会结合需求扩展变化

    相关情况,参见刷新或续期access_token使用

    让AppDelegate遵守<WXApiDelegate>协议,并实现协议方法onResp:,我们在该方法中接收请求回来的数据,如下图:

    实现onResp:方法,接收返回的响应

    参数说明

    参数 是否必须 说明
    appid 应用唯一标识,在微信开放平台提交应用审核通过后获得
    scope 应用授权作用域,如获取用户个人信息则填写snsapi_userinfo(什么是授权域
    state 用于保持请求和回调的状态,授权请求后原样带回给第三方。该参数可用于防止csrf攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加session进行校验

    返回说明

    用户点击授权后,微信客户端会被拉起,跳转至授权界面,用户在该界面点击允许或取消,SDK通过SendAuth的Resp返回数据给调用方。

    返回值 说明
    ErrCode ERR_OK = 0(用户同意),ERR_AUTH_DENIED = -4(用户拒绝授权),ERR_USER_CANCEL = -2(用户取消)
    code 用户换取access_token的code,仅在ErrCode为0时有效
    state 第三方程序发送时用来标识其请求的唯一性的标志,由第三方程序调用sendReq时传入,由微信终端回传,state字符串长度不能超过1K
    lang 微信客户端当前语言
    country 微信用户当前国家信息

    8、通过code获取access_token

    获取第一步的code后,请求以下链接获取access_token:

    https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code  
    

    相关代码参见图片实现onResp:方法,接收返回的响应图。

    参数说明

    参数 是否必须 说明
    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 只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段

    错误返回样例:

    {"errcode":40029,"errmsg":"invalid code"}  
    

    9、获取用户个人信息(UnionID机制)

    获取用户个人信息

    10、最后

    最后,你应该还会有上传用户响应标识到公司后台的需求,这具体的实现就要靠自己的实现了。

    有的同学可能已经发现,一个微信授权需要涉及两个大类,一个登录的controller,一个是AppDelegate,这两个类之间通信,需要代理或者其他设计模式来支持.

    大致流程就是这样,如有错误或不足,欢迎斧正。

    相关文章

      网友评论

      • Bye逝去的青春:目前已经解决直接从微信打开的链接可以直接点击下载APP的跳转,无需再通过另外浏览中打开才能点击下载,在微信中即可直接点击下载,需要的联系Q 7 7 4 0 8 02 6
      • 蛮荒星域:大神,能发个demo吗?我的回调有问题,OnResp代理不执行。模拟器执行了真机没有执行
        蛮荒星域:@刘大帅 我找到原因了。- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url 这个真机上没有支持。模拟器是支持的,所以要在- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation增加回调方法就好了。两个建议都保留。
        刘大帅:@蛮荒星域
        愧不敢当,确实没有Demo...
      • 乌龟的慢生活:请问,保存的唯一信息时access_token吗还是openid
      • wo叫天然呆:那个授权登录界面是哪里来的,我看市面上很多应用的授权界面都不一样,应该不是微信送的,是不是也要我们自己开发?如何开发?在哪里开发?是不是要绑定公众号?
      • jadyn_JT:你好,请问下微信怎么注销登录授权
        陶雨轩:点击退出按钮的时候,直接将你记录的accesstoken 给置为空,下一次请求,如果没有accesstoken ,就向微信请求认证。这样不就重新登录了。
        刘大帅:@风雨骑士 最近没做这方面的,都淡忘了。。。
        jadyn_JT:现在项目需要加上这个功能,但在WX中没找到有这样的方法
      • 水户洋平_Psist:大神 问个问题 现在我们公司做的APP就是个普通APP给普通用户的 我看你的例子里 access_token/refresh_token/appsecretid都存在了客户端 这样做可以吗。
        刘大帅:@水户洋平_Psist 不好意思,不记得了...
      • 大胖_康:大神,还有没有Demo.
        大胖_康:@刘大帅 大神都是直接上代码到项目中的 :smile:
        刘大帅:@69520eb15b8d 这个当时没写demo...
      • f829cbf24d95:大神,能留个联系方式么?
        刘大帅:@iOS_developer92 我也是1年前用过,都淡忘了...
        建议还是多尝试,再仔细看一下微信平台的说明,是不是哪里疏忽了
        f829cbf24d95:@刘大帅 最近在做的app有这个功能,之前没做过,想问你一些问题
        刘大帅:@iOS_developer92 不是大神...有什么要切磋的么?

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

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