欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

微信登录开发流程

程序员文章站 2022-06-21 19:19:05
微信登录开发流程文章目录微信登录开发流程一、添加依赖二、创建微信登录的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已经申请完毕注意...

微信登录开发流程


参考链接:

微信开发文档:
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

相关标签: 第三方开放平台