三方授权登陆
2018-01-19 14:42
113 查看
新浪授权申请地址:http://open.weibo.com/wiki/Connect/login
QQ授权申请地址:https://connect.qq.com
微信公众号授权申请地址:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842
微信扫码登陆申请地址:
https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&lang=zh_CN
授权申请说明:四种授权方式都需要回调域名跳转,调试的时候,可以申请域名,使用ngrok等工具来实现本地端口映射。其中新浪授权对域名是否备案要求不是太严格,测试域名只能用一天。微信公众号授权登陆需要域名和验证文件,可以下载对应的验证文件放到本地服务器根目录,来达到验证。QQ登陆和微信扫码登陆,都需要域名备案,回调地址对应的域名都必须是已经备案的域名,但是依然可以用备案域名来调试本地端口,我使用的是natapp,我的解决办法是将线上备案的域名下的二级域名解析到natapp,然后将natapp下的域名映射到本地端口,也通过了域名验证,实现了本地调试。
调试出现的问题:
1、微信公众号获取用户信息的时候,中文信息乱码,解决思路将响应信息用ISO-8859-1编码一次,然后在用UTF8解码一次,java实现代码如下:
byte[] bytes = responsetext.getBytes("ISO-8859-1");
responsetext=new String(bytes,"UTF-8")
2、微信公众号第一步通过code获取access_token时,然后第二步通过access_token获取用户信息,http请求需要时同步依次请求。我在调试的时候,发现使用异步请求的时候,由于第一次和第二步的http请求都是异步,导致access_token发生改变,获取用户信息失败,java实现代码如下:
// 通过code值获取access_token
String url = "https://api.weixin.qq.com/sns/oauth2/access_token";
Map<String, String> params = new HashMap<String, String>();
params.put("appid", ResourceConfig.getValue("wx_appid"));
params.put("secret", ResourceConfig.getValue("wx_secret"));
params.put("code", code);
params.put("grant_type", "authorization_code");
String result = HttpUtil.httpPost(url, HttpUtil.redistimeout, params);
// 解析返回结果
if (result != null) {
Map json2Map = JSONUtil.paseJson2Map(result);
if (json2Map.containsKey("errcode")) {
validation.addError("errcode", json2Map.get("errcode") + ":" + json2Map.get("errmsg"));
Result validateRlt = ResultValidateUtils.getResult(validation);
RenderUtils.renderBeanJson(validateRlt);
return;
} else {
// 通过access_token获取用户信息
String info_url = "https://api.weixin.qq.com/sns/userinfo";
Map<String, String> param = new HashMap<String, String>();
param.put("access_token", json2Map.get("access_token").toString());
param.put("openid", json2Map.get("openid").toString());
param.put("lang", "zh_CN");
String info = HttpClientUtil.httpGet(info_url, param, "ISO-8859-1");
// 解析返回结果
if (info != null) {
Map info2Map = JSONUtil.paseJson2Map(info);
if (info2Map.containsKey("errcode")) {
validation.addError("errcode", json2Map.get("errcode") + ":" + json2Map.get("errmsg"));
Result validateRlt = ResultValidateUtils.getResult(validation);
RenderUtils.renderBeanJson(validateRlt);
return;
} else {
userBp.dealinfoForWx(validation, info);
}
}
}
}
}
QQ授权申请地址:https://connect.qq.com
微信公众号授权申请地址:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842
微信扫码登陆申请地址:
https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&lang=zh_CN
授权申请说明:四种授权方式都需要回调域名跳转,调试的时候,可以申请域名,使用ngrok等工具来实现本地端口映射。其中新浪授权对域名是否备案要求不是太严格,测试域名只能用一天。微信公众号授权登陆需要域名和验证文件,可以下载对应的验证文件放到本地服务器根目录,来达到验证。QQ登陆和微信扫码登陆,都需要域名备案,回调地址对应的域名都必须是已经备案的域名,但是依然可以用备案域名来调试本地端口,我使用的是natapp,我的解决办法是将线上备案的域名下的二级域名解析到natapp,然后将natapp下的域名映射到本地端口,也通过了域名验证,实现了本地调试。
调试出现的问题:
1、微信公众号获取用户信息的时候,中文信息乱码,解决思路将响应信息用ISO-8859-1编码一次,然后在用UTF8解码一次,java实现代码如下:
byte[] bytes = responsetext.getBytes("ISO-8859-1");
responsetext=new String(bytes,"UTF-8")
2、微信公众号第一步通过code获取access_token时,然后第二步通过access_token获取用户信息,http请求需要时同步依次请求。我在调试的时候,发现使用异步请求的时候,由于第一次和第二步的http请求都是异步,导致access_token发生改变,获取用户信息失败,java实现代码如下:
// 通过code值获取access_token
String url = "https://api.weixin.qq.com/sns/oauth2/access_token";
Map<String, String> params = new HashMap<String, String>();
params.put("appid", ResourceConfig.getValue("wx_appid"));
params.put("secret", ResourceConfig.getValue("wx_secret"));
params.put("code", code);
params.put("grant_type", "authorization_code");
String result = HttpUtil.httpPost(url, HttpUtil.redistimeout, params);
// 解析返回结果
if (result != null) {
Map json2Map = JSONUtil.paseJson2Map(result);
if (json2Map.containsKey("errcode")) {
validation.addError("errcode", json2Map.get("errcode") + ":" + json2Map.get("errmsg"));
Result validateRlt = ResultValidateUtils.getResult(validation);
RenderUtils.renderBeanJson(validateRlt);
return;
} else {
// 通过access_token获取用户信息
String info_url = "https://api.weixin.qq.com/sns/userinfo";
Map<String, String> param = new HashMap<String, String>();
param.put("access_token", json2Map.get("access_token").toString());
param.put("openid", json2Map.get("openid").toString());
param.put("lang", "zh_CN");
String info = HttpClientUtil.httpGet(info_url, param, "ISO-8859-1");
// 解析返回结果
if (info != null) {
Map info2Map = JSONUtil.paseJson2Map(info);
if (info2Map.containsKey("errcode")) {
validation.addError("errcode", json2Map.get("errcode") + ":" + json2Map.get("errmsg"));
Result validateRlt = ResultValidateUtils.getResult(validation);
RenderUtils.renderBeanJson(validateRlt);
return;
} else {
userBp.dealinfoForWx(validation, info);
}
}
}
}
}
相关文章推荐
- 微信三方登陆和授权
- 粗略使用.NetCore2.0自带授权登陆Authorize
- Android APP第三方授权登陆,分享等功能合集
- 微信公众账号登陆授权开发——4
- Android经服务器授权登陆并将图片Post到自己服务器的简单小Demo(Java+servlet实现)
- 微信公众号(服务号)接入开发之微信授权登陆
- 有关登陆exchange出现http/1.1 401未经授权错误的分析
- mysql 授权 user@'%' 为什么登陆的时候localhost 不行呢???
- Android第三方登陆之微信Wechat、WeiXin篇(原生登陆授权)
- 微信授权登陆界面无法再次弹出,无法用户切换
- 淘宝账号基于OAuth2.0的登录验证授权登陆第三方网站
- 微信第三方授权登陆之网站应用
- 使用ShareSDK三方登陆
- Asp.Net Core登陆授权及身份认证
- 为什么登陆不上WIN 7系统的电脑?提示无权限,登陆失败,未授权用户在计算机上请求登录
- 远程无法登陆(由于没有远程桌面授权服务器可以提供许可证,远程会话被中断)
- 用的友盟安卓社会化组件,然后客户端安装了微博4.2,做的应用用友盟的新浪授权登陆 提示:sso package or sign error。
- MySQL新建用户,授权,删除用户,修改密码,远程登陆,亲测可行
- 微信公众号开发《一》OAuth2.0网页授权认证获取用户的详细信息,实现自动登陆
- 用的友盟安卓社会化组件,然后客户端安装了微博4.2,做的应用用友盟的新浪授权登陆 提示:sso package or sign error。