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() {
        //发起登陆请求前先注册微信api
        IWXAPI 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

        <activity
            android:name=".wxapi.WXEntryActivity"
            android:exported="true"
            android:launchMode="singleTask">
            <meta-data
                android: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 {

    
    @Override
    public void onReq(BaseReq baseReq) {

    }

    @Override
    public 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() {
        @Override
        public 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());
            }

        }

        @Override
        public 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() {
            @Override
            public 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);
                }
            }

            @Override
            public 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() {
            @Override
            public 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());
                }

            }

            @Override
            public 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;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

智能代码:生成式 AI 在软件开发中的革命性角色

想象一下&#xff0c;在智能手机革命性地改变了我们的生活之后&#xff0c;现在轮到了生成式 AI 在软件开发领域掀起风暴。你知道吗&#xff0c;如果代码能自己编写自己&#xff0c;这将是多么惊人的一步&#xff1f;这就好比我们现在能轻松地用手机应用管理日常生活一样&#…

AI大模型预先学习笔记三:使用Assistants API快速搭建领域专属AI助手

文章目录 一、什么是AssistantsAPI二、为什么用AssistantsAPI三、Demo展示及能力介绍四、Demo框架及具体实现五、从Demo到实际应用的Gap 一、什么是AssistantsAPI 介绍 OpenAI的第一手发布者API文档&#xff0c;也就是相当于GPT的API 二、为什么用AssistantsAPI 优点 够全、…

vue 渲染数组,拖拽排序,渲染同一个数组拖拽排序不影响其他选中行状态

当我们能够设置单行状态改变的时候&#xff0c;那么肯定可以拿到选中的当前行的id或者下标index。 只要设定一个初始化值在拖拽开始的时候重新赋值&#xff0c;然后再处理选中状态的时候进行判断即可。 前期写的时候没有注意到这个问题&#xff0c;可以看这个文章。 在复测的时…

解析HTTP响应的JSON数据

解析HTTP响应的JSON数据是许多Web开发任务中的常见需求。在Go语言中&#xff0c;可以使用标准库中的encoding/json包来轻松解析JSON数据。下面我将详细介绍如何解析HTTP响应的JSON数据。 首先&#xff0c;确保你已经发送了一个HTTP请求并获取到了响应。然后&#xff0c;你可以…

变电站综合自动化监控系统在某物流园35kV变电站中应用

摘 要&#xff1a;Acrel-1000变电站综合自动化系统&#xff0c;是我司根据电力系统自动化及无人值守的要求&#xff0c;总结国内外的研究和生产的先进经验&#xff0c;专门研制出的新一代电力监控系统。本系统具有保护、遥测、遥信、遥脉、遥调、遥控功能&#xff0c;可实现无人…

博途PLC增量式PID和脉冲轴组合控制阀门开度(算法介绍)

这篇博客我们以S7-1200PLC平台来举例,介绍我们的PID闭环控制器如何控制脉冲轴实现阀门角度控制。SMART PLC PID控制器控制伺服驱动器实现关节角度控制详细内容请参考下面文章: https://rxxw-control.blog.csdn.net/article/details/129658364https://rxxw-control.blog.csdn…

HNU-计算机网络-实验5(自选)-安全相关编程实验

计算机网络 课程综合实验安全相关编程实验&#xff08;RUST&#xff09; 计科210X 甘晴void 202108010XXX 【前言】 这个《课程综合实验》是21级开始新加的实验&#xff0c;之前都没有。具体的可以看实验指导书&#xff0c;是用的19级同学的毕设。我完成的这个实验需要一点点R…

新手小白如何正确做抖音小店无货源?这六个步骤,新手建议收藏!

大家好&#xff0c;我是电商花花。 新手想要做好抖音小店&#xff0c;就要有一个正确的做店方法&#xff0c;很多新手小白在做店的时候踩坑&#xff0c;或者做是不起来&#xff0c;然后开通后没啥订单销量。 下面我就把正确的抖音小店做店方法详细的流程分享出来&#xff0c;…

UniApp+Vue智慧工地信息化管理云平台源码(支持多工地使用)

