上次更新QQ登录到现在时间有点长了,这期间一直在工作,这次是微信登录,包括jar包,步骤,接入时注意的签名,和获取相关数据。
首先是申请appid,微信开放平台https://open.weixin.qq.com/
一、接入需要的jar包
二、AndroidManifest.xml,之前在网上看到的挺复杂,其实很简单,<manifest package="包名"/>
如果接受返回数据的Activity需要显式,就需要以一般的Activity那样来写
<activity
android:name="包名.wxapi.WXEntryActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:screenOrientation="fullSensor"
android:exported="true"/>
如果是隐式,两行就行
<activity
android:name="包名.wxapi.WXEntryActivity"
android:exported="true">
三、在Java代码编写具体实现步骤
private IWXAPI api;
if (api == null) {
api = WXAPIFactory.createWXAPI(activity, Constant.WX_APP_ID, false);
}
if (api.isWXAppInstalled()) {
api.registerApp(Constant.WX_APP_ID);
SendAuth.Req req = new SendAuth.Req();
req.scope = "snsapi_userinfo";//为后续获取微信用户信息用
req.state = "xnhd_login";//算是接入微信登录的自定义标识
api.sendReq(req);
} else {
showToastMsg("请先安装微信!");
}
以上就是点击按钮后,调起微信登录的主要步骤,但是apk必须是带有申请appid时上传的签名,相信大家也会利用Eclipses生成自己的签名文件
四、WXEntryActivity
public class WXEntryActivity extends Activity implements IWXAPIEventHandler{
private static final String TAG = "WXEntryActivity";
private IWXAPI api;
String code;
String accessToken;
String openID;
String refreshToken;
Long expires_in;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (api == null) {
api = WXAPIFactory.createWXAPI(this, Constant.WX_APP_ID, false);
}
api.registerApp(Constant.WX_APP_ID);
api.handleIntent(getIntent(), this);
}
// 微信发送请求到第三方应用时,会回调到该方法
@Override
public void onReq(BaseReq req) {
}
// 第三方应用发送到微信的请求处理后的响应结果,会回调到该方法
@Override
public void onResp(BaseResp resp) {
switch (resp.errCode) {
case BaseResp.ErrCode.ERR_OK:
switch (resp.getType()) {
case ConstantsAPI.COMMAND_SENDAUTH:
// 登录回调,处理登录成功的逻辑
SendAuth.Resp response = (SendAuth.Resp) resp;
// 判断请求是否是我的应用的请求
if (response.state == null || !response.state.equals("xnhd_login"))
return;
code = response.code;
Log.i(TAG, "wxcode:" + code);
break;
case ConstantsAPI.COMMAND_SENDMESSAGE_TO_WX:
// 分享回调,处理分享成功后的逻辑
break;
default:
break;
}
break;
case BaseResp.ErrCode.ERR_USER_CANCEL:
switch (resp.getType()) {
case ConstantsAPI.COMMAND_SENDAUTH:
// 登录回调
break;
case ConstantsAPI.COMMAND_SENDMESSAGE_TO_WX:
// 分享回调
break;
default:
break;
}
break;
case BaseResp.ErrCode.ERR_AUTH_DENIED:
switch (resp.getType()) {
case ConstantsAPI.COMMAND_SENDAUTH:
// 登录回调
break;
case ConstantsAPI.COMMAND_SENDMESSAGE_TO_WX:
// 分享回调
break;
default:
break;
}
break;
default:
break;
}
}
}
因为获取code之后的操作一般由服务器处理,会更安全,我把代码贴出,大家由此可以知道需要用到哪些变量!!
3.1通过code获取access_token(在自己服务器端做)
private void getAccessToken() {
String url = "https://api.weixin.qq.com/sns/oauth2/access_token?" + "appid=" + Constant.WX_APP_ID + "&secret="
+ Constant.WX_APP_SECRET + "&code=" + code + "&grant_type=authorization_code";
URI uri = URI.create(url);
HttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet(uri);
HttpResponse response;
try {
response = client.execute(get);
if (response.getStatusLine().getStatusCode() == 200) {
HttpEntity entity = response.getEntity();
BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent(), "UTF-8"));
StringBuilder sb = new StringBuilder();
for (String temp = reader.readLine(); temp != null; temp = reader.readLine()) {
sb.append(temp);
}
JSONObject object = new JSONObject(sb.toString().trim());
accessToken = object.getString("access_token");
openID = object.getString("openid");
refreshToken = object.getString("refresh_token");
expires_in = object.getLong("expires_in");
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
}
3.2获取用户信息
private void getUserInfo() {
if (isAccessTokenIsInvalid() && System.currentTimeMillis() < expires_in) {
String uri = "https://api.weixin.qq.com/sns/userinfo?access_token=" + accessToken + "&openid=" + openID;
HttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet(URI.create(uri));
try {
HttpResponse response = client.execute(get);
if (response.getStatusLine().getStatusCode() == 200) {
BufferedReader reader = new BufferedReader(
new InputStreamReader(response.getEntity().getContent(), "UTF-8"));
StringBuilder builder = new StringBuilder();
for (String temp = reader.readLine(); temp != null; temp = reader.readLine()) {
builder.append(temp);
}
JSONObject object = new JSONObject(builder.toString().trim());
String nikeName = object.getString("nickname");
ToastUtil.showToast(this, "昵称:" + nikeName);
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
}
}
3.3下次登录时只需要验证access_token是否有效,无效则重新获取授权,有效则无需重新获得授权。
private boolean isAccessTokenIsInvalid() {
String url = "https://api.weixin.qq.com/sns/auth?access_token=" + accessToken + "&openid=" + openID;
URI uri = URI.create(url);
HttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet(uri);
HttpResponse response;
try {
response = client.execute(get);
if (response.getStatusLine().getStatusCode() == 200) {
HttpEntity entity = response.getEntity();
BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent(), "UTF-8"));
StringBuilder sb = new StringBuilder();
for (String temp = reader.readLine(); temp != null; temp = reader.readLine()) {
sb.append(temp);
}
JSONObject object = new JSONObject(sb.toString().trim());
int errorCode = object.getInt("errcode");
if (errorCode == 0) {
return true;
}
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
return false;
}
以上3个步骤最好由服务器处理,你需要的字段由服务器返回。
以上就是全部微信登录的实现步骤!!!