Android APP开发集成微信登陆流程(手把手新手版)

 本文比较适合新手玩家,老玩家就不要看了

昨天整了下微信登陆,乍一看官方文档还有点难懂!遂自己整理了下流程,给大家参考参考。

官方文档链接:准备工作 | 微信开放文档微信开发者平台文档icon-default.png?t=N7T8https://developers.weixin.qq.com/doc/oplatform/Mobile_App/WeChat_Login/Development_Guide.html

第一步 :申请应用AppID

申请地址:微信开放平台icon-default.png?t=N7T8https://open.weixin.qq.com注意事项:包名和签名信息一定不能错,错了拉不起微信!应用通过审核了才能进行测试。

第二步:项目添加依赖

在app的build.grade文件里添加微信的依赖。至此,微信已经成功集成了

dependencies {//微信implementation 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'
}

第三步:请求调用微信登陆

在需要调用微信登陆的地方调用下面方法,参数【你的微信appid】换成你自己的,第一步注册的那个就是这个玩意。

private void wcLogin() {//发起登陆请求前先注册微信apiIWXAPI api = WXAPIFactory.createWXAPI(this,“你的微信appid”,true);api.registerApp(“你的微信appid”);if (!api.isWXAppInstalled()){//todo 提醒未安装微信return;}//开始发起登陆请求final SendAuth.Req req = new SendAuth.Req();req.scope = "snsapi_userinfo";req.state = "自定义state";api.sendReq(req);}

第四步:创建微信回调的Activity

Activity路径一定要为:你的包名+/wxapi/WXEntryActivity

例如我的包名是:com.aaa.bbb

那么回调activity的路径就是com.aaa.bbb.wxapi.WXEntryActivity

该Activity需要实现IWXAPIEventHandler的接口。

然后在注册文件AndroidManifest.xml中注册该Activity

        <activityandroid:name=".wxapi.WXEntryActivity"android:exported="true"android:launchMode="singleTask"><meta-dataandroid:name="android.app.lib_name"android:value="" /></activity>

exported属性一定要为true!另外注册文件AndroidManifest.xml中在权限下方添加安装包查询的请求权限,否则新版本无法检查出是否安装微信,直接拉不起来。

    <uses-permission android:name="android.permission.INTERNET" /><!-- 方案2 --><queries><package android:name="com.tencent.mm" /></queries>

activity代码

package com.aaa.bbb.wxapi;import androidx.appcompat.app.AppCompatActivity;import com.tencent.mm.opensdk.modelbase.BaseReq;
import com.tencent.mm.opensdk.modelbase.BaseResp;
import com.tencent.mm.opensdk.modelmsg.SendAuth;
import com.tencent.mm.opensdk.openapi.IWXAPI;
import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler;
import com.tencent.mm.opensdk.openapi.WXAPIFactory;import okhttp3.Response;public class WXEntryActivity extends Activity  implements IWXAPIEventHandler {@Overridepublic void onReq(BaseReq baseReq) {}@Overridepublic void onResp(BaseResp baseResp) {switch (baseResp.errCode){case BaseResp.ErrCode.ERR_OK://拉起微信成功break;case BaseResp.ErrCode.ERR_AUTH_DENIED://("授权出错");break;case BaseResp.ErrCode.ERR_USER_CANCEL://"用户取消登陆"break;default:break;}}}

第五步:获取微信的Token 

到这一步我们已经成功的拉起微信了,如果没有成功,检查下签名和包名是否和开放平台的填写一致,是否添加了<queries>权限,或者acitivty的expoted是否为ture等,都有可能导致拉不起微信。

接下来我们开始获取token

在case BaseResp.ErrCode.ERR_OK:中,

getAccessToken(((SendAuth.Resp)baseResp).code);
private void getAccessToken(String code) {//binding.tvLogin.setText("获取token中");String url  = "https://api.weixin.qq.com/sns/oauth2/access_token?"+"appid="+“你的appid”+"&secret="+“你的appSecret”+"&code="+code+"&grant_type=authorization_code";//todo 这个get请求自己封装吧HttpUtil.getInstance().doGet(url, new HttpUtil.CallBack() {@Overridepublic void success(String jsong) {log("请求token:"+jsong);Gson gson = new Gson();
//todo 这个bean也自己解析吧WXAccessTokenBean bean = gson.fromJson(jsong,WXAccessTokenBean.class);if (isEmpty(bean.getErrMsg())){refreshToken(bean);}else {loginFail(bean.getErrCode()+bean.getErrMsg());}}@Overridepublic void failed(Exception e) {loginFail("获取token失败:"+e.toString());}});
}

如代码中所示,把【你的appid】换成步骤1中的appid,然后步骤一通过审核后可以创建appSecret,创建好之后记得保存,他只显示一次;然后填到代码中【你的appSecret】位置。

 第六步:刷新Token

官方文档说token有效期是2个小时,本人开始测试的时候,这个操作没做也能做第七步,但本着严谨的原则,还是按官方操作吧。官方说这个刷新操场相当于对token进行一个续时。

    private void refreshToken(WXAccessTokenBean bean) {binding.tvLogin.setText("刷新token中");String url  = "https://api.weixin.qq.com/sns/oauth2/refresh_token?"+"appid="+“你的appid”+"&grant_type=refresh_token"+"&refresh_token="+bean.getRefreshToken();HttpUtil.getInstance().doGet(url, new HttpUtil.CallBack() {@Overridepublic void success(String jsong) {log("刷新token:"+jsong);Gson gson = new Gson();WXAccessTokenBean bean1 = gson.fromJson(jsong,WXAccessTokenBean.class);if (isEmpty(bean1.getErrMsg())){getUerInfo(bean1);}else {getUerInfo(bean);}}@Overridepublic void failed(Exception e) {getUerInfo(bean);}});}

所以,这一步如果成功了,我就用新的bean1去请求微信用户数据,如果失败了,我就用第五步的bean去请求了。。

第七步:获取微信用户数据

private void getUerInfo(WXAccessTokenBean bean) {binding.tvLogin.setText("获取微信用户信息中");String url  = "https://api.weixin.qq.com/sns/userinfo?"+"access_token="+bean.getAccessToken()+"&openid="+bean.getOpenid();HttpUtil.getInstance().doGet(url, new HttpUtil.CallBack() {@Overridepublic void success(String jsong) {Gson gson = new Gson();log("请求用户信息:"+jsong);WXUserInfoBean bean1 = gson.fromJson(jsong,WXUserInfoBean.class);if (isEmpty(bean1.getErrMsg())){loginByWx(bean1);}else {loginFail("获取用户信息失败:"+bean1.getErrCode()+bean1.getErrMsg());}}@Overridepublic void failed(Exception e) {loginFail("获取用户信息失败:"+e.toString());}});}

获取到的bean依旧大家自己去解析吧。

第八步:用获取到的微信数据调取自己服务器的登陆注册结果

获取到了这些就可以用获取的数据去调起自己服务器的登陆注册接口了。

附录:

最后本人良心发现,还是把bean附上吧,如果参考我的这个集成成功了,记得留个言哦,这样我才会有点动力

WXAccessTokenBean
package com.aaa.bbb.beans;import com.google.gson.annotations.SerializedName;public class WXAccessTokenBean {@SerializedName("errcode")private String errCode;@SerializedName("errmsg")private String errMsg;public String getErrCode() {return errCode;}public String getErrMsg() {return errMsg;}@SerializedName("access_token")private String accessToken;@SerializedName("expires_in")private Integer expiresIn;@SerializedName("refresh_token")private String refreshToken;@SerializedName("openid")private String openid;@SerializedName("scope")private String scope;@SerializedName("unionid")private String unionid;public String getAccessToken() {return accessToken;}public Integer getExpiresIn() {return expiresIn;}public String getRefreshToken() {return refreshToken;}public String getOpenid() {return openid;}public String getScope() {return scope;}public String getUnionid() {return unionid;}}

 WXUserInfoBean

package com.aaa.bbb.beans;import com.google.gson.annotations.SerializedName;import java.util.List;public class WXUserInfoBean {@SerializedName("errcode")private String errCode;@SerializedName("errmsg")private String errMsg;public String getErrCode() {return errCode;}public String getErrMsg() {return errMsg;}@SerializedName("openid")private String openid;@SerializedName("nickname")private String nickname;@SerializedName("sex")private Integer sex;@SerializedName("language")private String language;@SerializedName("city")private String city;@SerializedName("province")private String province;@SerializedName("country")private String country;@SerializedName("headimgurl")private String headimgurl;@SerializedName("privilege")private List<?> privilege;@SerializedName("unionid")private String unionid;public String getOpenid() {return openid;}public String getNickname() {return nickname;}public Integer getSex() {return sex;}public String getLanguage() {return language;}public String getCity() {return city;}public String getProvince() {return province;}public String getCountry() {return country;}public String getHeadimgurl() {return headimgurl;}public List<?> getPrivilege() {return privilege;}public String getUnionid() {return unionid;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/626910.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

晶圆表面缺陷检测现状概述

背景&#xff1a; 晶圆表面缺陷检测设备主要检测晶圆外观呈现出来的缺陷&#xff0c;损伤、毛刺等缺陷&#xff0c;主要设备供应商KLA&#xff0c;AMAT&#xff0c;日立等&#xff0c;其中KLA在晶圆表面检测设备占有市场52%左右。 检测设备分类&#xff1a; 电子束设备和光学…

浅谈安科瑞电流表和频率表在冰岛某木制品工厂的的应用

摘要&#xff1a;用户侧配电系统的智能化、精细化、可视化是当下配电管理的必然趋势。针对用户侧的配电进线回路&#xff0c;设计安装智能仪表&#xff0c;再通过设置仪表参数来实时监控各负载回路的工作状态&#xff1b;提高用能安全、提升设备维护效率、降低维护的人工成本、…

分类预测 | Matlab实现CS-SVM布谷鸟算法优化支持向量机的数据分类预测

分类预测 | Matlab实现CS-SVM布谷鸟算法优化支持向量机的数据分类预测 目录 分类预测 | Matlab实现CS-SVM布谷鸟算法优化支持向量机的数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现CS-SVM布谷鸟算法优化支持向量机的数据分类预测。 2.自带数据…

Matlab 使用 DH table 建立的 robot 和实际不符

机器人仿真 想借助 matlab robotics toolbox 来仿真机器人&#xff0c;但是直接输入自己的 DH table 显示出来的 robot 和实际不情况不符。 DH table 建立 robot Build Manipulator Robot Using Kinematic DH Parameters 主要使用 setFixedTransform&#xff0c;DH table 中…

【松叶漫话】来聊聊ChatGPT 和文心一言吧

两大AI助手的较量 在当今信息技术飞速发展的时代&#xff0c;人工智能助手成为我们生活中不可或缺的一部分。ChatGPT和文心一言作为两大代表性的AI助手&#xff0c;在智能回复、语言准确性、知识库丰富度等方面各有千秋。本文将就这两位AI助手的特点进行深入比较&#xff0c;为…

OLAP引擎也能实现高性能向量检索,据说QPS高于milvus!

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 随着 LLM 技术应用及落地&#xff0c;数据库需要提高向量分析以及 AI 支持能力&#xff0c;向量数据库及向量检索等能力“异军突起”&#xff0c;迎来业界持续不断关…

深入解析阻塞队列BlockingQueue及源码(超详细)

一、基础概念 1.1 BlockingQueue BlockingQueue 是 java.util.concurrent 包提供的用于解决并发生产者 - 消费者问题的最有用的类。 1.1.1 队列类型&#xff1a; 无限队列 &#xff08;unbounded queue &#xff09; - 几乎可以无限增长 有限队列 &#xff08; bounded qu…

自创C++题目——风扇

预估难度 简单 题目描述 有一个风扇&#xff0c;它有个旋转叶片&#xff0c;每个旋转叶片的编号是&#xff0c;请输出它旋转后&#xff0c;中心点与地面的直线距离哪个叶片最近&#xff0c;输出此旋转叶片的编号。默认以“”的形式。 当时&#xff1a; 当或时&#xff0c;…

海康visionmaster-VM 嵌入:嵌入用户软件界面的方法

描述 环境&#xff1a;VM4.0.0 VS2015 及以上 现象&#xff1a;将 VM 整体嵌入到客户软件界面中&#xff1f; 解答 将 VM 软件整体嵌入到客户软件中&#xff0c;需要利用 Panel 控件&#xff0c;并且需要先启动 VM 软件&#xff0c;具 体代码如下&#xff1a; C# [DllImport(“…

linux NTP服务器配置

需求场景&#xff1a;局域网内多台服务器时间同步&#xff0c;保持一致 前提条件&#xff1a; 1&#xff0c;各服务器已正确安装NTP服务&#xff0c;查询命令如下&#xff1a; rpm -qa | grep ntp&#xff0c;若回显信息中包含ntp-4.2之类的&#xff0c;表示服务器上存在ntp…

电脑监控软件有哪些,那个好用?

在当今信息化时代&#xff0c;电脑已经成为企业和个人工作、生活中不可或缺的工具。 然而&#xff0c;随着网络的普及和电脑使用频率的增加&#xff0c;也带来了一些安全隐患和管理上的挑战。 为了更好地保护电脑安全、规范员工工作纪律&#xff0c;越来越多的企业和个人开始使…

day18 找树左下角的值 路径总和 路径总和Ⅱ 从中序与后序遍历序列构造二叉树 从前序与中序遍历序列构造二叉树

题目1&#xff1a;513 找树左下角的值 题目链接&#xff1a;513 找树左下角的值 题意 找出二叉树的最底层 最左边节点的值 (假设二叉树中至少有1个节点) 最底层节点确保是深度最大的叶子节点&#xff0c;最左边的节点却不一定是左孩子 递归遍历 深度最大的叶子节点最…

docker使用nginx部署vue刷新页面404

docker使用nginx部署vue刷新页面404 从docker内部复制出来的配置文件是这样的&#xff0c;但是刷新页面之后就显示404&#xff0c;关键是我两个前端项目都是用的这一个配置文件&#xff0c;但是只有一个项目出现刷新浏览器显示404的问题&#xff0c;这给我搞懵了&#xff01;&…

【dayjs】类型“Dayjs”上不存在属性“isSameOrAfter”

dayjs中有一些方法是需要使用插件后才能使用&#xff0c;默认情况下&#xff0c;Day.js只提供核心代码&#xff0c;没有安装插件。 解决方法&#xff1a; import dayjs from dayjs;import isSameOrAfter from dayjs/plugin/isSameOrAfter;dayjs.extend(isSameOrAfter);再次使…

AI嵌入式K210项目(5)-串口通讯

文章目录 前言一、什么是UART&#xff1f;二、K210的UART三、实验过程总结 前言 串口通讯是平时大家进行调试最常用的方法&#xff0c;嵌入式应用通常要求一个简单的并且占用系统资源少的方法来传输数据。通用异步收发传输器 (UART)即可以满足这些要求&#xff0c;它能够灵活地…

odoo16 权限继承修改字段显示2

odoo16 权限继承修改字段显示2 上次文章写道:最近在搭建的一个服装批发中心使用的进销存一体化项目,由于客户文化水平低,不想在发货界面显示 好多无用功能,有些是有用的,有些是他不关心的。占在用户角度考虑,用不到的功能都是垃圾。有他们的道理。在隐藏的过程中,出现了…

2011 年考研数二真题解析

一、选择题 【01】【02】【03】【04】【05】【06】【07】【08】 二、填空题 【09】【10】【11】【12】【13】【14】 三、解答题 【15】【16】【17】【18】【19】【20】【21】【22】【23】

运筹说 第90期 | 网络计划-图解评审法

前述章节的网络计划方法主要研究以时间为主要参数的确定型网络模型&#xff0c;其中的概率型网络模型也只讨论工作公式的不确定性&#xff0c;并没有对事项或工作的不确定性进行讨论。由于这类网络模型的建立有严格的规则&#xff0c;大量研究与开发类计划尚无法表达。因从本期…

vue中el-radio无法默认选中

页面上不生效&#xff0c;默认什么都不选中 <el-radio-group v-model"queryParams.videoUrlType"><el-radio :label"1">本地上传</el-radio><el-radio :label"2">外部链接</el-radio> </el-radio-group>da…

污水处理厂能耗分析系统,高效节能保护环境的利器

在城市化发展中&#xff0c;水污染问题也愈发凸显&#xff0c;在污水处理过程中&#xff0c;所产生的能源相对较多&#xff0c;企能源消耗的量就比较大&#xff0c;所以成本就会较高。因此&#xff0c;应对污水处理的具体情况需要进行深入分析与研究&#xff0c;明确具体消耗情…