From df4733091b30b0434a04dacd0e844663114d4cfe Mon Sep 17 00:00:00 2001
From: 无关风月 <443237572@qq.com>
Date: 星期三, 09 七月 2025 17:51:56 +0800
Subject: [PATCH] 修改支付宝支付和bug修改

---
 cloud-server-account/src/main/java/com/dsh/account/util/PayMoneyUtil.java |  279 +++++++++++++++++++++++++++----------------------------
 1 files changed, 139 insertions(+), 140 deletions(-)

diff --git a/cloud-server-account/src/main/java/com/dsh/account/util/PayMoneyUtil.java b/cloud-server-account/src/main/java/com/dsh/account/util/PayMoneyUtil.java
index 4b32bb9..733d682 100644
--- a/cloud-server-account/src/main/java/com/dsh/account/util/PayMoneyUtil.java
+++ b/cloud-server-account/src/main/java/com/dsh/account/util/PayMoneyUtil.java
@@ -4,10 +4,7 @@
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
-import com.alipay.api.AlipayApiException;
-import com.alipay.api.AlipayClient;
-import com.alipay.api.CertAlipayRequest;
-import com.alipay.api.DefaultAlipayClient;
+import com.alipay.api.*;
 import com.alipay.api.domain.*;
 import com.alipay.api.request.*;
 import com.alipay.api.response.*;
@@ -26,6 +23,10 @@
 //import com.github.binarywang.wxpay.service.ProfitSharingV3Service;
 //import com.github.binarywang.wxpay.service.WxPayService;
 
+import com.dsh.account.util.wx.PartnerAppPrepay;
+import com.dsh.account.util.wx.WXPayUtility;
+import com.dsh.account.util.wx.WeChatV3SignUtil;
+import com.dsh.account.util.wx.WxV3PayConfig;
 import org.apache.commons.collections.map.HashedMap;
 import org.apache.http.client.methods.CloseableHttpResponse;
 import org.bouncycastle.jce.provider.BouncyCastleProvider;
@@ -55,7 +56,21 @@
 import java.util.*;
 
 import static com.dsh.account.util.akeylogin.Md5Util.byteArrayToHexString;
+import com.alipay.api.AlipayApiException;
+import com.alipay.api.AlipayClient;
+import com.alipay.api.DefaultAlipayClient;
+import com.alipay.api.AlipayConfig;
+import com.alipay.api.domain.SettleDetailInfo;
+import com.alipay.api.response.AlipayTradeSettleConfirmResponse;
+import com.alipay.api.domain.SettleConfirmExtendParams;
+import com.alipay.api.request.AlipayTradeSettleConfirmRequest;
+import com.alipay.api.domain.AlipayTradeSettleConfirmModel;
+import com.alipay.api.domain.SettleInfo;
 
+import com.alipay.api.FileItem;
+import java.util.Base64;
+import java.util.ArrayList;
+import java.util.List;
 /**
  * 第三方支付工具类
  */
@@ -181,57 +196,8 @@
     /**
      * 支付宝支付
      */
