微信第三方登录

article/2025/10/10 2:44:00

微信第三方登录

步骤:

1.申请你的AppID

请到微信开放平台https://open.weixin.qq.com/注册成为开发者,然后创建应用并提交审核,只有审核通过的应用才能进行开发。

2.下载SDK及API文档

Android Studio环境下:

在build.gradle文件中,添加如下依赖即可:

dependencies {compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:1.0.2'
}

dependencies {compile 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:1.0.2'
}

(其中,前者包含统计功能)

3.在代码中使用开发工具包

[1] AndroidManifest.xml 设置

添加必要的权限支持:

<uses-permission android:name="android.permission.INTERNET"/>

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>


[2] 注册到微信

要使你的程序启动后微信终端能响应你的程序,必须在代码中向微信终端注册你的id。(如下图所示,可以在程序入口Activity的onCreate回调函数处,或其他合适的地方将你的应用id注册到微信。注册函数示例如下图所示。

[3] 发送请求或响应到微信

现在,你的程序要发送请求或发送响应到微信终端,可以通过IWXAPI的 sendReq 和 sendResp 两个方法来实现。

boolean sendReq(BaseReq req);

sendReq是第三方app主动发送消息给微信,发送完成之后会切回到第三方app界面。

boolean sendResp(BaseResp resp);

sendResp是微信向第三方app请求数据,第三方app回应数据之后会切回到微信界面。

sendReq的实现示例,如下图所示:

需要注意的是,SendMessageToWX.Req的scene成员,如果scene填WXSceneSession,那么消息会发送至微信的会话内。如果scene填WXSceneTimeline(微信4.2以上支持,如果需要检查微信版本支持API的情况, 可调用IWXAPI的getWXAppSupportAPI方法,0x21020001及以上支持发送朋友圈),那么消息会发送至朋友圈。scene默认值为WXSceneSession。

sendResp的实现与SendReq类似,如下图所示:

具体要发送的内容由第三方app开发者定义,这里需要说一下,为了实现第三方登陆,这里请求是这样的:

微信登录的官方文档将微信登录分为3个步骤:

{// send oauth request Final SendAuth.Req req = new SendAuth.Req();req.scope = "snsapi_userinfo";req.state = "wechat_sdk_demo_test";api.sendReq(req);}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

用这段代码向微信开放平台请求授权码code,可拉起微信并打开授权登录页(前提是你安装了微信应用并已登录,未登录的会引导你先登录),如下图:

1.如果微信授权页不显示,请检查你的APP签名是否和你在腾讯开放平台的APP签名一致,不一致可修改腾讯开放平台中的APP签名,修改后重装微信或清除微信数据后重试。

2.在你的包名相应目录下新建一个wxapi目录,并在该wxapi目录下新增一个WXEntryActivity类,该类继承自Activity(例如应用程序的包名为net.sourceforge,则新的包名为:net.sourceforge.wxapi),此处应注意包名不要弄错,新增类的名字必须为WXEntryActivity,如下图示:

并在manifest文件里面加上exported属性,设置为true,例如:

返回说明 
用户点击授权后,微信客户端会被拉起,跳转至授权界面,用户在该界面点击允许或取消,SDK通过SendAuth的Resp返回数据给调用方。通过IWXAPIEventHandler接口的onReq方法进行回调,类似的,应用请求微信的响应结果将通过onResp回调,如下:

@Overridepublic void onResp(BaseResp resp) {int errorCode = resp.errCode;switch (errorCode) {case BaseResp.ErrCode.ERR_OK://用户同意String code = ((SendAuth.Resp) resp).code;  //code:授权码break;case BaseResp.ErrCode.ERR_AUTH_DENIED://用户拒绝break;case BaseResp.ErrCode.ERR_USER_CANCEL://用户取消break;default:break;}ToastUtil.showMessageLong(this, resp.errStr);}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

客户端收到授权码后,向自己的服务器发起登录请求,并附带收到的授权码code ,可以通过code获取access_token(建议在自己服务器端获取)

获取access_token链接为

https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

得到的Json对象解析为:

 		JSONObject object = new JSONObject(sb.toString().trim());accessToken = object.getString("access_token");openID = object.getString("openid");refreshToken = object.getString("refresh_token");expires_in = object.getLong("expires_in");

参数说明:

参数        是否必须        说明 
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"
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
    参数                              说明
access_token                    接口调用凭证
expires_in  access_token        接口调用凭证超时时间,单位(秒)
refresh_token                   用户刷新access_token
openid                          授权用户唯一标识
scope                           用户授权的作用域,使用逗号(,)分隔
unionid          只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。
错误返回样例:
{"errcode":40029,"errmsg":"invalid code"}
客户端可利用access_token获取微信用户信息,但进行接口调用,有以下前提:
  1. access_token有效且未超时;
  2. 微信用户已授权给第三方应用帐号相应接口作用域(scope)。
授权作用域(scope)             接口                接口说明
snsapi_base       /sns/oauth2/access_token     通过code换取              access_token、refresh_token和已授权scope/sns/oauth2/refresh_token  刷新或续期access_token使用/sns/auth                  检查access_token有效性
snsapi_userinfo    /sns/userinfo               获取用户个人信息

其中snsapi_base属于基础接口,若应用已拥有其它scope权限,则默认拥有snsapi_base的权限。使用snsapi_base可以让移动端网页授权绕过跳转授权登录页请求用户授权的动作,直接跳转第三方网页带上授权临时票据(code),但会使得用户已授权作用域(scope)仅为snsapi_base,从而导致无法获取到需要用户授权才允许获得的数据和基础功能。

以获取用户信息举例:

private void getUserInfo() {if (isAccessTokenIsInvalid() && System.currentTimeMillis() < expires_in) {String uri = "https://api.weixin.qq.com/sns/userinfo?access_token=" + accessToken + "&openid=" + openID;HttpClient client = new DefaultHttpClient();HttpGet get = new HttpGet(URI.create(uri));try {HttpResponse response = client.execute(get);if (response.getStatusLine().getStatusCode() == 200) {BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8"));StringBuilder builder = new StringBuilder();for (String temp = reader.readLine(); temp != null; temp = reader.readLine()) {builder.append(temp);}JSONObject object = new JSONObject(builder.toString().trim());String nikeName = object.getString("nickname");}} catch (ClientProtocolException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (JSONException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

重复登录

假设用户已经获得授权,则下次登录时只需要验证access_token是否有效,无效则重新获取授权,有效则无需重新获得授权。

1.用户向自己的服务器请求登录,登录方式为微信登录,附带上次登录返回的的access_token

2.服务器收到用户的登录请求,向微信开放平台发送access_token是否有效的验证请求如下

private boolean isAccessTokenIsInvalid() {String url = "https://api.weixin.qq.com/sns/auth?access_token=" + accessToken + "&openid=" + openID;URI uri = URI.create(url);HttpClient client = new DefaultHttpClient();HttpGet get = new HttpGet(uri);HttpResponse response;try {response = client.execute(get);if (response.getStatusLine().getStatusCode() == 200) {HttpEntity entity = response.getEntity();BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent(), "UTF-8"));StringBuilder sb = new StringBuilder();for (String temp = reader.readLine(); temp != null; temp = reader.readLine()) {sb.append(temp);}JSONObject object = new JSONObject(sb.toString().trim());int errorCode = object.getInt("errcode");if (errorCode == 0) {return true;}}} catch (ClientProtocolException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (JSONException e) {// TODO Auto-generated catch blocke.printStackTrace();}return false;}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

返回说明

正确的Json返回结果:
{ 
"errcode":0,"errmsg":"ok"
}
错误的Json返回示例:
{ 
"errcode":40003,"errmsg":"invalid openid"
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

如果access_token有效,服务端将信息返回给客户端,客户端成功登录。

如果access_token无效,服务端向微信开放平台发送刷新access_token的请求如下:

access_token是调用授权关系接口的调用凭证,由于access_token有效期(目前为2个小时)较短,当access_token超时后,可以使用refresh_token进行刷新,access_token刷新结果有两种:

1.若access_token已超时,那么进行refresh_token会获取一个新的access_token,新的超时时间; 
2.若access_token未超时,那么进行refresh_token不会改变access_token,但超时时间会刷新,相当于续期access_token。

refresh_token拥有较长的有效期(30天),当refresh_token失效的后,需要用户重新授权。

private void refreshAccessToken() {String uri = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=" + ShareUtil.APP_ID + "&grant_type=refresh_token&refresh_token="+ refreshToken;HttpClient client = new DefaultHttpClient();HttpGet get = new HttpGet(URI.create(uri));try {HttpResponse response = client.execute(get);if (response.getStatusLine().getStatusCode() == 200) {BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8"));StringBuilder builder = new StringBuilder();for (String temp = reader.readLine(); temp != null; temp = reader.readLine()) {builder.append(temp);}JSONObject object = new JSONObject(builder.toString().trim());accessToken = object.getString("access_token");refreshToken = object.getString("refresh_token");openID = object.getString("openid");expires_in = object.getLong("expires_in");}} catch (ClientProtocolException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (JSONException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

返回说明

正确的返回:
{ 
"access_token":"ACCESS_TOKEN", 
"expires_in":7200, 
"refresh_token":"REFRESH_TOKEN", 
"openid":"OPENID", 
"scope":"SCOPE" 
}
参数                    说明
access_token       接口调用凭证
expires_in        access_token接口调用凭证超时时间,单位(秒)
refresh_token     用户刷新access_token
openid           授权用户唯一标识
scope          用户授权的作用域,使用逗号(,)分隔错误返回样例:
{
"errcode":40030,"errmsg":"invalid refresh_token"
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

3.服务端获取到新的access_token等信息,并返回给客户端,客户端成功登录或者重新获取授权。

注意事项

[1]如果需要混淆代码,为了保证sdk的正常使用,需要在proguard.cfg加上下面两行配置:


-keep class com.tencent.mm.opensdk.** {

   *;

}

-keep class com.tencent.wxop.** {

   *;

}

-keep class com.tencent.mm.sdk.** {

   *;

}

[2]如果需要运行SDK Sample工程,需要通过指定的debug.keystore来进行签名:

Android Studio环境下:

signingConfigs {debug {storeFile file("../debug.keystore")}
}


Eclipse环境下:

请查阅文档《如何运行SDK Demo工程》


至此,你已经能使用微信Android开发工具包的API内容了。如果想更详细了解每个API函数的用法,请查阅 Android 平台参考手册 或自行下载阅读微信SDK Sample Demo源码。

微信SDK Sample Demo源码

参考博文:http://blog.csdn.net/luoyan973387349/article/details/49815225

官网接口地址:开发前需要知道的那些事   、   集成前资源配置    、    授权后接口调用(重)


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

相关文章

流程图了解微信第三方登录

1.首先是&#xff0c;浏览器显示微信登录 2.用户扫描&#xff0c;发送请求到微信服务器&#xff0c;前端也会发送一个请求到自己的后台服务器&#xff0c;后台服务器提供微信服务器获取第三方验证授权地址&#xff0c;携带回调路径 3.微信服务器验证成功&#xff0c;返回code…

Oracle官网下载JDK

进入Oracle官网&#xff1a;https://www.oracle.com/index.html 1、选择support&#xff08;支持&#xff09;software Download 2、选择 java 3、选择jdk 4、拉到底选择java archive&#xff08;档案文件&#xff09; 5、选择要下载的版本

解决JDK官网下载龟速的问题

在JDK的官网下载JDK时还需要登录Oracle 且下载的时候那速度相当缓慢 可以使用华为的镜像下载&#xff0c;超快的 下载仓库地址&#xff1a;x​​​​​​​ Index of java-local/jdk

如何在官网下载java JDK

1.打开Oracle官网&#xff0c;准备下载java JDK (下载时需要使用注册用户登陆&#xff0c;可以免费注册) 官网地址&#xff1a;http://www.oracle.com/ 登录Oracle账号 选择适合自己的JDK版本 选择适合的版本 勾选 下载

JDK1.8u162以及JDK1.8所有历史版本官网下载地址

很多网友想看JDK1.8里面所有的版本&#xff0c;今天我就给大家带来了所以JDK1.8版本的官方下载地址&#xff0c;其中包括Windows版本和Linux版本 JDK1.8所有版本官网下载链接 Java Archive Downloads - Java SE 8 Attention!!! Java Archive | Oraclehttps://www.oracle.c…

JDK 的 ORACLE 官网下载步骤

下面以下载 jdk-8u181-linux-x64.tar.gz 为例&#xff0c;说明下在 ORACLE官网下载的具体步骤 1、进入oracle官网–>Resource–>Software Downloads&#xff0c;如下截图&#xff1a; 2、进入页面后&#xff0c;下滑选择“java”&#xff0c;然后点击“Java(JDK) for De…

eclipse jdk官网下载不了

最近在学习java的简单语法&#xff0c;在下载eclipse时受挫&#xff0c;通过浏览器怎么都下载不下来。 最后&#xff0c;我是通过迅雷下载的&#xff0c;速度杠杠滴。哈哈&#xff0c;莫名给迅雷打个call。 1、eclipse下载地址&#xff1a;https://www.eclipse.org/downloads…

JDK官网下载与安装过程

一、JRE与JDK介绍 java是当前比较流行的一种编程语言&#xff0c;当我们开始学习java的时候肯定会先要安装jdk&#xff0c;然后进行环境变量控制。 JRE(Java Runtime Environment ) Java运行环境&#xff0c;用来运行JAVA程序的。 JDK(Java Development Kit) Java开发工具包&…

ubuntu下载安装jdk

1.首先进入Oracle官网 2.点击Products中的Software中的Java 3.下拉到如下位置&#xff0c;点击Oracle JDK 4.进入后选择自己所想要的版本&#xff0c;这里我选择Java SE8版本的jdk 5.下拉页面&#xff0c;这里我选择LInux x64位版本的压缩包文件&#xff0c;点击右侧下载 …

Oracle官网 JDK下载 注册登录公共账号和密码

目录 问题现象&#xff1a; 问题分析&#xff1a; 解决方法&#xff1a; 备注&#xff1a; 问题现象&#xff1a; 今天打算去下载一个linux版本的JDK8&#xff0c;于是去了Oracle官网下载&#xff0c;结果发现要注册登录&#xff01;&#xff01;&#xff01;我记得以前是不…

jdk官网下载账号登陆

目前jdk官网下载需要登陆才能进行下载 解决方案&#xff1a;下面为大家提供一个可以免费使用的账号和密码 账号&#xff1a;1985479344qq.com密码&#xff1a;Oracle123

官网下载 jdk1.7

官网下载 jdk1.7 下载地址&#xff1a;http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-521261.html#jdk-7u80-oth-JPR

JDK1.8官网下载安装以及配置环境变量教程(官网)

JDK是 Java 语言的软件开发工具包&#xff0c;主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心&#xff0c;它包含了JAVA的运行环境&#xff08;JVMJava系统类库&#xff09;和JAVA工具。 一、JDK下载 1.百度搜索jdk或者Oracle官网&#xff0c;点击进…

JDK各版本下载官网链接

https://www.oracle.com/java/technologies/downloads/archive/

官网下载Android Studio以及SDK

Android Studio下载以及SDK配置&#xff08;官网配置&#xff0c;更安全&#xff09; 一、 首先&#xff0c;推荐官网下载Android Studio&#xff0c;真的安全好多。而且&#xff0c;他是免费下载的开发工具&#xff0c;所以放心大胆的下载。 二、关于下载&#xff0c;推荐官…

Android SDK的下载与安装(Windows)

1、下载Android SDK Tools 下载地址&#xff1a;https://www.androiddevtools.cn/ 找到SDK Tools&#xff0c;选择最新的zip版本&#xff0c;下载解压至任意路径&#xff08;不要有中文&#xff09; 2.进入文件&#xff0c;双击启动“SDK Manager” 2.1 Tools的下载以下三个…

[原创]Android SDK下载(Linux下载SDK最新教程2020.11.26)

Centos下载安装最新Android SDK 最近项目需要自动化拉取Gitee上Android项目的代码并编译打包&#xff08;CI/CD&#xff09;&#xff0c;但是编译安卓项目的前提要在服务器上安装SDK&#xff08;不是通过Android Studio安装&#xff09;&#xff0c;但是网上查到的版本最新也只…

各SDK下载地址

目录 1.华为广告 2.华为支付 3.Adjust 4.Firebase 5.友盟 6.Facebook 7.Admob 8.tradPlus 9.OneSignal推送 10.quick 11.TopOn 12.talkingData 13.appflyer 14.穿山甲 15.Flurry 1.华为广告 文档中心https://developer.huawei.com/consumer/cn/doc/android-sdk-…

android-sdk-windows版本下载

Android SDK 4.0.3 开发环境配置及运行 最近又装了一次最新版本的ADK环境 目前最新版是Android SDK 4.0.3 本文的插图和文本虽然是Android2.2的 步骤都是一样的&#xff0c;如果安装的过程中遇到什么问题&#xff0c;可以留言&#xff0c;我会尽快回复&#xff01; 系统环境的要…

android sdk manager 快速下载sdk

1、在sDK 中选中要下载的版本&#xff1a; 2、使用国内映像升级 万恶的GFW&#xff0c;android sdk manager通过google的url下载sdk卡成翔了&#xff0c;在网上找了几个国内镜像&#xff0c;亲测可用。 Android SDK在线更新镜像服务器&#xff1a; 中国科学院开源协会镜像站…