智慧工地建设的意义 1、提高工程效率 智慧工地可以通过数字化手段&#xff0c;将工地的各个方面进行数字化存储和管理&#xff0c;从而实现的实时监测和共享。这可以大大提高工程的效率&#xff0c;减少工程中的人工干预&#xff0c;并且可以为后续的工程维护和升级提供便利。…

1月16日代码随想录最大二叉树

654.最大二叉树 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。递归地在最大值 右边 的 子数组后缀上 构建右子树。 返回 nums 构…

【分布式技术】监控平台zabbix对接grafana,优化dashboard

目录 第一步&#xff1a;在zabbix server服务端安装grafana&#xff0c;并启动 第二步&#xff1a; 访问http://ip:3000/login 第三步&#xff1a;创建数据源 第四步&#xff1a;导入dashboard模板 ps&#xff1a;自定义创建新面板 第一步&#xff1a;在zabbix server服务…

【Rust】get_local_info 0.2.4发布

发布0.2.4&#xff0c;修正0.2.3&#xff08;[我的Rust库更新]get_local_info 0.2.3-CSDN博客&#xff09;中存在的峰值算法bug&#xff0c;现已提交力扣并通过&#xff0c;耗时0ms

数仓建模理论与规范

一、 模型架构设计目标 数据仓库的定义 数据仓库是一个面向主题的&#xff08;Subject Oriented&#xff09;、集成的&#xff08;Integrated&#xff09;、相对稳定的&#xff08;Non-Volatile&#xff09;、反映历史变化&#xff08;Time Variant&#xff09;的数据集合&am…

❤ Uniapp使用一(文档和 API 篇)

❤ Uniapp使用一&#xff08;文档和 API 篇&#xff09; 一、介绍 uni-app官网&#xff1a;https://uniapp.dcloud.io/api/media/image?idpreviewimage 微信小程序官网&#xff1a;https://developers.weixin.qq.com/miniprogram/dev/api/media/image/wx.previewImage.html …

AI嵌入式K210项目(4)-FPIOA

文章目录 前言一、FPIOA是什么&#xff1f;二、FPIOA代码分析总结 前言 磨刀不误砍柴工&#xff0c;在正式开始学习之前&#xff0c;我们先来了解下K210自带的FPIOA&#xff0c;这个概念可能与我们之前学习STM32有很多不同&#xff0c;STM32每个引脚都有特定的功能&#xff0c…

Spring基于AOP(面向切面编程)开发

概述 AOP为Aspect Oriented Programming的缩写&#xff0c;意为&#xff1a;面向切面编程&#xff0c;通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续&#xff0c;是软件开发中的一个热点&#xff0c;也是Spring框架中的一个重要内容&…

通过旋转机械臂,将机械臂上相机拍摄图像的任意点移动至图像中心的方法

计算原理 角度计算 相机CCD大小固定&#xff0c;即相机成像平面大小固定&#xff0c;相机视场角(FOV)仅由相机焦距F决定&#xff1b; 因此&#xff0c;定焦相机的FOV大小固定&#xff0c;通过上图可以看出相机视场角的计算公式为&#xff1a; FOV 2*atan&#xff08;w/2f&…

Windows 下 使用 VSCode 和 arm-none-eabi 编译Linux代码时 mkdir 命令出错

编译环境&#xff1a; IDE: VSCode 交叉编译器&#xff1a;arm-none-eabi make 命令&#xff1a;Mingw-w64 GCC for Windows 64 源代码管理&#xff1a;git 交叉编译器版本和安装目录: E:\work_soft\gcc-arm-none-eabi-10.3-2021.10 Mingw 版本和目录&#xff1a;E:\work_…

C++ 设计模式之外观模式

【声明】本题目来源于卡码网&#xff08;题目页面 (kamacoder.com)&#xff09; 【提示&#xff1a;如果不想看文字介绍&#xff0c;可以直接跳转到C编码部分】 【简介】什么是外观模式 外观模式Facade Pattern , 也被称为“⻔⾯模式”&#xff0c;是⼀种结构型设计模式&#…

2011 年考研数二真题解析

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