本人开发的一个app使用了sharesdk集成微信登录功能,在测试的过程中微信授权登录界面有调用,但是授权后原应用的回调没有被执行

应用的包名是com.kimi.searcher

首先,确认微信点击授权后有没有执行回调,方法是通过日志过滤activitymanager,

日志中有出现

04-16 13:27:43.345 1805-3279/? I/ActivityManager: START u0 {flg=0x18000000 cmp=com.kimi.searcher/.wxapi.WXEntryActivity (has extras)} from uid 10156 on display 0

说明微信有回调app的wxentryactivity

那么继续判断安装包中的WXEntryActivity是否存在

使用https://github.com/iBotPeaches/Apktool 来反编译apk安装包,发现安装包中不存在com.kimi.searcher.wxapi.WXEntryActivity.取而代之的是com.qq.rnsharesdk.wxapi.WXEntryActivity.

原因分析:com.qq.rnsharesdk.wxapi.WXEntryActivity是放在一个依赖项目中的微信入口activity.被依赖的项目的package是com.qq.rnsharesdk。 activity的名称是.wxapi.WXEntryActivity。 原来gradle 在编程的过程中,androidmanifest.xml中的相对路径组件会根据被依赖包中的package名来生成全路径名称,而不是app项目中的package来生成全路径名称。

于是我在app项目中添加一条activity, 并且把build.gradle中的applicationId改成了com.kimi.searcher。编译后发现回调依然没有被执行,把新包进行反编译,发现androidmanifest.xml中多了一条com.awesomeproject.wxapi.WXEntryActivity。

原因是androidmanfiest.xml的相对路径填充不会使用build.gradle中使用的applicationId,而会使用androidmanifest.xml中的package来进行路径填充。

与往常使用gradlew编译安卓项目,build.gradlew的配置会覆盖androidmanifest.xml的配置的经验不同,androidmanifest.xml的相对路径填充的规则:

1.使用最近的package配置,2.不使用build.gradle中的配置


Android 微信授权登录、获取Wx用户信息,解决无法回调问题

微信授权登录,官方说的不是很清楚、所以导致有一部分的坑。

据此记载..(坑)

1.微信注册应用平台的应用签名为 打包keystore的MD5 小写并且去掉 ":" 号组成、或者去下载 微信签名生成工具 输入项目的packageName也可以查看到。

2.授权没反应,监测微信App_Id是否正确、是否按照上1.生成。 当前的App是否正式签名?也就是正式App.. DeBug签名环境的App貌似无法调动微信。

3.关于回调:是否按照官方要求注册WXEntryActivity并且继承Acticiy、 此Activity不能改名,并且在你的 package(项目报名).wxapi.WXEntryActivity.java 下面。 注册* 每段代码都别少...

<!--注册微信回调 WXEntryActivity -->
<activity
android:name=".wxapi.WXEntryActivity"
android:exported="true"
android:label="@string/app_name"
android:launchMode="singleTop"
android:theme="@android:style/Theme.Translucent" />

4.回调方法onResp() 方法没有触发回调、请监测WXEntryActivity onCreate中是否调用此方法  mApi.handleIntent(this.getIntent(), this);

public class WXEntryActivity extends Activity implements IWXAPIEventHandler {

    private final String TAG = this.getClass().getSimpleName();
public static final String APP_ID = "请自己填写";
public static final String APP_SECRET = "请自己填写";
private IWXAPI mApi; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mApi = WXAPIFactory.createWXAPI(this, APP_ID, true);
mApi.handleIntent(this.getIntent(), this);
} //微信发送的请求将回调到onReq方法
@Override
public void onReq(BaseReq baseReq) {
} //发送到微信请求的响应结果
@Override
public void onResp(BaseResp resp) {
switch (resp.errCode) {
case BaseResp.ErrCode.ERR_OK:
//发送成功
break;
case BaseResp.ErrCode.ERR_USER_CANCEL:
//发送取消
break;
case BaseResp.ErrCode.ERR_AUTH_DENIED:
//发送被拒绝
break;
default:
//发送返回
break;
}
finish(); } }

5.当授权时候进入WXEntryActivity、当前背景可能是黒或白,为了不影响用户体验,可以把当前Activity设置为透明。android:theme="@android:style/Theme.Translucent" ,可以参照上3. WXEntryActivity注册格式。

以上便是授权登录遇到的坑、只怪Wx要求格式的有个性、多多少少会遇到这样的坑。

授权登录并且拿取Wx用户信息,简单三部曲:

*
* 1.sendReq(req). 用户授权可以拿到 code
*
* 2.用code.调用Wx接口拿到 openid & accessToken
*
* 3.通过openid & accessToken 俩参数可以拿到最终用户信息
*
*

具体可参考:微信授权登录取用户信息步骤

部分代码:

/**
* 获取openid accessToken值用于后期操作
*
* @param code 请求码
*/
private void getAccess_token(final String code) {
new Thread(new Runnable() {
@Override
public void run() {
String path = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="
+ APP_ID
+ "&secret="
+ APP_SECRET
+ "&code="
+ code
+ "&grant_type=authorization_code";
try {
JSONObject jsonObject = JsonUtils.initSSLWithHttpClinet(path);// 请求https连接并得到json结果
if (null != jsonObject) {
String openid = jsonObject.getString("openid").toString().trim();
String access_token = jsonObject.getString("access_token").toString().trim();
getUserMesg(access_token, openid);
} } catch (Exception e) {
e.printStackTrace();
}
}
}).start(); } /**
* 获取微信的个人信息
*
* @param access_token
* @param openid
*/
private void getUserMesg(final String access_token, final String openid) {
String path = "https://api.weixin.qq.com/sns/userinfo?access_token="
+ access_token
+ "&openid="
+ openid;
try {
JSONObject jsonObject = JsonUtils.initSSLWithHttpClinet(path);// 请求https连接并得到json结果
if (null != jsonObject) {
String nickname = jsonObject.getString("nickname");
int sex = Integer.parseInt(jsonObject.get("sex").toString());
String headimgurl = jsonObject.getString("headimgurl"); Log.e(TAG, "getUserMesg 拿到了用户Wx基本信息.. nickname:" + nickname); }
} catch (Exception e) {
e.printStackTrace();
}
return;
}

