微信登录开发流程

文章目录

  • 微信登录开发流程
    • 一、添加依赖
    • 二、创建微信登录的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