From a096f565e19b41558334935cc56b61af9582d1a4 Mon Sep 17 00:00:00 2001 From: 777 <123@qwe.com> Date: Thu, 16 Jan 2025 17:05:08 +0800 Subject: [PATCH] 33333333333 --- .../com/ruoyi/cai/trdpay/TrdPayTypeEnum.java | 10 ++ .../cai/trdpay/handle/PayTrdV5Service.java | 2 +- .../cai/trdpay/handle/PayTrdV9Service.java | 106 ++++++++++++++++++ .../com/ruoyi/cai/util/RestTemplateUtil.java | 12 ++ 4 files changed, 129 insertions(+), 1 deletion(-) create mode 100644 ruoyi-cai/src/main/java/com/ruoyi/cai/trdpay/handle/PayTrdV9Service.java diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/trdpay/TrdPayTypeEnum.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/trdpay/TrdPayTypeEnum.java index b7a3420a..ae920b11 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/trdpay/TrdPayTypeEnum.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/trdpay/TrdPayTypeEnum.java @@ -91,6 +91,16 @@ public enum TrdPayTypeEnum { * https://31.bghyvwk.cn */ V8("https://31.bghyvwk.cn","/mapi.php","/api/pay/query","/api/pay/trd/notify/v8","success"), + /** + * API设置 + * API对接参数: + * 商户号:250207611 + * 网关地址:https://api.pay.wangwang888.cloud/Pay_Index.html + * 商户APIKEY:jmc1ge7ldzyt18kd3vtigovb8m5vfwge + * 989 支付宝 934 微信 + */ + V9("https://api.pay.wangwang888.cloud","/Pay_Index.html","/Pay_Trade_query.html","/api/pay/trd/notify/v9","OK"), + ; private final String gatewayUrl; private final String createOrderUrl; diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/trdpay/handle/PayTrdV5Service.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/trdpay/handle/PayTrdV5Service.java index 2c4b8c86..7e996f09 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/trdpay/handle/PayTrdV5Service.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/trdpay/handle/PayTrdV5Service.java @@ -79,7 +79,7 @@ public class PayTrdV5Service implements PayTrdService { boolean success = checkSuccess(jsonObject); orderLogsService.createAliPayLogs(payOrderInfoDTO.getOrderNo(), createOrderUrl+JSON.toJSONString(map), jsonObject, success, type); if(!success){ - log.info("第三方支付失败 V7 统一支付失败失败 url={} params={} body={}, payTrdConfig={}, typeEnum={}", createOrderUrl,JSON.toJSONString(map), body, JSON.toJSONString(payTrdConfig), JSON.toJSONString(jsonObject)); + log.info("第三方支付失败 V5 统一支付失败失败 url={} params={} body={}, payTrdConfig={}, typeEnum={}", createOrderUrl,JSON.toJSONString(map), body, JSON.toJSONString(payTrdConfig), JSON.toJSONString(jsonObject)); throw new ServiceException("调用支付失败"); } String payUrl = jsonObject.getString("h5_url"); diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/trdpay/handle/PayTrdV9Service.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/trdpay/handle/PayTrdV9Service.java new file mode 100644 index 00000000..c0730ddc --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/trdpay/handle/PayTrdV9Service.java @@ -0,0 +1,106 @@ +package com.ruoyi.cai.trdpay.handle; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.ruoyi.cai.domain.PayTrdConfig; +import com.ruoyi.cai.pay.PayManager; +import com.ruoyi.cai.pay.PayOrderInfoDTO; +import com.ruoyi.cai.pay.PayReturnResp; +import com.ruoyi.cai.service.OrderLogsService; +import com.ruoyi.cai.trdpay.PayMd5Util; +import com.ruoyi.cai.trdpay.PayTrdService; +import com.ruoyi.cai.trdpay.TrdPayTypeEnum; +import com.ruoyi.cai.trdpay.dto.NotifyResp; +import com.ruoyi.cai.util.RestTemplateUtil; +import com.ruoyi.common.exception.ServiceException; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.MultiValueMap; +import org.springframework.web.client.RestTemplate; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.HashMap; +import java.util.Map; + +@Service +@Slf4j +public class PayTrdV9Service implements PayTrdService { + + @Autowired + private OrderLogsService orderLogsService; + @Autowired + private PayManager payManager; + + @Override + public TrdPayTypeEnum getType() { + return TrdPayTypeEnum.V9; + } + + @Override + public PayReturnResp createOrderAli(PayOrderInfoDTO payOrderInfoDTO, PayTrdConfig payTrdConfig) { + TrdPayTypeEnum type = getType(); + RestTemplate rest = RestTemplateUtil.getRest(); + Map params = new HashMap<>(); + params.put("pay_memberid", payTrdConfig.getMchId()); + params.put("pay_orderid", payOrderInfoDTO.getOrderNo()); + params.put("pay_applydate", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); + params.put("pay_bankcode", payTrdConfig.getAliProductId()); + String notifyUrl = payTrdConfig.getNotifyUrl() + type.getNotifyPath(); + params.put("pay_notifyurl", notifyUrl); + params.put("pay_amount", payOrderInfoDTO.getPriceYuanStr()); + MultiValueMap map = PayMd5Util.createParamsOfMap(params, payTrdConfig.getSign(), "pay_md5sign"); + map.add("pay_productname",payOrderInfoDTO.getBody()); + String gatewayUrl = type.getGatewayUrl(); + if (StringUtils.isNotBlank(payTrdConfig.getGatewayUrl())) { + gatewayUrl = payTrdConfig.getGatewayUrl(); + } + String createOrderUrl = gatewayUrl + type.getCreateOrderUrl(); + String body = RestTemplateUtil.postFormData(rest, createOrderUrl, map); + JSONObject jsonObject = JSON.parseObject(body); + boolean success = checkSuccess(jsonObject); + orderLogsService.createAliPayLogs(payOrderInfoDTO.getOrderNo(), createOrderUrl+JSON.toJSONString(map), jsonObject, success, type); + if(!success){ + log.info("第三方支付失败 V9 统一支付失败失败 url={} params={} body={}, payTrdConfig={}, typeEnum={}", createOrderUrl,JSON.toJSONString(map), body, JSON.toJSONString(payTrdConfig), JSON.toJSONString(jsonObject)); + throw new ServiceException("调用支付失败"); + } + String payUrl = jsonObject.getString("h5_url"); + return PayReturnResp.createH5(payUrl); + } + private boolean checkSuccess(JSONObject jsonObject) { + if(jsonObject == null){ + return false; + } + if(!"success".equals(jsonObject.getString("status"))){ + return false; + } + return true; + } + + @Override + public NotifyResp getNotifyResp(Map sourceData) { + String mchOrderNo = sourceData.get("orderid"); + String payOrderId = sourceData.get("transaction_id"); + String status = sourceData.get("returncode"); + NotifyResp resp = new NotifyResp(); + resp.setOrderNo(mchOrderNo); + resp.setTrdOrderNo(payOrderId); + resp.setPayTypeEnum(getType()); + resp.setSourceData(sourceData); + resp.setSuccess("00".equals(status)); + return resp; + } + + @Override + public JSONObject queryOrder(String orderNo, PayTrdConfig payTrdConfig) { + throw new ServiceException("V9不支持订单查询"); + } + + @Override + public JSONObject resetOrder(String orderNo, PayTrdConfig payTrdConfig, boolean updateData) { + throw new ServiceException("V9不支持订单查询"); + } + +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/util/RestTemplateUtil.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/util/RestTemplateUtil.java index f0c7b6cc..58be5f92 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/util/RestTemplateUtil.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/util/RestTemplateUtil.java @@ -1,11 +1,15 @@ package com.ruoyi.cai.util; import org.apache.http.impl.client.CloseableHttpClient; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; import org.springframework.http.client.BufferingClientHttpRequestFactory; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.http.client.SimpleClientHttpRequestFactory; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.StringHttpMessageConverter; +import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestTemplate; import java.nio.charset.StandardCharsets; @@ -59,4 +63,12 @@ public class RestTemplateUtil { public static RestTemplate getNoSSLRest(){ return NO_SSL_REST_TEMPLATE; } + + + public static String postFormData(RestTemplate restTemplate, String url, MultiValueMap map) { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); + HttpEntity> request = new HttpEntity<>(map, headers); + return restTemplate.postForObject(url, request, String.class); + } }