【第三方】微信授权登录


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

1、下载SDK

下载地址

【第三方】微信授权登录_第1张图片
下载地址

2、将SDK放入工程

【第三方】微信授权登录_第2张图片
将SDK放入工程

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

3、观察微信API

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

4、补充一些框架

【第三方】微信授权登录_第3张图片
添加一些框架

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

5、添加URL scheme

【第三方】微信授权登录_第4张图片
添加URL TYPE

Identifier中填写自定义的文本。

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

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

【第三方】微信授权登录_第5张图片
向微信终端程序注册第三方应用,并在第三方应用实现从微信返回

7、请求CODE

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

【第三方】微信授权登录_第6张图片
请求CODE

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

向微信请求相应的授权

当然,实际使用中,还要结合需求做一些变化。因为授权后,诸如token之类的字段,是有有效期的,在有效期范围内,我们是没必要让用户再次授权的,所以,很可能你的实现,会如我下面所写的:

【第三方】微信授权登录_第7张图片
请求Code会结合需求扩展变化

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

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

【第三方】微信授权登录_第8张图片
实现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机制)

【第三方】微信授权登录_第9张图片
获取用户个人信息

10、最后

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

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

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

你可能感兴趣的:(【第三方】微信授权登录)