build.gradle添加依赖
dependencies {
....
//微信
api 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'
}
WxLogin
public static void initWx(Context context) {
UIUtils.initContext(context);
mContext = context;
api = WXAPIFactory.createWXAPI(context, Constants.WX_APPID, true);
api.registerApp(Constants.WX_APPID);
final IWXAPI msgApi = WXAPIFactory.createWXAPI(context, null);
// 将该app注册到微信
msgApi.registerApp(Constants.WX_APPID);
}
/**
* 微信登录
*/
public static void loginWx() {
if (mContext == null) {
Toast.makeText(mContext, "你没有初始化,请在Application中做初始化动作,请调用 initWx(context)方法", Toast.LENGTH_SHORT).show();
return;
}
if (!api.isWXAppInstalled()) {
Toast.makeText(mContext, "您还未安装微信客户端", Toast.LENGTH_SHORT).show();
return;
}
final SendAuth.Req req = new SendAuth.Req();
req.scope = "snsapi_userinfo";
req.state = Constants.STATE; //自定义
api.sendReq(req);
}
Application的onCreate中初始化微信
WxLogin.initWx(this);
登录的按钮调用
WxLogin.loginWx();
以上是拉起微信操作
用户授权后,微信回调wxapi目录下的WXEntryActivity(新建wxapi目录,在此目录下新建WXEntryActivity,注意不能为名字不能为其他内容)
清单文件注册(一定要加上android:exported="true",否则不走WXEntryActivity里面的回调)
<activity
android:name=".wxapi.WXEntryActivity"
android:exported="true">
</activity>
WXEntryActivity
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
private static final int RETURN_MSG_TYPE_LOGIN = 1;
private static final int RETURN_MSG_TYPE_SHARE = 2;
private IWXAPI mWeixinAPI;
private TextView id_tv;
private TextView nickname_tv;
private TextView sex_tv;
private ImageView imageView;
private Handler handler;
private static String TAG = "WXEntryActivity";
private String refresh_token;
private String expires_in;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.e(TAG, "onCreate: " );
handler = new Handler();
mWeixinAPI = WXAPIFactory.createWXAPI(this, Constants.WX_APPID, true);
mWeixinAPI.handleIntent(this.getIntent(), this); //必须调用,否则微信不回调Resp
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
mWeixinAPI.handleIntent(intent, this); //必须调用,否则微信不回调Resp
}
@Override
public void onReq(BaseReq baseReq) {
Log.e("-----", "onReq: " + baseReq);
finish();
}
@Override
public void onResp(BaseResp baseResp) {
Log.e("-----", "errStr: " + baseResp.errStr);
Log.e("-----", "openId: " + baseResp.openId);
Log.e("-----", "transaction: " + baseResp.transaction);
Log.e("-----", "errCode: " + baseResp.errCode);
Log.e("-----", "getType: " + baseResp.getType());
Log.e("-----", "checkArgs: " + baseResp.checkArgs());
switch (baseResp.errCode) {
case BaseResp.ErrCode.ERR_AUTH_DENIED:
case BaseResp.ErrCode.ERR_USER_CANCEL:
if (RETURN_MSG_TYPE_SHARE == baseResp.getType()) UIUtils.runOnUIToast("分享失败");
else UIUtils.runOnUIToast("登录失败");
break;
case BaseResp.ErrCode.ERR_OK:
switch (baseResp.getType()) {
case RETURN_MSG_TYPE_LOGIN:
//拿到了微信返回的code,立马再去请求access_token
String code = ((SendAuth.Resp) baseResp).code;
getAccess_token(code);
//就在这个地方,用网络库什么的或者自己封的网络api,发请求去咯,注意是get请求
Log.e("--------", "code: " + code);
id_tv.setText("code: " + code);
Toast.makeText(this, "登陆成功", Toast.LENGTH_SHORT).show();
break;
case RETURN_MSG_TYPE_SHARE:
UIUtils.runOnUIToast("微信分享成功");
finish();
break;
}
break;
}
}
/**
* 获取openid accessToken值用于后期操作
*
* @param code 请求码
*/
private void getAccess_token(final String code) {
String path = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="
+ Constants.WX_APPID
+ "&secret="
+ Constants.WX_SECRET
+ "&code="
+ code
+ "&grant_type=authorization_code";
OkHttpClient okHttpClient = new OkHttpClient();
final Request request = new Request.Builder()
.url(path)
.get()//默认就是GET请求,可以不写
.build();
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.d(TAG, "onFailure: ");
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String res = response.body().string();
Log.d(TAG, "onResponse: " + res);
Log.e(TAG, "onResponse: " + res);
JSONObject jsonObject = null;
try {
jsonObject = new JSONObject(res);
String openid = jsonObject.getString("openid").toString().trim();
String access_token = jsonObject.getString("access_token").toString().trim();
refresh_token = jsonObject.getString("refresh_token").toString().trim();
expires_in = jsonObject.getString("expires_in").toString().trim();
// Toast.makeText(WXEntryActivity.this, "access_token:"+access_token, Toast.LENGTH_SHORT).show();
getUserMesg(access_token, openid);
} catch (JSONException e) {
e.printStackTrace();
}
}
});
}
/**
* 获取微信的个人信息
*
* @param access_token
* @param openid
*/
private void getUserMesg(final String access_token, final String openid) {
String path = "https://api.weixin.qq.com/sns/userinfo?access_token="
+ access_token
+ "&openid="
+ openid;
OkHttpClient okHttpClient = new OkHttpClient();
final Request request = new Request.Builder()
.url(path)
.get()//默认就是GET请求,可以不写
.build();
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.d(TAG, "onFailure: ");
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String res = response.body().string();
Log.e("------", "全部数据: " + res);
JSONObject jsonObject = null;
try {
jsonObject = new JSONObject(res);
String nickname = jsonObject.getString("nickname");
String sex = jsonObject.get("sex").toString();
String headimgurl = jsonObject.getString("headimgurl");
String country = jsonObject.getString("country");
String openid1 = jsonObject.getString("openid");
String province = jsonObject.getString("province");
String unionid = jsonObject.getString("unionid");
String city = jsonObject.getString("city");
Log.e(TAG, "用户基本信息:");
Log.e(TAG, "nickname:" + nickname);
Log.e(TAG, "sex: " + sex);
Log.e(TAG, "headimgurl:" + headimgurl);
Log.e(TAG, "openid:" + openid1);
Log.e(TAG, "country:" + country);
Log.e(TAG, "province:" + province);
Log.e(TAG, "unionid:" + unionid);
Log.e(TAG, "city:" + city);
} catch (JSONException e) {
e.printStackTrace();
UIUtils.runOnUIToast("登陆错误,请重新再试");
}
}
});
}
}