具体代码:微信授权登录 - 案例 Dome。

参考、感谢:

1.http://blog.csdn.net/xiong_it/article/details/48317527

2.https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=1417751808&token=&lang=zh_CN

android app使用微信登录接口回调没有被执行的问题研究的更多相关文章

  1. 详解如何进行第三方App接入微信登录

    微信登录接入 微信登录遵循协议Aouth2.0中的授权码模式 我们来看一下Aouth2.0中的授权码模式是怎么定义的: 授权码模式(authorization code)是功能最完整.流程最严密的授权 ...

  2. Android集成第三方微信登录

    第一步: 在微信开放平台创建安卓应用,需要输入的包名和签名就不用再提吧,不知道的自行百度. 应用创建完毕后会得到两个值:AppID.AppSecret,用这两个值来请求微信. 然后去微信开放平台的资源 ...

  3. 网站实现微信登录之回调函数中登录逻辑的处理--基于yii2开发的描述

    上一篇文章网站实现微信登录之嵌入二维码中描述了如何在自己的登录页面内嵌入登录二维码,今天的这篇文章主要是描述下在扫码成功之后微信重定向回网站后登录逻辑的处理,其实也就是验证身份信息,授权用户登录的逻辑 ...

  4. Android实战之 万能的接口回调

    转载请标明原地址:http://blog.csdn.net/gaolei1201/article/details/47084111 前言:本人也算是自学"成才",呵呵,大学时尽管学 ...

  5. Android App接入微信开放平台注意事项

    一.Android第三方应用接入微信开放平台的注意事项: 1. 到微信开放平台官网申请正式的AppID(需通过审核),要填写包名.app签名的md5值.至于如何获取app签名信息,官方提供签名包apk ...

  6. 友盟分享——Android App接入微信开放平台注意事项

    一.Android第三方应用接入微信开放平台的注意事项: 1. 到微信开放平台官网申请正式的AppID(需通过审核),要填写包名.app签名的md5值.至于如何获取app签名信息,官方提供签名包apk ...

  7. 微信小程序 路由跳转 异步请求 存储数据,微信登录接口

    1小程序路由跳转 wx.switchTab(Object object) 这里的tabBar是底下的导航栏指定的页面 跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面 tabBar l ...

  8. Android app 第三方微信支付接入详解

    微信支付做了好几遍了,都没有出现什么棘手的问题,下面一一为大家分享一下,欢迎吐槽. 还是老样子,接入微信的支付要第一步添加微信支付官方的包libammsdk.jar 首先就处理略坑的一个问题,app应 ...

  9. android APP 中微信分享功能实现 的总结

    //花了很长时间最终完成了微信分享功能,中间走了很多弯路,在此做一下小结,希望对在应用中使用到微信分享的朋友有所帮助. 主要问题就是下面两个: 1.为什么运行了项目之后,微信分享只是闪了一下就没有了? ...

随机推荐

  1. AMBA总线协议AHB、APB、AXI对比分析【转】

    转自:https://blog.csdn.net/ivy_reny/article/details/56274412 一.AMBA概述    AMBA (Advanced Microcontrolle ...

  2. Python运维开发基础07-文件基础【转】

    一,文件的基础操作 对文件操作的流程 [x] :打开文件,得到文件句柄并赋值给一个变量 [x] :通过句柄对文件进行操作 [x] :关闭文件 创建初始操作模板文件 [root@localhost sc ...

  3. CentOS7利用systemctl添加自定义系统服务【转】

    systemctl enable name.service 设置开机启 systemctl disable name.service 删除开机启动指令 systemctl list-units --t ...

  4. jquery $.trim()去除字符串空格

    语法jQuery.trim()函数用于去除字符串两端的空白字符. 作用该函数可以去除字符串开始和末尾两端的空白字符(直到遇到第一个非空白字符串为止).它会清除包括换行符.空格.制表符等常见的空白字符. ...

  5. maven:打包时报错,报’找不到符号’

    参考文章:https://www.cnblogs.com/kelly-one/p/7349930.html 问题描述: 工程开发调试都没有问题,就是不能导出WAR包,用mvn clean packag ...

  6. shell脚本学习系列之一---入门

    参考:http://me.52fhy.com/shell-book/ 待后续整理...

  7. 执行原生SQL语句的方式

    原生sql语句 cursor方法:from api.models import *from django.db import connection,connectionscursor=connecti ...

  8. Confluence 6 使用电子邮件可见

    Confluence 提供了 3 个电子邮件策略,这些策略 Confluence 管理员可以通过管理员控制台(Administration Console)进行配置: 公开(Public):电子邮件地 ...

  9. RemoveDuplicatesfromSortedList

    给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次. 示例 1: 输入: 1->1->2 输出: 1->2 示例 2: 输入: 1->1->2->3-&g ...

  10. spring boot 自动配置原理

    1).spring boot启动的时候加载主配置类,开启了自动配置功能@EnableAutoConfiguration,先看一下启动类的main方法 public ConfigurableApplic ...