java 加密請求實現類

package cn.com.do1.dsf.modules.zdph.base.service.impl;

import cn.com.do1.dsf.common.utils.StringUtils;
import cn.com.do1.dsf.modules.zdph.base.service.ZdphAccessTokenService;
import cn.com.do1.dsf.modules.zdph.base.service.ZdphRequestService;
import cn.com.do1.dsf.modules.zdph.base.util.ZdphHttpRequestBaseUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.sgcc.sm.SM2Utils;
import com.sgcc.sm.SM3Utils;
import com.sgcc.sm.Util;
import lombok.extern.slf4j.Slf4j;
import org.bouncycastle.util.encoders.Hex;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.Calendar;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;

/**
 * 中電普華請求Service實現類
 * Created by ysq
 * time 2020-01-11 11:39
 * Copyright (c) 2019 廣東道一信息技術股份有限公司 All rights reserved.
 */
@Slf4j
@Service("zdphRequestService")
public class ZdphRequestServiceImpl implements ZdphRequestService {

    @Value("${zdph.serverUrl}")
    private String serverUrl;

    @Value("${zdph.serverPort}")
    private String serverPort;

    @Value("${zdph.serverScheme}")
    private String serverScheme;

    @Value("${zdph.publicKey}")
    private String publicKey;

    @Value("${zdph.privateKey}")
    private String privateKey;

    @Autowired
    private ZdphAccessTokenService zdphAccessTokenService;

    /**
     * 通用請求
     * @param url 接口相對路徑
     * @param params 參數
     * @return 解密後的json
     */
    @Override
    public String requestPost(String url, Map<String, String> params) {
        //封裝url
        StringBuilder urlBuilder = new StringBuilder()
                .append(serverScheme)
                .append("://")
                .append(serverUrl).append(":")
                .append(serverPort)
                .append(url);

        return commonRequestPost(urlBuilder.toString(),true,params);
    }

    /**
     * 獲取accessToken
     * @param url access路徑
     * @param params 參數
     * @return json
     */
    @Override
    public String reqestAccessToken(String url, Map<String, String> params) {
        StringBuilder urlBuilder = new StringBuilder()
                .append(serverScheme)
                .append("://")
                .append(serverUrl).append(":")
                .append(serverPort)
                .append(url);

        return commonRequestPost(urlBuilder.toString(),false,params);
    }

    /**
     * 統一加密請求
     * @param url
     * @param isNeedToken
     * @param params
     * @return
     */
    protected String commonRequestPost(String url,boolean isNeedToken,Map<String, String> params){
        String accessToken = "";
        //獲取accessToken
        if(isNeedToken) {
            accessToken = zdphAccessTokenService.getAccessToken();
        }

        try {
            Map<String,String> requestParam = new HashMap<>();
            String jsonValue;
            if(null == params || params.isEmpty()){
                jsonValue = "";
            }else{
                ObjectMapper objectMapper = new ObjectMapper();
                jsonValue = objectMapper.writeValueAsString(params);
            }

            Calendar calendar = Calendar.getInstance(Locale.CHINA);
            long timestamp = calendar.getTime().getTime();

            //加密對象
            byte[] encByte = new SM2Utils().encryptData(Util.decodeHex(publicKey.toCharArray()), Util.encodeHexString(jsonValue.getBytes()).getBytes());
            String encryptData = Util.byteToHex(encByte);

            //簽名生成
            StringBuilder signBuilder = new StringBuilder().append(encryptData).append(accessToken).append(timestamp);
            byte[] md = new SM3Utils().sign(signBuilder.toString().getBytes());
            String sign = new String(Hex.encode(md));

            //塞入對象
            requestParam.put("encryptData", encryptData);
            requestParam.put("timestamp", String.valueOf(timestamp));
            requestParam.put("sign", sign);

            //請求
            String resultJson = ZdphHttpRequestBaseUtil.postJsonData(url,accessToken,requestParam);
            if(StringUtils.isEmpty(resultJson)){
                return "";
            }

            JSONObject jsonObject = JSON.parseObject(resultJson);
            String encryptDataKey = "encryptData";
            if(!jsonObject.containsKey(encryptDataKey)){
                return "";
            }

            encryptData = jsonObject.getString(encryptDataKey);
            byte[]decByte = new SM2Utils().decryptData(Hex.decode(privateKey), Hex.decode(encryptData.getBytes()));
            String decryptValue = new String(Hex.decode(decByte));
            log.info("請求路徑={} 請求參數={} 請求結果={}",url,JSON.toJSONString(requestParam),decryptValue);
            return decryptValue;
        }catch (Exception e){
            log.error("請求中電普華結果異常",e);
        }

        return "";
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章