package com.fengdu.gas.service; import com.fengdu.gas.entity.request.test.TestPayVO; import com.fengdu.gas.repository.po.TestInfoPO; import com.fengdu.gas.service.convert.TestInfoConvert; import com.fengdu.gas.common.ExecutedResult; import com.fengdu.gas.common.PagerResult; import com.fengdu.gas.common.enums.EYesOrNo; import com.fengdu.gas.common.model.Tuple; import com.fengdu.gas.common.util.*; import com.fengdu.gas.entity.enums.EState; import com.fengdu.gas.entity.request.ReqListSetSort; import com.fengdu.gas.entity.request.ReqSetSort; import com.fengdu.gas.entity.request.test.ReqCreateTestInfo; import com.fengdu.gas.entity.request.test.ReqModifyTestInfo; import com.fengdu.gas.entity.search.SearchTestInfo; import com.fengdu.gas.repository.impl.TestInfoMapperImpl; import com.fengdu.gas.repository.vo.TestInfoVO; import com.google.gson.Gson; import org.apache.commons.lang3.BooleanUtils; import org.apache.http.HttpStatus; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import java.io.*; import java.net.HttpURLConnection; import java.net.URL; import java.security.KeyStore; import java.security.NoSuchAlgorithmException; import java.security.Signature; import java.security.interfaces.RSAPrivateCrtKey; import java.util.*; import java.util.stream.Collectors; /** * 测试信息 相关服务 */ @Service public class TestInfoService extends BaseService { @Autowired private TestInfoMapperImpl mapper; //私钥 private final static String PRIVATE_KEY=""; private final static String PASSWORD=""; /** * AES256加密 * @param data * @return * @throws Exception */ public String AES256(String data) throws Exception { KeyGenerator keyGenerator = KeyGenerator.getInstance("AES"); keyGenerator.init(256); // 初始化密钥生成器,指定AES-256 SecretKey key = keyGenerator.generateKey(); Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding"); cipher.init(Cipher.ENCRYPT_MODE, key); byte[] encrypted = cipher.doFinal(data.getBytes("UTF-8")); return Base64.getEncoder().encodeToString(encrypted); } /** * Base64加密 * @param data * @return */ public String Base64(String data) { String encodedString = Base64.getEncoder().encodeToString(data.getBytes()); return encodedString; } public static String getKeyAndValueStr(Map map) { String result = ""; try { List> infoIds = new ArrayList<>(map.entrySet()); // 对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序) Collections.sort(infoIds, Comparator.comparing(Map.Entry::getKey)); // 构造签名键值对的格式 StringBuilder sb = new StringBuilder(); for (Map.Entry item : infoIds) { if (item.getKey() != null && item.getKey() != "") { String key = item.getKey(); String val = item.getValue(); if (!(val == "" || val == null)) { sb.append(key + "=" + val + "&"); } } } result = sb.toString().substring(0, sb.length() - 1); } catch (Exception e) { return null; } return result; } /** * 测试支付 * @return * @throws Exception */ public ExecutedResult testPay() throws Exception { CloseableHttpClient client = HttpClients.createDefault(); HttpPost httpPost = new HttpPost("https://test.sumpay.cn/entrance/gateway.htm"); List pairList = new ArrayList<>(); Map map = new HashMap<>(); map.put("service", "fosun.sumpay.api.orderpay.order.apply"); map.put("version","1.0"); map.put("format","JSON"); map.put("app_id",); map.put("timestamp","20250313142521"); map.put("terminal_type","api"); map.put("mer_no", "200102833852");//商户号 map.put("account_type", "01");//付款方账户类型 map.put("card_no", AES256("6217007200125513450"));//付款方账户号 map.put("real_name", AES256("尹勇"));//付款方账户名 //map.put("bank_code","");//银行代码 //map.put("id_type","1");//证件类型 //map.put("id_no",AES256(""));//证件号码 //map.put("notify_url");//商户后台通知URL map.put("goods_name", Base64("测试001"));//商品名称 map.put("goods_num", "1");//商品数量 map.put("goods_price", "0.11");//商品价格 map.put("goods_type", "1");//商品类型 map.put("order_no", "111111111111111");//订单号 map.put("order_amount", "0.11");//订单金额 map.put("order_time", "20250313142521");//订单时间 map.put("currency", "CNY");//币种 // map.put("pay_comments");//附言 //map.put("remark");//备注字段 Map map1 = new HashMap<>(); for (Map.Entry entry : map.entrySet()) { map1.put(entry.getKey(), entry.getValue()); } //map转换字符串&拼接并排序 String keyAndValueStr = getKeyAndValueStr(map); //签名处理 String msg = signMsg(keyAndValueStr, PRIVATE_KEY, PASSWORD, "UTF-8"); map1.put("sign_type","CERT"); map1.put("sign",msg); for(String key:map1.keySet()){ pairList.add(new BasicNameValuePair(key,map1.get(key))); } UrlEncodedFormEntity entity = new UrlEncodedFormEntity(pairList, "UTF-8"); httpPost.setEntity(entity); try { // 执行请求并获取响应 CloseableHttpResponse response = client.execute(httpPost); try { if(response.getStatusLine().getStatusCode()== HttpStatus.SC_OK){ String data=EntityUtils.toString(response.getEntity(),"UTF-8"); System.out.println(data); }else { throw new RuntimeException("接口连接失败"); } // 处理响应... } finally { response.close(); } } catch (IOException e) { e.printStackTrace(); } finally { try { client.close(); } catch (IOException e) { e.printStackTrace(); } } return ExecutedResult.success(); } /** * 订单支付确认接口 * @return * @throws Exception */ public ExecutedResult confirmPay() throws Exception { CloseableHttpClient client = HttpClients.createDefault(); HttpPost httpPost = new HttpPost("https://test.sumpay.cn/entrance/gateway.htm"); List pairList = new ArrayList<>(); Map map = new HashMap<>(); map.put("service", "fosun.sumpay.api.orderpay.order.apply"); map.put("version","1.0"); map.put("format","JSON"); map.put("app_id",); map.put("timestamp","20250313142521"); map.put("terminal_type","api"); map.put("mer_no", "200102833852");//商户号 map.put("order_no", "111111111111111");//订单号 map.put("serial_no", "");//入账流水号 Map map1 = new HashMap<>(); for (Map.Entry entry : map.entrySet()) { map1.put(entry.getKey(), entry.getValue()); } //map转换字符串&拼接并排序 String keyAndValueStr = getKeyAndValueStr(map); //签名处理 String msg = signMsg(keyAndValueStr, PRIVATE_KEY, PASSWORD, "UTF-8"); map1.put("sign_type","CERT"); map1.put("sign",msg); for(String key:map1.keySet()){ pairList.add(new BasicNameValuePair(key,map1.get(key))); } UrlEncodedFormEntity entity = new UrlEncodedFormEntity(pairList, "UTF-8"); httpPost.setEntity(entity); try { // 执行请求并获取响应 CloseableHttpResponse response = client.execute(httpPost); try { if(response.getStatusLine().getStatusCode()== HttpStatus.SC_OK){ String data=EntityUtils.toString(response.getEntity(),"UTF-8"); System.out.println(data); }else { throw new RuntimeException("接口连接失败"); } // 处理响应... } finally { response.close(); } } catch (IOException e) { e.printStackTrace(); } finally { try { client.close(); } catch (IOException e) { e.printStackTrace(); } } return ExecutedResult.success(); } /** * 签名处理 * @param privateKeyPath:私钥 * @param plaintext:原始字符串 * @param passWord:证书密码 * @param charset :UTF-8 * @return */ public String signMsg(String plaintext, String privateKeyPath, String passWord, String charset) { try { InputStream keyFile = new FileInputStream(new File(privateKeyPath)); KeyStore ks = KeyStore.getInstance("PKCS12"); try { ks.load(keyFile, passWord.toCharArray()); } catch (Throwable ex) { if (keyFile != null) keyFile.close(); throw new RuntimeException("加载私钥失败",ex); } Enumeration myEnum = ks.aliases(); String keyAlias = null; RSAPrivateCrtKey prikey = null; /* IBM JDK必须使用While循环取最后一个别名,才能得到个人私钥别名 */ while (myEnum.hasMoreElements()) { keyAlias = myEnum.nextElement(); if (ks.isKeyEntry(keyAlias)) { prikey = (RSAPrivateCrtKey) ks.getKey(keyAlias, passWord.toCharArray()); break; } } if (prikey == null) { throw new RuntimeException("没有找到匹配私钥"); } else { Signature sign = Signature.getInstance("SHA256withRSA"); sign.initSign(prikey); sign.update(plaintext.getBytes(charset)); return org.apache.commons.codec.binary.Base64.encodeBase64String(sign.sign()); } } catch (RuntimeException e) { throw e; } catch (Throwable e) { throw new RuntimeException("签名失败",e); } } }