|
|
|
@ -1,8 +1,16 @@
|
|
|
|
package com.flossom.system.utils.shuyun;
|
|
|
|
package com.flossom.system.utils.shuyun;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import com.alibaba.fastjson.JSON;
|
|
|
|
import com.flossom.common.core.constant.CacheConstants;
|
|
|
|
import com.flossom.common.core.constant.CacheConstants;
|
|
|
|
|
|
|
|
import com.flossom.common.core.domain.R;
|
|
|
|
|
|
|
|
import com.flossom.common.core.domain.shuyun.AccessToken;
|
|
|
|
|
|
|
|
import com.flossom.common.core.domain.shuyun.ShuYunMember;
|
|
|
|
|
|
|
|
import com.flossom.common.core.domain.shuyun.ShuYunPointChange;
|
|
|
|
|
|
|
|
import com.flossom.common.core.exception.ServiceException;
|
|
|
|
import com.flossom.common.redis.service.RedisService;
|
|
|
|
import com.flossom.common.redis.service.RedisService;
|
|
|
|
import com.flossom.system.utils.HttpClientUtils;
|
|
|
|
import com.flossom.system.utils.HttpClientUtils;
|
|
|
|
|
|
|
|
import com.shuyun.open.sdk.bean.HttpMethod;
|
|
|
|
|
|
|
|
import com.shuyun.open.sdk.core.GateWayClient;
|
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
|
import org.slf4j.Logger;
|
|
|
|
import org.slf4j.Logger;
|
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
@ -11,6 +19,7 @@ import org.springframework.stereotype.Component;
|
|
|
|
|
|
|
|
|
|
|
|
import java.time.LocalDateTime;
|
|
|
|
import java.time.LocalDateTime;
|
|
|
|
import java.time.ZoneId;
|
|
|
|
import java.time.ZoneId;
|
|
|
|
|
|
|
|
import java.util.Map;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
@ -21,6 +30,9 @@ public class ShuYunApiUtils {
|
|
|
|
|
|
|
|
|
|
|
|
protected final static Logger logger = LoggerFactory.getLogger(ShuYunApiUtils.class);
|
|
|
|
protected final static Logger logger = LoggerFactory.getLogger(ShuYunApiUtils.class);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 数云配置类
|
|
|
|
|
|
|
|
*/
|
|
|
|
private static ShuYunConfig shuYunConfig;
|
|
|
|
private static ShuYunConfig shuYunConfig;
|
|
|
|
|
|
|
|
|
|
|
|
private static RedisService redisService;
|
|
|
|
private static RedisService redisService;
|
|
|
|
@ -36,20 +48,147 @@ public class ShuYunApiUtils {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* 获取 accessToken,缓存没有就请求数云回调接口,将accessToken传递过来
|
|
|
|
* 获取 accessToken,缓存没有就请求数云回调接口,将 accessToken 传递过来
|
|
|
|
*
|
|
|
|
|
|
|
|
* @return
|
|
|
|
|
|
|
|
* @throws Exception
|
|
|
|
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
public static String getAccessToken() throws Exception {
|
|
|
|
public static String getAccessToken() {
|
|
|
|
Integer expiryTime = redisService.getCacheMapValue(CacheConstants.SHUYUN_ACCESS_TOKEN_CACHE, CacheConstants.SHUYUN_ACCESS_TOKEN_CACHE_VALUE);
|
|
|
|
Long expiryTime = redisService.getCacheMapValue(CacheConstants.SHUYUN_ACCESS_TOKEN_CACHE, CacheConstants.SHUYUN_ACCESS_TOKEN_CACHE_EXPIRY);
|
|
|
|
if (expiryTime == null || LocalDateTime.now().atZone(ZoneId.systemDefault()).toEpochSecond() > expiryTime) {
|
|
|
|
if (expiryTime == null || expiryTime == 0 || LocalDateTime.now().atZone(ZoneId.systemDefault()).toEpochSecond() > expiryTime) {
|
|
|
|
String accessTokenUrl = StringUtils.replace(shuYunConfig.getActionMethod().getAccessToken(), "{appid}", shuYunConfig.getAppid());
|
|
|
|
String accessTokenUrl = StringUtils.replace(shuYunConfig.getActionMethod().getAccessToken(), "{appid}", shuYunConfig.getAppid());
|
|
|
|
logger.info("刷新accessToken地址:{}", accessTokenUrl);
|
|
|
|
logger.info("刷新accessToken地址:{}", accessTokenUrl);
|
|
|
|
String result = HttpClientUtils.get(accessTokenUrl);
|
|
|
|
try {
|
|
|
|
logger.info("请求刷新accessToken结果:{}", result);
|
|
|
|
String result = HttpClientUtils.get(accessTokenUrl);
|
|
|
|
|
|
|
|
logger.info("请求数云接口获取accessToken结果:{}", result);
|
|
|
|
|
|
|
|
R r = JSON.parseObject(result, R.class);
|
|
|
|
|
|
|
|
if (r.getCode() != R.SUCCESS) {
|
|
|
|
|
|
|
|
logger.error("请求数云接口获取accessToken失败,将直接使用旧的accessToken,失败原因:{}", result);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
|
|
|
logger.error("请求数云接口获取accessToken失败,将直接使用旧的accessToken,失败原因:{}", e);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
String accessTokenStr = redisService.getCacheMapValue(CacheConstants.SHUYUN_ACCESS_TOKEN_CACHE, CacheConstants.SHUYUN_ACCESS_TOKEN_CACHE_VALUE);
|
|
|
|
|
|
|
|
if (StringUtils.isNotBlank(accessTokenStr)) {
|
|
|
|
|
|
|
|
AccessToken accessToken = JSON.parseObject(accessTokenStr, AccessToken.class);
|
|
|
|
|
|
|
|
return accessToken.getAccessToken();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 第一次获取会失败,因为回调是异步的,如果还没回调回来,我们就从redis获取缓存了
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
logger.error("从redis获取数云accessToken失败,缓存中没有accessToken,有可能是第一次调用");
|
|
|
|
|
|
|
|
throw new ServiceException("从redis获取数云accessToken失败,缓存中没有accessToken,有可能是第一次调用");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 请求基础封装方法
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param httpMethod 请求方式
|
|
|
|
|
|
|
|
* @param requestParams get请求时,url地址后的参数
|
|
|
|
|
|
|
|
* @param requestBody post、put 请求时,请求体的数据
|
|
|
|
|
|
|
|
* @param actionMethod 请求方法地址
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
public static R shuYunHttpRequest(HttpMethod httpMethod, Map requestParams, String requestBody, String actionMethod) throws ServiceException {
|
|
|
|
|
|
|
|
logger.info("数云接口请求地址:{},参数:requestParams = {}、requestBody = {}", actionMethod, requestParams, requestBody);
|
|
|
|
|
|
|
|
String result = GateWayClient.askGateWay(
|
|
|
|
|
|
|
|
httpMethod,
|
|
|
|
|
|
|
|
shuYunConfig.getUrl(),
|
|
|
|
|
|
|
|
requestParams,
|
|
|
|
|
|
|
|
requestBody,
|
|
|
|
|
|
|
|
shuYunConfig.getAppid(),
|
|
|
|
|
|
|
|
shuYunConfig.getSecurity(),
|
|
|
|
|
|
|
|
getAccessToken(),
|
|
|
|
|
|
|
|
actionMethod);
|
|
|
|
|
|
|
|
logger.info("返回响应:{}", result);
|
|
|
|
|
|
|
|
R r = JSON.parseObject(result, R.class);
|
|
|
|
|
|
|
|
if (r.getCode() == 10000 || r.getCode() == 14000) {
|
|
|
|
|
|
|
|
return r;
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
logger.error("调用数云接口发生未知错误:{}", result);
|
|
|
|
|
|
|
|
throw new ServiceException("调用数云接口发生未知错误");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 会员注册
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
public static void registerMember(ShuYunMember member) {
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
shuYunHttpRequest(HttpMethod.POST, null, JSON.toJSONString(member),
|
|
|
|
|
|
|
|
shuYunConfig.getActionMethod().getRegisterMember());
|
|
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
|
|
|
logger.error("请求数云接口注册会员失败:{}", e);
|
|
|
|
|
|
|
|
throw new ServiceException("请求数云接口注册会员失败");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 会员查询(单查询)
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
public static ShuYunMember queryMember(ShuYunMember member) {
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
R r = shuYunHttpRequest(HttpMethod.POST, null, JSON.toJSONString(member),
|
|
|
|
|
|
|
|
shuYunConfig.getActionMethod().getQueryMember());
|
|
|
|
|
|
|
|
if (r.getCode() == 10000) {
|
|
|
|
|
|
|
|
return JSON.parseObject(r.getData().toString(), ShuYunMember.class);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
|
|
|
logger.error("请求数云接口-查询会员信息失败:{}", e);
|
|
|
|
|
|
|
|
throw new ServiceException("请求数云接口-查询会员信息失败");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 修改会员信息
|
|
|
|
|
|
|
|
* 手机号不能修改
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
public static void modifyMember(ShuYunMember member) {
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
shuYunHttpRequest(HttpMethod.PUT, null, JSON.toJSONString(member),
|
|
|
|
|
|
|
|
shuYunConfig.getActionMethod().getModifyMember());
|
|
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
|
|
|
logger.error("请求数云接口-修改会员信息(除手机号)失败:{}", e);
|
|
|
|
|
|
|
|
throw new ServiceException("请求数云接口-修改会员信息(除手机号)失败");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 修改会员手机号
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
public static void modifyMemberMobile(ShuYunMember member) {
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
shuYunHttpRequest(HttpMethod.PUT, null, JSON.toJSONString(member),
|
|
|
|
|
|
|
|
shuYunConfig.getActionMethod().getModifyMemberMobile());
|
|
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
|
|
|
logger.error("请求数云接口-修改会员手机号失败:{}", e);
|
|
|
|
|
|
|
|
throw new ServiceException("请求数云接口-修改会员手机号失败");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 解绑会员
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
public static void unbindMember(ShuYunMember member) {
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
shuYunHttpRequest(HttpMethod.POST, null, JSON.toJSONString(member),
|
|
|
|
|
|
|
|
shuYunConfig.getActionMethod().getUnbindMember());
|
|
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
|
|
|
logger.error("请求数云接口-解绑会员失败:{}", e);
|
|
|
|
|
|
|
|
throw new ServiceException("请求数云接口-解绑会员失败");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 积分变更
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
public static void pointChange(ShuYunPointChange shuYunPointChange) {
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
shuYunHttpRequest(HttpMethod.POST, null, JSON.toJSONString(shuYunPointChange),
|
|
|
|
|
|
|
|
shuYunConfig.getActionMethod().getPointChange());
|
|
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
|
|
|
logger.error("请求数云接口-会员积分变更失败:{}", e);
|
|
|
|
|
|
|
|
throw new ServiceException("请求数云接口-会员积分变更失败");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return redisService.getCacheMapValue(CacheConstants.SHUYUN_ACCESS_TOKEN_CACHE, CacheConstants.SHUYUN_ACCESS_TOKEN_CACHE_VALUE);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|