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 导入 Excel多sheet

    Python 导入 Excel多sheet 假设表格的样式如下 import os import sys import django BASE_DIR = os.path.dirname(os.pat ...

  2. jenkin部署(docker+gitlab)

    第一部分 安装部署 1.1 gitlab安装部署 最小配置 内存至少4g,系统内核至少在3.10以上 uname -r 可查看系统内核版本 默认docker已经安装 1.安装gitlab 127机器 ...

  3. PLC通过Modbus转Profinet网关与合康变频器Modbus通讯案例

    PLC通过Modbus转Profinet网关(XD-MDPN100)与合康变频器Modbus通讯,实现了两个设备之间的数据交互.Profinet是一种基于以太网的实时工控网络协议,而Modbus是一种 ...

  4. 研发三维GIS系统笔记/实现wgs84投影-001

    1. 工作内容,改造引擎,支持wgs84投影 改造原因:目前投影是墨卡托投影(与Google Map一致) 目前的GIS系统是二维的采用这个坐标系是没有问题的 但不支持wgs84瓦片数据以及高程数据, ...

  5. Installing Gradle

    Chapter 4. Installing Gradle 4.1. Prerequisites Gradle requires a Java JDK or JRE to be installed, v ...

  6. PHP-basename

    basename 定义: basename() 函数返回路径中的文件名部分. 语法: basename(path,suffix) 参数 描述 path 必需.规定要检查的路径 suffix 可选.规定 ...

  7. .then()方法的意思和用法

    then()方法是异步执行. 意思是:就是当.then()前的方法执行完后再执行then()内部的程序,这样就避免了,数据没获取到等的问题. 语法:promise.then(onCompleted, ...

  8. umicv cv-summary1-全连接神经网络模块化实现

    全连接神经网络模块化实现 Linear与Relu单层实现 LossLayer实现 多层神经网络 不同梯度下降方法 Dropout层 今天这篇博文针对Assignment3的全连接网络作业,对前面学习的 ...

  9. c#中适配器模式详解

    基础介绍:   想象这样一个场景,原项目中接口返回的数据是XML格式的数据,但现在来了一个新客户,它期望接口返回的数据类型为json格式的.   想要实现要么就是改原有接口,但这样就违反了开闭原则,容 ...

  10. Redis Functions 介绍之二

    首先,让我们先回顾一下上一篇讲的在Redis Functions中关于将key的名字作为参数和非key名字作为参数的区别,先看下面的例子.首先,我们先在一个Lua脚本文件mylib.lua中定义如下的 ...