提交 74bbe35e 编写于 作者: sq3536's avatar sq3536

第三方接入

上级 c3dd4508
......@@ -15,12 +15,8 @@ import com.alibaba.nacos.client.identify.Base64;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.dingtalk.api.DefaultDingTalkClient;
import com.dingtalk.api.DingTalkClient;
import com.dingtalk.api.request.OapiGettokenRequest;
import com.dingtalk.api.request.OapiSnsGetuserinfoBycodeRequest;
import com.dingtalk.api.request.OapiUserGetuserinfoRequest;
import com.dingtalk.api.response.OapiGettokenResponse;
import com.dingtalk.api.response.OapiSnsGetuserinfoBycodeResponse;
import com.dingtalk.api.response.OapiUserGetuserinfoResponse;
import com.dingtalk.api.request.*;
import com.dingtalk.api.response.*;
import com.taobao.api.ApiException;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpEntity;
......@@ -102,11 +98,15 @@ public class UserDingtalkRegisterService {
private ISysOpenAccessService sysOpenAccessService;
public SysOpenAccess getOpenAccess(String id)
{
return getOpenAccess(id,true);
}
public SysOpenAccess getOpenAccess(String id,boolean throwEx)
{
final String accessid = StringUtils.isEmpty(id)?"dingtalk":id;
SysOpenAccess sysOpenAccess=sysOpenAccessService.getOne(Wrappers.<SysOpenAccess>lambdaQuery().eq(SysOpenAccess::getOpenType,"dingtalk").
and(wrapper -> wrapper.eq(SysOpenAccess::getAccessKey,accessid).or().eq(SysOpenAccess::getId,accessid)),false);
if(sysOpenAccess==null|| (sysOpenAccess.getDisabled()!=null && sysOpenAccess.getDisabled()==1))
if((sysOpenAccess==null|| (sysOpenAccess.getDisabled()!=null && sysOpenAccess.getDisabled()==1))&&throwEx)
throw new BadRequestAlertException("获取接入配置失败","UserDingtalkRegisterService","");
String accessToken = getAccessToken(sysOpenAccess.getAccessKey(),sysOpenAccess.getSecretKey());
......@@ -190,7 +190,10 @@ public class UserDingtalkRegisterService {
returnObj.put("openid", response.getUserInfo().getOpenid());
returnObj.put("nickname", response.getUserInfo().getNick());
SysUserAuth userAuth = sysUserAuthService.getOne(Wrappers.<SysUserAuth>lambdaQuery().eq(SysUserAuth::getIdentityType,"dingtalk").eq(SysUserAuth::getIdentifier, response.getUserInfo().getOpenid()),false);
returnObj.put("unionid", response.getUserInfo().getUnionid());
SysUserAuth userAuth = sysUserAuthService.getOne(Wrappers.<SysUserAuth>lambdaQuery().eq(SysUserAuth::getIdentityType,"dingtalk")
.and(wrapper -> wrapper.eq(SysUserAuth::getIdentifier, response.getUserInfo().getOpenid()).or().eq(SysUserAuth::getIdentifier, response.getUserInfo().getUnionid())
),false);
IBZUSER user = null;
// 该钉钉用户注册过账号,登录系统
......
package cn.ibizlab.core.uaa.extensions.service;
import cn.ibizlab.core.uaa.domain.SysOpenAccess;
import cn.ibizlab.core.uaa.domain.SysUserAuth;
import cn.ibizlab.core.uaa.service.ISysOpenAccessService;
import cn.ibizlab.core.uaa.service.ISysUserAuthService;
import cn.ibizlab.util.domain.IBZUSER;
import cn.ibizlab.util.errors.BadRequestAlertException;
import cn.ibizlab.util.errors.InternalServerErrorException;
import cn.ibizlab.util.helper.HttpUtils;
import cn.ibizlab.util.service.IBZUSERService;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
......@@ -26,50 +30,51 @@ public class UserQQRegisterService {
@Autowired
private ISysUserAuthService sysUserAuthService;
/**
* 注册
*
* @param ibzuser
*/
public void toRegister(IBZUSER ibzuser) {
// 创建ibzuser
boolean flag = ibzuserService.save(ibzuser);
if (!flag) {
throw new BadRequestAlertException("注册失败", "UserQQRegisterService", "");
}
@Autowired
private ISysOpenAccessService sysOpenAccessService;
public SysOpenAccess getOpenAccess(String id)
{
return getOpenAccess(id,true);
}
public SysOpenAccess getOpenAccess(String id,boolean throwEx)
{
final String accessid = StringUtils.isEmpty(id)?"qq":id;
SysOpenAccess sysOpenAccess=sysOpenAccessService.getOne(Wrappers.<SysOpenAccess>lambdaQuery().eq(SysOpenAccess::getOpenType,"qq").
and(wrapper -> wrapper.eq(SysOpenAccess::getAccessKey,accessid).or().eq(SysOpenAccess::getId,accessid)),false);
if((sysOpenAccess==null|| (sysOpenAccess.getDisabled()!=null && sysOpenAccess.getDisabled()==1))&&throwEx)
throw new BadRequestAlertException("获取接入配置失败","UserQQRegisterService","");
/**
* 创建QQ用户授权信息
* @param ibzuser
*/
public void toCreateUserAuth(SysUserAuth ibzuser) {
// 创建用户授权信息
boolean flag = sysUserAuthService.create(ibzuser);
if (!flag) {
throw new BadRequestAlertException("保存用户授权信息失败", "UserQQRegisterService", "");
}
return sysOpenAccess;
}
/**
* 通过code获取QQ用户信息
* qq服务端通过临时授权码code获取授权用户的个人信息
*
* @param code
* @param redirectUri
* @param appId
* @param appSecret
* @return
*/
public JSONObject requestQQUserByCode(String code, String redirectUri, String appId, String appSecret) {
public JSONObject getUserBySnsToken(String id,String requestAuthCode) {
JSONObject returnObj = null;
SysOpenAccess openAccess = getOpenAccess(id);
if (openAccess==null || (openAccess.getDisabled()!=null && openAccess.getDisabled()==1))
throw new BadRequestAlertException("未找到配置", "UserWechatRegisterService", "");
try {
// 1.根据code获取access_token
String getAccessTokenUrl = "https://graph.qq.com/oauth2.0/token?" +
"grant_type=authorization_code" +
"&client_id=" + appId +
"&client_secret=" + appSecret +
"&code=" + code +
"&redirect_uri=" + redirectUri;
"&client_id=" + openAccess.getAccessKey() +
"&client_secret=" + openAccess.getSecretKey() +
"&code=" + requestAuthCode +
"&redirect_uri=" + openAccess.getRedirectUri();
String responserStr = HttpUtils.get(getAccessTokenUrl, null, null);
JSONObject responseObj = new JSONObject();
if (StringUtils.isEmpty(responserStr)) {
......@@ -89,6 +94,9 @@ public class UserQQRegisterService {
String access_token = responseObj.getString("access_token");
String refresh_token = responseObj.getString("refresh_token");
returnObj.put("access_token",access_token);
returnObj.put("refresh_token",refresh_token);
// 2.使用access_token来获取用户的OpenID
String openid = null;
String getOpenIdUrl = "https://graph.qq.com/oauth2.0/me?access_token=" + access_token;
......@@ -100,26 +108,33 @@ public class UserQQRegisterService {
JSONObject responseObj2 = JSONObject.parseObject(responseStr2);
if (responseObj2.containsKey("openid")) {
openid = responseObj2.getString("openid");
returnObj.put("openid",openid);
SysUserAuth userAuth = sysUserAuthService.getOne(Wrappers.<SysUserAuth>lambdaQuery().eq(SysUserAuth::getIdentityType,"qq").eq(SysUserAuth::getIdentifier, openid),false);
IBZUSER user = null;
// 该qq用户注册过账号,登录系统
if (userAuth!=null) {
user = ibzuserService.getById(userAuth.getUserid());
if (user == null)
user = ibzuserService.getOne(Wrappers.<IBZUSER>lambdaQuery().eq(IBZUSER::getUserid,openid).or().eq(IBZUSER::getUsername,openid),false);
if(user!=null)
{
returnObj.put("username",user.getLoginname()+(StringUtils.isEmpty(user.getDomains())?"":("|"+user.getDomains())));
}
}
}else {
throw new BadRequestAlertException("QQ服务端获取openid失败!", "UserQQRegisterService", "");
}
}
// 3.使用access_token以及OpenID来访问和修改用户数据
String getQQUserInfoUrl = "https://graph.qq.com/user/get_user_info?" +
"access_token=" + access_token +
"&oauth_consumer_key=" + appId +
"&openid=" + openid;
returnObj = JSONObject.parseObject(HttpUtils.get(getQQUserInfoUrl, null, null));
if (StringUtils.isEmpty(returnObj)) {
throw new BadRequestAlertException("QQ服务端返回结果为空!", "UserQQRegisterService", "");
} else if (returnObj.getInteger("ret")!=0) {
throw new BadRequestAlertException("获取QQ用户信息失败!", "UserQQRegisterService", "");
} else {
returnObj.put("openid", openid);
}
} catch (UnsupportedEncodingException e) {
throw new BadRequestAlertException("连接QQ服务端失败!", "UserQQRegisterService", "");
} catch (Exception e) {
e.printStackTrace();
throw new InternalServerErrorException("获取user失败");
}
return returnObj;
......
package cn.ibizlab.core.uaa.extensions.service;
import cn.ibizlab.core.uaa.domain.SysOpenAccess;
import cn.ibizlab.core.uaa.domain.SysUserAuth;
import cn.ibizlab.core.uaa.service.ISysOpenAccessService;
import cn.ibizlab.core.uaa.service.ISysUserAuthService;
import cn.ibizlab.util.domain.IBZUSER;
import cn.ibizlab.util.errors.BadRequestAlertException;
import cn.ibizlab.util.errors.InternalServerErrorException;
import cn.ibizlab.util.helper.HttpUtils;
import cn.ibizlab.util.service.IBZUSERService;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.dingtalk.api.DefaultDingTalkClient;
import com.dingtalk.api.request.OapiSnsGetuserinfoBycodeRequest;
import com.dingtalk.api.response.OapiSnsGetuserinfoBycodeResponse;
import com.taobao.api.ApiException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.io.UnsupportedEncodingException;
import java.sql.Timestamp;
/**
* 实体[IBZUSER] 微信用户注册接口实现
......@@ -26,92 +35,78 @@ public class UserWechatRegisterService {
@Autowired
private ISysUserAuthService sysUserAuthService;
/**
* 注册
*
* @param ibzuser
*/
public void toRegister(IBZUSER ibzuser) {
// 创建ibzuser
boolean flag = ibzuserService.save(ibzuser);
if (!flag) {
throw new BadRequestAlertException("注册失败", "UserWechatRegisterService", "");
}
@Autowired
private ISysOpenAccessService sysOpenAccessService;
public SysOpenAccess getOpenAccess(String id)
{
return getOpenAccess(id,true);
}
public SysOpenAccess getOpenAccess(String id,boolean throwEx)
{
final String accessid = StringUtils.isEmpty(id)?"wechat":id;
SysOpenAccess sysOpenAccess=sysOpenAccessService.getOne(Wrappers.<SysOpenAccess>lambdaQuery().eq(SysOpenAccess::getOpenType,"wechat").
and(wrapper -> wrapper.eq(SysOpenAccess::getAccessKey,accessid).or().eq(SysOpenAccess::getId,accessid)),false);
if((sysOpenAccess==null|| (sysOpenAccess.getDisabled()!=null && sysOpenAccess.getDisabled()==1))&&throwEx)
throw new BadRequestAlertException("获取接入配置失败","UserWechatRegisterService","");
/**
* 创建微信用户授权信息
* @param userAuth
*/
public void toCreateUserAuth(SysUserAuth userAuth) {
// 创建用户授权信息
boolean flag = sysUserAuthService.create(userAuth);
if (!flag) {
throw new BadRequestAlertException("保存用户授权信息失败", "UserWechatRegisterService", "");
}
return sysOpenAccess;
}
/**
* 通过code获取微信用户信息
* 微信服务端通过临时授权码code获取授权用户的个人信息
*
* @param code
* @param state
* @param appId
* @param appSecret
* @return
*/
public JSONObject requestWechatUserByCode(String code, String state, String appId, String appSecret) {
public JSONObject getUserBySnsToken(String id,String requestAuthCode) {
JSONObject returnObj = null;
SysOpenAccess openAccess = getOpenAccess(id);
if (openAccess==null || (openAccess.getDisabled()!=null && openAccess.getDisabled()==1))
throw new BadRequestAlertException("未找到配置", "UserWechatRegisterService", "");
try {
// 1.根据code获取access_token、openid、refresh_token
String getAccessTokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?" +
"appid=" + appId +
"&secret=" + appSecret +
"&code=" + code +
"appid=" + openAccess.getAccessKey() +
"&secret=" + openAccess.getSecretKey() +
"&code=" + requestAuthCode +
"&grant_type=authorization_code";
JSONObject responseObj = JSONObject.parseObject(HttpUtils.get(getAccessTokenUrl, null, null));
if (!responseObj.containsKey("access_token") && !responseObj.containsKey("openid")) {
returnObj = JSONObject.parseObject(HttpUtils.get(getAccessTokenUrl, null, null));
if (!returnObj.containsKey("access_token") && !returnObj.containsKey("openid")) {
throw new BadRequestAlertException("微信服务端获取access_token失败!", "UserWechatRegisterService", "");
}
String access_token = responseObj.getString("access_token");
String openid = responseObj.getString("openid");
String refresh_token = responseObj.getString("refresh_token");
// 2.检验授权凭证(access_token)是否有效,无效则需要刷新access_token
String checkAccessTokenUrl = "https://api.weixin.qq.com/sns/auth?" +
"access_token=" + access_token +
"&openid=" + openid;
JSONObject responseObj2 = JSONObject.parseObject(HttpUtils.get(checkAccessTokenUrl, null, null));
if (responseObj2.getInteger("errcode") != 0) {
// access_token已失效,使用refresh_token刷新access_token
String refreshAccess_token = "https://api.weixin.qq.com/sns/oauth2/refresh_token?" +
"appid=" + appId +
"&grant_type=refresh_token" +
"&refresh_token=" + refresh_token;
JSONObject responseObj3 = JSONObject.parseObject(HttpUtils.get(refreshAccess_token, null, null));
if (!responseObj3.containsKey("access_token") || !responseObj3.containsKey("openid")) {
throw new BadRequestAlertException("微信服务端刷新access_token失败!", "UserWechatRegisterService", "");
String access_token = returnObj.getString("access_token");
String openid = returnObj.getString("openid");
String refresh_token = returnObj.getString("refresh_token");
String unionid = returnObj.getString("unionid");
SysUserAuth userAuth = sysUserAuthService.getOne(Wrappers.<SysUserAuth>lambdaQuery().eq(SysUserAuth::getIdentityType,"webchat")
.and(wrapper -> wrapper.eq(SysUserAuth::getIdentifier, openid).or().eq(SysUserAuth::getIdentifier, unionid)
),false);
IBZUSER user = null;
// 该wechat用户注册过账号,登录系统
if (userAuth!=null) {
user = ibzuserService.getById(userAuth.getUserid());
if (user == null)
user = ibzuserService.getOne(Wrappers.<IBZUSER>lambdaQuery().eq(IBZUSER::getUserid,openid).or().eq(IBZUSER::getUsername,openid),false);
if(user!=null)
{
returnObj.put("username",user.getLoginname()+(StringUtils.isEmpty(user.getDomains())?"":("|"+user.getDomains())));
}
// 重新拿到access_token、openid、refresh_token
access_token = responseObj3.getString("access_token");
openid = responseObj3.getString("openid");
refresh_token = responseObj3.getString("refresh_token");
}
// 3.access_token有效,拉取用户信息
String getweChatUserInfoUrl = "https://api.weixin.qq.com/sns/userinfo?" +
"access_token=" + access_token +
"&openid=" + openid +
"&lang=zh_CN";
returnObj = JSONObject.parseObject(HttpUtils.get(getweChatUserInfoUrl, null, null));
if (StringUtils.isEmpty(returnObj)) {
throw new BadRequestAlertException("微信服务端返回结果为空!", "UserWechatRegisterService", "");
} else if (!returnObj.containsKey("openid")) {
throw new BadRequestAlertException("获取微信用户信息失败!", "UserWechatRegisterService", "");
}
} catch (UnsupportedEncodingException e) {
throw new BadRequestAlertException("连接微信服务端失败!", "UserWechatRegisterService", "");
} catch (Exception e) {
e.printStackTrace();
throw new InternalServerErrorException("获取user失败");
}
return returnObj;
......
......@@ -50,7 +50,7 @@ public class UserDingtalkRegisterResource {
@GetMapping(value = {"/uaa/getDingtalkAppId","/uaa/open/dingtalk/access_token","/uaa/open/dingtalk/appid"})
public ResponseEntity<JSONObject> getDingtalkAppId(@RequestParam(value = "id",required = false) String id) {
JSONObject obj = new JSONObject();
SysOpenAccess openAccess = userDingtalkRegisterService.getOpenAccess(id);
SysOpenAccess openAccess = userDingtalkRegisterService.getOpenAccess(id,false);
if (openAccess==null || (openAccess.getDisabled()!=null && openAccess.getDisabled()==1))
return ResponseEntity.ok(obj);
String appId = openAccess.getAccessKey();
......
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册