1:build.gradle下加入依赖
implementation 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
2:AndroidManifest.xml中加入网络权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
//在<application>下加入创建的actvity的属性
<activity
android:name=".wxapi.WXEntryActivity"
android:exported="true"
android:launchMode="singleTask"
android:screenOrientation="portrait"
android:taskAffinity="net.sourceforge.simcpux"
android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
3:创建微信登录需要的工具类WeiXinUtil
public class WeiXinUtil {
// APP_ID 替换为你的应用从官方网站申请到的合法appID
public static String APP_ID = "";
// IWXAPI 是第三方app和微信通信的openApi接口
private WeiXinUtil() {
}
public static boolean success(Context context){
//判断是否安装过微信
if (WeiXinUtil.reg(context).isWXAppInstalled()) {
return true;
}else {
return false;
}
}
public static IWXAPI reg(Context context){
if (context!=null) {
//AppConst.WEIXIN.APP_ID是指你应用在微信开放平台上的AppID,记得替换。
IWXAPI wxapi = WXAPIFactory.createWXAPI(context, APP_ID, true);
//注册到微信
wxapi.registerApp(APP_ID);
return wxapi;
}else {
return null;
}
}
/* //支付
public static void weiXinPay(Bean_OrderSuccessBean bean){
IWXAPI wxapi = WXAPIFactory.createWXAPI(App.context, APP_ID, true);
//注册到微信
wxapi.registerApp(APP_ID);
PayReq payReq = new PayReq();
payReq.appId=bean.getAppId();
payReq.prepayId=bean.getPrepayId();
payReq.partnerId=bean.getPartnerId();
payReq.nonceStr=bean.getNonceStr();
payReq.timeStamp=bean.getTimeStamp();
payReq.sign=bean.getSign();
payReq.packageValue=bean.getPackageValue();
Log.d("",payReq.toString()+"111111");
wxapi.sendReq(payReq);
}*/
}
4:在你点击微信登录的点击下加入判断手机或模拟器是否安装微信
case R.id.iv_wx:
// 微信登录
if (!WeiXinUtil.success(this)) {
Toast.makeText(this, "请先安装应用", Toast.LENGTH_SHORT).show();
} else {
// 验证
SendAuth.Req req = new SendAuth.Req();
req.scope = "snsapi_userinfo";
req.state = "wechat_sdk_demo_test";
WeiXinUtil.reg(LoginActivity.this).sendReq(req);
}
break;
5:创建一个微信登录的WXEntryActivity,切记创建名必须是WXEntryActivity继承IWXAPIEventHandler
6:微信登录官网接口请求工具类NetworkUtil
public class NetworkUtil {
private static String TAG = "MicroMsg.NetworkUtil";
public static final int GET_TOKEN = 1;
public static final int CHECK_TOKEN = 2;
public static final int REFRESH_TOKEN = 3;
public static final int GET_INFO = 4;
public static final int GET_IMG = 5;
public static void sendWxAPI(Handler handler, String url, int msgTag) {
Log.v(TAG, "--sendWxAPI---handler==" + handler);
HttpsThread httpsThread = new HttpsThread(handler, url, msgTag);
httpsThread.start();
}
public static void getImage(Handler handler, String url, int msgTag) {
HttpsThread httpsThread = new HttpsThread(handler, url, msgTag);
httpsThread.start();
}
static class HttpsThread extends Thread {
private Handler handler;
private String httpsUrl;
private int msgTag;
public HttpsThread(Handler handler, String url, int msgTag) {
this.handler = handler;
this.httpsUrl = url;
this.msgTag = msgTag;
}
@Override
public void run() {
if (msgTag == GET_IMG) {
try {
byte[] imgdata = httpURLConnectionGet(httpsUrl);
Message msg = Message.obtain();
msg.what = msgTag;
Bundle data = new Bundle();
data.putByteArray("imgdata", imgdata);
msg.setData(data);
Log.v(TAG, "---GET_IMG---" + msg);
handler.sendMessage(msg);
} catch (Exception e) {
Log.e(TAG, e.getMessage());
}
} else {
int resCode;
InputStream in;
String httpResult = null;
try {
URL url = new URL(httpsUrl);
URLConnection urlConnection = url.openConnection();
HttpsURLConnection httpsConn = (HttpsURLConnection) urlConnection;
httpsConn.setAllowUserInteraction(false);
httpsConn.setInstanceFollowRedirects(true);
httpsConn.setRequestMethod("GET");
httpsConn.connect();
resCode = httpsConn.getResponseCode();
if (resCode == HttpURLConnection.HTTP_OK) {
Log.v(TAG, "----HTTP_OK---");
in = httpsConn.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(
in, "iso-8859-1"), 8);
StringBuilder sb = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
sb.append(line).append("\n");
}
in.close();
httpResult = sb.toString();
Log.i(TAG, httpResult);
Message msg = Message.obtain();
msg.what = msgTag;
Bundle data = new Bundle();
data.putString("result", httpResult);
msg.setData(data);
handler.sendMessage(msg);
Log.v(TAG, "handler.sendMessage" + httpResult);
}
} catch (Exception e) {
Log.e(TAG, "----HTTP_e-----" + e.getMessage());
}
}
}
private static byte[] httpURLConnectionGet(String url) throws Exception {
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
if (connection == null) {
Log.i(TAG, "open connection failed.");
}
int responseCode = connection.getResponseCode();
if (responseCode >= 300) {
connection.disconnect();
Log.w(TAG, "dz[httpURLConnectionGet 300]");
return null;
}
InputStream is = connection.getInputStream();
byte[] data = readStream(is);
connection.disconnect();
return data;
}
private static byte[] readStream(InputStream inStream) throws IOException {
byte[] buffer = new byte[1024];
int len = -1;
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
while ((len = inStream.read(buffer)) != -1) {
outStream.write(buffer, 0, len);
}
byte[] data = outStream.toByteArray();
outStream.close();
inStream.close();
return data;
}
}
}
主要代码
public class WXEntryActivity extends BaseActivity implements IWXAPIEventHandler {
public static final String TAG = "WXEntryActivity";
private IWXAPI wxapi;
private String token;
private String mUnionid;
private String mOpenid;
private String mName;
private String mHeadimgurl;
//获取请求字段返回
private MyHandler handler = new MyHandler(this);
//刷新或续期 access_token 使用返回
private TokenHandler mTokenHandler = new TokenHandler(this);
//微信登录用户信息返回
private UserHandler mUserHandler = new UserHandler(this);
@SuppressLint("HandlerLeak")
private class MyHandler extends Handler {
private final WeakReference<WXEntryActivity> wxEntryActivityWeakReference;
public MyHandler(WXEntryActivity wxEntryActivity) {
wxEntryActivityWeakReference = new WeakReference<WXEntryActivity>(wxEntryActivity);
}
@Override
public void handleMessage(Message msg) {
int tag = msg.what;
switch (tag) {
case NetworkUtil.GET_TOKEN: {
Bundle data = msg.getData();
JSONObject json = null;
try {
json = new JSONObject(data.getString("result"));
//返回示例
// "access_token":"36_l7UREDIdJnicBKNmwoSvxdAAHNIAJFAebDDEFs9PR_YfTAvOSylEl25d9_TdsEwTOZwXRXHlRTf4uhHVP3Irk2ikaReY1cshN1rvWXLdr2Q",
// "expires_in":7200,"
// refresh_token":"36_3RPGL8hG5AkaB11XO6lvofO-DxP5baCBXxgoB_opeiXENqMdFIuj19iFRdkDwRtEKCtmkeESaKV8jr92EvHdgyph9MwNWoWYyYN69V6F2r4",
// "openid":"obvoBwSjNM2cG2A5b_GjVYRTVTKw",
// "scope":"snsapi_userinfo",
// "unionid":"omA_7vgPHBCwFg9J55Xvc40N_-Qg"
Log.v(TAG, "MyHandler weixin==" + json);
String refresh_token = json.getString("refresh_token");
//刷新或续期 access_token 使用
NetworkUtil.sendWxAPI(mTokenHandler, String.format("https://api.weixin.qq.com/sns/oauth2/refresh_token?" +
"appid=%s&grant_type=refresh_token&refresh_token=%s", "wxb3bd283e7ca67de1",
refresh_token), NetworkUtil.GET_TOKEN);
} catch (JSONException e) {
Log.e(TAG, e.getMessage());
}
}
}
}
}
@SuppressLint("HandlerLeak")
private class TokenHandler extends Handler {
private final WeakReference<WXEntryActivity> wxEntryActivityWeakReference;
public TokenHandler(WXEntryActivity wxEntryActivity) {
wxEntryActivityWeakReference = new WeakReference<WXEntryActivity>(wxEntryActivity);
}
@Override
public void handleMessage(Message msg) {
int tag = msg.what;
switch (tag) {
case NetworkUtil.GET_TOKEN: {
Bundle data = msg.getData();
JSONObject json = null;
try {
json = new JSONObject(data.getString("result"));
//返回示例
// {
// "access_token": "ACCESS_TOKEN",
// "expires_in": 7200,
// "refresh_token": "REFRESH_TOKEN",
// "openid": "OPENID",
// "scope": "SCOPE"
// }
Log.v(TAG, "TokenHandler weixin==" + json);
String access_token = json.getString("access_token");
String openid = json.getString("openid");
// //刷新或续期 access_token 使用
NetworkUtil.sendWxAPI(mUserHandler, String.format("https://api.weixin.qq.com/sns/userinfo?" +
"access_token=%s&openid=refresh_token&lang=zh-CN", access_token,
openid), NetworkUtil.GET_TOKEN);
} catch (JSONException e) {
Log.e(TAG, e.getMessage());
}
}
}
}
}
@SuppressLint("HandlerLeak")
private class UserHandler extends Handler {
private final WeakReference<WXEntryActivity> wxEntryActivityWeakReference;
public UserHandler(WXEntryActivity wxEntryActivity) {
wxEntryActivityWeakReference = new WeakReference<WXEntryActivity>(wxEntryActivity);
}
@Override
public void handleMessage(Message msg) {
int tag = msg.what;
switch (tag) {
case NetworkUtil.GET_TOKEN: {
Bundle data = msg.getData();
JSONObject json = null;
try {
json = new JSONObject(data.getString("result"));
//返回示例
// {
// "openid": "OPENID",
// "nickname": "NICKNAME",
// "sex": 1,
// "province": "PROVINCE",
// "city": "CITY",
// "country": "COUNTRY",
// "headimgurl": "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0",
// "privilege": ["PRIVILEGE1", "PRIVILEGE2"],
// "unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL"
// }
Log.v(TAG, "UserHandler weixin==" + json);
mOpenid = json.getString("openid");
mUnionid = json.getString("unionid");
mName = json.getString("nickname");
mHeadimgurl = json.getString("headimgurl");
if (!TextUtils.isEmpty(mUnionid)) {
Log.v(TAG, "--unionid==" + mUnionid + "---openid==" + mOpenid + "---nickname==" + mName + "---headimgurl" + mHeadimgurl);
//这里就进行微信登录之后要进行的一些操作,比如将用户信息传给接口等
ThirdLoginPresenter thirdLoginPresenter = new ThirdLoginPresenter(new WxCall());
Map<String, Object> maps = new HashMap<>();
maps.put("platform", "wechat");
maps.put("unionid", mUnionid);
RequestBody bodys = RequestBody.create(MediaType.parse("application/json; charset=utf-8"),
new Gson().toJson(maps));
thirdLoginPresenter.reqeust(bodys);
}
} catch (JSONException e) {
Log.e(TAG, e.getMessage());
}
}
}
}
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
wxapi.handleIntent(intent, this);
}
@Override
protected int getLayoutId() {
return R.layout.activity_wxentry;
}
@Override
protected void initView() {
token = PreferenceUtil.getString(Zhijiaojia, "token");
wxapi = WXAPIFactory.createWXAPI(this, "wxb3bd283e7ca67de1");
wxapi.handleIntent(getIntent(), this);
WeiXinUtil.reg(WXEntryActivity.this).handleIntent(getIntent(), this);
}
@Override
protected void destoryData() {
}
@Override
public void onReq(BaseReq baseReq) {
}
@Override
public void onResp(BaseResp baseResp) {
switch (baseResp.errCode) {
// 正确返回
case BaseResp.ErrCode.ERR_OK:
switch (baseResp.getType()) {
case ConstantsAPI.COMMAND_SENDMESSAGE_TO_WX:
//微信分享
Log.v(TAG, "----onResp----token==" + token);
//分享成功请求赚取佣金接口
SharePresenter sharePresenter = new SharePresenter(new shareCall());
Map<String, Object> map = new HashMap<>();
map.put("type", "goods");
RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"),
new Gson().toJson(map));
sharePresenter.reqeust(token, body);
break;
case ConstantsAPI.COMMAND_SENDAUTH:
SendAuth.Resp authResp = (SendAuth.Resp) baseResp;
final String code = authResp.code;
//微信登录
//官网步骤https://developers.weixin.qq.com/doc/oplatform/Mobile_App/WeChat_Login/Authorized_API_call_UnionID.html
// 通过 code 获取 access_token
Log.v(TAG, "---code==" + code);
NetworkUtil.sendWxAPI(handler, String.format("https://api.weixin.qq.com/sns/oauth2/access_token?" +
"appid=%s&secret=%s&code=%s&grant_type=authorization_code", "wxb3bd283e7ca67de1",
"d39b1b8ece397dd3db74a7ecf52c5684", code), NetworkUtil.GET_TOKEN);
break;
default:
break;
}
break;
default:
// 错误返回
switch (baseResp.getType()) {
// 微信分享
case ConstantsAPI.COMMAND_SENDMESSAGE_TO_WX:
Log.e("WXEntryActivity", ">>>errCode = " + baseResp.errCode);
ToastUtil.show("分享失败");
finish();
break;
default:
break;
}
break;
}
}
/**
* 接口请求成功
*/
class WxCall implements DataCall<Result<DataBean>> {
@Override
public void success(Result<DataBean> data) {
ToastUtil.show(data.getMsg());
}
@Override
public void fail(ApiException e) {
}
}
/**
* 分享成功回调
*/
class shareCall implements DataCall<Result> {
@Override
public void success(Result data) {
Log.v(TAG, "---shareCall---" + data.getMsg());
if (data.getCode() == 200) {
ToastUtil.show(data.getMsg());
} else {
ToastUtil.show(data.getMsg());
}
finish();
}
@Override
public void fail(ApiException e) {
}
}
}
QQ登录请查看QQ登录