第三方微信登录 | 静默授权与网页授权的实现
一:介绍
第三方登录有QQ、微信、微博、支付宝等等,如果现在自己的项目中实现这些登录,即可以使用友盟的sdk,也可以一个一个接入,各有各的有点,这里不做赘述。
今天和大家分享的是,在项目中实现微信登录,虽然微信官网给出了接入文档,但是我在接入的过程中,遇到一些问题,在此做出总结以便大家参考。主要讲微信snsapi_base静默授权与snsapi_userinfo网页授权的实现。
二:准备工作
移动应用微信登录是基于OAuth2.0标准协议构建的微信OAuth2.0授权登录系统。
在进行微信OAuth2.0授权登录接入之前,需要完成一下工作才可以开始介接入:
- 在微信开放平台注册开发者帐号;
- 拥有一个已审核通过的移动应用;
- 并获得相应的AppID和AppSecret;
- 申请微信登录且通过审核。
三:授权流程
微信OAuth2.0授权登录目前支持authorization_code模式,适用于拥有server端的应用授权。该模式整体流程为:
- 第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数;
- 通过code参数加上AppID和AppSecret等,通过API换取access_token;
- 通过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操作。
获取access_token时序图:
四:静默授权与网页授权的实现
1. 静默授权与网页授权的区别
网页授权:
req.scope = @"snsapi_userinfo";
静默授权:
req.scope = @"snsapi_base";
snsapi_base与snsapi_userinfo属于微信网页授权获取用户信息的两种作用域:
snsapi_base只能获取access_token和openID
snsapi_userinfo可以获取更详细的用户资料,比如头像、昵称、性别等
2. 获取CODE
再登录按钮的点击事件中写入一下代码:
//构造SendAuthReq结构体SendAuthReq* req =[[[SendAuthReq alloc]init]autorelease];req.scope = @"snsapi_userinfo";req.state = @"123";//第三方向微信终端发送一个SendAuthReq消息结构[WXApi sendReq:req];
在AppDelegate的didFinishLaunchingWithOptions方法中注册:
[WXApi registerApp:@"wx1234567890"];
“wx1234567890”为appid,请更换为自己项目的appid
拉起微信打开授权登录页如下图:
点击确认登陆,授权后回调 WXApiDelegate
-(void)onResp:(BaseReq *)resp
{/*ErrCode ERR_OK = 0(用户同意)ERR_AUTH_DENIED = -4(用户拒绝授权)ERR_USER_CANCEL = -2(用户取消)code 用户换取access_token的code,仅在ErrCode为0时有效state 第三方程序发送时用来标识其请求的唯一性的标志,由第三方程序调用sendReq时传入,由微信终端回传,state字符串长度不能超过1Klang 微信客户端当前语言country 微信用户当前国家信息*/if ([resp isKindOfClass:[SendAuthResp class]]) //判断是否为授权请求,否则与微信支付等功能发生冲突{SendAuthResp *aresp = (SendAuthResp *)resp;if (aresp.errCode== 0){NSLog(@"code %@",aresp.code);[[NSNotificationCenter defaultCenter] postNotificationName:@"wechatDidLoginNotification" object:self userInfo:@{@"code":aresp.code}];}}
}
使用通知,将aresp.code传递到登录页面
3. 通过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
参数说明:
* 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:当且仅当该移动应用已获得该用户的userinfo授权时,才会出现该字段
4. 注意:
建议将Appsecret、用户数据(如access_token)放在App云端服务器,由云端中转接口调用请求:
Appsecret 是应用接口使用密钥,泄漏后将可能导致应用数据泄漏、应用的用户数据泄漏等高风险后果;存储在客户端,极有可能被恶意窃取(如反编译获取Appsecret);
access_token 为用户授权第三方应用发起接口调用的凭证(相当于用户登录态),存储在客户端,可能出现恶意获取access_token 后导致的用户数据泄漏、用户微信相关接口功能被恶意发起等行为;
refresh_token 为用户授权第三方应用的长效凭证,仅用于刷新access_token,但泄漏后相当于access_token 泄漏,风险同上。
要注意网络授权网页授权access_token 与 普通access_token的区别:
- 网页授权的access_token在每次获取openID时一起更新,在接口调用频次限制中为“无上限”;
- 普通access_token一般限制为2000次/日,需要自己保存起来并定时更新。
到这里同时获得access_token和openid,静默授权与网页授权操作都是一样的。根据官网文档,网页授权还可以进一步操作,获取用户更多详细信息。
5. 获取用户个人信息(UnionID机制)
此接口用于获取用户个人信息,开发者可通过OpenID来获取用户基本信息,接口如下:
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID
参数说明:
* access_token:调用凭证
* openid:普通用户的标识,对当前开发者帐号唯一
正确的Json返回结果:
{
"openid":"OPENID",
"nickname":"NICKNAME",
"sex":1,
"province":"PROVINCE",
"city":"CITY",
"country":"COUNTRY",
"headimgurl": "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0",
"privilege":[
"PRIVILEGE1",
"PRIVILEGE2"
],
"unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL"
}
6. 静默授权获取到用户详细资料
在第3步通过snsapi_base,同时获得access_token和openid,
把这里的access_token和openid用于下面接口中:
https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
参数说明:
* access_token:调用凭证
* openid:普通用户的标识,对当前开发者帐号唯一
* lang:国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语,默认为zh-CN
Json返回结果和snsapi_userinfo下获取的用户详情一样。
但是这个方法的前提是同一个公众号内,用户关注了,如果是其他公众号,还是需要用户点击授权的。
希望可以帮助大家,如有问题可加QQ技术交流群: 668562416
如果哪里有什么不对或者不足的地方,还望读者多多提意见或建议如需转载请联系我,经过授权方可转载,谢谢
本篇已同步到个人博客:FBY展菲
欢迎关注我的公众号:网罗开发
第三方微信登录 | 静默授权与网页授权的实现相关推荐
- 企业微信三方开发(三):网页授权登录
其他链接 初识微信开发 企业微信三方开发:注册企业微信服务商 企业微信三方开发(一):回调验证及重要参数获取 企业微信三方开发(二):获取access_token 企业微信三方开发(三):网页授权登录 ...
- 微信授权demo php,PHP微信公众平台oauth2.0网页授权登录类的封装demo
一.微信授权使用的是OAuth2.0授权的方式.主要有以下简略步骤: 第一步:用户同意授权,获取code 第二步:通过code换取网页授权access_token 第三步:拉取用户信息(需scope为 ...
- php订阅号网页登录,微信订阅号怎么使用网页授权登录
微信公众号配置网页授权域名怎么设置? 提示:无法访问banma13.tunnel.phpor.me指向的web服务器(或虚拟主机)打开微信公众平台,输入账号密码登录后台. 如果爱上一个人,请不要炫耀, ...
- 微信公众号开发系列-网页授权获取用户基本信息
OAuth2.0网页授权这个也是在做微信公众平台用到最多的,可以利用授权接口对自己平台内用户进行绑定,实现用户扫描码和微信分享.微信签到.微信商城购物等: 1.高级接口OAuth2.0网页授权设置 a ...
- 微信公众平台oauth2.0 php,微信公众平台oauth2.0网页授权
本篇文章你将学到:在自己做的微信网站里,利用oauth2.0网页授权接口获取用户的信息(openid,姓名,性别,地区,头像等).如大转盘等游戏记录哪个微信用户获得什么奖品.H5等小游戏需要把分数与对 ...
- Java微信公众号开发之网页授权获取用户基本信息
本篇博客讲解的网页授权只需要前端传递一个backUrl(回调地址) 到后台接口,后台接口会完成整个授权流程,无需前端做更多工作: 一. 前言 微信公众号开发,需要用到网页授权获取用户信息,通过OAut ...
- ASP.NET MVC4 微信公众号开发之网页授权(一):搭建基础环境
首先你得注册并认证一个个人或企业的微信公众号===服务号从而确保获得以下接口权限: 然后打开公众号设置里的功能设置里找到业务域名和网页授权域名分别填上你的域名(注:已备案的域名),如下图所示: 到这里 ...
- iOS第三方微信登录时不走回调方法
ios 开发中第三方微信登录时,使用真机测试,授权登录按钮点击后不走微信demo的 -(void)onResp:(BaseResp*)resp 回调方法不走,无法判断是否成功 查看网上一些解决方法,自 ...
- Android App实现第三方微信登录
Android App实现第三方微信登录 Android App实现第三方微信登录 1.下载微信官方最新的sdk,集成到app中.如下图: 2.注册到微信 可以在app的某个Activity的onCr ...
最新文章
- od结构体大小_od内存断点的探析和检测方法
- php flock 超时,php flock失效问题
- Apache common包应用集合
- 《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一2.2.2 如何读入文本输入
- maven + sonar, gradle + sonar
- 电商设计师抢着用的液态水滴素材到底有多酷!
- R语言CRAN软件包Meta分析 1
- 系统架构设计理论与原则、负载均衡及高可用系统设计速记
- 牛顿插值法 matlab程序计算方法,(最新整理)牛顿插值法matlab程序
- window下ruby的下载与gem安装
- SSH智能社区住户信息管理系统
- 是否开启谷歌Ad广告中的搜索网络合作伙伴?
- egret可以用php做后端吗,Egret引擎开发指南之发布项目_node.js
- zimbra邮箱服务器迁移
- Revit中土建模块【精准生梁】快速生成
- STL原理与构建——阅读笔记
- ural 2032 Conspiracy Theory and Rebranding (数学水题)
- 新视觉任务!CVPR 2021 Oral | OWOD:面向开放世界的目标检测
- JavaScript框架比较:AngularJS vs ReactJS vs EmberJS
- 算法岗实习面经-字节跳动 PayPal 寒武纪 OPPO 平安科技等