From c4cb2989b3291d7efc32eb70bb0e6d5627e0a5b9 Mon Sep 17 00:00:00 2001 From: gong <1157756119@qq.com> Date: Wed, 14 Jan 2026 18:43:20 +0800 Subject: [PATCH] =?UTF-8?q?=E9=9B=86=E6=88=90=20=E5=B0=81=E8=A3=85?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/czg/PayManager.java | 58 +++++----------- .../czg/third/alipay/AlipayIsvPayManager.java | 34 +++++++--- .../czg/third/wechat/WechatPayManager.java | 67 ++++++++++--------- .../java/com/czg/impl/NativePayAdapter.java | 26 +++++-- 4 files changed, 96 insertions(+), 89 deletions(-) diff --git a/cash-sdk/aggregation-pay/src/main/java/com/czg/PayManager.java b/cash-sdk/aggregation-pay/src/main/java/com/czg/PayManager.java index f9410d87d..d6df65b75 100644 --- a/cash-sdk/aggregation-pay/src/main/java/com/czg/PayManager.java +++ b/cash-sdk/aggregation-pay/src/main/java/com/czg/PayManager.java @@ -1,8 +1,10 @@ package com.czg; -import com.czg.dto.req.PayParamsDto; +import com.czg.constants.SystemConstants; import com.czg.dto.req.RefundParamsDto; import com.czg.exception.CzgException; +import com.czg.pay.CzgPayBaseReq; +import com.czg.pay.NativeMerchantDTO; import com.czg.third.alipay.AlipayIsvPayManager; import com.czg.third.wechat.WechatPayManager; @@ -20,13 +22,11 @@ public class PayManager { * @param paramsDto 参数 * @return 结果 */ - public static Map jsapiPay(PayParamsDto paramsDto) { - paramsDto.verifyParams(); - - if (PayCst.Platform.WECHAT.equals(paramsDto.getPlatform())) { - return WechatPayManager.jsapiPay(null, paramsDto); - } else if (PayCst.Platform.ALIPAY.equals(paramsDto.getPlatform())) { - return AlipayIsvPayManager.jsapiPay(null, paramsDto); + public static Map jsapiPay(CzgPayBaseReq paramsDto, NativeMerchantDTO merchantDTO) { + if (SystemConstants.PayType.WECHAT.equals(paramsDto.getPayType())) { + return WechatPayManager.jsapiPay(null, paramsDto, merchantDTO); + } else if (SystemConstants.PayType.ALIPAY.equals(paramsDto.getPayType())) { + return AlipayIsvPayManager.jsapiPay(null, paramsDto, merchantDTO); } else { throw new CzgException("不支持的支付平台"); } @@ -38,13 +38,11 @@ public class PayManager { * @param paramsDto 参数 * @return 结果 */ - public static Map barPay(PayParamsDto paramsDto) { - paramsDto.verifyParams(); - - if (PayCst.Platform.WECHAT.equals(paramsDto.getPlatform())) { - return WechatPayManager.barPay(null, paramsDto); - } else if (PayCst.Platform.ALIPAY.equals(paramsDto.getPlatform())) { - return AlipayIsvPayManager.barPay(null, paramsDto); + public static Map barPay(CzgPayBaseReq paramsDto, NativeMerchantDTO merchantDTO) { + if (SystemConstants.PayType.WECHAT.equals(paramsDto.getPayType())) { + return WechatPayManager.barPay(null, paramsDto, merchantDTO); + } else if (SystemConstants.PayType.ALIPAY.equals(paramsDto.getPayType())) { + return AlipayIsvPayManager.barPay(null, paramsDto, merchantDTO); } else { throw new CzgException("不支持的支付平台"); } @@ -54,9 +52,9 @@ public class PayManager { * 查询订单状态 */ public static Map queryOrderStatus(String platform, String orderNo, String subMerchantId) { - if (PayCst.Platform.WECHAT.equals(platform)) { + if (SystemConstants.PayType.WECHAT.equals(platform)) { return WechatPayManager.queryOrder(null, orderNo, subMerchantId); - } else if (PayCst.Platform.ALIPAY.equals(platform)) { + } else if (SystemConstants.PayType.ALIPAY.equals(platform)) { return AlipayIsvPayManager.queryOrder(null, orderNo, subMerchantId); } else { throw new CzgException("不支持的支付平台"); @@ -67,9 +65,9 @@ public class PayManager { * 退款 */ public static Map refund(String platform, RefundParamsDto paramsDto) { - if (PayCst.Platform.WECHAT.equals(platform)) { + if (SystemConstants.PayType.WECHAT.equals(platform)) { return WechatPayManager.refundOrder(null, paramsDto); - } else if (PayCst.Platform.ALIPAY.equals(platform)) { + } else if (SystemConstants.PayType.ALIPAY.equals(platform)) { return AlipayIsvPayManager.refundOrder(null, paramsDto); } else { throw new CzgException("不支持的支付平台"); @@ -77,27 +75,5 @@ public class PayManager { } public static void main(String[] args) { -// jsapiPay(new PayParamsDto() -// .setPlatform(PayCst.Platform.ALIPAY) -// .setAppId("2021004145625815") -// .setOpenId("123123123") -// .setOrderNo("1111231231213") -// .setTitle("1213") -// .setMerchantId("123312321") -// .setBody("1213") -// .setAmount(1000L) -// .setPayParams("{\"app_auth_token\": \"ssss\"}") -// .setNotifyUrl("https://www.baidu.com")); - jsapiPay(new PayParamsDto() - .setPlatform(PayCst.Platform.WECHAT) - .setAppId("wxd88fffa983758a30") - .setOpenId("or1l86yipGvwyfPhrKIAcQuSfAV8") - .setOrderNo("1111231231213") - .setTitle("1213") - .setMerchantId("1738216504") - .setBody("1213") - .setAmount(1000L) - .setPayParams("{\"app_auth_token\": \"ssss\"}") - .setNotifyUrl("https://www.baidu.com")); } } diff --git a/cash-sdk/aggregation-pay/src/main/java/com/czg/third/alipay/AlipayIsvPayManager.java b/cash-sdk/aggregation-pay/src/main/java/com/czg/third/alipay/AlipayIsvPayManager.java index 3ed81c0f0..bb974549f 100644 --- a/cash-sdk/aggregation-pay/src/main/java/com/czg/third/alipay/AlipayIsvPayManager.java +++ b/cash-sdk/aggregation-pay/src/main/java/com/czg/third/alipay/AlipayIsvPayManager.java @@ -5,12 +5,14 @@ import com.alipay.v3.ApiException; import com.alipay.v3.api.AlipayTradeApi; import com.alipay.v3.model.AlipayTradeCreateModel; import com.alipay.v3.model.AlipayTradeCreateResponseModel; +import com.alipay.v3.model.AlipayTradePayModel; import com.alipay.v3.model.ExtendParams; import com.alipay.v3.util.model.CustomizedParams; import com.czg.PayCst; -import com.czg.dto.req.PayParamsDto; import com.czg.dto.req.RefundParamsDto; import com.czg.exception.CzgException; +import com.czg.pay.CzgPayBaseReq; +import com.czg.pay.NativeMerchantDTO; import com.czg.third.alipay.dto.config.AlipayConfigDto; import lombok.extern.slf4j.Slf4j; @@ -31,23 +33,23 @@ public class AlipayIsvPayManager { * @param configDto 配置 * @param paramsDto 参数 */ - public static Map jsapiPay(AlipayConfigDto configDto, PayParamsDto paramsDto) { + public static Map jsapiPay(AlipayConfigDto configDto, CzgPayBaseReq paramsDto, NativeMerchantDTO merchantDTO) { try { AlipayClient.setApiClient(configDto); AlipayTradeApi api = new AlipayTradeApi(); AlipayTradeCreateModel model = new AlipayTradeCreateModel(); - model.setOutTradeNo(paramsDto.getOrderNo()); + model.setOutTradeNo(paramsDto.getMchOrderNo()); model.setProductCode("JSAPI_PAY"); - model.setOpAppId(paramsDto.getAppId()); - model.setOpBuyerOpenId(paramsDto.getOpenId()); + model.setOpAppId(merchantDTO.getAlipayMerchantId()); + model.setOpBuyerOpenId(paramsDto.getUserId()); model.setTotalAmount(getYuanAmountByFen(paramsDto.getAmount())); - model.setSubject(paramsDto.getTitle()); + model.setSubject(paramsDto.getSubject()); model.setBody(paramsDto.getBody()); model.setNotifyUrl(paramsDto.getNotifyUrl() + "/" + PayCst.Platform.ALIPAY); model.setExtendParams(new ExtendParams()); CustomizedParams customizedParams = new CustomizedParams(); - customizedParams.setAppAuthToken(paramsDto.getAlipayAuthInfo().getAppAuthToken()); + customizedParams.setAppAuthToken(merchantDTO.getAlipayAuthInfo().getAppAuthToken()); AlipayTradeCreateResponseModel responseModel = api.create(model, customizedParams); log.info("支付宝 jsapi 支付结果: {}", responseModel); @@ -69,10 +71,26 @@ public class AlipayIsvPayManager { * @param configDto 配置 * @param paramsDto 参数 */ - public static Map barPay(AlipayConfigDto configDto, PayParamsDto paramsDto) { + public static Map barPay(AlipayConfigDto configDto, CzgPayBaseReq paramsDto, NativeMerchantDTO merchantDTO) { try { AlipayClient.setApiClient(configDto); + // 构造请求参数以调用接口 + AlipayTradeApi api = new AlipayTradeApi(); + AlipayTradePayModel data = new AlipayTradePayModel(); + + data.setOutTradeNo(paramsDto.getMchOrderNo()); + data.setTotalAmount(getYuanAmountByFen(paramsDto.getAmount())); + data.setSubject(paramsDto.getSubject()); + // 设置支付授权码 + data.setAuthCode(merchantDTO.getAlipayAuthInfo().getAppAuthToken()); + // 设置支付场景 + data.setScene("bar_code"); + // 设置产品码 + data.setProductCode("FACE_TO_FACE_PAYMENT"); + data.setAuthCode(paramsDto.getData()); +// AlipayTradeCreateResponseModel responseModel = api.create(data); + return new JSONObject(); // } catch (ApiException e) { // String body = e.getResponseBody(); diff --git a/cash-sdk/aggregation-pay/src/main/java/com/czg/third/wechat/WechatPayManager.java b/cash-sdk/aggregation-pay/src/main/java/com/czg/third/wechat/WechatPayManager.java index a99c698f1..902b10190 100644 --- a/cash-sdk/aggregation-pay/src/main/java/com/czg/third/wechat/WechatPayManager.java +++ b/cash-sdk/aggregation-pay/src/main/java/com/czg/third/wechat/WechatPayManager.java @@ -5,9 +5,10 @@ import cn.hutool.crypto.SecureUtil; import cn.hutool.http.HttpUtil; import com.alibaba.fastjson2.JSONObject; import com.czg.PayCst; -import com.czg.dto.req.PayParamsDto; import com.czg.dto.req.RefundParamsDto; import com.czg.exception.CzgException; +import com.czg.pay.CzgPayBaseReq; +import com.czg.pay.NativeMerchantDTO; import com.czg.third.wechat.dto.config.WechatPayConfigDto; import com.wechat.pay.java.core.Config; import com.wechat.pay.java.core.cipher.Signer; @@ -45,31 +46,31 @@ public class WechatPayManager { * @param configDto 配置 * @param paramsDto 参数 */ - public static Map jsapiPay(WechatPayConfigDto configDto, PayParamsDto paramsDto) { + public static Map jsapiPay(WechatPayConfigDto configDto, CzgPayBaseReq paramsDto, NativeMerchantDTO merchantDTO) { if (configDto == null) { configDto = WechatPayConfigDto.getDefaultConfig(); } try { JSONObject reqData = new JSONObject(); - reqData.put("sp_appid", paramsDto.getAppId()); + reqData.put("sp_appid", paramsDto.getSubAppid()); reqData.put("sp_mchid", configDto.getMerchantId()); - reqData.put("sub_mchid", paramsDto.getMerchantId()); - reqData.put("description", paramsDto.getTitle()); - reqData.put("out_trade_no", paramsDto.getOrderNo()); + reqData.put("sub_mchid", merchantDTO.getWechatMerchantId()); + reqData.put("description", paramsDto.getSubject()); + reqData.put("out_trade_no", paramsDto.getMchOrderNo()); reqData.put("notify_url", paramsDto.getNotifyUrl() + "/" + PayCst.Platform.WECHAT); - reqData.put("attach", paramsDto.getExtData()); + reqData.put("attach", paramsDto.getExtParam()); JSONObject amount = new JSONObject(); amount.put("total", paramsDto.getAmount()); reqData.put("amount", amount); JSONObject payer = new JSONObject(); - payer.put("sp_openid", paramsDto.getOpenId()); + payer.put("sp_openid", paramsDto.getUserId()); reqData.put("payer", payer); String string = WechatReqUtils.postReq(configDto, "/v3/pay/partner/transactions/jsapi", reqData.toJSONString()); - log.info("微信支付请求结果: orderNo = {}, res = {}", paramsDto.getOrderNo(), string); + log.info("微信支付请求结果: orderNo = {}, res = {}", paramsDto.getMchOrderNo(), string); JSONObject object = JSONObject.parseObject(string); @@ -77,23 +78,23 @@ public class WechatPayManager { String nonceStr = NonceUtil.createNonce(32); String packageVal = "prepay_id=" + object.getString("prepay_id"); String message = - paramsDto.getAppId() + "\n" + timestamp + "\n" + nonceStr + "\n" + packageVal + "\n"; + paramsDto.getSubAppid() + "\n" + timestamp + "\n" + nonceStr + "\n" + packageVal + "\n"; Config config = WechatConfig.getRsaConfig(configDto); Signer signer = config.createSigner(); String sign = signer.sign(message).getSign(); JSONObject res = new JSONObject(); - res.put("appId", paramsDto.getAppId()); + res.put("appId", paramsDto.getSubAppid()); res.put("timeStamp", String.valueOf(timestamp)); res.put("nonceStr", nonceStr); res.put("package", packageVal); res.put("signType", "RSA"); res.put("paySign", sign); - log.info("微信支付签名结果: orderNo = {}, res = {}", paramsDto.getOrderNo(), res); + log.info("微信支付签名结果: orderNo = {}, res = {}", paramsDto.getMchOrderNo(), res); return res; } catch (Exception e) { - log.error("微信支付异常: orderNo = {}, e = {}", paramsDto.getOrderNo(), e.getMessage()); + log.error("微信支付异常: orderNo = {}, e = {}", paramsDto.getMchOrderNo(), e.getMessage()); throw new CzgException("微信支付异常"); } } @@ -105,7 +106,7 @@ public class WechatPayManager { * @param configDto 配置 * @param paramsDto 参数 */ - public static Map barPay(WechatPayConfigDto configDto, PayParamsDto paramsDto) { + public static Map barPay(WechatPayConfigDto configDto, CzgPayBaseReq paramsDto, NativeMerchantDTO merchantDTO) { try { if (configDto == null) { configDto = WechatPayConfigDto.getDefaultConfig(); @@ -119,28 +120,28 @@ public class WechatPayManager { // 添加根元素 Element xml = document.addElement("xml"); - addElementIfNotEmpty(xml, "appid", paramsDto.getAppId()); - payMap.put("appid", paramsDto.getAppId()); + addElementIfNotEmpty(xml, "appid", paramsDto.getSubAppid()); + payMap.put("appid", paramsDto.getSubAppid()); addElementIfNotEmpty(xml, "mch_id", configDto.getMerchantId()); payMap.put("mch_id", configDto.getMerchantId()); - addElementIfNotEmpty(xml, "sub_mch_id", paramsDto.getMerchantId()); - payMap.put("sub_mch_id", paramsDto.getMerchantId()); + addElementIfNotEmpty(xml, "sub_mch_id", merchantDTO.getWechatMerchantId()); + payMap.put("sub_mch_id", merchantDTO.getWechatMerchantId()); addElementIfNotEmpty(xml, "nonce_str", nonceStr); payMap.put("nonce_str", nonceStr); - addElementIfNotEmpty(xml, "body", paramsDto.getTitle()); - payMap.put("body", paramsDto.getTitle()); - addElementIfNotEmpty(xml, "out_trade_no", paramsDto.getOrderNo()); - payMap.put("out_trade_no", paramsDto.getOrderNo()); + addElementIfNotEmpty(xml, "body", paramsDto.getSubject()); + payMap.put("body", paramsDto.getSubject()); + addElementIfNotEmpty(xml, "out_trade_no", paramsDto.getMchOrderNo()); + payMap.put("out_trade_no", paramsDto.getMchOrderNo()); addElementIfNotEmpty(xml, "total_fee", paramsDto.getAmount()); payMap.put("total_fee", paramsDto.getAmount()); addElementIfNotEmpty(xml, "spbill_create_ip", paramsDto.getClientIp()); payMap.put("spbill_create_ip", paramsDto.getClientIp()); - addElementIfNotEmpty(xml, "auth_code", paramsDto.getBarCode()); - payMap.put("auth_code", paramsDto.getBarCode()); + addElementIfNotEmpty(xml, "auth_code", paramsDto.getData()); + payMap.put("auth_code", paramsDto.getData()); - if (StrUtil.isNotBlank(paramsDto.getExtData())) { - addElementIfNotEmpty(xml, "attach", paramsDto.getExtData()); - payMap.put("attach", paramsDto.getExtData()); + if (StrUtil.isNotBlank(paramsDto.getExtParam())) { + addElementIfNotEmpty(xml, "attach", paramsDto.getExtParam()); + payMap.put("attach", paramsDto.getExtParam()); } String sign = signBarPayParam(configDto, payMap); @@ -154,10 +155,10 @@ public class WechatPayManager { log.info("微信条码支付参数:{}", xmlStr); String post = HttpUtil.post(BAR_PAY_URL, xmlStr); - log.info("微信条码支付请求结果: orderNo = {}, res = {}", paramsDto.getOrderNo(), post); + log.info("微信条码支付请求结果: orderNo = {}, res = {}", paramsDto.getMchOrderNo(), post); JSONObject res = new JSONObject(); - res.put("orderNo", paramsDto.getOrderNo()); + res.put("orderNo", paramsDto.getMchOrderNo()); SAXReader saxReader = new SAXReader(); Document read = saxReader.read(stringToInputStream(post)); @@ -171,7 +172,7 @@ public class WechatPayManager { if (StrUtil.isNotBlank(errCode)) { if ("SYSTEMERROR".equals(errCode) || "BANKERROR".equals(errCode) || "USERPAYING".equals(errCode)) { // 等待结果 - log.info("微信条码支付等待结果: orderNo = {}, err {}", paramsDto.getOrderNo(), errCodeDes); + log.info("微信条码支付等待结果: orderNo = {}, err {}", paramsDto.getMchOrderNo(), errCodeDes); res.put("status", "TRADE_AWAIT"); return res; } @@ -181,19 +182,19 @@ public class WechatPayManager { } if (!PAY_SUCCESS.equals(returnCode)) { - log.error("微信条码支付失败: orderNo = {}, msg = {}", paramsDto.getOrderNo(), rootElement.elementText("return_msg")); + log.error("微信条码支付失败: orderNo = {}, msg = {}", paramsDto.getMchOrderNo(), rootElement.elementText("return_msg")); res.put("status", "TRADE_FAIL"); return res; } // 支付成功 - log.info("微信条码支付成功: orderNo = {}, msg = {}", paramsDto.getOrderNo(), rootElement.elementText("return_msg")); + log.info("微信条码支付成功: orderNo = {}, msg = {}", paramsDto.getMchOrderNo(), rootElement.elementText("return_msg")); res.put("status", "TRADE_SUCCESS"); return res; } catch (CzgException e) { throw e; } catch (Exception e) { - log.error("微信条码支付异常: orderNo = {}, e = {}", paramsDto.getOrderNo(), e.getMessage()); + log.error("微信条码支付异常: orderNo = {}, e = {}", paramsDto.getMchOrderNo(), e.getMessage()); throw new CzgException("微信支付异常"); } } diff --git a/cash-service/pay-service/src/main/java/com/czg/impl/NativePayAdapter.java b/cash-service/pay-service/src/main/java/com/czg/impl/NativePayAdapter.java index 69da6a484..6435e759c 100644 --- a/cash-service/pay-service/src/main/java/com/czg/impl/NativePayAdapter.java +++ b/cash-service/pay-service/src/main/java/com/czg/impl/NativePayAdapter.java @@ -2,6 +2,7 @@ package com.czg.impl; import com.alibaba.fastjson2.JSONObject; import com.czg.PayAdapter; +import com.czg.PayManager; import com.czg.constant.PayChannelCst; import com.czg.entity.resp.CzgBaseResp; import com.czg.entity.resp.CzgRefundResp; @@ -11,6 +12,7 @@ import com.czg.pay.CzgPayBaseReq; import com.czg.pay.CzgRefundReq; import com.czg.pay.NativeMerchantDTO; import com.czg.resp.CzgResult; +import jakarta.validation.constraints.NotBlank; import lombok.NonNull; import lombok.extern.slf4j.Slf4j; @@ -38,15 +40,15 @@ public class NativePayAdapter implements PayAdapter { switch (payType) { // case H5_PAY: // return h5Pay(polyMerchantDTO, domain, notifyUrl, bizData); -// case JS_PAY: -// return jsPay(polyMerchantDTO, domain, notifyUrl, bizData); -// case LT_PAY: -// return ltPay(polyMerchantDTO, domain, notifyUrl, bizData); + case JS_PAY: + return jsPay(polyMerchantDTO, notifyUrl, bizData); + case LT_PAY: + return jsPay(polyMerchantDTO, notifyUrl, bizData); // case SCAN_PAY: // return scanPay(polyMerchantDTO, domain, notifyUrl, bizData); -// case MICRO_PAY: -// //扫码支付 扫描码 -// return microPay(polyMerchantDTO, domain, notifyUrl, (CzgPayBaseReq) bizData); + case MICRO_PAY: + //扫码支付 扫描码 + return barPay(polyMerchantDTO, notifyUrl, (CzgPayBaseReq) bizData); default: throw new CzgException("原生支付不支持该支付方式: " + bizData.getPayType()); } @@ -70,4 +72,14 @@ public class NativePayAdapter implements PayAdapter { public CzgResult queryRefund(String domain, String payData, String mchRefundNo, String refundOrderId) { return null; } + + private CzgResult> jsPay(NativeMerchantDTO merchantDTO, String notifyUrl, CzgPayBaseReq bizData) { + bizData.setNotifyUrl(notifyUrl); + return CzgResult.success(PayManager.jsapiPay(bizData, merchantDTO)); + } + + private CzgResult> barPay(NativeMerchantDTO merchantDTO, String notifyUrl, CzgPayBaseReq bizData) { + bizData.setNotifyUrl(notifyUrl); + return CzgResult.success(PayManager.barPay(bizData, merchantDTO)); + } }