• android app使用微信登录接口回调没有被执行的问题研究


    本人开发的一个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

  • 相关阅读:
    vue小项目总结与笔记【八】——keep-alive的使用
    vue小项目总结与笔记【七】——vuex实现数据共享
    vue小项目总结与笔记【六】——使用axios发送ajax请求
    安装SVN和汉化包及基本使用
    readhat6.5下安装weblogic10.3.6
    ssh连接不上vmware虚拟机centos7.5
    Oracle数据库基础操作语法
    Linux调整lvm逻辑分区大小
    win7安装oracle11g和oracle client和pl/sql
    linux常用命令--转载
  • 原文地址:https://www.cnblogs.com/kenshinobiy/p/9230970.html
Copyright © 2020-2023  润新知