Android对接微信登录记录 - Stars-One的杂货小窝

Android项目要对接下微信登录,稍微记录下踩坑点

代码

1.添加依赖

implementation 'com.tencent.mm.opensdk:wechat-sdk-android:6.8.0'

2.声明Activity

在你的清单文件添加下面Activity声明

<application>
<activity
android:name="com.test.my.wxapi.WXEntryActivity"
android:label="@string/app_name"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:exported="true"
android:taskAffinity="${applicationId}"
android:launchMode="singleTask">
</activity>
</application> <queries>
<!-- 指定微信包名-->
<package android:name="com.tencent.mm" />
</queries>

注意这里android:name="com.test.my.wxapi.WXEntryActivity"

实际上,我的applicationId就是com.test.my

2.创建Activity和处理回调

由于我的applicationId是com.test.my,但是由于我packageName不是这个,所以我得创建一个包名存放WXEntryActivity

class WXEntryActivity : Activity(), IWXAPIEventHandler {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) //没有这个,不会走下面的2个onReq和onResp回调的
WxLoginUtil.api.handleIntent(intent,this)
} override fun onReq(p0: BaseReq) { } override fun onResp(resp: BaseResp) {
Log.d(WxLoginUtil.TAG, "onResp: 进入WXEntryActivity onResp回调处理") if (resp is SendAuth.Resp) {
Log.d(WxLoginUtil.TAG, "onResp: onResp回调处理")
//微信登录回调处理
WxLoginUtil.handleResp(resp)
} //关闭当前微信页面(是透明的),否则会拦截掉原页面点击事件
finish()
}
}

4.处理回调

这里补充下handleResp里的写法,实际上很简单

有以下步骤:

  1. 处理回调,得到授权code
  2. 根据授权code,获取到access_token
  3. 根据access_token,得到最终的用户信息
  4. 拿到用户信息,之后编写你自己需要的逻辑即可

这里不详细说了,就是依次调用接口就完事了

步骤2调用此https://api.weixin.qq.com/sns/oauth2/access_token?appid=$appId&secret=$appSecret&code=${code}&grant_type=authorization_code

步骤3调用此https://api.weixin.qq.com/sns/userinfo?access_token=${token}&openid=${wxAccessInfo.openid}&lang=${lang}

lang是微信回调SendAuth.Resp对象里的数据

坑点

1.无法回调WxEntryActivity页面

从以下步骤排查:

  1. WxEntryActivity是否调用api.handleIntent(intent,this)
  2. 注意WxEntryActivity包名应该与你的applicationId相同,而不是你的包名文件夹

微信wxapi的文件结构包名必须和你填写的applicationId相同

例如你的程序结构是com.wx.mm,但是你的applicationId是com.wx.mm.qq。这时候创建wxapi包的时候,路径就必须是com.wx.mm.qq.wxapi这时候微信才能正常回调。

2.回到登录页面,无法点击

实际上,从登录页唤起微信,再返回,此时上一层页面是微信的那个WXEntryActivity页面,因为它是透明的,所以拦截了我们原来登录页面的点击事件

解决方法就是在回调的时候,把它页面调用finish关掉即可

3.出现错误40163 code been used

这个问题是请求获取access_token数据的接口返回的,解释说code参数是已被消费

我检测了一遍代码,发现没有重复请求

但最后想起了,项目里用的网络请求框架liangjingkanji/Net: Android 基于协程/OkHttp网络请求工具

然后赶紧直接用okhttp写了个简单的get请求,于是就是完美解决问题...无语了,只能说不要轻信别人封装的框架

真相是Net这个网络框架始终返回的是第二次调用接口给回的数据

还有其他网友说如果和友盟分享一起使用,可能也会有这个问题,因为微信分享和微信登录最终都会回调WxEntryActivity页面的

所以如果是和友盟分享使用的话,可以直接继承友盟分享里的那个WxEntryActivity页面,然后添加逻辑就可以了

