无障碍集成微信第三方登录,解决WXEntryActivity不回调onResp

导语:
现如今每个社交app都会有第三方登录的功能,今天主要简单阐述一下第三方登录微信的步骤。
步骤:
1.前往微信开放平台注册微信第三方登录app(https://open.weixin.qq.com/),获取所需要的APPID,需要准备相关app应用信息。
2.下载相关第三方登录Jar包,libammsdk.jar
3.审核通过后,会给你一个APPID,在你需要第三方登录的界面进行初始化设置:

    private IWXAPI api;
     //初始化微信登录程序
    private void initWXLogin(){
        //api注册
        api = WXAPIFactory.createWXAPI(this,AppUtils.WXAPPID, true);
        api.registerApp(AppUtils.WXAPPID);

        SendAuth.Req req = new SendAuth.Req();

        //授权读取用户信息
        req.scope = "snsapi_userinfo";
        //自定义信息
        req.state = "wechat_sdk_demo_test";
        //向微信发送请求
        api.sendReq(req);
//        startActivity(new Intent(this, WXEntryActivity.class));
    }

4.重点来了,就是新建一个类WXEntryActivity,不可改名,包名也有如下规则。
首先配置manifests文件:

        <activity
            android:exported="true"
            android:launchMode="singleTop"
            android:name="包名.wxapi.WXEntryActivity"
            android:theme="@android:style/Theme.NoDisplay" />

WXEntryActivity包名规则:
很多文档上人云亦云,说manifests中的package就是本app包名,其实是不正确的,app的包名不一定是package中的包名,我们根据最保险的方法,用代码把包名跑出来。
代码如下:


    private String getAppInfo() {
        try {
            String pkName = this.getPackageName();
            String versionName = this.getPackageManager().getPackageInfo(
                    pkName, 0).versionName;
            int versionCode = this.getPackageManager()
                    .getPackageInfo(pkName, 0).versionCode;
            return pkName ;
        } catch (Exception e) {
        }
        return null;
    }

我们用此方法拿到包名后,根据拿到的包名后,在manfests中注册WXEntryActivity,创建一个 wxapi的文件夹 在文件夹下创建WXEntryActivity类,将如下代码全部复制。
WXEntryActivity代码:

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

import com.google.android.gms.common.api.Api;
import com.samples.utils.AppUtils;
import com.tencent.mm.sdk.modelbase.BaseReq;
import com.tencent.mm.sdk.modelbase.BaseResp;
import com.tencent.mm.sdk.modelmsg.SendAuth;
import com.tencent.mm.sdk.openapi.IWXAPI;
import com.tencent.mm.sdk.openapi.IWXAPIEventHandler;
import com.tencent.mm.sdk.openapi.WXAPIFactory;

/**
 * Created by Administrator on 2016/8/16.
 */
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {

    private IWXAPI api;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //注册API
        api = WXAPIFactory.createWXAPI(this, AppUtils.WXAPPID);
        api.handleIntent(getIntent(), this);
        Log.i("savedInstanceState"," sacvsa"+api.handleIntent(getIntent(), this));
    }
    @Override
    public void onReq(BaseReq baseReq) {

    }
    //  发送到微信请求的响应结果
    @Override
    public void onResp(BaseResp resp) {
        if(resp instanceof SendAuth.Resp){
            SendAuth.Resp newResp = (SendAuth.Resp) resp;
            //获取微信传回的code
            String code = newResp.code;
            Log.i("newRespnewResp","   code    :"+code);

        }

        switch (resp.errCode) {
            case BaseResp.ErrCode.ERR_OK:
                Log.i("savedInstanceState","发送成功ERR_OKERR_OK");
                //发送成功
                break;
            case BaseResp.ErrCode.ERR_USER_CANCEL:
                Log.i("savedInstanceState","发送取消ERR_USER_CANCEL");
                //发送取消
                break;
            case BaseResp.ErrCode.ERR_AUTH_DENIED:
                Log.i("savedInstanceState","发送取消ERR_AUTH_DENIEDERR_AUTH_DENIEDERR_AUTH_DENIED");
                //发送被拒绝
                break;
            default:
                Log.i("savedInstanceState","发送返回breakbreakbreak");
                //发送返回
                break;
        }
        finish();

    }

}

5.如何拿到OPENID:

用get方法访问
https://api.weixin.qq.com/sns/oauth2/access_token?appid= APPID&secret=SECRET&code=CODE&grant_type=authorization_code
 appid(你的APPID)
 code(WXEntryActivity 中onResp方法回调得到的code)
 SECRET(你的secret)
 grant_type (这个字符串authorization_code)
 需要按自己注册的数据用get方法访问这个接口。 

得到的数据结构为

{ 
"access_token":"ACCESS_TOKEN", 
"expires_in":7200, 
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID", 
"scope":"SCOPE",
"unionid":"o6_bmasdasdsad6_2sgVt7hMZOPfL"
}

6.如何拿到用户信息:
访问如下接口拿到用户资料,其中access_token便是上个获得OPENID的接口得到的access_token:
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID
总结:
不要人云亦云,自己实践才能掌握真理。。

  • 24
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
微信SDK支付回调WXPayEntryActivity主要是通过发送广播的方式实现的。 在微信支付完成后,微信SDK会将支付结果回调到你在微信支付时指定的回调Activity中,这个Activity就是WXPayEntryActivity。在WXPayEntryActivity中,你需要重写`onResp`方法来接收微信支付的结果。 具体而言,`onResp`方法接收一个`BaseResp`对象,该对象包含了微信支付的结果信息。在`onResp`方法中,你可以根据支付结果的状态,进行相应的处理。例如,如果支付成功,你可以跳转到支付成功的页面,如果支付失败,你可以提示用户支付失败并让用户重新支付。 另外,为了将支付结果传递到你的其他组件中,你还需要在`onResp`方法中发送广播。具体而言,你需要创建一个Intent对象,并将支付结果放入Intent中,然后通过`sendBroadcast`方法将Intent发送出去。在其他组件中,你可以注册一个BroadcastReceiver来接收这个广播,并根据支付结果的状态进行相应的业务处理。 在微信SDK中,发送支付结果广播的代码如下: ```java Intent intent = new Intent(ACTION_PAY_RESULT); intent.putExtra(EXTRA_PAY_RESULT, resp.errCode); sendBroadcast(intent); ``` 其中,`ACTION_PAY_RESULT`是广播的Action,`EXTRA_PAY_RESULT`是支付结果的Extra字段。在你的组件中,你需要注册一个BroadcastReceiver,并监听`ACTION_PAY_RESULT`这个Action,当收到这个广播时,你就可以根据`EXTRA_PAY_RESULT`字段来处理支付结果了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值