parent
72e3cb2f01
commit
1eec59a4c3
@ -0,0 +1,14 @@ |
||||
package com.hfkj.channel.llg.config; |
||||
|
||||
/** |
||||
* 零零购 |
||||
* @className: LLGConfig |
||||
* @author: HuRui |
||||
* @date: 2023/12/19 |
||||
**/ |
||||
public class LLGConfig { |
||||
|
||||
public static final String requestUrl = "https://abcd.zjdt.cc"; |
||||
public static final String key = "BMKp20Omcv9u7TqGAhydCw63"; |
||||
|
||||
} |
@ -0,0 +1,92 @@ |
||||
package com.hfkj.channel.llg.service; |
||||
|
||||
import com.alibaba.fastjson.JSONObject; |
||||
import com.hfkj.channel.llg.config.LLGConfig; |
||||
import com.hfkj.channel.llg.util.AesUtil; |
||||
import com.hfkj.common.utils.HttpsUtils; |
||||
|
||||
import java.math.BigDecimal; |
||||
import java.net.HttpURLConnection; |
||||
import java.net.URL; |
||||
import java.util.HashMap; |
||||
import java.util.Map; |
||||
|
||||
/** |
||||
* 零零购分期 |
||||
* 交易订单业务 |
||||
* @className: LLGOrderService |
||||
* @author: HuRui |
||||
* @date: 2023/12/19 |
||||
**/ |
||||
public class LLGOrderService { |
||||
|
||||
/** |
||||
* 获取银行列表 |
||||
* @param merId 商户号 |
||||
* @param period 分期期数 |
||||
* @return |
||||
* @throws Exception |
||||
*/ |
||||
public static JSONObject getBanks(String merId,Integer period) { |
||||
return HttpsUtils.doGet(LLGConfig.requestUrl + "/v3/openapi/banks?merId=" + merId + "&period=" + period); |
||||
} |
||||
|
||||
/** |
||||
* 创建订单 |
||||
* @return 分期支付地址 |
||||
* @throws Exception |
||||
*/ |
||||
public static String createOrder() throws Exception { |
||||
Map<String,Object> param = new HashMap<>(); |
||||
param.put("merId", "109"); |
||||
param.put("marketId", "135"); |
||||
param.put("pkgId", "54"); |
||||
param.put("bankId", "52"); |
||||
param.put("orderId", System.currentTimeMillis()); |
||||
param.put("nickPrice", "100"); |
||||
param.put("payType", "02"); |
||||
param.put("period", "06"); |
||||
param.put("phoneName", "测试"); |
||||
param.put("backUrl", false); // 回调地址
|
||||
param.put("frontUrl", false); // 前端跳转地址
|
||||
param.put("qrcode", false); |
||||
|
||||
String dataStr = AesUtil.aesEncrypt(LLGConfig.key, JSONObject.toJSONString(param)); |
||||
URL url = new URL(LLGConfig.requestUrl + "/v3/openapi/order/create?data="+ dataStr); |
||||
HttpURLConnection connection = (HttpURLConnection) url.openConnection(); |
||||
// GET请求方式
|
||||
connection.setRequestMethod("GET"); |
||||
// 设置不使用缓存, 默认为 true 使用缓存
|
||||
connection.setUseCaches(false); |
||||
// 设置单次请求是否支持重定向,默认为 setFollowRedirects 方法设置的值
|
||||
connection.setInstanceFollowRedirects(false); |
||||
// 设置是否进行重定向,注意此处为 静态方法,表示所有的请求都不支持重定向,默认为true
|
||||
connection.setFollowRedirects(false); |
||||
|
||||
connection.getContent(); |
||||
// 获取重定向地址
|
||||
return "https:" + connection.getHeaderField("Location"); |
||||
} |
||||
|
||||
/** |
||||
* 创建订单 |
||||
* @return 分期支付地址 |
||||
* @throws Exception |
||||
*/ |
||||
public static JSONObject createOrder(Long merId, String orderId, String payType, BigDecimal txnAmt) throws Exception { |
||||
Map<String,Object> param = new HashMap<>(); |
||||
param.put("merId", merId); |
||||
param.put("orderId", orderId); |
||||
param.put("payType", payType); |
||||
param.put("txnAmt", txnAmt); |
||||
|
||||
String dataStr = AesUtil.aesEncrypt(LLGConfig.key, JSONObject.toJSONString(param)); |
||||
JSONObject response = HttpsUtils.doGet(LLGConfig.requestUrl + "/v3/openapi/order/paycheck?data=" + dataStr); |
||||
if (response == null) { |
||||
|
||||
} |
||||
|
||||
return response; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,105 @@ |
||||
package com.hfkj.channel.llg.util; |
||||
|
||||
import javax.crypto.Cipher; |
||||
import javax.crypto.spec.IvParameterSpec; |
||||
import javax.crypto.spec.SecretKeySpec; |
||||
|
||||
/** |
||||
* @className: AesUtil |
||||
* @author: HuRui |
||||
* @date: 2023/12/19 |
||||
**/ |
||||
public class AesUtil { |
||||
|
||||
private static final String CHARSET = "UTF-8"; |
||||
private static final String KEY_ALGORITHM = "AES"; |
||||
/**默认的加密算法 aes-192-cbc*/ |
||||
private static final String DEFAULT_CIPHER_ALGORITHM = "AES/CBC/PKCS5Padding"; |
||||
//private static final String IV_PARAMETER_SPEC_STRING = "0000000000000000";
|
||||
//对应nodejs的buffer.alloc(16,0)
|
||||
private static final byte[] IV_PARAMETER_SPEC_BYTE = new byte[]{00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00}; |
||||
private static final Integer RADIX = 16; |
||||
|
||||
public static void main(String[] args) { |
||||
String testStr =""; |
||||
String aesKey = "BMKp20Omcv9u7TqGAhydCw63";//密钥
|
||||
try { |
||||
/* String aesEncrypt = aesEncrypt(aesKey, testStr); |
||||
System.out.println("========success:===488944dc7dca74786f21fe9b98420038=================="); |
||||
System.out.println(aesEncrypt);*/ |
||||
String aesEncryptStr = "61be322b8f6afb254888109c67cc39619214e9a62eccca1dfee72461e025b9a4"; |
||||
String aesDecrypt = aesDecrypt(aesKey, aesEncryptStr); |
||||
System.out.println(aesDecrypt); |
||||
} catch (Exception e) { |
||||
e.printStackTrace(); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* AES 加密操作 |
||||
* |
||||
* @param aesKey 密钥 |
||||
* @param data 待加密内容 |
||||
* @return 加密数据 |
||||
*/ |
||||
public static String aesEncrypt(String aesKey, String data) throws Exception { |
||||
return byte2HexString(encrypt(aesKey.getBytes(CHARSET), data.getBytes(CHARSET))); |
||||
} |
||||
|
||||
/** |
||||
* AES 解密操作 |
||||
* |
||||
* @param aesKey 密钥 |
||||
* @param data 待解密内容 |
||||
* @return 解密数据 |
||||
*/ |
||||
public static final String aesDecrypt(String aesKey, String data) throws Exception { |
||||
return new String(decrypt(aesKey.getBytes(CHARSET), hexString2Byte(data)), CHARSET); |
||||
} |
||||
|
||||
private static byte[] decrypt(byte[] key, byte[] data) throws Exception { |
||||
SecretKeySpec secretKeySpec = new SecretKeySpec(key, KEY_ALGORITHM); |
||||
Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM); |
||||
IvParameterSpec iv = new IvParameterSpec(IV_PARAMETER_SPEC_BYTE); |
||||
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, iv); |
||||
return cipher.doFinal(data); |
||||
} |
||||
|
||||
private static byte[] hexString2Byte(String hexString) { |
||||
hexString = hexString.toUpperCase(); |
||||
int length = hexString.length() / 2; |
||||
char[] hexChars = hexString.toCharArray(); |
||||
byte[] b = new byte[length]; |
||||
for (int i = 0; i < length; i++) { |
||||
int pos = i * 2; |
||||
b[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1])); |
||||
} |
||||
return b; |
||||
} |
||||
|
||||
private static String byte2HexString(byte[] src) { |
||||
StringBuilder sb = new StringBuilder(); |
||||
for (int i = 0; i < src.length; i++) { |
||||
int v = src[i] & 0xff; |
||||
String hv = Integer.toHexString(v); |
||||
if (hv.length() < 2) { |
||||
sb.append("0"); |
||||
} |
||||
sb.append(hv); |
||||
} |
||||
return sb.toString(); |
||||
} |
||||
|
||||
private static byte charToByte(char c) { |
||||
return (byte) "0123456789ABCDEF".indexOf(c); |
||||
} |
||||
|
||||
private static byte[] encrypt(byte[] key, byte[] data) throws Exception { |
||||
SecretKeySpec secretKeySpec = new SecretKeySpec(key, KEY_ALGORITHM); |
||||
Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM); |
||||
IvParameterSpec iv = new IvParameterSpec(IV_PARAMETER_SPEC_BYTE); |
||||
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, iv); |
||||
return cipher.doFinal(data); |
||||
} |
||||
|
||||
} |
Loading…
Reference in new issue