spring mvc框架和蓝信做对接。 总结一下。
2016-07-06 15:55
615 查看
目前即时通讯市场基本都被微信所占有,但是为了安全考虑好多企业或机关都选择别的某信做企业级的外链。
最近我就做了俩个和 易信 蓝信的对接。(易信企业版目前没有完全完成,特别的给做的一个小接口),
蓝信这边基本都是定制,我做了个 简单的自动登录。
(根据蓝信上的信息找寻唯一标示,然后和自己系统里面的数据进行比对。成功自动登录,不成功,登录之后绑定手机号!)
受限看下 蓝信提供的接口
https://docs.lanxin.cn/
做的是自动登录方面所以 用到了
OAth2接口 如果你会用到 就自己看下!
大体看了下 大约需要三步完成 我需要的代码
1.获取Authorization Code
2.获取access_token
3.获取用户信息
下面是代码部分
1.获取Authorization
Code
/**
* 构造参数并将请求重定向到蓝信API获取登录信息
*
* @param index
* @return
*/
@RequestMapping(value = { "/oauth2wx" })
public static String Oauth2API(HttpServletRequest request){
//获取项目域名
String reqUrl =request.getLocalAddr();
//拼接蓝信回调地址
String backUrl ="http://" + reqUrl + "/bluelogin";
String redirect_uri = "";
try {
redirect_uri = java.net.URLEncoder.encode(backUrl, "utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
String oauth2Url = "http://domain/connect/oauth2/authorize?appid=888888&redirect_uri=" + redirect_uri
+ "&response_type=code&scope=snsapi_userinfo&state=1";
return "redirect:" + oauth2Url;
}
2.获取access_token
/**
* 根据code获取Userid后跳转到需要带用户信息的最终页面
*
* @param request
* @param code
* 获取蓝信重定向到自己设置的URL中code参数
* @param oauth2url
* 跳转到最终页面的地址
* @return
*/
public String oAuth2Url(HttpServletRequest request, String code,HttpServletResponse response){
AccessToken accessToken = lanxinUtil.getAccessToken(code);
// HttpSession session = request.getSession();
if (accessToken != null && accessToken.getToken() != null) {
String mobile = SimpleOAuth2Controller.getMemberGuidByCode(accessToken);
// 这里简单处理,存储到session中
// if (openid != null) {
// session.setAttribute("buleCellPhone", openid);
// }
User user = userService.findByCellphoto(mobile);
if(user==null){
return "/mobile/sys/login";
}else{
PrincipalCollection principals = new SimplePrincipalCollection(user.getUsername(), "MobileRealm");
Builder builder = new WebSubject.Builder(request, response);
builder.principals(principals);
builder.authenticated(true);
WebSubject subject = builder.buildWebSubject();
ThreadContext.bind(subject);
subject.getSession().setAttribute("user", user);
}
}
工具类:取得页面的返回值(原打算用json,由于一些问题换成了MAP ,凑合下看吧)
public static Map<String, Object> httpRequest(String requestUrl) {
Map<String, Object> maps = null;
try {
String str = null;
HttpGet getMethod = new HttpGet(requestUrl);
HttpClient client = new DefaultHttpClient();
HttpResponse res = client.execute(getMethod);
HttpEntity entity=res.getEntity() ;
if (entity!= null) {
str = EntityUtils.toString(entity);
}
maps = JsonUtils.toObject(str, Map.class);
System.out.println("maps=" + maps);
} catch (ConnectException ce) {
ce.printStackTrace();
// System.out.println("网络链接失败!");
} catch (UnknownHostException uhe) {
uhe.printStackTrace();
// System.out.println("蓝信API无法访问....!");
// httpRequest(requestUrl, requestMethod, outputStr);
} catch (Exception e) {
e.printStackTrace();
}
return maps;
}
2.获取access_token
/**
* 调用接口获取用户信息
*
* @return
* @throws SQLException
* @throws RemoteException
*/
public static String getMemberGuidByCode(AccessToken accessTokens) {
Result<String> result = lanxinUtil.oAuth2GetUserByCode(accessTokens);
if (result.getErrcode() == "0") {
if (result.getObj() != null) {
// 此处可以通过蓝信授权用code还钱的Userid查询自己本地服务器中的数据
return result.getObj();
}
}
return "";
}
/**
* OAuth2验证接口根据code获取成员信息
*
* @param AccessToken
* @return
*/
public static Result<String> oAuth2GetUserByCode(AccessToken accessTokens) {
Result<String> result = new Result<String>();
Map<String,Object > maps = WechatOAuth2.getUserByCode(accessTokens);
if (maps != null) {
try {
ArrayList openOrgMemberList =(ArrayList) maps.get("openOrgMemberList") ;
Map mapa = (Map) openOrgMemberList.get(0);
String openid = (String) mapa.get("mobile");
if (openid != null && openid.length() > 0) {
result.setErrmsg("");
result.setErrcode("0");
result.setObj(openid);
} else {
result.setErrmsg((String) mapa.get("errmsg"));
result.setErrcode((String) mapa.get("errcode"));
}
} catch (Exception e) {
result.setErrmsg("accessToken 超时......");
result.setErrcode("42001");
}
}
return result;
}
3.获取用户信息
public class WechatOAuth2 {
private static final String get_oauth2_url = "http://open.lanxin.cn/sns/userinfo?access_token=ACCESS_TOKEN&mobile=MOBILE";
/**
* 根据code获取成员信息
*
* @param request
*
* @return JSONObject
*/
public static Map<String, Object> getUserByCode(AccessToken accessTokens) {
System.out.println("accessTokens.getToken()="+accessTokens.getToken()+"accessTokens.getOpenid()="+accessTokens.getOpenid());
String menuUrl = get_oauth2_url.replace("ACCESS_TOKEN", accessTokens.getToken()).replace("xxxxxx",accessTokens.getOpenid() );
Map<String, Object> maps = WechatAccessToken.httpRequest(menuUrl);
// String getcode = code;
return maps;
}
最后就是登录那些代码了很简单就不放上了。放上一句话。
String mobile = SimpleOAuth2Controller.getMemberGuidByCode(accessToken);
结果还是好的,但是蓝信那边修改外链之后需要重新登录之后才可以看到修改以后的内容。这点很麻烦。
开始一直认为是自己错误了多耽误了一天工夫!
希望对别人有帮助!
最近我就做了俩个和 易信 蓝信的对接。(易信企业版目前没有完全完成,特别的给做的一个小接口),
蓝信这边基本都是定制,我做了个 简单的自动登录。
(根据蓝信上的信息找寻唯一标示,然后和自己系统里面的数据进行比对。成功自动登录,不成功,登录之后绑定手机号!)
受限看下 蓝信提供的接口
https://docs.lanxin.cn/
做的是自动登录方面所以 用到了
OAth2接口 如果你会用到 就自己看下!
大体看了下 大约需要三步完成 我需要的代码
1.获取Authorization Code
2.获取access_token
3.获取用户信息
下面是代码部分
1.获取Authorization
Code
/**
* 构造参数并将请求重定向到蓝信API获取登录信息
*
* @param index
* @return
*/
@RequestMapping(value = { "/oauth2wx" })
public static String Oauth2API(HttpServletRequest request){
//获取项目域名
String reqUrl =request.getLocalAddr();
//拼接蓝信回调地址
String backUrl ="http://" + reqUrl + "/bluelogin";
String redirect_uri = "";
try {
redirect_uri = java.net.URLEncoder.encode(backUrl, "utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
String oauth2Url = "http://domain/connect/oauth2/authorize?appid=888888&redirect_uri=" + redirect_uri
+ "&response_type=code&scope=snsapi_userinfo&state=1";
return "redirect:" + oauth2Url;
}
2.获取access_token
/**
* 根据code获取Userid后跳转到需要带用户信息的最终页面
*
* @param request
* @param code
* 获取蓝信重定向到自己设置的URL中code参数
* @param oauth2url
* 跳转到最终页面的地址
* @return
*/
public String oAuth2Url(HttpServletRequest request, String code,HttpServletResponse response){
AccessToken accessToken = lanxinUtil.getAccessToken(code);
// HttpSession session = request.getSession();
if (accessToken != null && accessToken.getToken() != null) {
String mobile = SimpleOAuth2Controller.getMemberGuidByCode(accessToken);
// 这里简单处理,存储到session中
// if (openid != null) {
// session.setAttribute("buleCellPhone", openid);
// }
User user = userService.findByCellphoto(mobile);
if(user==null){
return "/mobile/sys/login";
}else{
PrincipalCollection principals = new SimplePrincipalCollection(user.getUsername(), "MobileRealm");
Builder builder = new WebSubject.Builder(request, response);
builder.principals(principals);
builder.authenticated(true);
WebSubject subject = builder.buildWebSubject();
ThreadContext.bind(subject);
subject.getSession().setAttribute("user", user);
}
}
工具类:取得页面的返回值(原打算用json,由于一些问题换成了MAP ,凑合下看吧)
public static Map<String, Object> httpRequest(String requestUrl) {
Map<String, Object> maps = null;
try {
String str = null;
HttpGet getMethod = new HttpGet(requestUrl);
HttpClient client = new DefaultHttpClient();
HttpResponse res = client.execute(getMethod);
HttpEntity entity=res.getEntity() ;
if (entity!= null) {
str = EntityUtils.toString(entity);
}
maps = JsonUtils.toObject(str, Map.class);
System.out.println("maps=" + maps);
} catch (ConnectException ce) {
ce.printStackTrace();
// System.out.println("网络链接失败!");
} catch (UnknownHostException uhe) {
uhe.printStackTrace();
// System.out.println("蓝信API无法访问....!");
// httpRequest(requestUrl, requestMethod, outputStr);
} catch (Exception e) {
e.printStackTrace();
}
return maps;
}
2.获取access_token
/**
* 调用接口获取用户信息
*
* @return
* @throws SQLException
* @throws RemoteException
*/
public static String getMemberGuidByCode(AccessToken accessTokens) {
Result<String> result = lanxinUtil.oAuth2GetUserByCode(accessTokens);
if (result.getErrcode() == "0") {
if (result.getObj() != null) {
// 此处可以通过蓝信授权用code还钱的Userid查询自己本地服务器中的数据
return result.getObj();
}
}
return "";
}
/**
* OAuth2验证接口根据code获取成员信息
*
* @param AccessToken
* @return
*/
public static Result<String> oAuth2GetUserByCode(AccessToken accessTokens) {
Result<String> result = new Result<String>();
Map<String,Object > maps = WechatOAuth2.getUserByCode(accessTokens);
if (maps != null) {
try {
ArrayList openOrgMemberList =(ArrayList) maps.get("openOrgMemberList") ;
Map mapa = (Map) openOrgMemberList.get(0);
String openid = (String) mapa.get("mobile");
if (openid != null && openid.length() > 0) {
result.setErrmsg("");
result.setErrcode("0");
result.setObj(openid);
} else {
result.setErrmsg((String) mapa.get("errmsg"));
result.setErrcode((String) mapa.get("errcode"));
}
} catch (Exception e) {
result.setErrmsg("accessToken 超时......");
result.setErrcode("42001");
}
}
return result;
}
3.获取用户信息
public class WechatOAuth2 {
private static final String get_oauth2_url = "http://open.lanxin.cn/sns/userinfo?access_token=ACCESS_TOKEN&mobile=MOBILE";
/**
* 根据code获取成员信息
*
* @param request
*
* @return JSONObject
*/
public static Map<String, Object> getUserByCode(AccessToken accessTokens) {
System.out.println("accessTokens.getToken()="+accessTokens.getToken()+"accessTokens.getOpenid()="+accessTokens.getOpenid());
String menuUrl = get_oauth2_url.replace("ACCESS_TOKEN", accessTokens.getToken()).replace("xxxxxx",accessTokens.getOpenid() );
Map<String, Object> maps = WechatAccessToken.httpRequest(menuUrl);
// String getcode = code;
return maps;
}
最后就是登录那些代码了很简单就不放上了。放上一句话。
String mobile = SimpleOAuth2Controller.getMemberGuidByCode(accessToken);
结果还是好的,但是蓝信那边修改外链之后需要重新登录之后才可以看到修改以后的内容。这点很麻烦。
开始一直认为是自己错误了多耽误了一天工夫!
希望对别人有帮助!
相关文章推荐
- Spring整合Dwr,Cannot locate BeanDefinitionParser for element [annotation-scan]
- spring3 MVC手工搭建Spring3项目demo
- spring mvc 开发需要的jar包的用途详解
- 基于注解的 Spring MVC 简单入门-网摘
- [MVC] 深入浅出Spring MVC
- spring mvc的web.xml的配置
- SpringMVC工作原理
- Spring MVC静态资源处理<mvc:resources><mvc:default-servlet-handler>
- Spring MVC 为例,从前台—>后台—>前台的编解码过程及出现乱码的案例
- 在spring mvc与mybatis中加入logback
- springmvc+mybatis
- 当项目使用SpringMvc时拦截器的注意事项
- (struts2) spring mvc + mybatis + maven整合
- 文章标题
- springmvc集成mybatis
- Spring+Spring MVC 整合JasperReports
- 使用springmvc框架之第1篇:spring中bean的系统自动注册
- springmvc整合redis架构搭建
- SpringMVC Json
- ajax跨域:JQuery + Spring MVC3.0