注册界⾯android代码下载,第三⽅登录Android实现代
记录⼀下第三⽅实现登录的⽅法。还是⽐较简单。
⼀、必要的准备⼯作
1.⾸先需要注册并被审核通过的开放平台帐号,然后创建⼀个移动应⽤,也需要被审核;
2.然后到资源中⼼下载开发所需的⼯具;
下载的⽹址:点击打开链接,有⼀个是SDK,⼀个是签名⽣成⼯具还有⼀个范例代码。
3.将SDK⽂件夹lib下的jar⽂件libammsdk.jar导⼊到项⽬⼯程中;
4.你的测试⼿机需要装好客户端;
5.在项⽬的l⽂件中添加如下的权限:
6.因为登录后会返回结果到我们⾃⼰的应⽤,因此,我们需要按如下的规则来建⽴⼀个可供回调的Activity
a. 在包名(申请移动应⽤时所填的包名)下新建⼀个名为wxapi的包,然后再在wxapi的包中新增⼀个WXEntryActivity类,这个类需要继承⾃Activity。
然后再在这个l⽂件中,将这个activity的export属性设置为true,如下所⽰。
android:name=".wxapi.WXEntryActivity"
android:label="@string/title_activity_wxlogin"
android:launchMode="singleTop"
android:exported="true">
b. 实现IWXAPIEventHandler接⼝,发送的请求将回调到onReq⽅法,发送到请求的响应结果将回调到onResp⽅法
c. 在WXEntryActivity中将接收到的intent及实现了IWXAPIEventHandler接⼝的对象传递给IWXAPI接⼝的handleIntent⽅法,如下所⽰
api.handleIntent(getIntent(), this);
7.认证的时序图
这⾥有⼀点要注意,就是从上往下数第6个箭头,即通过code加上appid和appsecret换取access_token,其实这⼀步是在第三⽅应⽤服务器上做的,因为appsecret和access_token直接存储于客户端是⾮常不安全的。Android客户端获取code后,把这个code提交给应⽤服务器,应⽤服务器上保存有appsecret信息,由应⽤服务器来获取access_token,并⽤access_token来完成其它⼯作。
⼆、Android代码
在上⼀步添加的WXEntryActivity对应的类⽂件中添加必要的代码,我的代码如下:
ample.justyoung.logintest.wxapi;
t.Intent;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
ample.justyoung.logintest.HttpsHelper;
ample.justyoung.logintest.R;
ample.justyoung.logintest.fileExplorer.WXConstant;
t.delbase.BaseReq;
t.delbase.BaseResp;
t.delmsg.SendAuth;
t.mm.sdk.openapi.IWXAPI;
t.mm.sdk.openapi.IWXAPIEventHandler;
t.mm.sdk.openapi.WXAPIFactory;
import java.io.IOException;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.util.UUID;
public class WXEntryActivity extends ActionBarActivity implements IWXAPIEventHandler{ private Button wxLogin;
private IWXAPI api;
private static String uuid;
@Override
protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.activity_wxlogin);
wxLogin = (Button) findViewById(R.id.wx_login_button);
wxLogin.setOnClickListener(new WXLoginEvent());
api = ateWXAPI(this, WXConstant.APPID);
api.handleIntent(getIntent(), this);
}
@Override
public void onReq(BaseReq baseReq) {
}
@Override
public void onNewIntent(Intent intent) {
setIntent(intent);
api.handleIntent(intent, this);
}
@Override
public void onResp(BaseResp resp) {
String result;
switch (Code) {
case BaseResp.ErrCode.ERR_OK:
result = "OK";
SendAuth.Resp regResp = (SendAuth.Resp)resp;
if (!regResp.state.equals(uuid))
return;
String code = de;
new WXLoginThread("192.168.2.133:8443/CloudStorageServer/wechat/login?code=" + code).start(); break;
case BaseResp.ErrCode.ERR_USER_CANCEL:
result = "USER_CANCEL";
break;
case BaseResp.ErrCode.ERR_AUTH_DENIED:
result = "ERR_AUTH_DENIED";
break;
default:
result = "errcode_unknown";
break;
}
Toast.makeText(this, result, Toast.LENGTH_LONG).show(); }
class WXLoginEvent implements View.OnClickListener {
@Override
public void onClick(View v) {
uuid = UUID.randomUUID().toString();
final SendAuth.Req req = new SendAuth.Req();
req.scope = "snsapi_userinfo";
req.state = uuid;
api.sendReq(req);
}
}
private class WXLoginThread extends Thread {
private String url;
public WXLoginThread(String url) {
this.url = url;
}
@Override
public void run() {
HttpsHelper httpsHelper = new HttpsHelper();
try {
httpsHelper.prepareHttpsConnection(url);
String response = t();
} catch (KeyManagementException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}代码转换
}
}
}
代码中的如下⽚段是⽤来拉起认证界⾯的。这⾥我使⽤了uuid来作为state参数,(该参数可⽤于防⽌csrf攻击(跨站请求伪造攻击),建议第三⽅带上该参数,可设置为简单的随机数加session进⾏校验)。
uuid = UUID.randomUUID().toString();
final SendAuth.Req req = new SendAuth.Req();
req.scope = "snsapi_userinfo";
req.state = uuid;
api.sendReq(req);
在⽤户接受认证后,应⽤会回调IWXAPIEventHandler接⼝的onResp⽅法。在该⽅法中,⾸先判断返回的resp的状态,若是正常状态,则判断state,然后从再从resp中获取code值。⾄此客户端便完成了它的⼯作。
因为客户端保留appsecret和access_token是⾮常不安全的,因此剩余信息的获取应放到我们的应⽤服务器上进⾏。
三、应⽤服务器代码
在Anroid客户端获取到code后,可提交到我们⾃⼰的应⽤服务器,在我们的应⽤服务器再通过code,来获取access_token,openid等⽤户信息。
1.通过code获取access_token,openid的⽅法是使⽤GET请求,按以下⽅式请求接⼝:
2.通过access_token获取⽤户的⼀些信息的⽅式是通过GET请求使⽤的接⼝:
下⾯贴⼀下我⾃⼰使⽤的代码:
private void handle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String code = getParameter(request, "code");
if (isArgumentNullOrEmpty(code)) {
Log.logger.info("code为空");
return;
}
Log.logger.info("收到code: " + code);
try {
AccessToken accessToken = new AccessToken("/sns/oauth2/access_token", "authorization_code", code);
AccessToken.UserData userData = MetaData().getUserInfo();
... // userData中就是我们通过access_token获取的⽤户信息了。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。