微信登录(Eclipse)

上次更新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个步骤最好由服务器处理,你需要的字段由服务器返回。
以上就是全部微信登录的实现步骤!!!

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值