Selaa lähdekoodia

refactor: 清理无用导入并优化支付工具类代码

移除HttpConnectionUtil中未使用的日志导入和注释掉未使用的变量
注释掉SmUtil中未使用的公钥常量
优化SybPayService中的类型安全处理和空指针检查
重构AllinpaySDK的测试主方法,增加详细测试用例和工具类测试
skyfffire 1 viikko sitten
vanhempi
commit
3a83107524

+ 157 - 34
src/main/java/common/utils/tl/AllinpaySDK.java

@@ -491,52 +491,175 @@ public class AllinpaySDK {
     }
     
     /**
-     * 测试主方法
+     * 测试主方法 - 使用现有工具类进行测试
      */
     public static void main(String[] args) {
-        System.out.println("=== 通联支付SDK测试 ===");
+        System.out.println("=== 通联支付SDK测试 (使用现有工具类) ===");
+        
+        // 创建SybPayService实例
+        SybPayService payService = new SybPayService();
         
         // 测试参数
-        Long trxamt = 100L; // 1元(分为单位)
         String reqsn = "TEST" + System.currentTimeMillis(); // 商户订单号
-        String body = "book";
-        String remark = "SDKbook";
-        String notify_url = "https://dlsh-nft.com.cn/api/hello/";
+        long trxamt = 100L; // 1元(分为单位)
         
         System.out.println("测试订单号: " + reqsn);
         System.out.println("交易金额: " + trxamt + "分");
+        System.out.println("商户ID: " + SybConstants.SYB_CUSID);
+        System.out.println("应用ID: " + SybConstants.SYB_APPID);
+        System.out.println("API地址: " + SybConstants.SYB_APIURL);
         
-        // 测试1: H5收银台支付
-        System.out.println("\n=== 测试H5收银台支付 ===");
-        PaymentResult payResult = h5Pay(trxamt, reqsn, body, remark, notify_url, 
-                                       "https://dlsh-nft.com.cn", "UTF-8", 
-                                       30, null, null, null);
-        System.out.println("支付结果: " + payResult);
-        
-        if (payResult.isSuccess()) {
-            System.out.println("支付链接: " + payResult.getPayUrl());
-            System.out.println("请在浏览器中打开上述链接完成支付");
-            
-            // 测试2: 查询支付结果
+        try {
+            // 测试1: 查询支付结果
             System.out.println("\n=== 测试查询支付结果 ===");
-            QueryResult queryResult = queryPayment(reqsn);
-            System.out.println("查询结果: " + queryResult);
-        } else {
-            System.out.println("支付失败: " + payResult.getMessage());
+            try {
+                Map<String, String> queryResult = payService.query(reqsn, null);
+                System.out.println("查询结果: " + queryResult);
+                
+                if ("SUCCESS".equals(queryResult.get("retcode"))) {
+                    System.out.println("查询成功!");
+                    System.out.println("交易状态: " + queryResult.get("trxstatus"));
+                    System.out.println("交易ID: " + queryResult.get("trxid"));
+                    System.out.println("交易金额: " + queryResult.get("trxamt"));
+                } else {
+                    System.out.println("查询失败: " + queryResult.get("retmsg"));
+                }
+            } catch (Exception e) {
+                System.out.println("查询异常: " + e.getMessage());
+            }
+            
+            // 测试2: 退款操作 (需要有原始交易)
+            System.out.println("\n=== 测试退款操作 ===");
+            String refundReqsn = "REFUND" + System.currentTimeMillis();
+            String oldTrxId = "TL" + (System.currentTimeMillis() - 1000); // 模拟原交易ID
+            String oldReqsn = "OLD" + (System.currentTimeMillis() - 1000); // 模拟原订单号
+            
+            try {
+                Map<String, String> refundResult = payService.refund(trxamt, refundReqsn, oldTrxId, oldReqsn);
+                System.out.println("退款结果: " + refundResult);
+                
+                if ("SUCCESS".equals(refundResult.get("retcode"))) {
+                    System.out.println("退款成功!");
+                    System.out.println("退款交易ID: " + refundResult.get("trxid"));
+                } else {
+                    System.out.println("退款失败: " + refundResult.get("retmsg"));
+                }
+            } catch (Exception e) {
+                System.out.println("退款异常: " + e.getMessage());
+            }
+            
+            // 测试3: 撤销操作
+            System.out.println("\n=== 测试撤销操作 ===");
+            String cancelReqsn = "CANCEL" + System.currentTimeMillis();
+            
+            try {
+                Map<String, String> cancelResult = payService.cancel(trxamt, cancelReqsn, oldTrxId, oldReqsn);
+                System.out.println("撤销结果: " + cancelResult);
+                
+                if ("SUCCESS".equals(cancelResult.get("retcode"))) {
+                    System.out.println("撤销成功!");
+                    System.out.println("撤销交易ID: " + cancelResult.get("trxid"));
+                } else {
+                    System.out.println("撤销失败: " + cancelResult.get("retmsg"));
+                }
+            } catch (Exception e) {
+                System.out.println("撤销异常: " + e.getMessage());
+            }
+            
+            // 测试4: 工具类方法测试
+            System.out.println("\n=== 测试工具类方法 ===");
+            
+            // 测试随机字符串生成
+            String randomCode = SybUtil.getValidatecode(8);
+            System.out.println("生成随机码: " + randomCode);
+            
+            // 测试MD5加密
+            String testData = "test data for md5";
+            String md5Hash = SybUtil.md5(testData.getBytes());
+            System.out.println("MD5加密测试: " + testData + " -> " + md5Hash);
+            
+            // 测试JSON转换
+            String jsonStr = "{\"name\":\"test\",\"value\":\"123\"}";
+            try {
+                Map<String, String> jsonMap = SybUtil.json2Obj(jsonStr, Map.class);
+                System.out.println("JSON转换测试: " + jsonStr + " -> " + jsonMap);
+            } catch (Exception e) {
+                System.out.println("JSON转换异常: " + e.getMessage());
+            }
+            
+            // 测试签名生成
+            System.out.println("\n=== 测试签名生成 ===");
+            TreeMap<String, String> signParams = new TreeMap<>();
+            signParams.put("cusid", SybConstants.SYB_CUSID);
+            signParams.put("appid", SybConstants.SYB_APPID);
+            signParams.put("version", "11");
+            signParams.put("trxamt", String.valueOf(trxamt));
+            signParams.put("reqsn", reqsn);
+            signParams.put("randomstr", randomCode);
+            signParams.put("signtype", SybConstants.SIGN_TYPE);
+            
+            try {
+                String appkey;
+                if ("RSA".equals(SybConstants.SIGN_TYPE)) {
+                    appkey = SybConstants.SYB_RSACUSPRIKEY;
+                } else if ("SM2".equals(SybConstants.SIGN_TYPE)) {
+                    appkey = SybConstants.SYB_SM2PPRIVATEKEY;
+                } else {
+                    appkey = SybConstants.SYB_MD5_APPKEY;
+                }
+                
+                String signature = SybUtil.unionSign(signParams, appkey, SybConstants.SIGN_TYPE);
+                System.out.println("签名类型: " + SybConstants.SIGN_TYPE);
+                System.out.println("生成签名: " + signature);
+                
+                // 测试签名验证
+                boolean verifyResult = SybUtil.validSign(signParams, appkey, SybConstants.SIGN_TYPE);
+                System.out.println("签名验证结果: " + verifyResult);
+                
+            } catch (Exception e) {
+                System.out.println("签名测试异常: " + e.getMessage());
+            }
+            
+            // 测试5: HTTP连接工具测试
+            System.out.println("\n=== 测试HTTP连接工具 ===");
+            try {
+                HttpConnectionUtil httpUtil = new HttpConnectionUtil(SybConstants.SYB_APIURL + "/unitorder/query");
+                httpUtil.init();
+                
+                TreeMap<String, String> httpParams = new TreeMap<>();
+                httpParams.put("appid", SybConstants.SYB_APPID);
+                httpParams.put("cusid", SybConstants.SYB_CUSID);
+                httpParams.put("version", "11");
+                httpParams.put("reqsn", reqsn);
+                httpParams.put("randomstr", SybUtil.getValidatecode(8));
+                httpParams.put("signtype", SybConstants.SIGN_TYPE);
+                
+                String appkey = "MD5".equals(SybConstants.SIGN_TYPE) ? SybConstants.SYB_MD5_APPKEY : 
+                               "RSA".equals(SybConstants.SIGN_TYPE) ? SybConstants.SYB_RSACUSPRIKEY : 
+                               SybConstants.SYB_SM2PPRIVATEKEY;
+                
+                httpParams.put("sign", SybUtil.unionSign(httpParams, appkey, SybConstants.SIGN_TYPE));
+                
+                byte[] response = httpUtil.postParams(httpParams, true);
+                String responseStr = new String(response, "UTF-8");
+                System.out.println("HTTP请求响应: " + responseStr);
+                
+                httpUtil.destory();
+                
+            } catch (Exception e) {
+                System.out.println("HTTP连接测试异常: " + e.getMessage());
+            }
+            
+        } catch (Exception e) {
+            System.out.println("测试过程中发生异常: " + e.getMessage());
+            e.printStackTrace();
         }
         
-        // 测试3: 模拟异步通知处理
-        System.out.println("\n=== 测试异步通知处理 ===");
-        Map<String, String> notifyParams = new HashMap<>();
-        notifyParams.put("reqsn", reqsn);
-        notifyParams.put("trxstatus", "0000");
-        notifyParams.put("trxid", "TL" + System.currentTimeMillis());
-        notifyParams.put("trxamt", String.valueOf(trxamt));
-        notifyParams.put("sign", "test_sign"); // 实际使用时这里应该是真实的签名
-        
-        NotifyResult notifyResult = handleNotify(notifyParams);
-        System.out.println("通知处理结果: " + notifyResult);
-        
         System.out.println("\n=== 测试完成 ===");
+        System.out.println("注意: 部分测试可能因为没有真实的交易数据而失败,这是正常现象。");
+        System.out.println("在实际使用时,请确保:");
+        System.out.println("1. 配置正确的商户信息和密钥");
+        System.out.println("2. 使用真实的交易订单号进行查询、退款、撤销操作");
+        System.out.println("3. 在生产环境中移除测试代码");
     }
 }