Android对接微信登录记录的更多相关文章

  1. Android对接微信支付体验

    在写正文之前我不得不吐槽一下:微信支付所提供的参考文档以及技术支持真心太烂了. 微信的坑: 1.在生成prepay_id向微信服务器传递参数时<body>不支持中文.需要对其进行转码,否则 ...

  2. Java对接微信登录

    今天我们来对接微信开放平台的网站应用登录 首先上文档链接:https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login ...

  3. Android微信登录、分享、支付

    转载需要著名出处: http://blog.csdn.net/lowprofile_coding/article/details/78004224 之前写过微信登录分享支付第一版: http://bl ...

  4. 详解Android微信登录与分享

    Android 使用微信登录.分享功能 具体的文档详情微信官网上介绍(微信官网文档),本人直接按照项目部署步骤进行讲解: 第一步:申请你的AppID: 第二步:依赖 dependencies { co ...

  5. Android开发 对接微信分享SDK总结

    原文:Android开发 对接微信分享SDK总结 - Stars-One的杂货小窝 公司项目需要对接微信分享,本来之前准备对接友盟分享的,但友盟的分享实际参数太多,而我又只需要对接一个微信分享,于是便 ...

  6. 对接微信红包时:CA证书出错,请登录微信支付商户平台下载证书

    今天在对接微信支付的微信红包发放时,出现““CA证书出错,请登录微信支付商户平台下载证书”的错误,特此记录一下: 如果你也在对接微信红包,并且你也在这个页面上下载了demo,再就是你也参照了里面的文档 ...

  7. [转] Android:微信授权登录与微信分享全解析

    https://wohugb.gitbooks.io/wechat/content/qrconnent/refresh_token.html http://blog.csdn.net/xiong_it ...

  8. Android接入微信SDK之一:发起微信授权登录

    1.重要的事情首先说! 包名.应用签名.app id 三者都必须和在腾讯上申请的一致!!!否则将不能成功. 包名:就是在腾讯上申请的包名 应用签名:使用微信官网提供的<签名生成工具>(这个 ...

  9. 关于使用微信登录第三方APP的实现(Android版)

    使用微信登录APP,免去注册过程,现在已经有很多的类似应用了.集成该功能过程不复杂,但还是有一些地方需要注意的. 开始之前,需要做下面的准备工作. 1.到微信开放平台注册你的APP,并申请开通微信登录 ...

  10. android微信登录,分享

    这几天开发要用到微信授权的功能,所以就研究了一下.可是微信开放平台接入指南里有几个地方写的不清不楚.在此总结一下,以便需要的人. 很多微信公众平台的应用如果移植到app上的话就需要微信授权登陆了. 目 ...

随机推荐

  1. python flask 提供web的get/post开发

    转载请注明出处: 使用python flask框架编写web api中的get与post接口,代码编写与调试示例如下: from flask import Flask, request, jsonif ...

  2. Codeforces 1462F The Treasure of The Segments

    题意 给\(n(1\leq n\leq 2*10^5)\)个线段$[l_i,r_i] (1≤l_i≤r_i≤10^9) $,问最少删除几个线段,使得剩下线段中,有至少一个线段与所有线段相交. 分析 对 ...

  3. Maven关联本地已有仓库的方法

    1. 将本地仓库目录localwarehouse进行压缩为localwarehouse.rar. 2. 将localwarehouse.rar解压到D:\maven文件夹中,然后在setting.xm ...

  4. 记一次 Redisson 线上问题 → ERR unknown command 'WAIT' 的排查与分析

    开心一刻 昨晚和一个朋友聊天 我:处对象吗,咱俩试试? 朋友:我有对象 我:我不信,有对象不公开? 朋友:不好公开,我当的小三 问题背景 程序在生产环境稳定的跑着 直到有一天,公司执行组件漏洞扫描,有 ...

  5. BS系统的登录鉴权流程演变

    1 基础知识 用户登录是使用指定用户名和密码登录到系统,以对用户的私密数据进行访问和操作.在一个有登录鉴权的BS系统中,通常用户访问数据时,后端拦截请求,对用户进行鉴权,以验证用户身份和权限.用户名. ...

  6. Redis——Redis面试题

    文章目录 概述 什么是Redis Redis有哪些优缺点 为什么要用 Redis /为什么要用缓存 为什么要用 Redis 而不用 map/guava 做缓存? Redis为什么这么快 数据类型 Re ...

  7. linux特殊权限rws和rwt

    Linux文件,除了rwx这些权限外,还有一些特殊的权限,如rws.rwt. 1.s权限(setuid) 1.1 设置方法:chmod u+s 该位可以让普通用户以root用户的角色运行只有root帐 ...

  8. 实现脚本自动部署docker

    前言: 使用场景是 我这边的一个单体项目需要多一个多副本的部署方式,一直输入重复命令我实在是嫌烦了,使用写了一个脚本来一键更新部署上去.jar包都是我手动上传的,没有把包传入公网库里. 之所以记录就是 ...

  9. linux知识点 ROM,RAM,SRAM,DRAM,Flash

    参考视频:https://www.bilibili.com/video/BV13L4y1b7So?spm_id_from=333.337.search-card.all.click SRAM,DRAM ...

  10. 监控Mysql数据库

    Prometheus(普罗米修斯) 监控Mysql数据库: 这个是基于第一版本环境搭建的,需要部署prometheus: 服务器 IP地址 Prometheus服务器 192.168.1.22 被监控 ...