微信开放平台开发(3) 移动应用微信登录

article/2025/11/1 12:24:12

在这篇微信公众平台开发教程中,我们将介绍如何使用微信开放平台接口实现移动应用微信登录的功能。

 

移动应用微信登录是基于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返回数据给调用方。

 

返回值说明
ErrCodeERR_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_inaccess_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);

 

 


http://chatgpt.dhexx.cn/article/VONwn8MM.shtml

相关文章

微信开放平台之第三方平台开发,模板小程序如何提交?

大家好,我是悟空码字 12月25日,天气晴朗,阳光普照,今天是圣诞节。因为疫情影响,小羊人的增多,街上放眼望去,人烟稀少。楼下除了几个十一二岁的小男孩在玩耍,也没有像往日老人悠闲打…

微信开放平台第三方开发,注册试用小程序,一整套流程

大家好,我是小悟 对服务商来说,试用小程序的好处不言而喻,主打一个先创建后认证的流程。只需要提供小程序名称和openid便可快速注册一个试用小程序,在认证之前,有效期14天,大致流程如下。 注册试用小程序 …

微信开放平台开发第三方授权登陆(五):微信小程序

微信开放平台开发系列文章: 微信开放平台开发第三方授权登陆(一):开发前期准备 微信开放平台开发第三方授权登陆(二):PC网页端 微信开放平台开发第三方授权登陆(三)&a…

微信开放平台开发-授权、全网发布(PHP)

这两天做了微信开发平台的开发,梳理下。。。 先看看授权的流程: 第一步:接收component_verify_ticket: 1、微信服务器每隔10分钟会向第三方的消息接收地址推送一次component_verify_ticket,拿到后需要在本地做好存储&…

微信开放平台开发——网页微信扫码登录(OAuth2.0)

转自 http://www.cnblogs.com/0201zcr/p/5133062.html 1、OAuth2.0 OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表)&am…

微信开放平台-第三方平台开发配置及常见的问题

目录 概述 参考文档 开源项目&工具 第三方平台设置 问题及解决方法 概述 本实例:第三方平台微信公众号(服务号) 微信开放平台-第三方平台,为广大公众号和小程序提供运营服务和行业解决方案。分两种类型,定制…

微信第三方平台开发(一)

个人感觉微信在第三方平台开发者这块的开发文档写的很不友好,很隐晦,我在开发的过程总结的一些东西,写出来给大家分享一下。恩,就这样吧。 一、注册第三方平台账号 打开https://open.weixin.qq.com/cgi-bin/index?thome/index&…

微信开放平台开发第三方授权登陆(三):Android客户端

微信开放平台开发系列文章: 微信开放平台开发第三方授权登陆(一):开发前期准备 微信开放平台开发第三方授权登陆(二):PC网页端 微信开放平台开发第三方授权登陆(三)&a…

微信开放平台开发第三方授权登陆(二):PC网页端

微信开放平台开发系列文章: 微信开放平台开发第三方授权登陆(一):开发前期准备 微信开放平台开发第三方授权登陆(二):PC网页端 微信开放平台开发第三方授权登陆(三)&a…

.md文件用什么软件打开

记事本-------体验感差 效果: Notepad 毫无疑问的完胜记事本 官网下载地址:https://notepad-plus.en.softonic.com/download (下载速度比较慢) 这是百度网盘:(会快一点点) 链接:ht…

md文件打开方式推荐

MD文件介绍 以下介绍来自于百度: md文件是Markdown语法编写的文件,Markdown是一款轻量级的标记语言,可以使用语法来代替排版,插入公式和图片等都非常的容易,目前很多博客都可以使用该语法去编辑。使用Markdown的好处…

md文件如何打开?

阅读md文件时 常常会手足无措 今天教大家如何打开md文件 当在阅览md文件时,一般系统默认是记事本: 阅览效果极其不佳且编辑体验极差! 今天推荐一款软件:Typora 直接上链接:下载地址(官网) …

Windows下右键新建.md文件教程(转)

Windows下右键新建.md文件教程 转载自Keavnn’Blog,并有些许修正 原本创建.md文件需要首先打开markdown文本编辑器,如Typora,或者新建.txt文件然后修改后缀名,本文介绍了如何在Windows操作系统中添加右键创建.md文件的方法。 环…

md文件使用

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

如何编写md格式的文档、vscode中写.md文件的插件推荐

目录 1. 标题 2. 字体 3. 引用 4. 分割线 5. 图片 6. 超链接 7. 无序列表 8. 有序列表 9. 列表嵌套 10. 表格 11.代码 12. vscode中写.md文件的插件推荐 .md格式的文章可以用编辑器Markdown打开,Markdown是一种纯文本格式的标记语言。通过简单的标记语法…

md文件转换成word文档

md文件转成word文档 Typora导出word文件时需要先下载pandoc Typora导出word文件时因为文档里面有表格,导出失败,所以先使用使用pandoc命令导出无边框表格的word 1.在xxx.md所在文件夹打开命令提示符 2.在命令提示符输入:pandoc -s xxxx.md …

.md文件以及markdown语法书写md文档

.md文件以及markdown语法书写md文档 1. .md文件如何打开2. markdown是什么?2.1 markdown用来干嘛?2.2 怎样书写和读取markdown? 3. markdown语法3.1 基本符号3.2 标题(从大到小取决于#号的数量)3.3 正文3.4 段落3.5 字…

md文档的阅读查看

前言: md文档可以用vscode看,也可以直接拖入浏览器看,但看起来不太好看,效果如下: 改进方法: 方法1、假如你的电脑安装了node.js (1)判断是否安装:WindowsR&#xff0…

如何将md文件完美转化为 PDF?

今天在网上搜kali相关教程时,无意中找到一本很好的教程,但是它是以*.md的文件形式放在github上,我试了将原文件zip下载到本地,但怎么能将.md文件转成PDF文件呢?(如果你用Visual Studio code, 那么安装Markd…

如何编写.md格式文件?

文章目录 如何编写.md格式文件?1.标题2.字体3.插入图片操作4.不带快捷键Markdown书写操作5.Markdown拓展功能6.主题替换 如何编写.md格式文件? md即markdown,百度的解释:Markdown是一种可以使用普通文本编辑器编写的标记语言&…