TRX 1 år sedan
förälder
incheckning
513620af87

+ 3 - 0
PaymentServer/src/main/java/com/zhongshu/payment/server/core/domain/unionFrictionlessPay/UnionUserOpenInfo.java

@@ -57,6 +57,9 @@ public class UnionUserOpenInfo extends SuperMain {
     @Schema(description = "签约订单过期时间")
     private Long expiredTime;
 
+    @Schema(description = "解约时间")
+    private Long rescissionTime;
+
     @Schema(description = "签约参数")
     private Object param;
 

+ 16 - 7
PaymentServer/src/main/java/com/zhongshu/payment/server/core/service/pay/impl/unionFrictionlessPay/UnionFrictionlessPayMainService.java

@@ -30,6 +30,7 @@ import com.zhongshu.payment.server.core.domain.unionFrictionlessPay.UnionUserOpe
 import com.zhongshu.payment.server.core.service.org.CollectionIdService;
 import com.zhongshu.payment.server.core.service.pay.SuperPayService;
 import com.zhongshu.payment.server.core.service.pay.impl.unionFrictionlessPay.config.UnionFrictionlessPayApiConfig;
+import com.zhongshu.payment.server.core.service.pay.impl.unionFrictionlessPay.config.UnionFrictionlessPayConfig;
 import com.zhongshu.payment.server.core.service.pay.impl.unionFrictionlessPay.config.UnionPaymentConfig;
 import com.zhongshu.payment.server.core.utils.AesUtils;
 import jakarta.servlet.http.HttpServletRequest;
@@ -76,6 +77,9 @@ public class UnionFrictionlessPayMainService extends SuperPayService {
     @Autowired
     StreamHelper streamHelper;
 
+    @Autowired
+    UnionFrictionlessPayConfig payConfig;
+
     /**
      * 发起签约
      *
@@ -110,20 +114,20 @@ public class UnionFrictionlessPayMainService extends SuperPayService {
         }
 
         unionUserOpenInfo.setContractNo(contractNo);
-        Date expireDate = new Date(System.currentTimeMillis() + 60 * 1000);
+        Date expireDate = new Date(System.currentTimeMillis() + payConfig.getExpireTime());
         unionUserOpenInfo.setExpiredTime(expireDate.getTime());
 
         String expireTime = DateUtils.paresTime(expireDate.getTime(), DateUtils.FORMAT_LONG);
         SignParam signParam = new SignParam();
         signParam.setRequestTimestamp(DateUtils.paresTime(System.currentTimeMillis(), DateUtils.FORMAT_LONG));
         signParam.setMid(UnionPaymentConfig.mid);
-        signParam.setPlanId(UnionPaymentConfig.planId);
+        signParam.setPlanId(payConfig.getPlanId());
         signParam.setContractNo(contractNo);
-        signParam.setNotifyUrl(UnionPaymentConfig.notifyUrl + "/" + contractNo);
+        signParam.setNotifyUrl(payConfig.getNotifyUrl() + "/" + contractNo);
         signParam.setExpireTime(expireTime);
-        signParam.setInvokeScene(UnionPaymentConfig.invokeScene);
-        signParam.setMchntWxMpAppId(UnionPaymentConfig.mchntWxMpAppId);
-        signParam.setMchntWxMpPath(UnionPaymentConfig.mchntWxMpPath);
+        signParam.setInvokeScene(payConfig.getInvokeScene());
+        signParam.setMchntWxMpAppId(param.getMchntWxMpAppId());
+        signParam.setMchntWxMpPath(param.getMchntWxMpPath());
         // 身份信息
         String cardNumber = userCountModel.getCardNumber();
         if (StringUtils.isNotEmpty(cardNumber)) {
@@ -168,12 +172,17 @@ public class UnionFrictionlessPayMainService extends SuperPayService {
 
         RescissionParam rescissionParam = new RescissionParam();
         rescissionParam.setRequestTimestamp(DateUtils.paresTime(System.currentTimeMillis(), DateUtils.FORMAT_LONG));
+        rescissionParam.setMid(UnionPaymentConfig.mid);
+        rescissionParam.setPlanId(payConfig.getPlanId());
+        rescissionParam.setContractId(unionUserOpenInfo.getContractId());
         String url = payApiConfig.getUrl(UnionFrictionlessPayApiConfig.rescission);
         SuperResponseModel requestAPI = unionRequestService.requestUnionAPI(url, rescissionParam, SuperResponseModel.class);
         if (requestAPI.isFailed()) {
             return ResultContent.buildFail(requestAPI.getMsg());
         }
-
+        unionUserOpenInfo.setContractState(ContractState.RESCISSION);
+        unionUserOpenInfo.setRescissionTime(System.currentTimeMillis());
+        unionUserOpenInfoDao.save(unionUserOpenInfo);
         return ResultContent.buildSuccess();
     }
 

+ 5 - 1
PaymentServer/src/main/java/com/zhongshu/payment/server/core/service/pay/impl/unionFrictionlessPay/UnionNotifyService.java

@@ -14,6 +14,7 @@ import com.zhongshu.payment.client.payModel.unionFrictionlessPay.model.SignNotif
 import com.zhongshu.payment.server.core.dao.unionFrictionlessPay.UnionUserOpenInfoDao;
 import com.zhongshu.payment.server.core.domain.unionFrictionlessPay.UnionUserOpenInfo;
 import com.zhongshu.payment.server.core.service.base.SuperService;
+import com.zhongshu.payment.server.core.service.pay.impl.unionFrictionlessPay.config.UnionFrictionlessPayConfig;
 import com.zhongshu.payment.server.core.service.pay.impl.unionFrictionlessPay.config.UnionPaymentConfig;
 import com.zhongshu.payment.server.core.utils.AesUtils;
 import com.zhongshu.payment.server.core.utils.CommonUtil;
@@ -57,6 +58,9 @@ public class UnionNotifyService extends SuperService {
     @Autowired
     UnionUserOpenInfoDao unionUserOpenInfoDao;
 
+    @Autowired
+    UnionFrictionlessPayConfig payConfig;
+
     /**
      * 无感支付签约回调 (解约也调用该接口)
      *
@@ -121,7 +125,7 @@ public class UnionNotifyService extends SuperService {
         log.info("签约通知字符串:{} {}", contractNo, paramMap);
 
         PublicKey publicKey = AesUtils.initializeSM3WithSM2PublicKey(
-                UnionPaymentConfig.notifySecret);
+                payConfig.getNotifySecret());
         // 创建 Signature 对象,指定验签算法为 SM3withSM2
         Signature signature1 = Signature.getInstance("SM3withSM2");
         // 初始化 Signature 对象,使用公钥进行验签

+ 7 - 3
PaymentServer/src/main/java/com/zhongshu/payment/server/core/service/pay/impl/unionFrictionlessPay/UnionRequestService.java

@@ -18,6 +18,7 @@ import com.zhongshu.card.client.utils.DateUtils;
 import com.zhongshu.payment.client.payModel.unionFrictionlessPay.model.ApiConfParam;
 import com.zhongshu.payment.client.payModel.unionFrictionlessPay.model.UnionSuperParam;
 import com.zhongshu.payment.server.core.service.base.SuperService;
+import com.zhongshu.payment.server.core.service.pay.impl.unionFrictionlessPay.config.UnionFrictionlessPayConfig;
 import com.zhongshu.payment.server.core.service.pay.impl.unionFrictionlessPay.config.UnionPaymentConfig;
 import com.zhongshu.payment.server.core.utils.AesUtils;
 import com.zhongshu.payment.server.core.utils.CommonUtil;
@@ -54,6 +55,9 @@ public class UnionRequestService extends SuperService {
     @Autowired
     JsonHelper jsonHelper;
 
+    @Autowired
+    UnionFrictionlessPayConfig payConfig;
+
     /**
      * 银联请求
      *
@@ -84,10 +88,10 @@ public class UnionRequestService extends SuperService {
             String timestamp = DateUtils.paresTime(System.currentTimeMillis(), DateUtils.unionAuth);
             String nonce = CommonUtil.UUID();
             Map<String, Object> header = new HashMap<>();
-            String c = String.format("%s%s%s%s", UnionPaymentConfig.appId, timestamp, nonce, sign);
+            String c = String.format("%s%s%s%s", payConfig.getAppId(), timestamp, nonce, sign);
 
-            String signature = AesUtils.signMacSHA256(c, UnionPaymentConfig.appKey);
-            String authorization = "OPEN-BODY-SIG AppId=" + "\"" + UnionPaymentConfig.appId + "\""
+            String signature = AesUtils.signMacSHA256(c, payConfig.getAppKey());
+            String authorization = "OPEN-BODY-SIG AppId=" + "\"" + payConfig.getAppId() + "\""
                     + ",Timestamp=" + "\"" + timestamp + "\""
                     + ",Nonce=" + "\"" + nonce + "\""
                     + ",Signature=" + "\"" + signature + "\"";

+ 32 - 0
PaymentServer/src/main/java/com/zhongshu/payment/server/core/service/pay/impl/unionFrictionlessPay/config/UnionFrictionlessPayConfig.java

@@ -1,5 +1,6 @@
 package com.zhongshu.payment.server.core.service.pay.impl.unionFrictionlessPay.config;
 
+import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.context.annotation.Configuration;
@@ -14,5 +15,36 @@ import org.springframework.stereotype.Component;
 @Configuration
 @ConfigurationProperties(prefix = "unionfrictionless")
 public class UnionFrictionlessPayConfig {
+
+    @Schema(description = "运行环境")
     private String evn = "";
+
+    @Schema(description = "签约状态通知地址")
+    private String notifyUrl = "";
+
+    @Schema(description = "无感支付 秘钥 测试环境通知加密密钥")
+    private String notifySecret;
+
+    private String appId;
+
+    private String appKey;
+
+    @Schema(description = "终端号")
+    private String tid;
+
+    @Schema(description = "银联无感支付签约模板ID")
+    private String planId;
+
+    @Schema(description = "来源编号")
+    private String msgSrcId;
+
+    @Schema(description = "签约结束后调整小程序id")
+    private String mchntWxMpAppId;
+
+    @Schema(description = "交易发起场景 01:APP 03:小程序 04:公众号 缺省值:01:APP")
+    private String invokeScene = "03";
+
+    @Schema(description = "交易过期时间")
+    private Long expireTime = 30 * 60 * 1000L;
+
 }

+ 0 - 30
PaymentServer/src/main/java/com/zhongshu/payment/server/core/service/pay/impl/unionFrictionlessPay/config/UnionPaymentConfig.java

@@ -8,37 +8,7 @@ package com.zhongshu.payment.server.core.service.pay.impl.unionFrictionlessPay.c
  */
 public class UnionPaymentConfig {
 
-    // 无感支付 秘钥 测试环境通知加密密钥
-    public static final String notifySecret = "GAhPWQ8D4hXanneneaydaHYHiwn64p7y3A46Jpss87aKWsy5";
-
-    //
-    public static final String appId = "10037e6f803bc8ab01805fd07db4000d";
-
-    public static final String appKey = "18a3a8d41b9f44d9acdf39c360f7a971";
-
     // 商户代码 银商商户号
     public static final String mid = "898100054115259";
 
-    // 终端号
-    public static final String tid = "00000001";
-
-    // 银联无感支付签约模板ID
-    public static final String planId = "d2041b5c28474a2c9bb8b70128d71160";
-
-    // 来源编号
-    public static final String msgSrcId = "103A";
-
-    // 签约状态发生变化回调地址
-    public static final String notifyUrl = "https://api.dev.qk.zonelife.cn/paymentserver-trx/frictionless/notify/signNotify";
-
-    // 过期时间
-    public static final long expireTime = 30 * 60 * 1000l;
-
-    // 交易发起场景 01:APP 03:小程序 04:公众号 缺省值:01:APP
-    public static final String invokeScene = "03";
-
-    public static final String mchntWxMpAppId = "wx3be1d6d84d46cdf7";
-
-    public static final String mchntWxMpPath = "/page/signResult";
-
 }

+ 0 - 153
PaymentServer/src/main/java/com/zhongshu/payment/server/core/utils/Query.java

@@ -1,153 +0,0 @@
-package com.zhongshu.payment.server.core.utils;
-
-import com.zhongshu.payment.server.core.service.pay.impl.unionFrictionlessPay.config.UnionBalanceConfig;
-import com.zhongshu.payment.server.core.service.pay.impl.unionFrictionlessPay.config.UnionPaymentConfig;
-import org.apache.commons.codec.binary.Base64;
-import org.apache.commons.codec.digest.DigestUtils;
-
-import javax.crypto.Mac;
-import javax.crypto.spec.SecretKeySpec;
-import java.io.*;
-import java.net.HttpURLConnection;
-import java.net.URL;
-import java.net.URLConnection;
-
-/**
- * @author kkqiao
- * 网银支付订单交易查询接口
- * 说明:
- * 钱包支付时,因通讯故障、服务器故障等原因,造成收银机最终没有收到支付结果通知,收银员不确定
- * 该笔支付后台处理结果,可以在收银机上发起“查询”交易,查询该笔交易订单在钱包后台的支付结果,
- * 并将支付结果返回给收银机。
- *  测试环境:http://58.247.0.18:29015/v1/netpay/query
- *  生产环境:https://api-mop.chinaums.com/v1/netpay/query
- */
-public class Query {
-
-//    static String appid = UnionBalanceConfig.appId;
-//    static String appkey = UnionBalanceConfig.appKey;
-
-    static String appid = UnionPaymentConfig.appId;
-    static String appkey = UnionPaymentConfig.appKey;
-
-    static String url = "https://test-api-open.chinaums.com/v1/inip/sign/uac/entrust-pay/sign";
-
-    public static void main(String[] args) throws Exception{
-        //1. 组建请求报文
-        QueryBody reqBody = new QueryBody();
-        reqBody.requestTimestamp = "2019-08-12 15:40:55";
-        reqBody.merOrderId = "101771154dc89774b477474d929f29bc150b80c9";
-        reqBody.mid = "898310148160568";
-        reqBody.tid = "88880001";
-        reqBody.instMid = "H5DEFAULT";
-        System.out.println("request body:\n"+reqBody);
-
-        //2. 获取认证报文,timestamp为当前日期,老旧日期无法请求成功
-        String authorization = getAuthorization(appid,appkey,"20190812154100","nonce",reqBody.toString());
-        System.out.println("authorization:\n"+authorization);
-
-        //3. 发送http请求,并解析返回信息
-        String response = request(url,authorization,reqBody.toString());
-        System.out.println("response:\n"+response);
-    }
-
-    /**
-     * 发送http请求
-     * @param url 请求url
-     * @param authorization 认证报文
-     * @param reqBody  请求体
-     * @return response
-     */
-    static String request(String url, String authorization, String reqBody){
-        String response = "";
-        PrintWriter out = null;
-        BufferedReader in = null;
-        try{
-            URL realUrl = new URL(url);
-            URLConnection conn = realUrl.openConnection();
-            HttpURLConnection httpUrlConnection = (HttpURLConnection) conn;
-            httpUrlConnection.setRequestProperty("Content-Type", "application/json");
-            httpUrlConnection.setRequestProperty("authorization",authorization);
-            httpUrlConnection.setDoOutput(true);
-            httpUrlConnection.setDoInput(true);
-            out = new PrintWriter(httpUrlConnection.getOutputStream());
-            out.write(reqBody);
-            out.flush();
-            httpUrlConnection.connect();
-            in = new BufferedReader(new InputStreamReader(httpUrlConnection.getInputStream()));
-            String line;
-            while ((line = in.readLine()) != null) {
-                response += line;
-            }
-        }catch(Exception e){
-            e.printStackTrace();
-        } finally {
-            try {
-                if (out != null) { out.close();}
-                if (in != null) {in.close();}
-            } catch (Exception ex) {
-                ex.printStackTrace();
-            }
-        }
-        return response;
-    }
-
-    /**
-     * 获取签名头
-     * @param appid
-     * @param appkey
-     * @param timestamp 格式:"yyyyMMddHHmmss"
-     * @param nonce 随机字符串,
-     * @param body 请求体
-     * @return authorization 认证报文
-     * @throws Exception
-     */
-    static String getAuthorization(String appid, String appkey, String timestamp, String nonce, String body) throws Exception {
-        byte[] data = body.getBytes("utf-8");
-        InputStream is = new ByteArrayInputStream(data);
-        String testSH = DigestUtils.sha256Hex(is);
-        String s1 = appid+timestamp+nonce+testSH;
-        Mac mac = Mac.getInstance("HmacSHA256");
-        mac.init(new SecretKeySpec(appkey.getBytes("utf-8"),"HmacSHA256"));
-        byte[] localSignature = mac.doFinal(s1.getBytes("utf-8"));
-        String localSignatureStr = Base64.encodeBase64String(localSignature);
-        return  "OPEN-BODY-SIG AppId="+"\""+appid+"\""+", Timestamp="+"\""+timestamp+"\""+", Nonce="+"\""+nonce+"\""+", Signature="+"\""+localSignatureStr+"\"";
-    }
-
-    static class QueryBody{
-        //消息ID
-        String msgId;
-        //报文请求时间,格式yyyy-MM-ddHH:mm:ss
-        String requestTimestamp;
-        //请求系统预留字段
-        String srcReserve;
-        //商户号
-        String mid;
-        //终端号
-        String tid;
-        //业务类型
-        String instMid;
-        //商户订单号
-        String merOrderId;
-
-        String toJson(){
-            StringBuilder sb = new StringBuilder();
-            sb.append("{");
-            if (this.msgId != null) sb.append("\"msgId\":\"" + this.msgId + "\",");
-            if (this.requestTimestamp != null) sb.append("\"requestTimestamp\":\"" + this.requestTimestamp + "\",");
-            if (this.srcReserve != null) sb.append("\"srcReserve\":\"" + this.srcReserve + "\",");
-            if (this.mid != null) sb.append("\"mid\":\"" + this.mid + "\",");
-            if (this.tid != null) sb.append("\"tid\":\"" + this.tid + "\",");
-            if (this.instMid != null) sb.append("\"instMid\":\"" + this.instMid + "\",");
-            if (this.merOrderId != null) sb.append("\"merOrderId\":\"" + this.merOrderId + "\",");
-            if (sb.charAt(sb.length() - 1) == ',')
-                sb.deleteCharAt(sb.length() - 1);
-            sb.append("}");
-            return sb.toString();
-        }
-        public String toString(){
-            return this.toJson();
-        }
-    }
-
-}

+ 1 - 1
PaymentServer/src/main/java/com/zhongshu/payment/server/core/utils/Test.java

@@ -55,7 +55,7 @@ public class Test {
         System.out.println("Signature verified: " + signature.verify(sig));
 
 
-        String publicKeyString = UnionPaymentConfig.notifySecret;
+        String publicKeyString = "GAhPWQ8D4hXanneneaydaHYHiwn64p7y3A46Jpss87aKWsy5";
         byte[] keyBytes = Base64.getDecoder().decode(publicKeyString);
         X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes);
         KeyFactory keyFactory = KeyFactory.getInstance("ECDSA", "BC");