From b3cb6ca882d5ff0c36ab08503f33c029778563af Mon Sep 17 00:00:00 2001 From: 777 <123@qwe.com> Date: Mon, 24 Feb 2025 15:44:45 +0800 Subject: [PATCH] 33333333333 --- .../com/ruoyi/cai/trdpay/TrdPayTypeEnum.java | 13 ++ .../cai/trdpay/handle/PayTrdV11Service.java | 142 ++++++++++++++++++ 2 files changed, 155 insertions(+) create mode 100644 ruoyi-cai/src/main/java/com/ruoyi/cai/trdpay/handle/PayTrdV11Service.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 a06d96a3..4c5c9192 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 @@ -115,6 +115,19 @@ public enum TrdPayTypeEnum { * pay_type=json */ V10("https://20.255.61.130","/Pay_Index.html","/Pay_Trade_query.html","/api/pay/trd/notify/v10","OK"), + /** + * 下单网关:http://bgxa.peiqi.zhifusg.com/Pay_Index.html + * 查询网关:http://bgxa.peiqi.zhifusg.com/Pay_Trade_query.html + * 商户登录地址:http://bgxa.peiqi.zhifusg.com/user.html + * 用户名:花花 + * 密码和登录密码默认:123456 + * 回调IP:8.217.105.159 + * 商务号:250290627 + * 秘钥:y9cjdifyvoxbrnzbmj5qxc5ck58llx2y + * 对接文档:http://bgxa.peiqi.zhifusg.com/api.pdf + * 支付宝 8 微信 4 + */ + V11("http://bgxa.peiqi.zhifusg.com","/Pay_Index.html","/Pay_Trade_query.html","/api/pay/trd/notify/v10","OK"), ; private final String gatewayUrl; diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/trdpay/handle/PayTrdV11Service.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/trdpay/handle/PayTrdV11Service.java new file mode 100644 index 00000000..641f1eae --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/trdpay/handle/PayTrdV11Service.java @@ -0,0 +1,142 @@ +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 com.ruoyi.common.helper.LoginHelper; +import com.ruoyi.common.utils.ServletUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +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 PayTrdV11Service implements PayTrdService { + + @Autowired + private OrderLogsService orderLogsService; + @Autowired + private PayManager payManager; + + @Override + public TrdPayTypeEnum getType() { + return TrdPayTypeEnum.V11; + } + + @Override + public PayReturnResp createOrderAli(PayOrderInfoDTO payOrderInfoDTO, PayTrdConfig payTrdConfig,boolean wx) { + TrdPayTypeEnum type = getType(); + RestTemplate rest = RestTemplateUtil.getNoSSLRest(); + 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.getProductId(wx)); + String notifyUrl = type.getNotifyUrl(payTrdConfig.getNotifyUrl(), wx); + 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()); + map.add("pay_ip", ServletUtils.getClientIP()); + map.add("pay_userid", LoginHelper.getUserId()+""); + map.add("pay_type", "json"); + String gatewayUrl = getGatewayUrl(payTrdConfig); + String createOrderUrl = gatewayUrl + type.getCreateOrderUrl(); + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); + HttpEntity> request = new HttpEntity<>(map, headers); + String body = rest.postForObject(createOrderUrl, request, String.class); + JSONObject jsonObject = JSON.parseObject(body); + boolean success = checkSuccess(jsonObject); + orderLogsService.createAliPayLogs(payOrderInfoDTO.getOrderNo(), createOrderUrl+JSON.toJSONString(map), jsonObject, success, type, getStepName(wx)); + if(!success){ + log.info("第三方支付失败 V11 统一支付失败失败 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(!"1".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) { + RestTemplate rest = RestTemplateUtil.getRest(); + TrdPayTypeEnum type = getType(); + Map params = new HashMap<>(); + params.put("pay_memberid", payTrdConfig.getMchId()); + params.put("pay_orderid", orderNo); + MultiValueMap map = PayMd5Util.createParamsOfMap(params, payTrdConfig.getSign(), "pay_md5sign"); + String gatewayUrl = getGatewayUrl(payTrdConfig); + String queryOrderUrl = gatewayUrl + type.getQueryOrderUrl(); + String body = RestTemplateUtil.postFormData(rest, queryOrderUrl, map); + JSONObject jsonObject = JSON.parseObject(body); + if(jsonObject == null){ + log.error("第三方支付查询失败 返回数据为空 URL={} query={}",queryOrderUrl,JSON.toJSONString(map)); + throw new ServiceException("调用支付失败"); + } + log.info("第三方支付查询成功 V11 URL={}, query={}, body={}",queryOrderUrl,JSON.toJSONString(map), body); + return jsonObject; + } + + @Override + public JSONObject resetOrder(String orderNo, PayTrdConfig payTrdConfig, boolean updateData) { + JSONObject jsonObject = this.queryOrder(orderNo,payTrdConfig); + if(!"00".equals(jsonObject.getString("returncode"))){ + log.info("第三方支付失败 V11统一支付查询订单失败 orderNo={}, payTrdConfig={}", orderNo, JSON.toJSONString(payTrdConfig)); + throw new ServiceException("V11统一支付查询订单失败"); + } + String status = jsonObject.getString("trade_state"); + if("SUCCESS".equals(status)){ + if(updateData){ + Map params = new HashMap<>(); + params.put("str", "主动查询出来的结果"); + params.put("data", JSON.toJSONString(jsonObject)); + payManager.callBack(orderNo,null,params,"V11", null); + } + } + return jsonObject; + } + +}