java 对接乐橙云 获取AccessToken

public class DhFluorConstant {

    /**
     * APP_ID
     */
    public static final String APP_ID = "xxxxxxxxxxxxxxxxx";
    /**
     * SECRET
     */
    public static final String APP_SECRET = "xxxxxxxxxxxxxxxxx";

    /**
     * redis 存储accessToken 键
     */
    public static final String REDIS_DH_FLUOR_ACCESSTOKEN_KEY = "DH_FLUOR_ACCESSTOKEN_KEY";

    /**
     * 获取乐橙云开放平台AccessToken
     */
    public static final String GETACCESSTOKEN_URL = "https://openapi.lechange.cn/openapi/accessToken";


}
@Slf4j
@Component
public class DhFluorTool {

    @Autowired
    private RestTemplate restTemplate;
    @Autowired
    private RedisCache redisCache;


    private JSONObject getBaseRequestDate() {
        long time = System.currentTimeMillis() / 1000;
        String nonce = UUID.randomUUID().toString();
        JSONObject data = new JSONObject();
        data.put("system", new JSONObject()
                .fluentPut("ver", "1.0")
                .fluentPut("appId", DhFluorConstant.APP_ID)
                .fluentPut("sign", getSign(time, nonce))
                .fluentPut("time", time)
                .fluentPut("nonce", nonce)
        );
        data.put("id", UUID.randomUUID().toString());
        return data;
    }

    private String getSign(long time, String nonce) {
        String oriSign = String.format("time:%s,nonce:%s,appSecret:%s", time, nonce, DhFluorConstant.APP_SECRET);
        return MD5(oriSign);
    }

    private String MD5(String str) {
        char hexDigits[] = { // 用来将字节转换成 16 进制表示的字符
                '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd',
                'e', 'f'};
        try {
            byte[] strTemp = str.getBytes();
            MessageDigest mdTemp = MessageDigest.getInstance("MD5");
            mdTemp.update(strTemp);
            byte tmp[] = mdTemp.digest(); // MD5 的计算结果是一个 128 位的长整数,
            // 用字节表示就是 16 个字节
            char strs[] = new char[16 * 2]; // 每个字节用 16 进制表示的话,使用两个字符,
            // 所以表示成 16 进制需要 32 个字符
            int k = 0; // 表示转换结果中对应的字符位置
            for (int i = 0; i < 16; i++) { // 从第一个字节开始,对 MD5 的每一个字节
                // 转换成 16 进制字符的转换
                byte byte0 = tmp[i]; // 取第 i 个字节
                strs[k++] = hexDigits[byte0 >>> 4 & 0xf]; // 取字节中高 4 位的数字转换,
                // >>> 为逻辑右移,将符号位一起右移
                strs[k++] = hexDigits[byte0 & 0xf]; // 取字节中低 4 位的数字转换
            }
//            return new String(strs).toUpperCase(); // 换后的结果转换为字符串
            return new String(strs); // 换后的结果转换为字符串
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 获取AccessToken
     *
     * @return
     * @throws FluorException
     */
    public String getAccessToken() throws FluorException {
        String accessToken = redisCache.getCacheObject(DhFluorConstant.REDIS_DH_FLUOR_ACCESSTOKEN_KEY);
        if (StringUtils.isNotEmpty(accessToken)) {
            log.info("获取大华AccessToken,缓存获取======" + accessToken);
            return accessToken;
        }
        HttpHeaders headers = new HttpHeaders();
        headers.set(HttpHeaders.CONTENT_TYPE, "application/json");
        headers.set(HttpHeaders.ACCEPT_CHARSET, "UTF-8");
        log.info("获取大华AccessToken入参======" + getBaseRequestDate().toJSONString());
        HttpEntity<JSONObject> request = new HttpEntity<JSONObject>(getBaseRequestDate(), headers);
        String response = null;
        try {
            String url = DhFluorConstant.GETACCESSTOKEN_URL;
            response = restTemplate.postForObject(url, request, String.class);
        } catch (HttpClientErrorException e) {
            throw new FluorException("获取大华AccessToken请求失败", 500);
        }
        JSONObject data = JSON.parseObject(response);
        log.info("获取大华AccessToken返回信息======" + JSON.toJSONString(data));
        JSONObject resp = data.getJSONObject("result");
        if (null == resp) {
            throw new FluorException("为获取到大华AccessToken返回信息");
        }
        if ("0".equals(resp.getString("code"))) {
            accessToken = resp.getJSONObject("data").getString("accessToken");
            Long expireTime = resp.getJSONObject("data").getLong("expireTime");
            redisCache.setCacheObject(DhFluorConstant.REDIS_DH_FLUOR_ACCESSTOKEN_KEY, accessToken, expireTime, TimeUnit.SECONDS);
        } else {
            throw new FluorException(resp.getString("msg"), 500);
        }
        return accessToken;
    }


}
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一名技术极客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值