在进行微信OAuth2.0授权登录接入之前,在微信开放平台注册开发者帐号,并拥有一个已审核通过的移动应用,并获得相应的AppID和AppSecret,申请微信登录且通过审核后,可开始接入流程。我是从产品那里得到的,所以就不写这个步骤了。。。
1、下载SDK
2、将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
Identifier
中填写自定义的文本。
6、向微信终端程序注册第三方应用,并在第三方应用实现从微信返回
在AppDelegate.m中引入"WXApi.h"
头文件,然后
7、请求CODE
在要微信授权登录的controller中引入"WXApi.h"
头文件,编写请求code的代码,如下图:
执行该方法后,如果客户端安装了微信,那么就会向微信请求相应的授权,如图:
当然,实际使用中,还要结合需求做一些变化。因为授权后,诸如token之类的字段,是有有效期的,在有效期范围内,我们是没必要让用户再次授权的,所以,很可能你的实现,会如我下面所写的:
相关情况,参见刷新或续期access_token使用
让AppDelegate遵守<WXApiDelegate>
协议,并实现协议方法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,这两个类之间通信,需要代理或者其他设计模式来支持.
大致流程就是这样,如有错误或不足,欢迎斧正。