+ 1 - 3
src/main/java/common/utils/tl/HttpConnectionUtil.java

@@ -14,8 +14,6 @@ import javax.net.ssl.HostnameVerifier;
 import javax.net.ssl.HttpsURLConnection;
 import javax.net.ssl.SSLSession;
 
-import org.apache.commons.logging.Log;
-
 public class HttpConnectionUtil {
     private HttpURLConnection conn;
     private String connectUrl;
@@ -42,7 +40,7 @@ public class HttpConnectionUtil {
             HttpsURLConnection httpsConn = (HttpsURLConnection) conn;
             httpsConn.setSSLSocketFactory(SSLUtil.getInstance().getSSLSocketFactory());
         } else if (conn instanceof HttpURLConnection) {
-            HttpURLConnection httpConn = (HttpURLConnection) conn;
+            // HttpURLConnection httpConn = (HttpURLConnection) conn;
         } else {
             throw new Exception("不是http/https协议的url");
         }

+ 1 - 1
src/main/java/common/utils/tl/SmUtil.java

@@ -38,7 +38,7 @@ public class SmUtil {
         /**商户sm2私钥,用于向通联发起请求前进行签名**/
         String cusPrivateKey = "MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgjj4Rk+b0YjwO+UwXofnHf4bK+kaaY5Btkd8nMP2VimmgCgYIKoEcz1UBgi2hRANCAAQqlALW4qGC3bP1x3wo5QsKxaCMEZJ2ODTTwOQ+d8UGU7GoK/y/WMBQWf5upMnFU06p5FxGooXYYoBtldgm03hq";
         /**商户sm2公钥,需要配置到通联商户平台**/
-        String cusPubKey = "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEKpQC1uKhgt2z9cd8KOULCsWgjBGSdjg008DkPnfFBlOxqCv8v1jAUFn+bqTJxVNOqeRcRqKF2GKAbZXYJtN4ag==";
+        // String cusPubKey = "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEKpQC1uKhgt2z9cd8KOULCsWgjBGSdjg008DkPnfFBlOxqCv8v1jAUFn+bqTJxVNOqeRcRqKF2GKAbZXYJtN4ag==";
 
         /**通联平台sm2公钥,用于请求返回或者通联通知的验签**/
         String tlPubKey = "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAE/BnA8BawehBtH0ksPyayo4pmzL/u1FQ2sZcqwOp6bjVqQX4tjo930QAvHZPJ2eez8sCz/RYghcqv4LvMq+kloQ==";

+ 10 - 9
src/main/java/common/utils/tl/SybPayService.java

@@ -1,6 +1,5 @@
 package common.utils.tl;
 
-import java.net.URLEncoder;
 import java.util.Map;
 import java.util.TreeMap;
 
@@ -94,29 +93,31 @@ public class SybPayService {
 
     public static Map<String, String> handleResult(String result) throws Exception {
         System.out.println("ret:" + result);
-        Map map = SybUtil.json2Obj(result, Map.class);
+        @SuppressWarnings("unchecked")
+        Map<String, String> map = SybUtil.json2Obj(result, Map.class);
         if (map == null) {
             throw new Exception("返回数据错误");
         }
         if ("SUCCESS".equals(map.get("retcode"))) {
-            TreeMap tmap = new TreeMap();
+            TreeMap<String, String> tmap = new TreeMap<>();
             tmap.putAll(map);
-            String appkey = "";
-            if (SybConstants.SIGN_TYPE.equals("RSA"))
+            String appkey;
+            if (SybConstants.SIGN_TYPE.equals("RSA")) {
                 appkey = SybConstants.SYB_RSATLPUBKEY;
-            else if (SybConstants.SIGN_TYPE.equals("SM2"))
+            } else if (SybConstants.SIGN_TYPE.equals("SM2")) {
                 appkey = SybConstants.SYB_SM2TLPUBKEY;
-            else
+            } else {
                 appkey = SybConstants.SYB_MD5_APPKEY;
+            }
             if (SybUtil.validSign(tmap, appkey, SybConstants.SIGN_TYPE)) {
                 System.out.println("签名成功");
                 return map;
             } else {
                 throw new Exception("验证签名失败");
             }
-
         } else {
-            throw new Exception(map.get("retmsg").toString());
+            Object retmsg = map.get("retmsg");
+            throw new Exception(retmsg != null ? retmsg.toString() : "未知错误");
         }
     }