浏览代码

feat:"增加推送东南亚支付配置功能,支付回调接口"

soobin 1 月之前
父节点
当前提交
12f3b7dcd3

+ 1 - 1
src/main/java/com/szwl/constant/OperationType.java

@@ -17,7 +17,7 @@ public enum OperationType implements IEnum<String> {
     UPDATE_GOODS_NAME("updateGoodsName","修改商品名称"),
     ELIMINATE("eliminate","消除屏幕报警"),
     VOLUME("volume","修改音量"),
-    PAY_ORDER("PAY_ORDER", "支付订单");
+    OPEN_PAY_INFO("openPayInfo", "东南亚支付配置"),;
 
     private String code;
 

+ 54 - 0
src/main/java/com/szwl/controller/CallbackController.java

@@ -9,9 +9,13 @@ import com.fasterxml.jackson.databind.node.JsonNodeFactory;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.szwl.constant.HuifuConstant;
 import com.szwl.constant.JoinpayConstant;
+import com.szwl.model.bo.R;
+import com.szwl.model.bo.ResponseModel;
+import com.szwl.model.entity.OpenPayOrder;
 import com.szwl.model.entity.TJoinpayMch;
 import com.szwl.model.entity.WithdrawalRecord;
 import com.szwl.model.utils.RSAUtil;
+import com.szwl.service.OpenPayOrderService;
 import com.szwl.service.TJoinpayMchService;
 import com.szwl.service.WithdrawalRecordService;
 import io.swagger.annotations.ApiOperation;
@@ -20,6 +24,8 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.Date;
 import java.util.Map;
 
@@ -42,6 +48,9 @@ public class CallbackController {
     @Autowired
     private TJoinpayMchService joinpayMchService;
 
+    @Autowired
+    private OpenPayOrderService openPayOrderService;
+
     @ApiOperation("汇聚提现回调")
     @PostMapping("/withdrawJoinPay")
     public Object withdrawJoinPay(@RequestBody Map<String, Object> rawData) {
@@ -154,4 +163,49 @@ public class CallbackController {
         return jsonNodes;
     }
 
+    @ApiOperation("openPay支付回调")
+    @PostMapping("/openPay")
+    public ResponseModel<?> openPay(@RequestBody Map<String, Object> rawData) {
+        try {
+            log.info("openPay支付回调参数,rawData={}", rawData);
+            String businessNumber = (String) rawData.get("business_number");
+            String transactionNumber = (String) rawData.get("transaction_number");
+            String productNumber = (String) rawData.get("product_number");
+            String productAbilityCode = (String) rawData.get("product_ability_code");
+            String outTradeNumber = (String) rawData.get("out_trade_number");
+            Double paymentAmount = (Double) rawData.get("payment_amount");
+            String paymentState = (String) rawData.get("payment_state");
+            String transactionCompletedAt = (String) rawData.get("transaction_completed_at");
+            String clientId = (String) rawData.get("notification_callback");
+
+            LambdaQueryWrapper<OpenPayOrder> query = Wrappers.lambdaQuery();
+            query.eq(OpenPayOrder::getOutTradeNumber, outTradeNumber);
+            OpenPayOrder openPayOrder = openPayOrderService.getOne(query);
+            if (openPayOrder != null) {
+                openPayOrder.setModifyDate(new Date());
+                openPayOrder.setTransactionCompletedAt(transactionCompletedAt);
+                openPayOrder.setPaymentState(paymentState);
+                openPayOrderService.updateById(openPayOrder);
+            } else {
+                openPayOrder = new OpenPayOrder();
+                openPayOrder.setCreateDate(new Date());
+                openPayOrder.setModifyDate(new Date());
+                openPayOrder.setClientId(clientId);
+                openPayOrder.setBusinessNumber(businessNumber);
+                openPayOrder.setTransactionNumber(transactionNumber);
+                openPayOrder.setProductNumber(productNumber);
+                openPayOrder.setProductAbilityCode(productAbilityCode);
+                openPayOrder.setOutTradeNumber(outTradeNumber);
+                openPayOrder.setPaymentAmount(new BigDecimal(paymentAmount).setScale(2, RoundingMode.HALF_UP));
+                openPayOrder.setPaymentState(paymentState);
+                openPayOrder.setTransactionCompletedAt(transactionCompletedAt);
+                openPayOrderService.save(openPayOrder);
+            }
+            return R.ok();
+        } catch (Exception e) {
+            log.error("openPay支付回调异常,参数,rawData={}", rawData, e);
+        }
+        return R.fail("openPay支付回调异常");
+    }
+
 }

+ 80 - 0
src/main/java/com/szwl/controller/OpenPayInfoController.java

@@ -0,0 +1,80 @@
+package com.szwl.controller;
+
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.szwl.constant.OperationType;
+import com.szwl.constant.ResponseCodesEnum;
+import com.szwl.exception.BizException;
+import com.szwl.manager.TokenManager;
+import com.szwl.model.bo.R;
+import com.szwl.model.bo.ResponseModel;
+import com.szwl.model.bo.UserDetailBO;
+import com.szwl.model.entity.OpenPayInfo;
+import com.szwl.model.utils.PushUtils;
+import com.szwl.service.OpenPayInfoService;
+import com.szwl.service.TEquipmentService;
+import io.swagger.annotations.ApiOperation;
+import org.json.JSONObject;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Optional;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author wuhs
+ * @since 2025-06-25
+ */
+@RestController
+@RequestMapping("/openPayInfo")
+public class OpenPayInfoController {
+
+    @Autowired
+    private OpenPayInfoService openPayInfoService;
+
+    @Autowired
+    private TEquipmentService equipmentService;
+
+    @Autowired
+    TokenManager tokenManager;
+
+    @ApiOperation("推送支付配置")
+    @PostMapping("/pushPayInfo")
+    public ResponseModel<?> pushPayInfo(@RequestBody OpenPayInfo openPayInfo) {
+        UserDetailBO userDetailBO = Optional.ofNullable(tokenManager.getLoginUserDetails())
+                .orElseThrow(() -> new BizException(ResponseCodesEnum.L0001));
+        Long adminId = userDetailBO.getId();
+        String clientId = openPayInfo.getClientId();
+        String merchantId = openPayInfo.getMerchantId();
+        String secretCode = openPayInfo.getSecretCode();
+        String areaCode = openPayInfo.getAreaCode();
+        String productAbilityCode = openPayInfo.getProductAbilityCode();
+        // 创建OpenPayInfo
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("merchantId", merchantId);
+        jsonObject.put("secretCode", secretCode);
+        jsonObject.put("areaCode", areaCode);
+        jsonObject.put("productAbilityCode", productAbilityCode);
+        String kindData = JSON.toJSONString(jsonObject);
+        // 推送
+        String message = PushUtils.buildJson(OperationType.OPEN_PAY_INFO.getCode(), kindData).toString();
+        equipmentService.sendRemoteMessage(clientId, OperationType.OPEN_PAY_INFO, message, adminId);
+        return R.ok();
+    }
+
+    @ApiOperation("获取支付配置")
+    @RequestMapping("/getPayConfig")
+    public ResponseModel<?> getPayConfig(String clientId) {
+        LambdaQueryWrapper<OpenPayInfo> query = Wrappers.lambdaQuery();
+        query.eq(OpenPayInfo::getClientId, clientId);
+        OpenPayInfo openPayInfo = openPayInfoService.getOne(query);
+        return R.ok(openPayInfo);
+    }
+
+}
+

+ 21 - 0
src/main/java/com/szwl/controller/OpenPayOrderController.java

@@ -0,0 +1,21 @@
+package com.szwl.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author wuhs
+ * @since 2025-06-26
+ */
+@RestController
+@RequestMapping("/openPayOrder")
+public class OpenPayOrderController {
+
+}
+

+ 58 - 0
src/main/java/com/szwl/handle/response/OpenPayInfoProcessor.java

@@ -0,0 +1,58 @@
+package com.szwl.handle.response;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.szwl.constant.OperationType;
+import com.szwl.model.entity.MessageLog;
+import com.szwl.model.entity.OpenPayInfo;
+import com.szwl.service.OpenPayInfoService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.Date;
+
+@Slf4j
+@Component
+public class OpenPayInfoProcessor implements ResponseProcessor{
+
+    @Resource
+    private OpenPayInfoService openPayInfoService;
+
+    @Override
+    public void process(MessageLog messageLog) {
+        try {
+            Integer statusCode = messageLog.getStatusCode();
+            if (statusCode == 200) {
+                String clientId = messageLog.getClientId();
+                String responseContent = messageLog.getResponseContent();
+                // 转换为对象
+                OpenPayInfo payInfo = JSON.parseObject(responseContent, OpenPayInfo.class);
+                LambdaQueryWrapper<OpenPayInfo> query = Wrappers.lambdaQuery();
+                query.eq(OpenPayInfo::getClientId, clientId);
+                OpenPayInfo openPayInfo = openPayInfoService.getOne(query);
+                if (openPayInfo != null) {
+                    openPayInfo.setModifyDate(new Date());
+                    openPayInfo.setMerchantId(payInfo.getMerchantId());
+                    openPayInfo.setSecretCode(payInfo.getSecretCode());
+                    openPayInfo.setProductAbilityCode(payInfo.getProductAbilityCode());
+                    openPayInfo.setAreaCode(payInfo.getAreaCode());
+                    openPayInfoService.updateById(openPayInfo);
+                } else {
+                    payInfo.setCreateDate(new Date());
+                    payInfo.setModifyDate(new Date());
+                    payInfo.setClientId(clientId);
+                    openPayInfoService.save(payInfo);
+                }
+            }
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    @Override
+    public String getSupportedOperationType() {
+        return OperationType.OPEN_PAY_INFO.getCode();
+    }
+}

+ 16 - 0
src/main/java/com/szwl/mapper/OpenPayInfoMapper.java

@@ -0,0 +1,16 @@
+package com.szwl.mapper;
+
+import com.szwl.model.entity.OpenPayInfo;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author wuhs
+ * @since 2025-06-25
+ */
+public interface OpenPayInfoMapper extends BaseMapper<OpenPayInfo> {
+
+}

+ 16 - 0
src/main/java/com/szwl/mapper/OpenPayOrderMapper.java

@@ -0,0 +1,16 @@
+package com.szwl.mapper;
+
+import com.szwl.model.entity.OpenPayOrder;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author wuhs
+ * @since 2025-06-26
+ */
+public interface OpenPayOrderMapper extends BaseMapper<OpenPayOrder> {
+
+}

+ 22 - 0
src/main/java/com/szwl/mapper/xml/OpenPayInfoMapper.xml

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.szwl.mapper.OpenPayInfoMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.szwl.model.entity.OpenPayInfo">
+        <id column="id" property="id" />
+        <result column="create_date" property="createDate" />
+        <result column="modify_date" property="modifyDate" />
+        <result column="client_id" property="clientId" />
+        <result column="merchant_id" property="merchantId" />
+        <result column="secret_code" property="secretCode" />
+        <result column="product_ability_code" property="productAbilityCode" />
+        <result column="area_code" property="areaCode" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, create_date, modify_date, client_id, merchant_id, secret_code, product_ability_code, area_code
+    </sql>
+
+</mapper>

+ 26 - 0
src/main/java/com/szwl/mapper/xml/OpenPayOrderMapper.xml

@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.szwl.mapper.OpenPayOrderMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.szwl.model.entity.OpenPayOrder">
+        <id column="id" property="id" />
+        <result column="create_date" property="createDate" />
+        <result column="modify_date" property="modifyDate" />
+        <result column="client_id" property="clientId" />
+        <result column="business_number" property="businessNumber" />
+        <result column="transaction_number" property="transactionNumber" />
+        <result column="product_number" property="productNumber" />
+        <result column="product_ability_code" property="productAbilityCode" />
+        <result column="out_trade_number" property="outTradeNumber" />
+        <result column="payment_amount" property="paymentAmount" />
+        <result column="payment_state" property="paymentState" />
+        <result column="transaction_completed_at" property="transactionCompletedAt" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, create_date, modify_date, client_id, business_number, transaction_number, product_number, product_ability_code, out_trade_number, payment_amount, payment_state, transaction_completed_at
+    </sql>
+
+</mapper>

+ 52 - 0
src/main/java/com/szwl/model/entity/OpenPayInfo.java

@@ -0,0 +1,52 @@
+package com.szwl.model.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.io.Serializable;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author wuhs
+ * @since 2025-06-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="OpenPayInfo对象", description="")
+public class OpenPayInfo implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty(value = "创建时间")
+    private Date createDate;
+
+    @ApiModelProperty(value = "修改时间")
+    private Date modifyDate;
+
+    @ApiModelProperty(value = "设备编号")
+    private String clientId;
+
+    @ApiModelProperty(value = "商户ID")
+    private String merchantId;
+
+    @ApiModelProperty(value = "商户密钥")
+    private String secretCode;
+
+    @ApiModelProperty(value = "产品代码")
+    private String productAbilityCode;
+
+    @ApiModelProperty(value = "区域代码")
+    private String areaCode;
+
+
+}

+ 65 - 0
src/main/java/com/szwl/model/entity/OpenPayOrder.java

@@ -0,0 +1,65 @@
+package com.szwl.model.entity;
+
+import java.math.BigDecimal;
+import com.baomidou.mybatisplus.annotation.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.io.Serializable;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author wuhs
+ * @since 2025-06-26
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="OpenPayOrder对象", description="")
+public class OpenPayOrder implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty(value = "创建时间")
+    private Date createDate;
+
+    @ApiModelProperty(value = "修改时间")
+    private Date modifyDate;
+
+    @ApiModelProperty(value = "设备编号")
+    private String clientId;
+
+    @ApiModelProperty(value = "平台业务编号")
+    private String businessNumber;
+
+    @ApiModelProperty(value = "平台交易编号")
+    private String transactionNumber;
+
+    @ApiModelProperty(value = "产品编号")
+    private String productNumber;
+
+    @ApiModelProperty(value = "产品代码")
+    private String productAbilityCode;
+
+    @ApiModelProperty(value = "订单编号")
+    private String outTradeNumber;
+
+    @ApiModelProperty(value = "交易金额")
+    private BigDecimal paymentAmount;
+
+    @ApiModelProperty(value = "交易状态")
+    private String paymentState;
+
+    @ApiModelProperty(value = "交易完成时间,时区:UTC+0")
+    private String transactionCompletedAt;
+
+
+}

