准备工作:
1、微信开发平台注册一个App,获取到APP_ID。
2、在Android Studio生成签名文件。
3、微信登录api和bean类
api:
public interface LoginApiService {
@FormUrlEncoded
@POST("url/login")
Observable<WeChatLoginBean> wxLogin(@Field("code") String code);
}
bean类:
public class WeChatLoginBean {
private ResultBean result;
private String message;
private String status;
public ResultBean getResult() {
return result;
}
public void setResult(ResultBean result) {
this.result = result;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public static class ResultBean {
private int attentionSum;
private int bankCardBindingStatus;
private String constellation;
private int fanSum;
private int followWeChat;
private String headPic;
private int newUserFlag;
private String nickName;
private String personalImage;
private String sessionId;
private int sex;
private String signature;
private int userId;
private int verifiedStatus;
private int workSum;
private List<?> userLabelList;
public int getAttentionSum() {
return attentionSum;
}
public void setAttentionSum(int attentionSum) {
this.attentionSum = attentionSum;
}
public int getBankCardBindingStatus() {
return bankCardBindingStatus;
}
public void setBankCardBindingStatus(int bankCardBindingStatus) {
this.bankCardBindingStatus = bankCardBindingStatus;
}
public String getConstellation() {
return constellation;
}
public void setConstellation(String constellation) {
this.constellation = constellation;
}
public int getFanSum() {
return fanSum;
}
public void setFanSum(int fanSum) {
this.fanSum = fanSum;
}
public int getFollowWeChat() {
return followWeChat;
}
public void setFollowWeChat(int followWeChat) {
this.followWeChat = followWeChat;
}
public String getHeadPic() {
return headPic;
}
public void setHeadPic(String headPic) {
this.headPic = headPic;
}
public int getNewUserFlag() {
return newUserFlag;
}
public void setNewUserFlag(int newUserFlag) {
this.newUserFlag = newUserFlag;
}
public String getNickName() {
return nickName;
}
public void setNickName(String nickName) {
this.nickName = nickName;
}
public String getPersonalImage() {
return personalImage;
}
public void setPersonalImage(String personalImage) {
this.personalImage = personalImage;
}
public String getSessionId() {
return sessionId;
}
public void setSessionId(String sessionId) {
this.sessionId = sessionId;
}
public int getSex() {
return sex;
}
public void setSex(int sex) {
this.sex = sex;
}
public String getSignature() {
return signature;
}
public void setSignature(String signature) {
this.signature = signature;
}
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public int getVerifiedStatus() {
return verifiedStatus;
}
public void setVerifiedStatus(int verifiedStatus) {
this.verifiedStatus = verifiedStatus;
}
public int getWorkSum() {
return workSum;
}
public void setWorkSum(int workSum) {
this.workSum = workSum;
}
public List<?> getUserLabelList() {
return userLabelList;
}
public void setUserLabelList(List<?> userLabelList) {
this.userLabelList = userLabelList;
}
}
}
4、在moudle模块下的build.gradle文件下:添加以下内容
plugins {
id 'com.android.application'
}
android {
//添加的内容
signingConfigs {
debug {
storeFile file('../keystore/a.keystore')
storePassword '123456'
keyAlias 'key'
keyPassword '123456'
}
}
compileSdkVersion 31
buildToolsVersion "30.0.3"
defaultConfig {
applicationId "包名"
minSdkVersion 23
targetSdkVersion 23
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
implementation 'androidx.appcompat:appcompat:1.4.1'
implementation 'com.google.android.material:material:1.5.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
implementation 'com.tencent.mm.opensdk:wechat-sdk-android:+'//微信登录SDK
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}
正文:
一、导入依赖
implementation 'com.tencent.mm.opensdk:wechat-sdk-android:+'//微信登录SDK
二、准备微信登录工具类
public class WeChatLoginUtils {
// 微信开放平台申请的 App ID
private static final String APP_ID = "换成自己的APP_ID";
private IWXAPI wxApi; // 微信 API 对象
private Context context;
// 构造函数,初始化上下文和微信 API 对象
public WeChatLoginUtils(Context context) {
this.context = context;
// 创建微信 API 对象并注册 App ID
wxApi = WXAPIFactory.createWXAPI(context, APP_ID, true);
wxApi.registerApp(APP_ID);
}
// 发送微信授权请求的方法
public void sendWeChatAuthRequest() {
// 检查是否安装了微信客户端
if (wxApi.isWXAppInstalled()) {
// 创建授权请求对象
SendAuth.Req req = new SendAuth.Req();
req.scope = "snsapi_userinfo"; // 请求用户授权的作用域,这里请求获取用户信息
req.state = "wechat_login"; // 自定义字段,可用于回调时识别请求来源
// 发送授权请求
wxApi.sendReq(req);
} else {
// 如果未安装微信客户端,显示提示信息
Toast.makeText(context, "请先安装微信客户端", Toast.LENGTH_SHORT).show();
}
}
}
三、触发微信登录,例如点击按钮执行微信登录操作
WeChatLoginUtils weChatLoginUtils = new WeChatLoginUtils(this);
weChatLoginUtils.sendWeChatAuthRequest(); //会自动进入WXEntryActivity.java
四、在AndroidManifest.xml声明WXEntryActivity.java
<activity
android:name=".wxapi.WXEntryActivity"
android:exported="true"
android:label="@string/app_name"
android:launchMode="singleTask"
android:taskAffinity="com.wd.live"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
五、在整体包名位置下建一个名为wxapi的包,包里创建一个名为WXEntryActivity.java的文件(严格按照该命名) 例如包名为:com.XX.XXX
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
private IWXAPI wxApi; // 微信 API 对象
private static final String TAG = "WXEntryActivity"; // 日志标签
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 创建微信 API 对象并处理传入的 Intent
wxApi = WXAPIFactory.createWXAPI(this, "换成自己的APP_ID");
wxApi.handleIntent(getIntent(), this);
}
@Override
public void onReq(BaseReq baseReq) {
// 微信请求回调方法,可在此处处理请求相关逻辑,不需要处理时留空
}
@Override
public void onResp(BaseResp baseResp) {
if (baseResp.getType() == ConstantsAPI.COMMAND_SENDAUTH) {
switch (baseResp.errCode) {
case BaseResp.ErrCode.ERR_OK:
// 用户同意授权,获取到用户的 code,可以通过 code 去服务器换取 access_token 和用户信息
String code = ((SendAuth.Resp) baseResp).code;
// 发送 code 到服务器进行登录验证
HttpUtils.getInstance().getLoginApiService().wxLogin(code)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<WeChatLoginBean>() {
@Override
public void accept(WeChatLoginBean weChatLoginBean) throws Exception {
if(weChatLoginBean.getStatus().equals("0000")) {
//获取的登录用户的信息
}
}
});
break;
case BaseResp.ErrCode.ERR_USER_CANCEL:
// 用户取消登录
Toast.makeText(this, "用户取消登录", Toast.LENGTH_SHORT).show();
break;
case BaseResp.ErrCode.ERR_AUTH_DENIED:
// 用户拒绝授权
Toast.makeText(this, "用户拒绝授权", Toast.LENGTH_SHORT).show();
break;
default:
// 登录失败
Toast.makeText(this, "登录失败", Toast.LENGTH_SHORT).show();
break;
}
}
}
}
至此实现微信登录功能