android开发实现微信三方登录

需要了解的知识:OATH2的简单机制。http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html这篇文章写得很清晰(谢谢作者)。

基本流程(从微信官方文档截图):(说的很详细)



自己理解:首先使用appId在手机客户端向微信开放平台发起请求---->返回code零时票据,让后客户端请求自己的服务器端(code作为参数)---->服务器使用code加上app ID河appSecret(不能放在客户端,容易泄露)向微信开放平台发起请求---->返回access_token。然后服务器端就可以根据access_token获取到授权用户的一些信息。

下面是我的代码实现:

第一部分:(客户端)

第一个页面:

/**

 * 发起请求的页面,只有一个按钮

 * @author ylh

 *

 */


public class YlhActivity extends Activity {

String APP_ID = "******";//改成你自己的APP_ID

private IWXAPI api;


private Button btn_sanfangLogin_activity_main;

public static String uuid = null;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);


btn_sanfangLogin_activity_main = (Button) findViewById(R.id.btn_sanfangLogin_activity_main);


api = WXAPIFactory.createWXAPI(this, APP_ID);

api.registerApp(APP_ID);


btn_sanfangLogin_activity_main

.setOnClickListener(new OnClickListener() {


@Override

public void onClick(View v) {

if (!api.isWXAppInstalled()) {

Toast.makeText(YlhActivity.this, "未安装微信客户端,请先下载",

Toast.LENGTH_LONG).show();

return;

}


uuid = UUID.randomUUID().toString();

final SendAuth.Req req = new SendAuth.Req();

req.scope = "snsapi_userinfo";

req.state = uuid;

System.out.println("state: " + uuid);

boolean b = api.sendReq(req);

System.out.println(b);

}

});

}


}

第二个页面:

/**

 * 授权后,微信客户端调用的页面( android:exported="true")

 * @author ylh

 *

 */


public class WXEntryActivity extends Activity implements IWXAPIEventHandler {

String APP_ID = "*****";//改成你自己的APP_ID

private IWXAPI api;


@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

api = WXAPIFactory.createWXAPI(this, APP_ID);

api.registerApp(APP_ID);


api.handleIntent(getIntent(), this);

}


@Override

public void onReq(BaseReq arg0) {

System.out.println("onRep");

}


@Override

public void onResp(BaseResp resp) {

System.out.println("onResp");

switch (resp.errCode) {

case BaseResp.ErrCode.ERR_OK:

System.out.println("成功");

SendAuth.Resp response = (SendAuth.Resp) resp;

System.out.println(response.state);


if (response.state == null

|| !response.state.equals(YlhActivity.uuid))

return;// 判断请求是否是我的应用的请求


System.out.println(response.code);

System.out.println(response.country);

break;

case BaseResp.ErrCode.ERR_USER_CANCEL:

System.out.println("quxiao");

break;

case BaseResp.ErrCode.ERR_AUTH_DENIED:

System.out.println("jujue");

break;

default:

break;

}

}


}

第二部分:(服务器端,使用httpClient向微信开放平台发起请求,使用json-lib-2.4-jdk15.jar解析返回的结果)

/**

* 发起get请求的方法

* @param urlAddress

* @return

*/

public static String doGet(String urlAddress) {

String getUrl = urlAddress;

HttpGet httpGet = new HttpGet(getUrl);

HttpParams hp = httpGet.getParams();

hp.getParameter("true");

// hp.

// httpGet.setp

HttpClient hc = HttpClients.createDefault();

try {

HttpResponse ht = hc.execute(httpGet);

if (ht.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {

HttpEntity he = ht.getEntity();

InputStream is = he.getContent();

BufferedReader br = new BufferedReader(new InputStreamReader(is));

String response = "";

String readLine = null;

while ((readLine = br.readLine()) != null) {

// response = br.readLine();

response = response + readLine;

}

is.close();

br.close();


// String str = EntityUtils.toString(he);

System.out.println(response);

return response;

} else {

return "error";

}

} catch (ClientProtocolException e) {

// TODO Auto-generated catch block

e.printStackTrace();

return "exception";

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

return "exception";

}

}

下面就调用:

1. 使用客户端传来的code,加上app ID河appSecret(不能放在客户端,容易泄露)向微信开放平台发起请求

doGet("https://api.weixin.qq.com/sns/oauth2/access_token?grant_type=authorization_code&appid=***********&secret=***********&code=***********");(***********的地方替换相应的参数)返回access_token和openid

2. 使用上一步获得的 access_token和openid 向微信开放平台发起请求,获得用户信息

String resp = doGet("https://api.weixin.qq.com/sns/userinfo?access_token=**********&openid=***********");

JSONObject jObject = JSONObject.fromObject(resp);

String openid = jObject.get("openid").toString();

String nickname = jObject.get("nickname").toString();

String sex = jObject.get("sex").toString();

String language = jObject.get("language").toString();

String city = jObject.get("city").toString();

String province = jObject.get("province").toString();

String country = jObject.get("country").toString();

String headimgurl = jObject.get("headimgurl").toString();

String privilege = jObject.get("privilege").toString();

String unionid = jObject.get("unionid").toString();

System.out.println(openid);

System.out.println(nickname);

System.out.println(sex);

System.out.println(language);

System.out.println(city);

System.out.println(province);

System.out.println(country);

System.out.println(headimgurl);

System.out.println(privilege);

System.out.println(unionid);

注: JSONObject使用的是json-lib-2.4-jdk15.jar解析,依赖的jar包有

commons-beanuitls-1.7.0.jar、commons-collections-3.2.jar、commons-lang-2.4.jar、commons-logging-1.2.jar、ezmorph-1.0.4.jar、json-lib-2.4-jdk15.jar

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值