# Conflicts: # hai-service/src/main/java/com/hai/openApi/service/impl/ApiOrderCreateHandleServiceImpl.java # hai-service/src/main/java/com/hai/openApi/service/impl/ApiOrderServiceImpl.javamaster
parent
415a13e8ec
commit
9f48149490
File diff suppressed because one or more lines are too long
@ -0,0 +1,58 @@ |
||||
package com.web.controller.notify; |
||||
|
||||
import com.alibaba.fastjson.JSONObject; |
||||
import com.hai.config.PetroConfig; |
||||
import com.hai.service.impl.OutRechargeOrderServiceImpl; |
||||
import io.swagger.annotations.Api; |
||||
import io.swagger.annotations.ApiOperation; |
||||
import org.slf4j.Logger; |
||||
import org.slf4j.LoggerFactory; |
||||
import org.springframework.stereotype.Controller; |
||||
import org.springframework.web.bind.annotation.RequestBody; |
||||
import org.springframework.web.bind.annotation.RequestMapping; |
||||
import org.springframework.web.bind.annotation.RequestMethod; |
||||
import org.springframework.web.bind.annotation.ResponseBody; |
||||
|
||||
import javax.servlet.http.HttpServletRequest; |
||||
import javax.servlet.http.HttpServletResponse; |
||||
import java.io.PrintWriter; |
||||
|
||||
@Controller |
||||
@RequestMapping(value = "/petroNotify") |
||||
@Api(value = "中石油业务通知") |
||||
public class PetroNotifyController { |
||||
|
||||
private static Logger log = LoggerFactory.getLogger(PetroConfig.class); |
||||
|
||||
|
||||
|
||||
@RequestMapping(value = "/petroCallback", method = RequestMethod.POST) |
||||
@ApiOperation(value = "中石油回调") |
||||
@ResponseBody |
||||
public void rechargeCallbackByJj(@RequestBody JSONObject jsonObject, HttpServletResponse response) { |
||||
try { |
||||
|
||||
|
||||
log.info("============回调任务Start============="); |
||||
log.info("尖椒订单充值-回调参数: " + jsonObject); |
||||
log.info("============回调任务End============="); |
||||
|
||||
|
||||
response.setCharacterEncoding("UTF-8"); |
||||
response.setContentType("text/html;charset=utf-8"); |
||||
PrintWriter writer= response.getWriter(); |
||||
|
||||
JSONObject postJson = new JSONObject(); |
||||
postJson.put("resultCode" ,"0000"); |
||||
postJson.put("errMsg" ,""); |
||||
writer.write(postJson.toJSONString()); |
||||
writer.flush(); |
||||
writer.close(); |
||||
|
||||
|
||||
} catch (Exception e) { |
||||
log.error("WechatPayController --> wechatNotify() error!", e); |
||||
} |
||||
} |
||||
|
||||
} |
@ -0,0 +1,189 @@ |
||||
package com.hai.common.utils; |
||||
|
||||
import java.io.ByteArrayOutputStream; |
||||
import java.io.UnsupportedEncodingException; |
||||
import java.nio.charset.StandardCharsets; |
||||
import java.security.MessageDigest; |
||||
import java.util.Map; |
||||
import java.util.TreeMap; |
||||
|
||||
public class PetroEncryptUtil { |
||||
|
||||
|
||||
/** |
||||
* 生成签名 |
||||
* |
||||
* @param signMaps |
||||
* @return |
||||
* @throws Exception |
||||
*/ |
||||
public static String generateSign(Map<String, Object> signMaps) { |
||||
StringBuilder sb = new StringBuilder(); |
||||
TreeMap<String, Object> sortedMap = new TreeMap<>(signMaps); |
||||
// 字典序
|
||||
for (Map.Entry<String, Object> entry : sortedMap.entrySet()) { |
||||
String key = entry.getKey(); |
||||
String value = (String) entry.getValue(); |
||||
|
||||
// 为空不参与签名、参数名区分大小写
|
||||
if (!"sign".equals(key)) { |
||||
sb.append(key).append("=").append(value).append("&"); |
||||
} |
||||
|
||||
} |
||||
sb = new StringBuilder(sb.substring(0, sb.length() - 1)); |
||||
// MD5加密
|
||||
return md532(sb.toString()); |
||||
} |
||||
|
||||
/*** |
||||
* MD5加码 生成32位md5码 |
||||
*/ |
||||
public static String md532(String inStr) { |
||||
MessageDigest md5; |
||||
try { |
||||
md5 = MessageDigest.getInstance("MD5"); |
||||
|
||||
} catch (Exception e) { |
||||
System.out.println(e); |
||||
e.printStackTrace(); |
||||
return ""; |
||||
} |
||||
char[] charArray = inStr.toCharArray(); |
||||
byte[] byteArray = new byte[charArray.length]; |
||||
|
||||
for (int i = 0; i < charArray.length; i++) |
||||
byteArray[i] = (byte) charArray[i]; |
||||
byte[] md5Bytes = md5.digest(byteArray); |
||||
StringBuilder hexValue = new StringBuilder(); |
||||
for (byte md5Byte : md5Bytes) { |
||||
int val = ((int) md5Byte) & 0xff; |
||||
if (val < 16) |
||||
hexValue.append("0"); |
||||
hexValue.append(Integer.toHexString(val)); |
||||
} |
||||
return hexValue.toString(); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* 加密解密算法 |
||||
* |
||||
* @param inStr 加密字符串 |
||||
* @param secretKey 秘钥 |
||||
* 算法: |
||||
* 1:加密字符串和秘钥转换成字符数组; |
||||
* 2:秘钥去重复 |
||||
* 3:循环一(秘钥字符串数组){ 循环二(加密字符串数组){ |
||||
* 秘钥字符的ASC码 与 加密字符的ASC码 进行二进制异或运算 |
||||
* } |
||||
* } |
||||
* 4:把字符串转为16进制 |
||||
*/ |
||||
private static String convert(String inStr, String secretKey) { |
||||
char[] a = inStr.toCharArray(); |
||||
char[] s = rmRepeated(secretKey).toCharArray(); |
||||
for (int i = 0; i < s.length; i++) { |
||||
for (int j = 0; j < a.length; j++) { |
||||
a[j] = (char) (a[j] ^ s[i]); |
||||
} |
||||
} |
||||
return new String(a); |
||||
} |
||||
|
||||
/** |
||||
* 清除字符串中重复字母算法 |
||||
* |
||||
* @param s |
||||
* @return |
||||
*/ |
||||
private static String rmRepeated(String s) { |
||||
int len = s.length(); |
||||
int k = 0; |
||||
int count = 0; |
||||
String str = ""; |
||||
char[] c = new char[len]; |
||||
for (int i = 0; i < len; i++) { |
||||
c[i] = s.charAt(i); |
||||
} |
||||
for (int i = 0; i < len; i++) { |
||||
k = i + 1; |
||||
while (k < len - count) { |
||||
if (c[i] == c[k]) { |
||||
for (int j = k; j < len - 1; j++) { |
||||
c[j] = c[j + 1];// 出现重复字母,从k位置开始将数组往前挪位
|
||||
} |
||||
count++;// 重复字母出现的次数
|
||||
k--; |
||||
} |
||||
k++; |
||||
} |
||||
} |
||||
for (int i = 0; i < len - count; i++) { |
||||
str += String.valueOf(c[i]); |
||||
} |
||||
return str; |
||||
} |
||||
|
||||
/* |
||||
* 将字符串编码成16进制数字,适用于所有字符(包括中文) |
||||
*/ |
||||
private static String hexString = "0123456789ABCDEF"; |
||||
|
||||
public static String encode(String str) { |
||||
// 根据默认编码获取字节数组
|
||||
String r; |
||||
byte[] bytes = str.getBytes(StandardCharsets.UTF_8); |
||||
StringBuilder sb = new StringBuilder(bytes.length * 2); |
||||
// 将字节数组中每个字节拆解成2位16进制整数
|
||||
for (byte aByte : bytes) { |
||||
sb.append(hexString.charAt((aByte & 0xf0) >> 4)); |
||||
sb.append(hexString.charAt((aByte & 0x0f))); |
||||
} |
||||
r = sb.toString(); |
||||
return r; |
||||
} |
||||
|
||||
/* |
||||
* 将16进制数字解码成字符串,适用于所有字符(包括中文) |
||||
*/ |
||||
public static String decode(String bytes) { |
||||
String r = ""; |
||||
try { |
||||
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(bytes.length() / 2); |
||||
// 将每2位16进制整数组装成一个字节
|
||||
for (int i = 0; i < bytes.length(); i += 2) { |
||||
byteArrayOutputStream.write((hexString.indexOf(bytes.charAt(i)) << 4 | hexString.indexOf(bytes.charAt(i + 1)))); |
||||
} |
||||
r = byteArrayOutputStream.toString("UTF-8"); |
||||
} catch (UnsupportedEncodingException e) { |
||||
e.printStackTrace(); |
||||
} |
||||
return r; |
||||
} |
||||
|
||||
/** |
||||
* 加密 |
||||
* |
||||
* @param inStr 原字符串 |
||||
* @param secretKey 秘钥 |
||||
* @return |
||||
*/ |
||||
public static String encrypt(String inStr, String secretKey) { |
||||
String hexStr = convert(inStr, secretKey); |
||||
return encode(hexStr); |
||||
} |
||||
|
||||
/** |
||||
* 解密 |
||||
* |
||||
* @param inStr 原字符串 |
||||
* @param secretKey 秘钥 |
||||
* @return |
||||
*/ |
||||
public static String decrypt(String inStr, String secretKey) { |
||||
String hexStr = decode(inStr); |
||||
return convert(hexStr, secretKey); |
||||
} |
||||
|
||||
} |
Loading…
Reference in new issue