+ 16 - 0
src/main/java/com/szwl/service/OpenPayInfoService.java

@@ -0,0 +1,16 @@
+package com.szwl.service;
+
+import com.szwl.model.entity.OpenPayInfo;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author wuhs
+ * @since 2025-06-25
+ */
+public interface OpenPayInfoService extends IService<OpenPayInfo> {
+
+}

+ 16 - 0
src/main/java/com/szwl/service/OpenPayOrderService.java

@@ -0,0 +1,16 @@
+package com.szwl.service;
+
+import com.szwl.model.entity.OpenPayOrder;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author wuhs
+ * @since 2025-06-26
+ */
+public interface OpenPayOrderService extends IService<OpenPayOrder> {
+
+}

+ 20 - 0
src/main/java/com/szwl/service/impl/OpenPayInfoServiceImpl.java

@@ -0,0 +1,20 @@
+package com.szwl.service.impl;
+
+import com.szwl.model.entity.OpenPayInfo;
+import com.szwl.mapper.OpenPayInfoMapper;
+import com.szwl.service.OpenPayInfoService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author wuhs
+ * @since 2025-06-25
+ */
+@Service
+public class OpenPayInfoServiceImpl extends ServiceImpl<OpenPayInfoMapper, OpenPayInfo> implements OpenPayInfoService {
+
+}

+ 20 - 0
src/main/java/com/szwl/service/impl/OpenPayOrderServiceImpl.java

@@ -0,0 +1,20 @@
+package com.szwl.service.impl;
+
+import com.szwl.model.entity.OpenPayOrder;
+import com.szwl.mapper.OpenPayOrderMapper;
+import com.szwl.service.OpenPayOrderService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author wuhs
+ * @since 2025-06-26
+ */
+@Service
+public class OpenPayOrderServiceImpl extends ServiceImpl<OpenPayOrderMapper, OpenPayOrder> implements OpenPayOrderService {
+
+}