-    public ResultUtil  alipay(String smid,String body, String subject, String passbackParams, String outTradeNo, String amount, String notifyUrl) {
-//        //构造client
-//        CertAlipayRequest certAlipayRequest = new CertAlipayRequest ();
-//        //设置网关地址
-//        certAlipayRequest.setServerUrl("https://openapi.alipay.com/gateway.do");
-//        //设置应用Id
-//        certAlipayRequest.setAppId(aliAppid);
-//        //设置应用私钥
-//        certAlipayRequest.setPrivateKey(appPrivateKey);
-//        //设置请求格式,固定值json
-//        certAlipayRequest.setFormat("json");
-//        //设置字符集
-//        certAlipayRequest.setCharset("UTF-8");
-//        //设置签名类型
-//        certAlipayRequest.setSignType("RSA2");
-//        //设置应用公钥证书路径
-//        certAlipayRequest.setCertPath(app_cert_path);
-//        //设置支付宝公钥证书路径
-//        certAlipayRequest.setAlipayPublicCertPath(alipay_cert_path);
-//        //设置支付宝根证书路径
-//        certAlipayRequest.setRootCertPath(alipay_root_cert_path);
-//        //构造client
-//        AlipayClient alipayClient = null;
-//        try {
-//            alipayClient = new DefaultAlipayClient(certAlipayRequest);
-//        } catch (AlipayApiException e) {
-//            e.printStackTrace();
-//        }
-//        //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
-//        AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest ();
-//        //SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
-//        AlipayTradeAppPayModel model = new AlipayTradeAppPayModel ();
-//        model.setBody(body);
-//        model.setSubject (subject);
-//        model.setOutTradeNo (outTradeNo);
-//        model.setTimeoutExpress ("30m" );
-//        model.setTotalAmount (amount);
-//        model.setProductCode ( "QUICK_MSECURITY_PAY" );
-//        model.setPassbackParams(passbackParams);//自定义参数
-//        request.setBizModel ( model );
-//        request.setNotifyUrl (callbackPath + notifyUrl);
-//        try  {
-//            //这里和普通的接口调用不同,使用的是sdkExecute
-//            AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
-//            Map<String, String> map = new HashMap<>();
-//            map.put("orderString", response.getBody());
-//            System.out.println(map);//就是orderString 可以直接给客户端请求,无需再做处理。
-//            return ResultUtil.success(map);
-//        }  catch (AlipayApiException e ) {
-//            e.printStackTrace();
-//        }
+    public ResultUtil  alipay(String smid,String body, String subject,
+                              String passbackParams, String outTradeNo, String amount, String notifyUrl) {
 
         //实例化客户端
         AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", aliAppid, appPrivateKey, "json", "UTF-8", alipay_public_key, "RSA2");
@@ -258,49 +224,15 @@
         SubMerchant subMerchant = new SubMerchant();
         subMerchant.setMerchantId(smid);
         model.setSubMerchant(subMerchant);
-        ExtendParams extendParams = new ExtendParams();
-        extendParams.setRoyaltyFreeze("true");// 冻结资金 用于后续分账处理
-        model.setExtendParams(extendParams);
-        //分账
-//        Integer    coursePackagePayments = coursePackageClient.queryByCode(outTradeNo);
-//        Integer paymentCompetitions = competitionsClient.queryByCode(outTradeNo);
-//        Integer siteBookings = siteClient.queryByCode(outTradeNo);
-//        List<Integer> stores = new ArrayList<>();
-//        stores.add(coursePackagePayments);
-//        stores.add(paymentCompetitions);
-//        stores.add(siteBookings);
-//
-//        OperatorUser operatorUser = siteClient.queryOperator(stores);
-//
-//        String alipayProportion = operatorUser.getAlipayProportion();
-//        String alipayNum = operatorUser.getAlipayNum();
-//
-//        ExtendParams extendParams = new ExtendParams();
-////        extendParams.setSysServiceProviderId("YOUR_SERVICE_PROVIDER_ID");
-//        model.setExtendParams(extendParams);
-//
-//        RoyaltyInfo royaltyInfo = new RoyaltyInfo();
-////        royaltyInfo.setRoyaltyType("transfer");
-//
-//
-//        RoyaltyDetailInfos royaltyDetailInfo1 = new RoyaltyDetailInfos();
-//        royaltyDetailInfo1.setTransOutType("userId");
-//        royaltyDetailInfo1.setTransOut(aliAppid);
-//        royaltyDetailInfo1.setTransInType("loginName");
-//        royaltyDetailInfo1.setTransIn("18398968484");
-//
-//        royaltyDetailInfo1.setDesc("分账描述1");
-//        royaltyDetailInfo1.setAmountPercentage(alipayProportion);
-//        List<RoyaltyDetailInfos> royaltyDetailInfos = new ArrayList<>();
-//
-//
-//
-//        royaltyInfo.setRoyaltyDetailInfos(royaltyDetailInfos);
-//        model.setRoyaltyInfo(royaltyInfo);
-//        System.err.println("=================="+royaltyInfo);
-        //
+
+        if (!smid.equals("2088330203191220")){
+            ExtendParams extendParams = new ExtendParams();
+            extendParams.setRoyaltyFreeze("true");
+            model.setExtendParams(extendParams);
+        }
         request.setBizModel(model);
         request.setNotifyUrl(callbackPath + notifyUrl);
+        System.err.println("回调地址:"+callbackPath + notifyUrl);
         try {
             //这里和普通的接口调用不同,使用的是sdkExecute
             AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
@@ -349,45 +281,63 @@
         return ResultUtil.success(alipay_trade_precreate_response.getString("qr_code"));
     }
     // 直付通模式 alipay.trade.settle.confirm(统一收单确认结算接口)
-    public ResultUtil confirm(String smid1,String code, String outTradeNo, String amount) {
-        AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do",
-                aliAppid,
-                appPrivateKey,
-                "json",
-                "GBK",
-                alipay_public_key,
-                "RSA2");
+    public ResultUtil confirm(String smid1,String code, String outTradeNo, String amount) throws AlipayApiException {
+        // 初始化SDK
+        AlipayClient alipayClient = new DefaultAlipayClient(getAlipayConfig());
+
+        // 构造请求参数以调用接口
         AlipayTradeSettleConfirmRequest request = new AlipayTradeSettleConfirmRequest();
-        request.setBizContent("{" +
-                "  \"out_request_no\":\""+code+"\"," +
-                "  \"trade_no\":\""+outTradeNo+"\"," +
-                "  \"settle_info\":{" +
-                "    \"settle_detail_infos\":[" +
-                "      {" +
-                "        \"trans_in_type\":\"defaultSettle\"," +
-                "        \"settle_entity_id\":\""+smid1+"\"," +
-                "        \"settle_entity_type\":\"SecondMerchant\"," +
-                "        \"amount\":"+amount+"," +
-                "      }" +
-                "    ]" +
-                "  }," +
-                "  \"extend_params\":{" +
-                "    \"royalty_freeze\":\"false\"" +
-                "  }" +
-                "}");
-        AlipayTradeSettleConfirmResponse response = null;
-        try {
-            response = alipayClient.execute(request);
-        } catch (AlipayApiException e) {
-            e.printStackTrace();
-        }
-        if(response.isSuccess()){
+        AlipayTradeSettleConfirmModel model = new AlipayTradeSettleConfirmModel();
+
+        // 设置确认结算请求流水号
+        model.setOutRequestNo(code);
+
+        // 设置支付宝交易号
+        model.setTradeNo(outTradeNo);
+
+        // 设置描述结算信息
+        SettleInfo settleInfo = new SettleInfo();
+        List<SettleDetailInfo> settleDetailInfos = new ArrayList<SettleDetailInfo>();
+        SettleDetailInfo settleDetailInfos0 = new SettleDetailInfo();
+        settleDetailInfos0.setAmount(amount);
+        settleDetailInfos0.setTransIn(smid1);
+        settleDetailInfos0.setSettleEntityType("SecondMerchant");
+        settleDetailInfos0.setSettleEntityId(smid1);
+        settleDetailInfos0.setTransInType("defaultSettle");
+        settleDetailInfos.add(settleDetailInfos0);
+        settleInfo.setSettleDetailInfos(settleDetailInfos);
+        model.setSettleInfo(settleInfo);
+        request.setBizModel(model);
+        System.err.println("结算金额"+amount);
+        // 第三方代调用模式下请设置app_auth_token
+        // request.putOtherTextParam("app_auth_token", "<-- 请填写应用授权令牌 -->");
+
+        AlipayTradeSettleConfirmResponse response = alipayClient.execute(request);
+        System.out.println("返回体"+response.getBody());
+
+
+        if (response.isSuccess()) {
             System.out.println("调用成功");
-            return ResultUtil.success();
         } else {
             System.out.println("调用失败");
-            return ResultUtil.error("出现问题啦");
+            // sdk版本是"4.38.0.ALL"及以上,可以参考下面的示例获取诊断链接
+            // String diagnosisUrl = DiagnosisUtils.getDiagnosisUrl(response);
+            // System.out.println(diagnosisUrl);
         }
+        return ResultUtil.success(response.getBody());
+    }
+    private static AlipayConfig getAlipayConfig() {
+        String privateKey  = "MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCi5i9nW/hGLJ3A06cZxTQdviFC7THpdSihoTYGLr9q006hu0V26ecBMY/o4w5bvIX0Ok/yofmZsVcCJpAPvbXL/uqVrIjnRRxXiaeBFThlxoBUTdunvbUSDYfzlEhJr5NvUKI6H6lz2niXlQGx4qy8Hau4ccWit9kM8jwUvsBVQoFgJA+xrjMvooA7YLopQtpOD+UJr5thApTSf1xrnr1W12yolTLEH15JmNV372cqXrYUuqnY0QsaPtxeqJUGAOcGdVLllQ7easEznP8DFBvDdHATcmp2SHNQDUEWN6MCVPbMgY06NQVqAXxqjTAYSVh+6TRu6bofPmpYC3TZB003AgMBAAECggEBAJAcR2+PA3NBYUYHeFrqBRMS8uX8ZR19kjZ7IgoSLTFaQsP9opRylPSPXhrPVBKAE5leRQAHn4MCSlESwHvMfxo7KFjFTFAc6dffZZpipYQUOc9bGampwJh58/3e/pyBgVMG6J23CPf/HJQtNFSkjd/V9+ayb/9l2dUEL3bC0fAZ/dbx8HsxdLw8wn3fLlWLj68hOMqa2deCZe3JdSVsPbeWqkh56FFsMLug0Nd+Ar4TgRl9/jnhXF0JWiD0LmPUYLhboY7EfUBzN4w1iYbDi1P+3zvoOYsiVKAXox9GMhQ2VzOO2UcSTuizSza2e98mGpabl/GpKmCz+RDFjtkX6eECgYEA2MyCij65eO3aGIm3FUe93DULRBYTfX8qJQSJq2WOWA3mmQlEW6L3O2B5/lG2h+8WmN6iLEs9eHpgycGYp7vAqgrANEn16ACVcuyx0scFtrZfZ+kmHMzFfiUWxJjVYk/6YngsGVBLdw6ueM42C8TTP67X9tU5TdVGoGWuqEj4W98CgYEAwFqwprXOch5Pqk/RPbb49r0Ou03K/UbciWnWWKzUhFFNS8MdlQPoDvQZbMwHLeWsa2VhaKITK3x5biLQb3U+0GLOn6lTvEyrEUH+ucREyLgVYTRAvwBPtnvlrzpyxPk2HnslQjju8WrvvLLBMKWUjlTrTOzhaHT21gz3pHMiOakCgYEAhLmfaXdBITGshb054sNLDtdCkGpbgEcrzAHdLps769iGxkYQHXHFngpQZUwtTUcoNGqIKknd1jZFrv7gsD+XkgKG7PwimehRlkwmCX5ilxtLiVgJRzRt6+5U5AMVD90a0tHzXYP0z2yjj73fBJF5KtGl0a10KZxaYrQdm1UhB00CgYBZZgzx/k9rtHC8LAqIj1CYhHejT92G53c6Gkl3vyOqN4sgKhfGmSEySfrDGPRBPZxr8ZtbIPCd5mUdberH0osWGMYFaJI1UsCy7aQwvGpniz7MhZeN7dweaOjwDs8mgtjHQ96mL4XGCDhR0BZ/wIURvZ/6iaGdhbbu9unlsWj3uQKBgQCmZYdsbbZkd3ev6f8rwyvMz+DrCQyYpY44cegBYuJgrZiQnL2fJioeN7ixX0UM48SfwsZEIrzshP/LGAwnc2MdjxKUl4jLN8SEe0NAjXOnz9Zaw740+aOmLpXcLWdP4uM2gIhWsvW1tEkQZCXmm7c9s/RsU8Pmzv+YL3+fSijOzA==";
+        String alipayPublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmu8n/4yTHWbn7VOrNc9OsLtDL1bEQ8gC1dHkj8Wy5z0mkaOsjJRIG/28ze12M0V8jdCKuuDr5Z1OPKiqf+XO3ypguEh+mYUVMBM/cZodDFQfTY1TKLWjvQCuaqlA+QUTCK6f7T7stsgyQ1o9Jj0rXZDz6PM4QHSTzjrLIBaeqM5WIBvH+fy/X+QG5Utd+/UT0kc0JyvuKhZ65yVUd/C9VcwJJAPliRsAQNrqYterwAJ9zvw9tF11wj9W0XgJ8Ccu4x3gR1vrlLRJJo/OA97RmxPQ+5hSacWQZCUd1dwiBq+YCrKVHGTj14izRHXrLc0yBlRXo7tBOIqcy3IsvKVthQIDAQAB";
+        AlipayConfig alipayConfig = new AlipayConfig();
+        alipayConfig.setServerUrl("https://openapi.alipay.com/gateway.do");
+        alipayConfig.setAppId("2021004105665036");
+        alipayConfig.setPrivateKey(privateKey);
+        alipayConfig.setFormat("json");
+        alipayConfig.setAlipayPublicKey(alipayPublicKey);
+        alipayConfig.setCharset("UTF-8");
+        alipayConfig.setSignType("RSA2");
+        return alipayConfig;
     }
     // 资金冻结 做分账处理
     public ResultUtil confirm1(String smid,String code, String outTradeNo, String amount) {
@@ -547,17 +497,10 @@
         map.put("appid", appid);
         map.put("mch_id", mchId);
         map.put("nonce_str", nonce_str);
-        String temp = "";
-        if (body.split("-").length>1){
-             temp = body.split("-")[1];
-            map.put("body", body.split("-")[0]);
-        }else{
+
             map.put("body", body);
-        }
-        if (StringUtils.hasLength(temp) && temp.equals("1")){
-            // 添加分账标识
-            map.put("profit_sharing", "Y");
-        }
+
+
         map.put("attach", attach);//存储订单id
         map.put("out_trade_no", out_trade_no);//存储的订单code
         map.put("total_fee", i);
@@ -649,6 +592,62 @@
             return ResultUtil.error(map1.get("return_msg"), new JSONObject());
         }
     }
+    public ResultUtil weixinpayV3(String subMchid,String description, String outTradeNo, String notifyUrl, String totalFee) throws Exception {
+        int i = new BigDecimal(totalFee).multiply(new BigDecimal("100")).intValue();
+        // TODO: 请准备商户开发必要参数,参考:https://pay.weixin.qq.com/doc/v3/partner/4013080340
+        PartnerAppPrepay client = new PartnerAppPrepay(
+//                "1681873607",                  // 商户号,是由微信支付系统生成并分配给每个商户的唯一标识符,商户号获取方式参考https://pay.weixin.qq.com/doc/v3/partner/4013080340
+//                "55714944F7A7E52526F708280B176DCC838F371A",       // 商户API证书序列号,如何获取请参考https://pay.weixin.qq.com/doc/v3/partner/4013058924
+//                "E:\\wanpai\\1681873607_20250424_cert\\apiclient_key.pem", // 商户API证书私钥文件路径,本地文件路径
+//                "PUB_KEY_ID_0116818736072025042400351694002605",          // 微信支付公钥ID,如何获取请参考https://pay.weixin.qq.com/doc/v3/partner/4013038589
+//                "E:\\wanpai\\pub_key.pem"     // 微信支付公钥文件路径,本地文件路径
+
+                "1681873607",                  // 商户号,是由微信支付系统生成并分配给每个商户的唯一标识符,商户号获取方式参考https://pay.weixin.qq.com/doc/v3/partner/4013080340
+                "55714944F7A7E52526F708280B176DCC838F371A",       // 商户API证书序列号,如何获取请参考https://pay.weixin.qq.com/doc/v3/partner/4013058924
+                "/usr/playpai/server/wxV3/1681873607_20250424_cert/apiclient_key.pem", // 商户API证书私钥文件路径,本地文件路径
+                "PUB_KEY_ID_0116818736072025042400351694002605",          // 微信支付公钥ID,如何获取请参考https://pay.weixin.qq.com/doc/v3/partner/4013038589
+                "/usr/playpai/server/wxV3/pub_key.pem"     // 微信支付公钥文件路径,本地文件路径
+        );
+
+        PartnerAppPrepay.PartnerAPIv3CommonPrepayRequest request = new PartnerAppPrepay.PartnerAPIv3CommonPrepayRequest();
+        request.spAppid = appid;// appid
+        request.spMchid = WxV3PayConfig.Mch_ID;// 服务商商户号
+        request.subMchid = subMchid;// 子商户号
+        request.description = description;// 描述
+        request.outTradeNo = outTradeNo;// 订单号
+        request.notifyUrl = callbackPath+notifyUrl;// 回调地址
+        request.amount = new PartnerAppPrepay.CommonAmountInfo();
+        request.amount.total = (long) i;// 金额 单位分
+        request.amount.currency = "CNY";
+        String prepayId ="";
+        Map<String, Object> map3 = new HashMap<>();
+        try {
+            PartnerAppPrepay.PartnerAPIv3AppPrepayResponse response = client.run(request);
+            // TODO: 请求成功,继续业务逻辑
+            System.err.println("微信申请成功,预支付ID: " + response.prepayId);
+            prepayId = response.prepayId;
+        } catch (WXPayUtility.ApiException e) {
+            // TODO: 请求失败,根据状态码执行不同的逻辑
+            e.printStackTrace();
+        }
+        map3.put("appid", appid);
+        map3.put("timestamp", String.valueOf(System.currentTimeMillis() / 1000));
+        String nonce_str = UUIDUtil.getRandomCode(16);
+        map3.put("noncestr", nonce_str);
+        map3.put("prepayid", prepayId);
+        // 构造待签名字符串
+        String message = WeChatV3SignUtil.buildSignMessage(map3);
+        // 私钥路径(pem 文件)
+        String privateKeyPath = "/usr/playpai/server/wxV3/1681873607_20250424_cert/apiclient_key.pem";
+//      String privateKeyPath = "E:\\wanpai\\1681873607_20250424_cert\\apiclient_key.pem";
+        // 生成签名
+        String sign = WeChatV3SignUtil.signWithPrivateKey(message, privateKeyPath);
+        map3.put("sign", sign);
+        map3.put("package", "Sign=WXPay");
+        map3.put("partnerid", WxV3PayConfig.Mch_ID);// 服务商商户号
+        System.err.println(map3);
+        return ResultUtil.success(map3);
+    }
 
 
     @Resource

--
Gitblit v1.7.1