parent
0e1623165a
commit
45e867bca3
@ -1 +1 @@ |
|||||||
package com.bweb.controller;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.hai.common.exception.ErrorCode;
import com.hai.common.exception.ErrorHelp;
import com.hai.common.exception.SysCode;
import com.hai.common.pay.util.XmlUtil;
import com.hai.common.pay.util.sdk.WXPayConstants;
import com.hai.common.utils.ResponseMsgUtil;
import com.hai.common.utils.WxUtils;
import com.hai.config.*;
import com.hai.dao.HighGasOrderPushMapper;
import com.hai.entity.*;
import com.hai.model.HighMerchantModel;
import com.hai.model.HighMerchantStoreModel;
import com.hai.model.ResponseData;
import com.hai.model.ResultProfitSharing;
import com.hai.service.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContexts;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.annotation.Resource;
import javax.net.ssl.SSLContext;
import java.io.FileInputStream;
import java.math.BigDecimal;
import java.security.KeyStore;
import java.util.*;
/**
* @Auther: 胡锐
* @Description:
* @Date: 2021/3/26 23:08
*/
@Controller
@RequestMapping(value = "/test")
@Api(value = "订单接口")
public class HighTestController {
private static Logger log = LoggerFactory.getLogger(HighTestController.class);
@Resource
private HighMerchantService highMerchantService;
@Resource
private HighMerchantStoreService highMerchantStoreService;
@Resource
private HighGasOilPriceService highGasOilPriceService;
@Resource
private HighOrderService highOrderService;
@Resource
private HighProfitSharingRecordService highProfitSharingRecordService;
@Resource
private HighGasOrderPushMapper highGasOrderPushMapper;
@Resource
private HuiLianTongConfig huiLianTongConfig;
@Resource
private UnionPayConfig unionPayConfig;
@RequestMapping(value = "/getBackendToken", method = RequestMethod.GET)
@ResponseBody
@ApiOperation(value = "获取访问令牌backendToken")
public ResponseData getBackendToken() {
try {
return ResponseMsgUtil.success(UnionUserConfig.getBackendToken());
} catch (Exception e) {
log.error("HighOrderController --> getBackendToken() error!", e);
return ResponseMsgUtil.exception(e);
}
}
} |
package com.bweb.controller;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.hai.common.exception.ErrorCode;
import com.hai.common.exception.ErrorHelp;
import com.hai.common.exception.SysCode;
import com.hai.common.pay.util.XmlUtil;
import com.hai.common.pay.util.sdk.WXPayConstants;
import com.hai.common.utils.ResponseMsgUtil;
import com.hai.common.utils.WxUtils;
import com.hai.config.*;
import com.hai.dao.HighGasOrderPushMapper;
import com.hai.entity.*;
import com.hai.model.HighMerchantModel;
import com.hai.model.HighMerchantStoreModel;
import com.hai.model.ResponseData;
import com.hai.model.ResultProfitSharing;
import com.hai.service.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContexts;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.annotation.Resource;
import javax.net.ssl.SSLContext;
import java.io.FileInputStream;
import java.math.BigDecimal;
import java.security.KeyStore;
import java.util.*;
/**
* @Auther: 胡锐
* @Description:
* @Date: 2021/3/26 23:08
*/
@Controller
@RequestMapping(value = "/test")
@Api(value = "订单接口")
public class HighTestController {
private static Logger log = LoggerFactory.getLogger(HighTestController.class);
@Resource
private HighMerchantService highMerchantService;
@Resource
private HighMerchantStoreService highMerchantStoreService;
@Resource
private HighGasOilPriceService highGasOilPriceService;
@Resource
private HighOrderService highOrderService;
@Resource
private HighProfitSharingRecordService highProfitSharingRecordService;
@Resource
private HighGasOrderPushMapper highGasOrderPushMapper;
@Resource
private HuiLianTongConfig huiLianTongConfig;
@Resource
private UnionPayConfig unionPayConfig;
@RequestMapping(value = "/getBackendToken", method = RequestMethod.GET)
@ResponseBody
@ApiOperation(value = "获取访问令牌backendToken")
public ResponseData getBackendToken() {
try {
return ResponseMsgUtil.success(null);
} catch (Exception e) {
log.error("HighOrderController --> getBackendToken() error!", e);
return ResponseMsgUtil.exception(e);
}
}
} |
File diff suppressed because one or more lines are too long
@ -0,0 +1,487 @@ |
|||||||
|
package com.hai.common.utils; |
||||||
|
|
||||||
|
import com.google.gson.Gson; |
||||||
|
import com.google.gson.GsonBuilder; |
||||||
|
import com.sun.jersey.api.client.Client; |
||||||
|
import com.sun.jersey.api.client.ClientResponse; |
||||||
|
import com.sun.jersey.api.client.WebResource; |
||||||
|
import com.sun.jersey.api.client.WebResource.Builder; |
||||||
|
import com.sun.jersey.api.client.config.DefaultClientConfig; |
||||||
|
import com.sun.jersey.client.urlconnection.HTTPSProperties; |
||||||
|
import org.apache.commons.codec.binary.Base64; |
||||||
|
|
||||||
|
import javax.crypto.Cipher; |
||||||
|
import javax.crypto.spec.SecretKeySpec; |
||||||
|
import javax.net.ssl.*; |
||||||
|
import javax.ws.rs.core.MediaType; |
||||||
|
import java.security.*; |
||||||
|
import java.security.cert.CertificateException; |
||||||
|
import java.security.spec.InvalidKeySpecException; |
||||||
|
import java.security.spec.KeySpec; |
||||||
|
import java.security.spec.PKCS8EncodedKeySpec; |
||||||
|
import java.security.spec.X509EncodedKeySpec; |
||||||
|
import java.text.ParseException; |
||||||
|
import java.text.SimpleDateFormat; |
||||||
|
import java.util.*; |
||||||
|
|
||||||
|
public class UnionUtils { |
||||||
|
private static Client c = null; |
||||||
|
private static Client secureClient =null; |
||||||
|
private static Gson gson = new GsonBuilder().disableHtmlEscaping().create(); |
||||||
|
public static String DATE_FORMAT = "yyyy-MM-dd"; |
||||||
|
/** |
||||||
|
* 初始化设置 |
||||||
|
*/ |
||||||
|
static{ |
||||||
|
initalizationJersyClient(); |
||||||
|
initalizationSecureJersyClient(); |
||||||
|
} |
||||||
|
/** |
||||||
|
* 设置调用参数 |
||||||
|
*/ |
||||||
|
private static void initalizationJersyClient(){ |
||||||
|
try { |
||||||
|
c = Client.create(); |
||||||
|
c.setFollowRedirects(true); |
||||||
|
c.setConnectTimeout(10000); |
||||||
|
c.setReadTimeout(10000); |
||||||
|
} catch (Exception e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private static void initalizationSecureJersyClient(){ |
||||||
|
try { |
||||||
|
SSLContext context = SSLContext.getInstance("SSL"); |
||||||
|
context.init(null, new TrustManager[] { new X509TrustManager() { |
||||||
|
public java.security.cert.X509Certificate[] getAcceptedIssuers() { |
||||||
|
return null; |
||||||
|
} |
||||||
|
public void checkClientTrusted( |
||||||
|
java.security.cert.X509Certificate[] chain, String authType) |
||||||
|
throws CertificateException {} |
||||||
|
public void checkServerTrusted( |
||||||
|
java.security.cert.X509Certificate[] chain, |
||||||
|
String authType) throws CertificateException {} |
||||||
|
} }, new SecureRandom()); |
||||||
|
HostnameVerifier hv = new HostnameVerifier(){ |
||||||
|
public boolean verify(String urlHostName, SSLSession session){ |
||||||
|
return true; |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
HTTPSProperties prop = new HTTPSProperties(hv, context); |
||||||
|
DefaultClientConfig dcc = new DefaultClientConfig(); |
||||||
|
dcc.getProperties().put(HTTPSProperties.PROPERTY_HTTPS_PROPERTIES, prop); |
||||||
|
secureClient = Client.create(dcc); |
||||||
|
secureClient.setFollowRedirects(true); |
||||||
|
secureClient.setConnectTimeout(10000); |
||||||
|
secureClient.setReadTimeout(10000); |
||||||
|
} catch (Exception e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 调用接口 |
||||||
|
*/ |
||||||
|
public static String sendPOSTRequest(String url, Object map, String contentTpye){ |
||||||
|
if(null==c){ |
||||||
|
initalizationJersyClient(); |
||||||
|
} |
||||||
|
Client client = null; |
||||||
|
if(url.indexOf("https://") == 0){ |
||||||
|
if(null==secureClient){ |
||||||
|
initalizationJersyClient(); |
||||||
|
} |
||||||
|
client = secureClient; |
||||||
|
}else{ |
||||||
|
if(null==c){ |
||||||
|
initalizationJersyClient(); |
||||||
|
} |
||||||
|
client = c; |
||||||
|
} |
||||||
|
WebResource resource = client.resource(url); |
||||||
|
String resultStr = null; |
||||||
|
try { |
||||||
|
Builder builder = resource.accept("*/*"); |
||||||
|
ClientResponse res = builder.type(contentTpye).entity(map).post(ClientResponse.class); |
||||||
|
if(res.getStatus() != 200){ |
||||||
|
throw new Exception("url:"+url+",response code:" + res.getStatus()); |
||||||
|
} |
||||||
|
resultStr = res.getEntity(String.class); |
||||||
|
return resultStr; |
||||||
|
} catch (Exception e) { |
||||||
|
e.printStackTrace(); |
||||||
|
return null; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 参数 转为json格式 |
||||||
|
* @param url 调用地址 |
||||||
|
* @param map 设置的参数 |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static String sendPostGson(String url, Map<String, String> map){ |
||||||
|
String ps = gson.toJson(map); |
||||||
|
|
||||||
|
System.out.println("生成加密后的报文:"+ps); |
||||||
|
return sendPOSTRequest(url, ps, MediaType.APPLICATION_JSON); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 使用公钥加密对称密钥 |
||||||
|
* @param publicKey 公钥 |
||||||
|
* @param symmetricKeyByte 对称密钥字节 |
||||||
|
* @return 加密后的对称密钥字节 |
||||||
|
* @throws Exception |
||||||
|
*/ |
||||||
|
public static byte[] encrypt(String publicKey, byte[] symmetricKeyByte) throws Exception { |
||||||
|
byte[] encodedKey = Base64.decodeBase64(publicKey); |
||||||
|
KeySpec keySpec = new X509EncodedKeySpec(encodedKey); |
||||||
|
KeyFactory keyFactory = KeyFactory.getInstance("RSA"); |
||||||
|
PublicKey pk = keyFactory.generatePublic(keySpec); |
||||||
|
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); |
||||||
|
cipher.init(Cipher.ENCRYPT_MODE, pk); |
||||||
|
byte[] result = cipher.doFinal(symmetricKeyByte); |
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 签名加密后的数据装载进map |
||||||
|
* @param key 对称秘钥 |
||||||
|
* @param params 待加密的字符串 |
||||||
|
* @param encryptKeys 加密字段 |
||||||
|
* @throws Exception |
||||||
|
*/ |
||||||
|
public static void encryptedParamMap(String key, Map<String, String> params, String ... encryptKeys) throws Exception{ |
||||||
|
if(encryptKeys != null && encryptKeys.length > 0){ |
||||||
|
for(String encryptKey : encryptKeys){ |
||||||
|
params.put(encryptKey, getEncryptedValue(params.get(encryptKey), key)); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 3DES加密 |
||||||
|
* @param value 待加密的字符串 |
||||||
|
* @param key 加密密钥 |
||||||
|
* @return 加密后的字符串 |
||||||
|
* @throws Exception |
||||||
|
*/ |
||||||
|
public static String getEncryptedValue(String value, String key) throws Exception { |
||||||
|
if (null == value || "".equals(value)) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
byte[] valueByte = value.getBytes(); |
||||||
|
byte[] sl = encrypt3DES(valueByte, hexToBytes(key)); |
||||||
|
String result = Base64.encodeBase64String(sl); |
||||||
|
// String result = BytesUtil.bytesToHex(sl);
|
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 解密 |
||||||
|
* @param value 待解密的字符串 |
||||||
|
* @param key 解密秘钥 |
||||||
|
* @return 解密后字符串 |
||||||
|
* @throws Exception |
||||||
|
*/ |
||||||
|
public static String getDecryptedValue(String value, String key) throws Exception { |
||||||
|
if (null == value || "".equals(value)) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
byte[] valueByte = Base64.decodeBase64(value); |
||||||
|
byte[] sl = decrypt3DES(valueByte, hexStr2Bytes(key)); |
||||||
|
String result = new String(sl); |
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 3DES解密 |
||||||
|
* @param input |
||||||
|
* @param key |
||||||
|
* @return |
||||||
|
* @throws Exception |
||||||
|
*/ |
||||||
|
public static byte[] decrypt3DES(byte[] input, byte[] key) throws Exception { |
||||||
|
Cipher c = Cipher.getInstance("DESede/ECB/PKCS5Padding"); |
||||||
|
c.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key, "DESede")); |
||||||
|
return c.doFinal(input); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* bytes字符串转换为Byte值 |
||||||
|
* @param src String Byte字符串,每个Byte之间没有分隔符(字符范围:0-9 A-F) |
||||||
|
* @return byte[] |
||||||
|
*/ |
||||||
|
public static byte[] hexStr2Bytes(String src){ |
||||||
|
/*对输入值进行规范化整理*/ |
||||||
|
src = src.trim().replace(" ", "").toUpperCase(Locale.US); |
||||||
|
//处理值初始化
|
||||||
|
int m=0,n=0; |
||||||
|
int iLen=src.length()/2; //计算长度
|
||||||
|
byte[] ret = new byte[iLen]; //分配存储空间
|
||||||
|
|
||||||
|
for (int i = 0; i < iLen; i++){ |
||||||
|
m=i*2+1; |
||||||
|
n=m+1; |
||||||
|
ret[i] = (byte)(Integer.decode("0x"+ src.substring(i*2, m) + src.substring(m,n)) & 0xFF); |
||||||
|
} |
||||||
|
return ret; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 3DES加密 |
||||||
|
* @param input 待加密的字节 |
||||||
|
* @param key 密钥 |
||||||
|
* @return 加密后的字节 |
||||||
|
* @throws Exception |
||||||
|
*/ |
||||||
|
private static byte[] encrypt3DES(byte[] input, byte[] key) throws Exception { |
||||||
|
Cipher c = Cipher.getInstance("DESede/ECB/PKCS5Padding"); |
||||||
|
c.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key, "DESede")); |
||||||
|
return c.doFinal(input); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 获取随机字符串 |
||||||
|
* @return 随机字符串 |
||||||
|
*/ |
||||||
|
public static String createNonceStr(){ |
||||||
|
String sl = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; |
||||||
|
StringBuilder sb = new StringBuilder(); |
||||||
|
for(int i = 0 ; i < 16 ; i ++){ |
||||||
|
sb.append(sl.charAt(new Random().nextInt(sl.length()))); |
||||||
|
} |
||||||
|
return sb.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* h获取32位随机数字字符串 |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static String createNonceNumber(){ |
||||||
|
String sl = "0123456789"; |
||||||
|
StringBuilder sb = new StringBuilder(); |
||||||
|
for(int i = 0 ; i < 32 ; i ++){ |
||||||
|
sb.append(sl.charAt(new Random().nextInt(sl.length()))); |
||||||
|
} |
||||||
|
return sb.toString(); |
||||||
|
} |
||||||
|
/** |
||||||
|
* 获取当前日期时间 |
||||||
|
* |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static String getCurrentDateTime(String Dateformat) { |
||||||
|
String datestr = null; |
||||||
|
SimpleDateFormat df = new SimpleDateFormat(Dateformat); |
||||||
|
datestr = df.format(new Date()); |
||||||
|
return datestr; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 在输入日期上增加(+)或减去(-)天数 |
||||||
|
* |
||||||
|
* @param date 输入日期 |
||||||
|
*/ |
||||||
|
public static Date addDay(Date date, int iday) { |
||||||
|
Calendar cd = Calendar.getInstance(); |
||||||
|
|
||||||
|
cd.setTime(date); |
||||||
|
|
||||||
|
cd.add(Calendar.DAY_OF_MONTH, iday); |
||||||
|
|
||||||
|
return cd.getTime(); |
||||||
|
} |
||||||
|
/** |
||||||
|
* 将日期格式日期转换为字符串格式 自定義格式 |
||||||
|
* |
||||||
|
* @param date |
||||||
|
* @param dateformat |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static String dateToString(Date date, String dateformat) { |
||||||
|
String datestr = null; |
||||||
|
SimpleDateFormat df = new SimpleDateFormat(dateformat); |
||||||
|
datestr = df.format(date); |
||||||
|
return datestr; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 将字符串日期转换为日期格式 |
||||||
|
* |
||||||
|
* @param datestr |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static Date stringToDate(String datestr) throws Exception{ |
||||||
|
|
||||||
|
if (datestr == null || datestr.equals("")) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
Date date = new Date(); |
||||||
|
SimpleDateFormat df = new SimpleDateFormat(DATE_FORMAT); |
||||||
|
try { |
||||||
|
date = df.parse(datestr); |
||||||
|
} catch (ParseException e) { |
||||||
|
date = stringToDate(datestr, "yyyyMMdd"); |
||||||
|
} |
||||||
|
return date; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 将字符串日期转换为日期格式 |
||||||
|
* 自定義格式 |
||||||
|
* |
||||||
|
* @param datestr |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static Date stringToDate(String datestr, String dateformat) throws Exception{ |
||||||
|
Date date = new Date(); |
||||||
|
SimpleDateFormat df = new SimpleDateFormat(dateformat); |
||||||
|
date = df.parse(datestr); |
||||||
|
return date; |
||||||
|
} |
||||||
|
/** |
||||||
|
* 签名 |
||||||
|
* @param param 待签名的参数 |
||||||
|
* @param signKey 签名密钥 |
||||||
|
* @return 签名结果字符串 |
||||||
|
* @throws Exception |
||||||
|
*/ |
||||||
|
public static String sign(Map<String, String> param, String signKey) throws Exception { |
||||||
|
String value = sortMap(param); |
||||||
|
byte[] keyBytes = Base64.decodeBase64(signKey); |
||||||
|
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes); |
||||||
|
KeyFactory keyf = KeyFactory.getInstance("RSA"); |
||||||
|
PrivateKey priKey = keyf.generatePrivate(keySpec); |
||||||
|
Signature signature = Signature.getInstance("SHA256WithRSA"); |
||||||
|
signature.initSign(priKey); |
||||||
|
signature.update(value.getBytes()); |
||||||
|
byte[] signed = signature.sign(); |
||||||
|
String result = Base64.encodeBase64String(signed); |
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 排序 |
||||||
|
* @param param 待排序的参数 |
||||||
|
* @return 排序结果字符串 |
||||||
|
*/ |
||||||
|
public static String sortMap(Map<String, String> param){ |
||||||
|
StringBuilder result = new StringBuilder(); |
||||||
|
Collection<String> keySet = param.keySet(); |
||||||
|
List<String> list = new ArrayList<String>(keySet); |
||||||
|
Collections.sort(list); |
||||||
|
for (int i = 0; i < list.size(); ++i) { |
||||||
|
String key = list.get(i); |
||||||
|
if("symmetricKey".equals(key)){ |
||||||
|
continue; |
||||||
|
} |
||||||
|
// 非空字段需要参与签名
|
||||||
|
// if(param.get(key) == null || "".equals(param.get(key).trim())){
|
||||||
|
// continue;
|
||||||
|
// }
|
||||||
|
result.append(key).append("=").append(param.get(key)).append("&"); |
||||||
|
} |
||||||
|
return result.substring(0, result.length() - 1); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public static String sha256(byte[] data) { |
||||||
|
try { |
||||||
|
MessageDigest md = MessageDigest.getInstance("SHA-256"); |
||||||
|
return bytesToHex(md.digest(data)); |
||||||
|
|
||||||
|
} catch (Exception ex) { |
||||||
|
|
||||||
|
return null; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 将byte数组转换成16进制字符串 |
||||||
|
* |
||||||
|
* @param bytes |
||||||
|
* @return 16进制字符串 |
||||||
|
*/ |
||||||
|
public static String bytesToHex(byte[] bytes) { |
||||||
|
String hexArray = "0123456789abcdef"; |
||||||
|
StringBuilder sb = new StringBuilder(bytes.length * 2); |
||||||
|
for (byte b : bytes) { |
||||||
|
int bi = b & 0xff; |
||||||
|
sb.append(hexArray.charAt(bi >> 4)); |
||||||
|
sb.append(hexArray.charAt(bi & 0xf)); |
||||||
|
} |
||||||
|
return sb.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
public static byte[] hexToBytes(String hex) { |
||||||
|
return hexToBytes(hex.toCharArray()); |
||||||
|
} |
||||||
|
|
||||||
|
public static byte[] hexToBytes(char[] hex) { |
||||||
|
int length = hex.length / 2; |
||||||
|
byte[] raw = new byte[length]; |
||||||
|
for (int i = 0; i < length; i++) { |
||||||
|
int high = Character.digit(hex[i * 2], 16); |
||||||
|
int low = Character.digit(hex[i * 2 + 1], 16); |
||||||
|
int value = (high << 4) | low; |
||||||
|
if (value > 127) { |
||||||
|
value -= 256; |
||||||
|
} |
||||||
|
raw[i] = (byte) value; |
||||||
|
} |
||||||
|
return raw; |
||||||
|
} |
||||||
|
|
||||||
|
public static String createSign(Map<String, String> params){ |
||||||
|
StringBuilder sb = new StringBuilder(); |
||||||
|
// 将参数以参数名的字典升序排序
|
||||||
|
Map<String, String> sortParams = new TreeMap<String, String>(params); |
||||||
|
// 遍历排序的字典,并拼接"key=value"格式
|
||||||
|
for (Map.Entry<String, String> entry : sortParams.entrySet()) { |
||||||
|
String key = entry.getKey(); |
||||||
|
String value = entry.getValue().trim(); |
||||||
|
if (null != value && !"".equals(value)) |
||||||
|
sb.append("&").append(key).append("=").append(value); |
||||||
|
} |
||||||
|
String stringA = sb.toString().replaceFirst("&",""); |
||||||
|
String stringSignTemp = stringA ; |
||||||
|
String signValue = sha256(stringSignTemp.getBytes()); |
||||||
|
return signValue; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 签名 |
||||||
|
* @param param 待签名的参数 |
||||||
|
* @param sign 签名结果字符串 |
||||||
|
* @return 签名结果 |
||||||
|
* @throws NoSuchAlgorithmException |
||||||
|
* @throws InvalidKeySpecException |
||||||
|
* @throws InvalidKeyException |
||||||
|
* @throws SignatureException |
||||||
|
*/ |
||||||
|
public static boolean verify(Map<String, String> param, String sign,String rescissionPublicKey) throws Exception { |
||||||
|
String value = sortMap(param); |
||||||
|
byte[] keyBytes = Base64.decodeBase64(rescissionPublicKey); |
||||||
|
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes); |
||||||
|
KeyFactory keyf = KeyFactory.getInstance("RSA"); |
||||||
|
PublicKey pubkey = keyf.generatePublic(keySpec); |
||||||
|
Signature signature = Signature.getInstance("SHA256WithRSA"); |
||||||
|
signature.initVerify(pubkey); |
||||||
|
signature.update(value.getBytes()); |
||||||
|
boolean result = signature.verify(Base64.decodeBase64(sign.getBytes())); |
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
} |
Loading…
Reference in new issue