最近app上Goole市场,三方登录这块原先用的是mob的,但是Goole那边检测到mob会自动收集手机用户的手机号码信息并上传到mob的后台,所以App被下架了,没办法就让直接对接微信登录。下面就是整体的流程了
步骤:
1.接入微信的sdk,可以直接用Gradle 的方式添加??
在 build.gradle 文件中,添加如下依赖即可:
//该文件是根目录下的build.gradle
//目前 Maven Central仅支持部分版本:6.6.4、6.6.5、6.6.23、6.7.0、6.7.9、6.8.0,建议开发者升级
//至最新版本6.8.0。后续所有版本更新都会上传至Maven Central
repositories {
jcenter() //由于 jCenter 服务关停,需要修改成引用 Maven Central
mavenCentral()
google()
maven {
url "https://jitpack.io"
}
}
//该文件是工程目录下的build.gradle 不是根目录下的
dependencies {
//微信sdk
api 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'
}
2.添加权限
<!--其中网络权限如果没有使用扫码登录功能非必要;后三个权限,如果没有使用 mta,也非必要,即使有使用 mta,去掉也不影响功能-->
<uses-permission android:name="android.permission.INTERNET" />
<!-- for mta statistics, not necessary-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
3.接入sdk,添加完所需权限后,接入微信登录环境算是搭建好了。下面第一步是初始化(即:向微信注册)
//在项目的Application的onCreate()方法中调用
@Override
public void onCreate() {
super.onCreate();
wxinit();
}
/**微信初始化*/
public static IWXAPI api;
private void wxinit(){
api = WXAPIFactory.createWXAPI(this,WX_APP_ID,true);
api.registerApp(WX_APP_ID);
//建议动态监听微信启动广播进行注册到微信
registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// 将该app注册到微信
api.registerApp(WX_APP_ID);
}
}, new IntentFilter(ConstantsAPI.ACTION_REFRESH_WXAPP));
}
4.在项目中微信登录点击事件的方法内调起微信授权
//微信登录点击事件
onclick(v->{
if (Application.api == null) {
Application.api = WXAPIFactory.createWXAPI(this, WX_APP_ID, true);
}
if(!Application.api.isWXAppInstalled()){
toast("未安装微信客户端!");
}else{
Application.api.registerApp(WX_APP_ID);
SendAuth.Req req = new SendAuth.Req();
req.scope = "snsapi_userinfo";
req.state = "wechat_sdk_demo";
Application.api.sendReq(req);
}
});
5.在项目的包名下,创建一个名为wxapi的文件夹,然后在该文件夹下创建一个名为
WXEntryActivity的java文件(文件夹和类名都是不能更改的,都是与微信约定好的名字)
/**
* 微信客户端回调activity示例
*/
public class WXEntryActivity extends AppCompatActivity implements IWXAPIEventHandler {
private String openid;
private String accessToken;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_wx);
boolean handleIntent = XChatApplication.api.handleIntent(getIntent(), this);
//下面代码是判断微信分享后返回WXEnteryActivity的,如果handleIntent==false,说明没有调用IWXAPIEventHandler,则需要在这里销毁这个透明的Activity;
if (handleIntent == false) {
Log.d("微信登录", "onCreate: " + handleIntent);
finish();
}
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
XChatApplication.api.handleIntent(intent, this);
}
@Override
public void onReq(BaseReq baseReq) {
Log.d("微信登录", "onReq: 退出");
finish();
}
/**
* 微信请求回调处理结果
*/
@Override
public void onResp(BaseResp baseResp) {
Log.d("微信登录", "onResp: 回调");
//登录回调
if (baseResp != null) {
switch (baseResp.errCode) {
case BaseResp.ErrCode.ERR_OK:
String code = ((SendAuth.Resp) baseResp).code;
Log.d("微信登录 code", "" + code);
new Thread(new Runnable() {
@Override
public void run() {
getAccessToken(code);
}
}).start();
break;
case BaseResp.ErrCode.ERR_AUTH_DENIED: //用户拒绝授权
finish();
break;
case BaseResp.ErrCode.ERR_USER_CANCEL: //用户取消
finish();
break;
default:
finish();
break;
}
} else {
Log.d("微信登录", "onResp: 回调为空");
}
}
private void getAccessToken(String code) {
//获取授权,参数拼接
StringBuffer longUrl = new StringBuffer();
longUrl.append("https://api.weixin.qq.com/sns/oauth2/access_token")
.append("?appid=" + Constants.WX_APP_ID)
.append("&secret=" + Constants.WX_APP_SECRET)
.append("&code=" + code)
.append("&grant_type=authorization_code");
Log.d("微信登录请求参数", "" + longUrl);
OkHttpClient okHttpClient = new OkHttpClient();
final Request request = new Request.Builder()
.url(longUrl.toString())
.get()
.build();
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
String responseInfo = response.body().string();
Log.d("微信登录返回值", "" + responseInfo);
try {
JSONObject jo = new JSONObject(responseInfo);
openid = jo.getString("openid");
accessToken = jo.getString("access_token");
//一直到这里其实上面拿的都是微信授权的信息,这里是因为后台那边可以用这些参数去微信获取该用户
//的名称头像等数据,再进行注册。返回给我们这边是我们项目的用户数据模型。所以就直接调用的后台接
//口,没有继续查下去
//CoreManager.getCore(IAuthCore.class).ThirdLogin(openid, //jo.getString("unionid"), accessToken, 1);
} catch (JSONException e) {
e.printStackTrace();
}
finish();
}
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
finish();
}
});
}
//如果有需要可以再继续走该方法,获取微信用户的详细信息
private void getWXUserInfo(String openid,String accessToken,String unionid){
StringBuffer userUrl = new StringBuffer();
userUrl.append("https://api.weixin.qq.com/sns/userinfo")
.append("?access_token=" + accessToken)
.append("&openid=" + Constants.WX_APP_SECRET);
Log.d("微信登录请求参数", "" + openid);
OkHttpClient okHttpClient = new OkHttpClient();
final Request request = new Request.Builder()
.url(userUrl.toString())
.get()
.build();
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
}
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
//{
// "openid": "OPENID", 普通用户的标识,对当前开发者帐号唯一
// "nickname": "NICKNAME", 普通用户昵称
// "sex": 1, 普通用户性别,1 为男性,2 为女性
// "province": "PROVINCE", 普通用户个人资料填写的省份
// "city": "CITY", 普通用户个人资料填写的城市
// "country": "COUNTRY", 国家,如中国为 CN
// "headimgurl": "https://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0", 头像
// "privilege": ["PRIVILEGE1", "PRIVILEGE2"], 用户特权信息,json 数组,如微信沃卡用户为(chinaunicom)
// "unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL" 用户统一标识。针对一个微信开放平台帐号下的应用,同一用户的 unionid 是唯一的。
//}
}
});
}
}
上面代码中,微信的appId和secret 是自己项目在微信申请的。
以上 基本上就是接入微信登录的全部过程。
|