微信开放平台开发(3) 移动应用微信登录
原文:http://www.cnblogs.com/txw1958/p/weixin-applogin.html
在这篇微信公众平台开发教程中,我们将介绍如何使用微信开放平台接口实现移动应用微信登录的功能。
移动应用微信登录是基于OAuth2.0协议标准构建的微信OAuth2.0授权登录系统。
在进行微信OAuth2.0授权登录接入之前,在微信开放平台注册开发者帐号,并拥有一个已审核通过的移动应用,并获得相应的AppID和AppSecret,申请微信登录且通过审核后,可开始接入流程。
1、目前移动应用上微信登录只提供原生的登录方式,需要用户安装微信客户端才能配合使用。
2、对于Android应用,建议总是显示微信登录按钮,当用户手机没有安装微信客户端时,请引导用户下载安装微信客户端。
3、对于iOS应用,考虑到iOS应用商店审核指南中的相关规定,建议开发者接入微信登录时,先检测用户手机是否已安装微信客户端(使用sdk中isWXAppInstalled函数 ),对未安装的用户隐藏微信登录按钮,只提供其他登录方式(比如手机号注册登录、游客登录等)。
授权流程说明
微信OAuth2.0授权登录让微信用户使用微信身份安全登录第三方应用或网站,在微信用户授权登录已接入微信OAuth2.0的第三方应用后,第三方可以获取到用户的接口调用凭证(access_token),通过access_token可以进行微信开放平台授权关系接口调用,从而可实现获取微信用户基本开放信息和帮助用户实现基础开放功能等。
微信OAuth2.0授权登录目前支持authorization_code模式,适用于拥有server端的应用授权。该模式整体流程为:
1. 第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数;
2. 通过code参数加上AppID和AppSecret等,通过API换取access_token;
3. 通过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操作。
获取access_token时序图:
第一步:请求CODE
移动应用微信授权登录
开发者需要配合使用微信开放平台提供的SDK进行授权登录请求接入。正确接入SDK后并拥有相关授权域(scope,什么是授权域?)权限后,开发者移动应用会在终端本地拉起微信应用进行授权登录,微信用户确认后微信将拉起开发者移动应用,并带上授权临时票据(code)。
iOS平台应用授权登录接入代码示例(请参考iOS接入指南):
-(void)sendAuthRequest { //构造SendAuthReq结构体 SendAuthReq* req =[[[SendAuthReq alloc ] init ] autorelease ];req.scope = @"snsapi_userinfo" ;req.state = @"123" ;//第三方向微信终端发送一个SendAuthReq消息结构 [WXApi sendReq:req]; }
Android平台应用授权登录接入代码示例(请参考Android接入指南):
{ // send oauth request Final SendAuth.Req req = new SendAuth.Req();req.scope = "snsapi_userinfo";req.state = "wechat_sdk_demo_test";api.sendReq(req); }
参数说明
参数 | 是否必须 | 说明 |
---|---|---|
appid | 是 | 应用唯一标识,在微信开放平台提交应用审核通过后获得 |
scope | 是 | 应用授权作用域,如获取用户个人信息则填写snsapi_userinfo(什么是授权域?) |
state | 否 | 用于保持请求和回调的状态,授权请求后原样带回给第三方。该参数可用于防止csrf攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加session进行校验 |
返回示例:
appid: wxd477edab60670232 scope: snsapi_userinfo state: wechat_sdk_demo
可拉起微信打开授权登录页:
返回说明
用户点击授权后,微信客户端会被拉起,跳转至授权界面,用户在该界面点击允许或取消,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 | 微信用户当前国家信息 |
第二步:通过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": "OezXcEiiBSKSxW0eoylIeOZ0dfxvb93UyrFdwznvwUv3JkVNVV1yFvQQa3IfuyMi4iZGDsAfe81sCaUXxyKrI-5XgCvhAS02eAC4MF2fJFl80Y9s-0h1EsuBmIVKgu0GnKhxCQ0M8G-gkQAJpzLzmQ","expires_in": 7200,"refresh_token": "OezXcEiiBSKSxW0eoylIeOZ0dfxvb93UyrFdwznvwUv3JkVNVV1yFvQQa3IfuyMiH7dCabGFyMRtZHnHPHuEK78cf1eISYJ4y453T8pDa2tFAIJu8bFeLMBpeFSv9dgnGrK-ZfRxHzhq7IW4qevEMQ","openid": "oH9d2v7NmDhsFzICG63UPSIOgUcY","scope": "snsapi_userinfo","unionid": "o4wcnwx0BVC4F_hSl5qCd5rC4Jps" }
参数说明
参数 | 说明 |
---|---|
access_token | 接口调用凭证 |
expires_in | access_token接口调用凭证超时时间,单位(秒) |
refresh_token | 用户刷新access_token |
openid | 授权用户唯一标识 |
scope | 用户授权的作用域,使用逗号(,)分隔 |
unionid | 当且仅当该移动应用已获得该用户的userinfo授权时,才会出现该字段 |
获取用户个人信息(UnionID机制)
接口说明
此接口用于获取用户个人信息。开发者可通过OpenID来获取用户基本信息。特别需要注意的是,如果开发者拥有多个移动应用、网站应用和公众帐号,可通过获取用户基本信息中的unionid来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号,用户的unionid是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,unionid是相同的。请注意,在用户修改微信头像后,旧的微信头像URL将会失效,因此开发者应该自己在获取用户信息后,将头像图片保存下来,避免微信头像URL失效后的异常情况。
请求说明
http请求方式: GET
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID
参数说明
参数 | 是否必须 | 说明 |
---|---|---|
access_token | 是 | 调用凭证 |
openid | 是 | 普通用户的标识,对当前开发者帐号唯一 |
lang | 否 | 国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语,默认为zh-CN |
{"openid": "oH9d2v7NmDhsFzICG63UPSIOgUcY","nickname": "方倍","sex": 0,"language": "zh_CN","city": "","province": "","country": "CN","headimgurl": "http://wx.qlogo.cn/mmopen/pburdzLK7PUTcFw3ozK52Gravkznno51DSjnqnzsG6WzJLUOtadGBYYSVqh5YDicdawxrD6hHoR96OcyyDWAEgA/0","privilege": [],"unionid": "o4wcnwx0BVC4F_hSl5qCd5rC4Jps" }
参数说明
参数 | 说明 |
---|---|
openid | 普通用户的标识,对当前开发者帐号唯一 |
nickname | 普通用户昵称 |
sex | 普通用户性别,1为男性,2为女性 |
province | 普通用户个人资料填写的省份 |
city | 普通用户个人资料填写的城市 |
country | 国家,如中国为CN |
headimgurl | 用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空 |
privilege | 用户特权信息,json数组,如微信沃卡用户为(chinaunicom) |
unionid | 用户统一标识。针对一个微信开放平台帐号下的应用,同一用户的unionid是唯一的。 |
完整PHP SDK
class class_app {var $appid = APPID;var $appsecret = APPSECRET;//构造函数public function __construct($appid = NULL, $appsecret = NULL){if($appid && $appsecret){$this->appid = $appid;$this->appsecret = $appsecret;}}//通过code获取access_tokenpublic function oauth2_access_token($code){$url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=".$this->appid."&secret=".$this->appsecret."&code=".$code."&grant_type=authorization_code";$res = $this->http_request($url);return json_decode($res, true);}//获取用户个人信息(UnionID机制)public function oauth2_get_user_info($access_token, $openid){$url = "https://api.weixin.qq.com/sns/userinfo?access_token=".$access_token."&openid=".$openid."&lang=zh_CN";$res = $this->http_request($url);return json_decode($res, true);}//HTTP请求(支持HTTP/HTTPS,支持GET/POST)protected function http_request($url, $data = null){$curl = curl_init();curl_setopt($curl, CURLOPT_URL, $url);curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);if (!empty($data)){curl_setopt($curl, CURLOPT_POST, 1);curl_setopt($curl, CURLOPT_POSTFIELDS, $data);}curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);$output = curl_exec($curl);curl_close($curl);return $output;}//日志记录private function logger($log_content){if(isset($_SERVER['HTTP_APPNAME'])){ //SAEsae_set_display_errors(false);sae_debug($log_content);sae_set_display_errors(true);}else if($_SERVER['REMOTE_ADDR'] != "127.0.0.1"){ //LOCAL$max_size = 500000;$log_filename = "log.xml";if(file_exists($log_filename) and (abs(filesize($log_filename)) > $max_size)){unlink($log_filename);}file_put_contents($log_filename, date('Y-m-d H:i:s').$log_content."\r\n", FILE_APPEND);}} }
调用方法
/*方倍工作室 http://www.fangbei.org/CopyRight 2014 All Rights Reserved微信开放平台 移动应用 (微信登录) */ header("Content-type: text/html; charset=utf-8");define('APPID', "wx3f05f4b79761d123"); define('APPSECRET', "9acc222b92afb29cff90b9bcfc7d6080");$code = "041359a1b393c92a5a509ce24e2ef50f";$weixin = new class_app(); var_dump($weixin);//传入授权临时票据(code) $oauth2_info = $weixin->oauth2_access_token($code); var_dump($oauth2_info);$result = $weixin->oauth2_get_user_info($oauth2_info['access_token'], $oauth2_info['openid']); var_dump($result);
微信开放平台开发(3) 移动应用微信登录相关推荐
- 微信开放平台开发第三方授权登陆(三):Android客户端
微信开放平台开发系列文章: 微信开放平台开发第三方授权登陆(一):开发前期准备 微信开放平台开发第三方授权登陆(二):PC网页端 微信开放平台开发第三方授权登陆(三):Android客户端 微信开放平 ...
- 微信开放平台开发第三方授权登陆(二):PC网页端
微信开放平台开发系列文章: 微信开放平台开发第三方授权登陆(一):开发前期准备 微信开放平台开发第三方授权登陆(二):PC网页端 微信开放平台开发第三方授权登陆(三):Android客户端 微信开放平 ...
- 微信开放平台开发第三方授权登陆
本文转载自网络,原文链接https://blog.csdn.net/qq_34190023/article/details/81133619 目录 一.前期准备流程 二.具体实现步骤 1.注册邮箱账号 ...
- 微信公众开放平台开发07---java servlet 实现微信开发第一步:微信服务器验证
微信公众开放平台开发07---java servlet 实现微信开发第一步:微信服务器验证 技术qq交流群:JavaDream:251572072 ------------------------- ...
- 微信开放平台开发常见错误(长期更新)
微信开放平台开发常见错误 在开发微信第三方平台的时候,会常见一下错误码 42001: 获取access token超时,一般都是第三方平台的access Token失效导致的 47001: data ...
- 微信开放平台开发 Tp5 + easyweichat3.X
微信开放平台开发 Tp5 + easyweichat3.X 需求 总流程 授权 流程 1.公众号管理员登录我们的授权网站 2. 进入微信官方授权网站 3. 公众号管理员微信扫描二维码. 4.点击授权 ...
- 视频教程-微信公众平台开发实战PHP版-微信开发
微信公众平台开发实战PHP版 互联商通创始人/架构师, 在IT领域摸爬滚打20年的全栈老程序员(架构师.培训讲师).熟悉iOS.Android及LNMP的架构下快速开发互联网相关项目.精通微信和支付宝 ...
- 微信公众平台开发(二) 微信公众平台示例代码分析
http://www.cnblogs.com/mchina/archive/2013/06/07/3120592.html 微信公众平台开发(二) 微信公众平台示例代码分析 一.摘要 微信公众平台提供 ...
- 微信开放平台开发——网页微信扫码登录(OAuth2.0)
1.OAuth2.0 OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. 允许用户提供 ...
最新文章
- java 正则表达式 非贪婪模式_详解正则表达式的贪婪模式与非贪婪模式
- Matlab学习笔记——数据文件定位
- 正则匹配所有包括换行符
- 计算机领域认知个人陈述,计算机专业个人陈述十九
- 高效的深度学习:将深度学习模型变得更小、更快、更好的综述
- ajax请求l类型,jquery 的ajax请求示例和注意事项
- 6-51单片机ESP8266学习-AT指令(8266TCP服务器--做自己的AndroidTCP客户端发信息给单片机控制小灯的亮灭)...
- Java多线程基础学习一:线程的6种状态和相互转化
- Spring Cloud Alibaba基础教程:Nacos的数据持久化 1
- Leetcode每日一题: 1.two-sum(两数之和)
- 读《学习JavaScript数据结构与算法》 第二章
- Typescript 类型的常用知识与技能
- FTP、WEB虚拟目录作用
- 如何在iPhone或Mac上自定义共享菜单?
- Unity性能优化之Resources System
- 华为android7.0 root,华为荣耀畅玩6X EMUI5.0 7.0 root教程 荣耀6X获取7.0的root权限
- OSChina 周三乱弹 ——我们IT工程师会缺女友?
- bat 链接mysql数据库_使用bat脚本进行数据库操作
- 高翔视觉SLAM十四讲(第二版)各种软件、库安装的以及报错解决方法
- ajax xmlhttp下open方法POST、GET参数的区别
热门文章
- 检验方法的验证、确认步骤及详细计算方法
- 基于tesseract_ocr实现图片中汉字辨识
- 知识图谱学习(一)(笔记整理)
- “No JSON object could be decoded“问题定位
- 苹果4如何添加时间插件_Pr快速批量制作和添加字幕,节省时间还不用插件的做法...
- 聚观早报|苹果默认不再接受隔空投送;Mete被裁员工将获薪水补偿
- 华硕服务器系统安装win7系统教程,华硕K751 U盘装系统win7教程
- iOS小技能:app侧登录流程【上篇】 (前置知识)
- 模型检测--工具PRISM
- python 修改图片尺寸 留白_php 图片指定留白叠加缩放