微信登录开发流程

2022-07-29,,

微信登录开发流程

文章目录

  • 微信登录开发流程
    • 一、添加依赖
    • 二、创建微信登录的Activity回调类
    • 三、初始化微信登录代码

参考链接:

微信开发文档:
https://developers.weixin.qq.com/doc/oplatform/Mobile_App/WeChat_Login/Development_Guide.html

多类传递参数:https://blog.csdn.net/Mr_Tony/article/details/78988281

前置条件:微信上面的AppKey已经申请完毕

注意:这里面只是获取了access_token值,没有获取用户信息,因为程序原有的代码写了,所以这里就没有再写。用户可以根据最终获取的access_token和openId来获取微信用户信息

一、添加依赖

dependencies {
    //微信分享、登录、收藏、支付
    implementation 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:5.5.8'
}

二、创建微信登录的Activity回调类

截图如下:

WXEntryActivity.java(名字要叫这个,否则监听不到,微信支付的可以起别的名字)

/**
 * 微信登录功能
 */
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
    private IWXAPI api;
    @Override
    protected void onCreate(Bundle bundle) {
        super.onCreate(bundle);
        DqLog.e("YM-----------WXEntryActivity>回调登录");
        api = WXAPIFactory.createWXAPI(this, BuildConfig.WX_PAY_APPID);
        api.handleIntent(getIntent(), this);
    }
    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        api.handleIntent(intent, this);
    }

    @Override
    public void onReq(BaseReq baseReq) {
        Log.e("YM", "onPayFinish, errCode = onReq");
    }

    @Override
    public void onResp(BaseResp baseResp) {
        int errCode = baseResp.errCode;
        switch (errCode){
            case BaseResp.ErrCode.ERR_OK:
                String code = ((SendAuth.Resp) baseResp).code;
                getRefreshToken(code);
                Log.d("fantasychongwxlogin", code.toString()+ "");
                break;
            case BaseResp.ErrCode.ERR_AUTH_DENIED://用户拒绝授权
            case BaseResp.ErrCode.ERR_USER_CANCEL://用户取消
            default:
                finish();
                break;

        }
    }

    private void getAccessToken(String code) {
        DqLog.e("YM--------微信登录的code:"+code);
        //获取授权
        StringBuffer loginUrl = new StringBuffer();
        loginUrl.append("https://api.weixin.qq.com/sns/oauth2/access_token")
                .append("?appid=")
                .append("*****************")
                .append("&secret=")
                .append("*****************************")
                .append("&code=")
                .append(code)
                .append("&grant_type=authorization_code");
        Log.d("urlurl", loginUrl.toString());
        OkHttpUtil.simpleGet(loginUrl.toString(), new StringCallback() {
            @Override
            public void onError(Call call, Exception e, int id) {
                e.printStackTrace();
                DqLog.e("YM---------->请求失败:");
                finish();
            }

            @Override
            public void onResponse(String response, int id) {
                DqLog.e("YM---------->getAccessToken:",response);
                try {
                    JSONObject jsonObject = new JSONObject(response);
                    ModuleMgr.getCenterMgr().saveWxRefreshToken(jsonObject.optString("refresh_token",""));
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                CallBackUtils.getInstance().sendMessageSingle(MsgType.WX_LOGIN_RESULT,response);
                finish();
            }
        });
//        https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN
    }

    private void getRefreshToken(String code){
        //先判断本地有没有refreshToken,有的话调用微信的refreshToken接口,没有的话再调用accessToken接口,如果一直调accessToken接口的话会出现code已经被使用的问题(错误码为40163)
        String refreshToken = ModuleMgr.getCenterMgr().getWxRefreshToken();
        DqLog.e("YM---------->获取的refreshToken:",refreshToken);
        if (!TextUtils.isEmpty(refreshToken)){
            StringBuffer loginUrl = new StringBuffer();
            loginUrl.append("https://api.weixin.qq.com/sns/oauth2/refresh_token")
                    .append("?appid=")
                    .append("**********************")
                    .append("&refresh_token=")
                    .append(refreshToken)
                    .append("&grant_type=refresh_token");
            Log.d("urlurl", loginUrl.toString());
            OkHttpUtil.simpleGet(loginUrl.toString(), new StringCallback() {
                @Override
                public void onError(Call call, Exception e, int id) {
                    e.printStackTrace();
                    DqLog.e("YM---------->请求失败:");
                    finish();
                }

                @Override
                public void onResponse(String response, int id) {
                    DqLog.e("YM---------->getRefreshToken:",response);
                    JSONObject jsonObject = null;
                    try {
                        jsonObject = new JSONObject(response);
                        int errorCode = jsonObject.optInt("errcode",-1);
                        if (errorCode == 40030){
                            getAccessToken(code);
                            return;
                        }
                        ModuleMgr.getCenterMgr().saveWxRefreshToken(jsonObject.optString("refresh_token",""));
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                    finish();//获取结果后要结束掉页面,否则,其余页面上会有一个透明的弹窗
                    CallBackUtils.getInstance().sendMessageSingle(MsgType.WX_LOGIN_RESULT,response);//这个是用于多个类之间回调的,可以在没有上下文的类中接收参数
                }
            });
            return;
        }
        getAccessToken(code);
    }

}

AndroidManifest.xml

 <!-- 微信登录,主题使用为全屏透明,要使用这种主题使用户无感微信回调页启动的过程 -->
        <activity
            android:name=".wxapi.WXEntryActivity"
            android:configChanges="keyboardHidden|orientation|screenSize"
            android:exported="true"
            android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" />

三、初始化微信登录代码

WxLoginHelper.java

public class WXLoginHelper {

    private static IWXAPI api;
    /**
     * WXLoginListener可以在一个页面进行回调给其他程序,方便多模块公用微信登录
     */
    public static void WxLogin(Activity context, WXLoginListener loginListener) {
        CallBackUtils.getInstance().setListener(MsgType.WX_LOGIN_RESULT, new CallBackUtils.MessageCallBack() {
            @Override
            public void callBack(String value) {
                DqLog.e("YM--------->接收的获取微信AccessToken的值:",value.toString());
                Map<String,String> map = new HashMap<>();
                try {
                    JSONObject jsonObject = new JSONObject(value);
                    Iterator<String> iterable = jsonObject.keys();
                    while (iterable.hasNext()){
                        String jsonKey = iterable.next();
                        String jsonValue = jsonObject.optString(jsonKey,"");
                        map.put(jsonKey,jsonValue);
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                if(null != loginListener) {
                    loginListener.loginWX(map);
                }
            }
        });
        api = WXAPIFactory.createWXAPI(context, BuildConfig.WX_PAY_APPID, false);
        api.registerApp(BuildConfig.WX_PAY_APPID);
        if (!api.isWXAppInstalled()){
            DqToast.showShort("您还未安装微信客户端!");
            return;
        }
        final SendAuth.Req req = new SendAuth.Req();
        req.scope = "snsapi_userinfo";
        req.state = "dqApp";
        api.sendReq(req);
    }

}

本文地址:https://blog.csdn.net/Mr_Tony/article/details/108734837

《微信登录开发流程.doc》

下载本文的Word格式文档,以方便收藏与打印。