前面介绍了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个步骤
第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数;
通过code参数加上AppID和AppSecret等,然后我们可以通过springMVC使用http链接通过API换取access_token;
在自己的服务器中,通过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。欢迎大家收藏与转发,如果转载到其它网站,请与我联系.
1.文章《(access_token 填什么)羊了个羊token填什么!》援引自互联网,为网友投稿收集整理,仅供学习和研究使用,内容仅代表作者本人观点,与本网站无关,侵删请点击页脚联系方式。
2.文章《(access_token 填什么)羊了个羊token填什么!》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
相关推荐
- . 现代买票为什么带上携程保险
- . 潮阳怎么去广州南站
- . 湖南马拉河怎么样
- . 烧纸为什么到三岔路口
- . 百色为什么这么热
- . 神州租车怎么样
- . 芜湖方特哪个适合儿童
- . 护肤品保养液是什么类目
- . 早晚的护肤保养有哪些项目
- . 女孩护肤品怎么保养的最好