前面介绍了Android和IOS在使用微信登录时,直接使用客户端获取相应的token并刷新token是危险的。因此,应用的密钥Appsecret将暴露给客户端,以便您可以查看相应的密钥。第二,token和refresh token也可能直接落在本地。我们必须把获取token的这种方法放在服务器上,并在服务器上请求这个token。这样私钥就不会存储在客户端上。

如果对我的文章感兴趣,欢迎订阅我的头条号:一点热,yee.

快速链接:

android和ios使用微信登录

ios使用微信登录授权开发-实战二

我也简单介绍一下微信的关键的这几个要点:

1、Appsecret 是应用使用密钥,如果存在泄漏的话,需要立即更改,否则很可能遭到恶意攻击;

2、access_token 为用户授权第三方应用发起接口调用的凭证,这个有点像我们的钥匙,凭着钥匙可以开门;

3、refresh_token 为用户授权第三方应用的长效凭证,仅用于刷新access_token。

那么开始今天要说的内容

首先微信登陆分3个步骤

  1. 第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数;

  2. 通过code参数加上AppID和AppSecret等,然后我们可以通过springMVC使用http链接通过API换取access_token;

  3. 在自己的服务器中,通过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操作。

一、客户端部分

在客户端,我们首先需要发起调用微信的登陆请求

那么在Android里面,我们可以这样调用

Final SendAu req = new SendAu();

req.scope = "snsapi_userinfo";

req.state = "yeehot_com_weixin";

a(req);

这样就可以发起调用了,当然我们也可以检测一下客户端有没有安装微信这些的。此外还需要注册微信到应用里面。这个具体可以看看微信登陆操作的部分。

我们发起调用之后,会在WXEntryActivity这个页面返回结果的,那么我们需要对结果进行解析,

返回的结果:

我们只需要拿这个临时票据scope,然后递交到服务器中。

SendAu sendResp = (SendAu) resp;

我们把,通过http客户端访问我们的spring mvc 服务器

假设我们用Android的AsyncHttpClient:

AsyncHttpClient client = new AsyncHttpClient();

RequestParams params=new RequestParams();

("code",code);

client.get("http://www.yee/Yeehot-Program-King/user/access_token", params, new AsyncHttpResponseHandler() {

@Override

public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {

String result=new String(responseBody);

if (result!=null){

Toa).show();

}

else {

Toa;无法访问服务器",Toa).show();

}

}

@Override

public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {

}

});

二、服务器部分,使用spring mvc来实现

1、获取token的实现:

@ResponseBody

@RequestMapping(value = "/user/access_token", method = Reque)

public String token(String code){

Map<String, String> param = new HashMap<String, String>();

("code",code);

("secret", "请填写你的应用秘钥");

("grant_type", "authorization_code");

("appid","填写你的应用ID");

String https = "; + "appid=" + ("appid") + "&secret=" + ("secret") + "&code=" + ("code") + "&grant_type=authorization_code";

String infoString= httpget(https);

return infoString;

}

2、获取个人信息

这里需要注意的就是需要我们填写openid,这个openid就是我们在获取token的时候返回的。

public String getuserinfo(String access_token,String openid) {

Map<String, String> param = new HashMap<String, String>();

("access_token", access_token);

("openid", openid);

String https = "; + "access_token=" + ("access_token") + "&openid=" + ("openid") ;

String infoString= httpget(https);

(infoString);

return infoString;

}

3、刷新token

public String refreshtoken(String refresh_token) {

Map<String, String> param = new HashMap<String, String>();

("refresh_token", refresh_token);

("grant_type", "refresh_token");

("appid", "你的微信应用ID");

String https = "; + "refresh_token=" + ("refresh_token") + "&grant_type=" + ("grant_type") + "&appid=" + ("appid") ;

String infoString= httpget(https);

Sy(infoString);

return infoString;

}

4、实现网络连接的方法

public String httpget(String url){

X509TrustManager tm = new X509TrustManager() {

public void checkClientTrusted(X509Certificate[] xcs,

String string) throws CertificateException {

}

public void checkServerTrusted(X509Certificate[] xcs,

String string) throws CertificateException {

}

public X509Certificate[] getAcceptedIssuers() {

return null;

}

};

SSLContext sslcontext;

try {

sslcontext = SSLCon("TLS");

(null, new TrustManager[]{tm}, null);

} catch (NoSuchAlgorithmException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (KeyManagementException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

ConnectionSocketFactory plainsf = PlainConnectionSocketFactory

.getSocketFactory();

LayeredConnectionSocketFactory sslsf = SSLConnectionSocketFactory

.getSocketFactory();

Registry<ConnectionSocketFactory> registry = RegistryBuilder

.<ConnectionSocketFactory> create().register("http", plainsf)

.register("https", sslsf).build();

PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(

registry);

cm.setMaxTotal(200);

CloseableHttpClient httpClient = H()

.setConnectionManager(cm)

.build();

String result="";

HttpGet get = new HttpGet(url);

long start = Sy();

try {

CloseableHttpResponse response = (get);

try {

StringBuilder sb2 = new StringBuilder();

BufferedReader br = new BufferedReader(new InputStreamReader().getContent(), "UTF-8"));

String line;

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

(line);

}

result= ();

} finally {

re();

}

} catch (ClientProtocolException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} finally {

// 关闭连接,释放资源

try {

();

} catch (IOException e) {

e.printStackTrace();

}

}

return result;

}

这里就讲解到这里了,如果在自己的项目中遇到问题可以提问,,欢迎继续关注我的头条号:一点热,yee。欢迎大家收藏与转发,如果转载到其它网站,请与我联系.

相关推荐