微信登录开发流程
程序员文章站
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