From 44b8fb1cec053b99b3dbccd66cd62723c37fb243 Mon Sep 17 00:00:00 2001
From: Administrator <zhubaomin>
Date: 星期四, 07 三月 2024 10:49:14 +0800
Subject: [PATCH] 2024-03-07 朱宝民 虚拟卡注册接口、充值方法与微信支付整合、获取水卡列表接口优化

---
 pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/virtualCard/VirtualCardCtrl.java         |   74 +
 pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/config/RestTemplateWechatCertConfig.java |    8 
 pipIrr-platform/pipIrr-web/pipIrr-web-sell/pom.xml                                                                  |    9 
 pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/config/RestTemplateConfig.java           |   10 
 pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/dto/RefundRequest.java         |   70 +
 pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeVcRechargeMapper.java                       |   34 
 pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeVcRechargeMapper.xml                                      |  171 ++++
 pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wallet/WalletCtrl.java                   |    2 
 pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoSe/SeVirtualCard.java                           |   76 +
 pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/client/ClientCtrl.java                   |    2 
 pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/virtualCard/enums/OrderStateENUM.java    |   21 
 pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/dto/Code2Session.java          |    6 
 pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeClientCardMapper.xml                                      |    2 
 pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/dto/RefundResponse.java        |  114 ++
 pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/virtualCard/enums/LastOperateENUM.java   |   24 
 pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/dto/DtoOrder.java              |   40 +
 pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/virtualCard/dto/DtoVirtualCard.java      |   47 +
 pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/PaymentSv.java                 |   55 +
 pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/util/HmacSha256.java                     |   43 +
 pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/virtualCard/VirtualCardSv.java           |  150 +++
 pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/PayInfo.java                   |   36 
 pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/dto/Refund.java                |   39 
 pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/util/RestTemplateUtil.java               |   21 
 pipIrr-platform/pipIrr-web/pom.xml                                                                                  |    1 
 pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeVirtualCardMapper.java                      |   28 
 pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeVirtualCardMapper.xml                                     |  116 ++
 /dev/null                                                                                                           |   13 
 pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/util/PayHelper.java                      |  344 ++++++++
 pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/result/SellResultCode.java               |   21 
 pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/util/AesUtil.java                        |   51 +
 pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/dto/OrderNotify.java           |   81 ++
 pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoSe/SeVcRecharge.java                            |  102 ++
 pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/PaymentCtrl.java               |  541 +++++++++++++
 pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voSe/VoCards.java                                   |    6 
 pipIrr-platform/pipIrr-global/src/main/resources/application-global.yml                                             |    4 
 35 files changed, 2,308 insertions(+), 54 deletions(-)

diff --git a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeVcRechargeMapper.java b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeVcRechargeMapper.java
new file mode 100644
index 0000000..dcf8965
--- /dev/null
+++ b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeVcRechargeMapper.java
@@ -0,0 +1,34 @@
+package com.dy.pipIrrGlobal.daoSe;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.dy.pipIrrGlobal.pojoSe.SeVcRecharge;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @author ZhuBaoMin
+ * @date 2024-03-05 20:21
+ * @LastEditTime 2024-03-05 20:21
+ * @Description
+ */
+
+@Mapper
+public interface SeVcRechargeMapper extends BaseMapper<SeVcRecharge> {
+    int deleteByPrimaryKey(Long id);
+
+    int insert(SeVcRecharge record);
+
+    int insertSelective(SeVcRecharge record);
+
+    SeVcRecharge selectByPrimaryKey(Long id);
+
+    int updateByPrimaryKeySelective(SeVcRecharge record);
+
+    int updateByPrimaryKey(SeVcRecharge record);
+
+    /**
+     * 鏍规嵁璁㈠崟鍙疯幏鍙栬櫄鎷熷崱鍏呭�煎璞�
+     * @param orderNumber
+     * @return
+     */
+    SeVcRecharge getVCRechargeByorderNumber(String orderNumber);
+}
\ No newline at end of file
diff --git a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeVirtualCardMapper.java b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeVirtualCardMapper.java
new file mode 100644
index 0000000..8bac3d7
--- /dev/null
+++ b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeVirtualCardMapper.java
@@ -0,0 +1,28 @@
+package com.dy.pipIrrGlobal.daoSe;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.dy.pipIrrGlobal.pojoSe.SeVirtualCard;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @author ZhuBaoMin
+ * @date 2024-03-05 20:45
+ * @LastEditTime 2024-03-05 20:45
+ * @Description
+ */
+
+@Mapper
+public interface SeVirtualCardMapper extends BaseMapper<SeVirtualCard> {
+    int deleteByPrimaryKey(Long id);
+
+    int insert(SeVirtualCard record);
+
+    int insertSelective(SeVirtualCard record);
+
+    SeVirtualCard selectByPrimaryKey(Long id);
+
+    int updateByPrimaryKeySelective(SeVirtualCard record);
+
+    int updateByPrimaryKey(SeVirtualCard record);
+
+}
\ No newline at end of file
diff --git a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoSe/SeVcRecharge.java b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoSe/SeVcRecharge.java
new file mode 100644
index 0000000..933faa1
--- /dev/null
+++ b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoSe/SeVcRecharge.java
@@ -0,0 +1,102 @@
+package com.dy.pipIrrGlobal.pojoSe;
+
+import com.alibaba.fastjson2.annotation.JSONField;
+import com.alibaba.fastjson2.writer.ObjectWriterImplToString;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.dy.common.po.BaseEntity;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.*;
+import org.hibernate.validator.constraints.Length;
+
+import java.util.Date;
+
+/**
+ * @author ZhuBaoMin
+ * @date 2024-03-05 20:21
+ * @LastEditTime 2024-03-05 20:21
+ * @Description
+ */
+
+@TableName(value="se_vc_recharge", autoResultMap = true)
+@Data
+@Builder
+@ToString
+@NoArgsConstructor
+@AllArgsConstructor
+@Schema(name = "铏氭嫙鍗″厖鍊煎疄浣�")
+public class SeVcRecharge implements BaseEntity {
+    public static final long serialVersionUID = 202403052025001L;
+
+    /**
+    * 涓婚敭
+    */
+    @JSONField(serializeUsing= ObjectWriterImplToString.class)
+    @TableId(type = IdType.INPUT)
+    @Schema(description = "瀹炰綋id", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    private Long id;
+
+    /**
+    * 铏氭嫙鍗D
+    */
+    @Schema(description = "铏氭嫙鍗D", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @NotNull(message = "铏氭嫙鍗D涓嶈兘涓虹┖")
+    private Long vcId;
+
+    /**
+    * 鍐滄埛ID
+    */
+    @Schema(description = "鍐滄埛ID", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @NotNull(message = "鍐滄埛ID涓嶈兘涓虹┖")
+    private Long clientId;
+
+    /**
+    * 閽卞寘浣欓
+    */
+    @Schema(description = "閽卞寘浣欓", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @NotNull(message = "閽卞寘浣欓涓嶈兘涓虹┖")
+    private Double money;
+
+    /**
+    * 鍏呭�煎悗浣欓
+    */
+    @Schema(description = "鍏呭�煎悗浣欓", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @NotNull(message = "鍏呭�煎悗浣欓涓嶈兘涓虹┖")
+    private Double afterRecharge;
+
+    /**
+    * 璁㈠崟鍙�
+    */
+    @Schema(description = "璁㈠崟鍙�", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @NotBlank(message = "璁㈠崟鍙蜂笉鑳戒负绌�")
+    private String orderNumber;
+
+    /**
+    * 鍏呭�奸噾棰�
+    */
+    @Schema(description = "鍏呭�奸噾棰�", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @NotNull(message = "鍏呭�奸噾棰濅笉鑳戒负绌�")
+    private Integer rechargeAmount;
+
+    /**
+    * 涓嬪崟鏃堕棿
+    */
+    @Schema(description = "涓嬪崟鏃堕棿", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    private Date orderTime;
+
+    /**
+    * 鍏呭�煎畬鎴愭椂闂�
+    */
+    @Schema(description = "鍏呭�煎畬鎴愭椂闂�", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    private Date rechargeTime;
+
+    /**
+    * 璁㈠崟鐘舵��;1-鏈敮浠橈紝2-宸叉敮浠�
+    */
+    @Schema(description = "璁㈠崟鐘舵��", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @Length(message = "璁㈠崟鐘舵�佷笉澶т簬{max}锛屼笉灏忎簬{min}", min = 1, max = 2)
+    private Byte orderState;
+}
\ No newline at end of file
diff --git a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoSe/SeVirtualCard.java b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoSe/SeVirtualCard.java
new file mode 100644
index 0000000..23484e2
--- /dev/null
+++ b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoSe/SeVirtualCard.java
@@ -0,0 +1,76 @@
+package com.dy.pipIrrGlobal.pojoSe;
+
+import com.alibaba.fastjson2.annotation.JSONField;
+import com.alibaba.fastjson2.writer.ObjectWriterImplToString;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.dy.common.po.BaseEntity;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.Max;
+import jakarta.validation.constraints.Min;
+import jakarta.validation.constraints.NotNull;
+import lombok.*;
+
+import java.util.Date;
+
+/**
+ * @author ZhuBaoMin
+ * @date 2024-03-05 20:45
+ * @LastEditTime 2024-03-05 20:45
+ * @Description
+ */
+
+@TableName(value="se_virtual_card", autoResultMap = true)
+@Data
+@Builder
+@ToString
+@NoArgsConstructor
+@AllArgsConstructor
+@Schema(name = "铏氭嫙鍗″疄浣�")
+public class SeVirtualCard implements BaseEntity {
+    public static final long serialVersionUID = 202403052048001L;
+
+    /**
+    * 涓婚敭
+    */
+    @JSONField(serializeUsing= ObjectWriterImplToString.class)
+    @TableId(type = IdType.INPUT)
+    @Schema(description = "瀹炰綋id", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    private Long id;
+
+    /**
+    * 鍐滄埛ID
+    */
+    @Schema(description = "鍐滄埛ID", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @NotNull(message = "鍐滄埛ID涓嶈兘涓虹┖")
+    private Long clientId;
+
+    /**
+    * 閽卞寘浣欓
+    */
+    @Schema(description = "閽卞寘浣欓", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @Min(value = 0, message = "閽卞寘浣欓涓嶈兘灏忎簬0")
+    private Double money;
+
+    /**
+    * 鏈�鍚庢搷浣�;1-寮�鎴凤紝2-鍏呭�硷紝3-娑堣垂锛�4-鐢宠閫�娆撅紝5-閫�娆惧鏍�
+    */
+    @Schema(description = "鎿嶄綔绫诲瀷", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @Min(value = 1, message = "鏈�鍚庢搷浣滀笉鑳藉皬浜�1")
+    @Max(value = 5, message = "鏈�鍚庢搷浣滀笉鑳藉ぇ浜�5")
+    private Byte lastOperate;
+
+    /**
+    * 鏈�鍚庢搷浣滄椂闂�
+    */
+    @Schema(description = "鏈�鍚庢搷浣滄椂闂�", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    private Date lastOperateTime;
+
+    /**
+    * 鍒涘缓鏃堕棿
+    */
+    @Schema(description = "鍒涘缓鏃堕棿", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    private Date createTime;
+
+}
\ No newline at end of file
diff --git a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voSe/VoCards.java b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voSe/VoCards.java
index 2ec42d9..95da821 100644
--- a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voSe/VoCards.java
+++ b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voSe/VoCards.java
@@ -26,13 +26,13 @@
     private String cardNum;
 
     @Schema(title = "鐢佃瘽鍙风爜")
-    private Float phone;
+    private String phone;
 
     @Schema(title = "韬唤璇佸彿鐮�")
-    private Float idCard;
+    private String idCard;
 
     @Schema(title = "姘村崱鐘舵��")
-    private Float cardState;
+    private Integer cardState;
 
     @Schema(title = "姘村崱鐘舵�佸悕绉�")
     private String stateName;
diff --git a/pipIrr-platform/pipIrr-global/src/main/resources/application-global.yml b/pipIrr-platform/pipIrr-global/src/main/resources/application-global.yml
index ffa34fd..28bf7d0 100644
--- a/pipIrr-platform/pipIrr-global/src/main/resources/application-global.yml
+++ b/pipIrr-platform/pipIrr-global/src/main/resources/application-global.yml
@@ -112,10 +112,6 @@
         webPort: 8085
         actutorPort: 9085
         idSuffix: 7
-    webchat:
-        webPort: 8086
-        actutorPort: 9086
-        idSuffix: 8
 
 #椤圭洰缂栧彿
 #projectCode:
diff --git a/pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeClientCardMapper.xml b/pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeClientCardMapper.xml
index fbd6120..8fb2f81 100644
--- a/pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeClientCardMapper.xml
+++ b/pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeClientCardMapper.xml
@@ -364,7 +364,7 @@
             WHEN card.state = 3 THEN '宸叉寕澶�'
         End) AS stateName,
         '鍐滄埛鍗�' AS cardType,
-        card.money
+        FORMAT(card.money, 2) AS money
     FROM se_client_card card
         INNER JOIN se_client cli ON card.clientId = cli.id
     <where>
diff --git a/pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeVcRechargeMapper.xml b/pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeVcRechargeMapper.xml
new file mode 100644
index 0000000..95b5342
--- /dev/null
+++ b/pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeVcRechargeMapper.xml
@@ -0,0 +1,171 @@
+<?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.dy.pipIrrGlobal.daoSe.SeVcRechargeMapper">
+  <resultMap id="BaseResultMap" type="com.dy.pipIrrGlobal.pojoSe.SeVcRecharge">
+    <!--@mbg.generated-->
+    <!--@Table se_vc_recharge-->
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="vc_id" jdbcType="BIGINT" property="vcId" />
+    <result column="client_id" jdbcType="BIGINT" property="clientId" />
+    <result column="money" jdbcType="FLOAT" property="money" />
+    <result column="after_recharge" jdbcType="FLOAT" property="afterRecharge" />
+    <result column="order_number" jdbcType="VARCHAR" property="orderNumber" />
+    <result column="recharge_amount" jdbcType="INTEGER" property="rechargeAmount" />
+    <result column="order_time" jdbcType="TIMESTAMP" property="orderTime" />
+    <result column="recharge_time" jdbcType="TIMESTAMP" property="rechargeTime" />
+    <result column="order_state" jdbcType="TINYINT" property="orderState" />
+  </resultMap>
+  <sql id="Base_Column_List">
+    <!--@mbg.generated-->
+    id, vc_id, client_id, money, after_recharge, order_number, recharge_amount, order_time, 
+    recharge_time, order_state
+  </sql>
+  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
+    <!--@mbg.generated-->
+    select 
+    <include refid="Base_Column_List" />
+    from se_vc_recharge
+    where id = #{id,jdbcType=BIGINT}
+  </select>
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
+    <!--@mbg.generated-->
+    delete from se_vc_recharge
+    where id = #{id,jdbcType=BIGINT}
+  </delete>
+  <insert id="insert" parameterType="com.dy.pipIrrGlobal.pojoSe.SeVcRecharge">
+    <!--@mbg.generated-->
+    insert into se_vc_recharge (id, vc_id, client_id, 
+      money, after_recharge, order_number, 
+      recharge_amount, order_time, recharge_time, 
+      order_state)
+    values (#{id,jdbcType=BIGINT}, #{vcId,jdbcType=BIGINT}, #{clientId,jdbcType=BIGINT}, 
+      #{money,jdbcType=FLOAT}, #{afterRecharge,jdbcType=FLOAT}, #{orderNumber,jdbcType=VARCHAR}, 
+      #{rechargeAmount,jdbcType=INTEGER}, #{orderTime,jdbcType=TIMESTAMP}, #{rechargeTime,jdbcType=TIMESTAMP}, 
+      #{orderState,jdbcType=TINYINT})
+  </insert>
+  <insert id="insertSelective" parameterType="com.dy.pipIrrGlobal.pojoSe.SeVcRecharge">
+    <!--@mbg.generated-->
+    insert into se_vc_recharge
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        id,
+      </if>
+      <if test="vcId != null">
+        vc_id,
+      </if>
+      <if test="clientId != null">
+        client_id,
+      </if>
+      <if test="money != null">
+        money,
+      </if>
+      <if test="afterRecharge != null">
+        after_recharge,
+      </if>
+      <if test="orderNumber != null">
+        order_number,
+      </if>
+      <if test="rechargeAmount != null">
+        recharge_amount,
+      </if>
+      <if test="orderTime != null">
+        order_time,
+      </if>
+      <if test="rechargeTime != null">
+        recharge_time,
+      </if>
+      <if test="orderState != null">
+        order_state,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        #{id,jdbcType=BIGINT},
+      </if>
+      <if test="vcId != null">
+        #{vcId,jdbcType=BIGINT},
+      </if>
+      <if test="clientId != null">
+        #{clientId,jdbcType=BIGINT},
+      </if>
+      <if test="money != null">
+        #{money,jdbcType=FLOAT},
+      </if>
+      <if test="afterRecharge != null">
+        #{afterRecharge,jdbcType=FLOAT},
+      </if>
+      <if test="orderNumber != null">
+        #{orderNumber,jdbcType=VARCHAR},
+      </if>
+      <if test="rechargeAmount != null">
+        #{rechargeAmount,jdbcType=INTEGER},
+      </if>
+      <if test="orderTime != null">
+        #{orderTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="rechargeTime != null">
+        #{rechargeTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="orderState != null">
+        #{orderState,jdbcType=TINYINT},
+      </if>
+    </trim>
+  </insert>
+  <update id="updateByPrimaryKeySelective" parameterType="com.dy.pipIrrGlobal.pojoSe.SeVcRecharge">
+    <!--@mbg.generated-->
+    update se_vc_recharge
+    <set>
+      <if test="vcId != null">
+        vc_id = #{vcId,jdbcType=BIGINT},
+      </if>
+      <if test="clientId != null">
+        client_id = #{clientId,jdbcType=BIGINT},
+      </if>
+      <if test="money != null">
+        money = #{money,jdbcType=FLOAT},
+      </if>
+      <if test="afterRecharge != null">
+        after_recharge = #{afterRecharge,jdbcType=FLOAT},
+      </if>
+      <if test="orderNumber != null">
+        order_number = #{orderNumber,jdbcType=VARCHAR},
+      </if>
+      <if test="rechargeAmount != null">
+        recharge_amount = #{rechargeAmount,jdbcType=INTEGER},
+      </if>
+      <if test="orderTime != null">
+        order_time = #{orderTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="rechargeTime != null">
+        recharge_time = #{rechargeTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="orderState != null">
+        order_state = #{orderState,jdbcType=TINYINT},
+      </if>
+    </set>
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.dy.pipIrrGlobal.pojoSe.SeVcRecharge">
+    <!--@mbg.generated-->
+    update se_vc_recharge
+    set vc_id = #{vcId,jdbcType=BIGINT},
+      client_id = #{clientId,jdbcType=BIGINT},
+      money = #{money,jdbcType=FLOAT},
+      after_recharge = #{afterRecharge,jdbcType=FLOAT},
+      order_number = #{orderNumber,jdbcType=VARCHAR},
+      recharge_amount = #{rechargeAmount,jdbcType=INTEGER},
+      order_time = #{orderTime,jdbcType=TIMESTAMP},
+      recharge_time = #{rechargeTime,jdbcType=TIMESTAMP},
+      order_state = #{orderState,jdbcType=TINYINT}
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+
+  <!--鏍规嵁璁㈠崟鍙疯幏鍙栬櫄鎷熷崱鍏呭�煎璞�-->
+  <select id="getVCRechargeByorderNumber" resultMap="BaseResultMap">
+    SELECT
+        <include refid="Base_Column_List" />
+    FROM se_vc_recharge
+    WHERE order_number = #{orderNumber}
+    LIMIT 0,1
+  </select>
+</mapper>
\ No newline at end of file
diff --git a/pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeVirtualCardMapper.xml b/pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeVirtualCardMapper.xml
new file mode 100644
index 0000000..15614b3
--- /dev/null
+++ b/pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeVirtualCardMapper.xml
@@ -0,0 +1,116 @@
+<?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.dy.pipIrrGlobal.daoSe.SeVirtualCardMapper">
+  <resultMap id="BaseResultMap" type="com.dy.pipIrrGlobal.pojoSe.SeVirtualCard">
+    <!--@mbg.generated-->
+    <!--@Table se_virtual_card-->
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="client_id" jdbcType="BIGINT" property="clientId" />
+    <result column="money" jdbcType="FLOAT" property="money" />
+    <result column="last_operate" jdbcType="TINYINT" property="lastOperate" />
+    <result column="last_operate_time" jdbcType="TIMESTAMP" property="lastOperateTime" />
+    <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
+  </resultMap>
+  <sql id="Base_Column_List">
+    <!--@mbg.generated-->
+    id, client_id, money, last_operate, last_operate_time, create_time
+  </sql>
+  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
+    <!--@mbg.generated-->
+    select 
+    <include refid="Base_Column_List" />
+    from se_virtual_card
+    where id = #{id,jdbcType=BIGINT}
+  </select>
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
+    <!--@mbg.generated-->
+    delete from se_virtual_card
+    where id = #{id,jdbcType=BIGINT}
+  </delete>
+  <insert id="insert" parameterType="com.dy.pipIrrGlobal.pojoSe.SeVirtualCard">
+    <!--@mbg.generated-->
+    insert into se_virtual_card (id, client_id, money, 
+      last_operate, last_operate_time, create_time
+      )
+    values (#{id,jdbcType=BIGINT}, #{clientId,jdbcType=BIGINT}, #{money,jdbcType=FLOAT}, 
+      #{lastOperate,jdbcType=TINYINT}, #{lastOperateTime,jdbcType=TIMESTAMP}, #{createTime,jdbcType=TIMESTAMP}
+      )
+  </insert>
+  <insert id="insertSelective" parameterType="com.dy.pipIrrGlobal.pojoSe.SeVirtualCard">
+    <!--@mbg.generated-->
+    insert into se_virtual_card
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        id,
+      </if>
+      <if test="clientId != null">
+        client_id,
+      </if>
+      <if test="money != null">
+        money,
+      </if>
+      <if test="lastOperate != null">
+        last_operate,
+      </if>
+      <if test="lastOperateTime != null">
+        last_operate_time,
+      </if>
+      <if test="createTime != null">
+        create_time,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        #{id,jdbcType=BIGINT},
+      </if>
+      <if test="clientId != null">
+        #{clientId,jdbcType=BIGINT},
+      </if>
+      <if test="money != null">
+        #{money,jdbcType=FLOAT},
+      </if>
+      <if test="lastOperate != null">
+        #{lastOperate,jdbcType=TINYINT},
+      </if>
+      <if test="lastOperateTime != null">
+        #{lastOperateTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="createTime != null">
+        #{createTime,jdbcType=TIMESTAMP},
+      </if>
+    </trim>
+  </insert>
+  <update id="updateByPrimaryKeySelective" parameterType="com.dy.pipIrrGlobal.pojoSe.SeVirtualCard">
+    <!--@mbg.generated-->
+    update se_virtual_card
+    <set>
+      <if test="clientId != null">
+        client_id = #{clientId,jdbcType=BIGINT},
+      </if>
+      <if test="money != null">
+        money = #{money,jdbcType=FLOAT},
+      </if>
+      <if test="lastOperate != null">
+        last_operate = #{lastOperate,jdbcType=TINYINT},
+      </if>
+      <if test="lastOperateTime != null">
+        last_operate_time = #{lastOperateTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="createTime != null">
+        create_time = #{createTime,jdbcType=TIMESTAMP},
+      </if>
+    </set>
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.dy.pipIrrGlobal.pojoSe.SeVirtualCard">
+    <!--@mbg.generated-->
+    update se_virtual_card
+    set client_id = #{clientId,jdbcType=BIGINT},
+      money = #{money,jdbcType=FLOAT},
+      last_operate = #{lastOperate,jdbcType=TINYINT},
+      last_operate_time = #{lastOperateTime,jdbcType=TIMESTAMP},
+      create_time = #{createTime,jdbcType=TIMESTAMP}
+    where id = #{id,jdbcType=BIGINT}
+  </update>
+
+</mapper>
\ No newline at end of file
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-sell/pom.xml b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/pom.xml
index 841fc87..8511298 100644
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-sell/pom.xml
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/pom.xml
@@ -15,6 +15,15 @@
     <name>pipIrr-web-sell</name>
     <description>web钀ラ攢淇℃伅绯荤粺</description>
 
+    <dependencies>
+        <!--OkHttp-->
+        <dependency>
+            <groupId>com.squareup.okhttp3</groupId>
+            <artifactId>okhttp</artifactId>
+            <version>4.9.2</version>
+        </dependency>
+    </dependencies>
+
     <build>
         <plugins>
             <!-- 鐢熸垚涓嶅寘鍚緷璧杍ar鐨勫彲鎵цjar鍖�
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/client/ClientCtrl.java b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/client/ClientCtrl.java
index 29de085..0aed5d4 100644
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/client/ClientCtrl.java
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/client/ClientCtrl.java
@@ -110,7 +110,7 @@
     @PostMapping(path = "add", consumes = MediaType.APPLICATION_JSON_VALUE)
     @Transactional(rollbackFor = Exception.class)
     @SsoAop()
-    public BaseResponse<Boolean> add(@RequestBody @Valid DtoClient po, BindingResult bindingResult){
+    public BaseResponse<Boolean> add(@RequestBody @Valid DtoClient po, BindingResult bindingResult) {
         if(bindingResult != null && bindingResult.hasErrors()){
             return BaseResponseUtils.buildFail(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
         }
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/src/main/java/com/dy/pipirrWebChat/config/RestTemplateConfig.java b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/config/RestTemplateConfig.java
similarity index 95%
rename from pipIrr-platform/pipIrr-web/pipIrr-web-webchat/src/main/java/com/dy/pipirrWebChat/config/RestTemplateConfig.java
rename to pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/config/RestTemplateConfig.java
index 0cbc9c1..3ba853d 100644
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/src/main/java/com/dy/pipirrWebChat/config/RestTemplateConfig.java
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/config/RestTemplateConfig.java
@@ -1,4 +1,4 @@
-package com.dy.pipirrWebChat.config;
+package com.dy.pipIrrSell.config;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Bean;
@@ -9,12 +9,11 @@
 
 import java.nio.charset.StandardCharsets;
 import java.util.List;
-//import org.apache.http.client.HttpClient;
 
 /**
  * @author ZhuBaoMin
- * @date 2024-02-23 15:42
- * @LastEditTime 2024-02-23 15:42
+ * @date 2024-03-06 11:43
+ * @LastEditTime 2024-03-06 11:43
  * @Description
  */
 
@@ -77,5 +76,4 @@
 
         return restTemplate;
     }
-}
-
+}
\ No newline at end of file
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/src/main/java/com/dy/pipirrWebChat/config/RestTemplateWechatCertConfig.java b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/config/RestTemplateWechatCertConfig.java
similarity index 93%
rename from pipIrr-platform/pipIrr-web/pipIrr-web-webchat/src/main/java/com/dy/pipirrWebChat/config/RestTemplateWechatCertConfig.java
rename to pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/config/RestTemplateWechatCertConfig.java
index f566a74..5a3c7d4 100644
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/src/main/java/com/dy/pipirrWebChat/config/RestTemplateWechatCertConfig.java
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/config/RestTemplateWechatCertConfig.java
@@ -1,6 +1,6 @@
-package com.dy.pipirrWebChat.config;
+package com.dy.pipIrrSell.config;
 
-import com.dy.pipirrWebChat.payment.PayInfo;
+import com.dy.pipIrrSell.wechatpay.PayInfo;
 import okhttp3.OkHttpClient;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.context.annotation.Bean;
@@ -18,8 +18,8 @@
 
 /**
  * @author ZhuBaoMin
- * @date 2024-02-23 19:18
- * @LastEditTime 2024-02-23 19:18
+ * @date 2024-03-06 11:44
+ * @LastEditTime 2024-03-06 11:44
  * @Description
  */
 
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/result/SellResultCode.java b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/result/SellResultCode.java
index a0b2d7c..db843e7 100644
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/result/SellResultCode.java
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/result/SellResultCode.java
@@ -79,14 +79,27 @@
     AUDITS_ADD_FAIL(80001, "鎬昏处瀹℃牳璁板綍娣诲姞澶辫触"),
 
     /**
-     * 鐢靛瓙閽卞寘
+     * 铏氭嫙鍗�
      */
+
+    VERIFY_FAIL(10001, "楠岀澶辫触"),
+
+    TOTAL_REFUND_EXCEED_TRADE(10001, "閫�娆炬�婚瓒呰繃璁㈠崟閲戦"),
+    ACCEPTED(10001, "閫�娆剧敵璇峰凡鍙楃悊"),
+    PROCESSING(10001, "閫�娆惧鐞嗕腑"),
+    ABNORMAL(10001, "閫�娆惧紓甯�"),
+    RECHARGE_ADD_FAIL(10001, "鍏呭�艰褰曟坊鍔犲け璐�"),
+
     CLIENT_ID_CANNOT_BE_NULL(90001, "鍐滄埛缂栧彿涓嶈兘涓虹┖"),
-    WALLET_OPEN_ACCOUNT_FAIL(90002, "鐢靛瓙閽卞寘璐︽埛娉ㄥ唽澶辫触"),
-    WALLET_ACCOUNT_EXIST(90003, "璇ュ啘鎴峰凡娉ㄥ唽鐢靛瓙閽卞寘"),
-    NO_ACCOUNT(90004, "鎮ㄥ皻鏈敞鍐岀數瀛愰挶鍖呰处鎴�"),
+    WALLET_OPEN_ACCOUNT_FAIL(90002, "铏氭嫙鍗¤处鎴锋敞鍐屽け璐�"),
+    //WALLET_ACCOUNT_EXIST(90003, "璇ュ啘鎴峰凡娉ㄥ唽鐢靛瓙閽卞寘"),
+    NO_ACCOUNT(90004, "鎮ㄦ寚瀹氱殑铏氭嫙鍗℃湭娉ㄥ唽"),
+
     UPDATE_ACCOUNT_FAIL(90005, "鍏呭�煎け璐ワ紝鐢靛瓙閽卞寘璐︽埛鏇存柊澶辫触"),
     RECHARGE_FAIL(90006, "鍏呭�煎け璐�"),
+    RECHARGE_NOT_EXIST(90006, "鍏呭�艰褰曚笉瀛樺湪"),
+    VIRTUAL_CARD_NOT_EXIST(90006, "铏氭嫙鍗¤处鎴蜂笉瀛樺湪"),
+
     BALANCE_IS_INSUFFICIENT(90007, "娑堣垂澶辫触锛屼綑棰濅笉瓒�"),
     CONSUME_FAIL(90008, "娑堣垂澶辫触"),
     REFUND_AMOUNT_CANNOT_GREATER_THAN_MONEY(90009, "鐢宠閫�娆惧け璐ワ紝閫�娆鹃噾棰濅笉鑳藉ぇ浜庝綑棰�"),
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/util/AesUtil.java b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/util/AesUtil.java
new file mode 100644
index 0000000..0d70bd5
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/util/AesUtil.java
@@ -0,0 +1,51 @@
+package com.dy.pipIrrSell.util;
+
+import javax.crypto.Cipher;
+import javax.crypto.NoSuchPaddingException;
+import javax.crypto.spec.GCMParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+import java.io.IOException;
+import java.security.GeneralSecurityException;
+import java.security.InvalidAlgorithmParameterException;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.util.Base64;
+
+/**
+ * @author ZhuBaoMin
+ * @date 2024-03-06 11:46
+ * @LastEditTime 2024-03-06 11:46
+ * @Description
+ */
+
+public class AesUtil {
+    static final int KEY_LENGTH_BYTE = 32;
+    static final int TAG_LENGTH_BIT = 128;
+
+    /**
+     * 瑙e瘑
+     * @param apiV3Key apiV3瀵嗛挜
+     * @param associatedData 闄勫姞鏁版嵁
+     * @param nonce 闅忔満涓�
+     * @param ciphertext 鏁版嵁瀵嗘枃
+     * @return 瑙e瘑鍚庡瓧绗︿覆
+     * @throws GeneralSecurityException
+     * @throws IOException
+     */
+    public static String decryptToString(byte[] apiV3Key, byte[] associatedData, byte[] nonce, String ciphertext) throws GeneralSecurityException, IOException {
+        try {
+            Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
+            SecretKeySpec key = new SecretKeySpec(apiV3Key, "AES");
+            GCMParameterSpec spec = new GCMParameterSpec(TAG_LENGTH_BIT, nonce);
+
+            cipher.init(Cipher.DECRYPT_MODE, key, spec);
+            cipher.updateAAD(associatedData);
+
+            return new String(cipher.doFinal(Base64.getDecoder().decode(ciphertext)), "utf-8");
+        } catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
+            throw new IllegalStateException(e);
+        } catch (InvalidKeyException | InvalidAlgorithmParameterException e) {
+            throw new IllegalArgumentException(e);
+        }
+    }
+}
\ No newline at end of file
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/util/HmacSha256.java b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/util/HmacSha256.java
new file mode 100644
index 0000000..176dd63
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/util/HmacSha256.java
@@ -0,0 +1,43 @@
+package com.dy.pipIrrSell.util;
+
+import javax.crypto.Mac;
+import javax.crypto.spec.SecretKeySpec;
+import java.nio.charset.StandardCharsets;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+
+/**
+ * @author ZhuBaoMin
+ * @date 2024-03-06 11:47
+ * @LastEditTime 2024-03-06 11:47
+ * @Description
+ */
+public class HmacSha256 {
+    public static String getSignature(String secretKey, String data) throws NoSuchAlgorithmException, InvalidKeyException {
+        // 鍒涘缓瀵嗛挜瀵硅薄
+        byte[] keyBytes = secretKey.getBytes(StandardCharsets.UTF_8);
+        SecretKeySpec secretKeySpec = new SecretKeySpec(keyBytes, "HmacSHA256");
+
+        // 鍒涘缓Mac瀵硅薄骞跺垵濮嬪寲
+        Mac mac = Mac.getInstance("HmacSHA256");
+        mac.init(secretKeySpec);
+
+        // 灏嗗緟鍔犲瘑鐨勬暟鎹浆鎹负瀛楄妭鏁扮粍
+        byte[] dataBytes = data.getBytes(StandardCharsets.UTF_8);
+
+        // 浣跨敤瀵嗛挜瀵规暟鎹繘琛屽姞瀵�
+        byte[] encryptedBytes = mac.doFinal(dataBytes);
+
+        // 灏嗗姞瀵嗗悗鐨勭粨鏋滆浆鎹负鍗佸叚杩涘埗瀛楃涓�
+        StringBuilder hexString = new StringBuilder();
+        for (byte b : encryptedBytes) {
+            String hex = Integer.toHexString(0xff & b);
+            if (hex.length() == 1) {
+                hexString.append('0');
+            }
+            hexString.append(hex);
+        }
+        String hmacSha256 = hexString.toString();
+        return hmacSha256;
+    }
+}
\ No newline at end of file
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/util/PayHelper.java b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/util/PayHelper.java
new file mode 100644
index 0000000..032a5d6
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/util/PayHelper.java
@@ -0,0 +1,344 @@
+package com.dy.pipIrrSell.util;
+
+import com.alibaba.fastjson2.JSONArray;
+import com.alibaba.fastjson2.JSONObject;
+
+import com.dy.pipIrrSell.wechatpay.PayInfo;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Component;
+
+import javax.crypto.NoSuchPaddingException;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.security.*;
+import java.security.cert.Certificate;
+import java.security.cert.CertificateException;
+import java.security.cert.CertificateFactory;
+import java.security.spec.InvalidKeySpecException;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.util.Base64;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Random;
+
+/**
+ * @author ZhuBaoMin
+ * @date 2024-03-06 11:47
+ * @LastEditTime 2024-03-06 11:47
+ * @Description
+ */
+@Component
+@RequiredArgsConstructor
+public class PayHelper {
+    private final RestTemplateUtil restTemplateUtil;
+
+    private static final String CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
+
+    private String checkSessionUrl = PayInfo.checkSessionUrl;
+    private String tokenUrl = PayInfo.tokenUrl;
+    private String resetUserSessionKeyUrl = PayInfo.resetUserSessionKeyUrl;
+
+    // 骞冲彴璇佷功鍏挜
+    public Map<String, Certificate> CERTIFICATE_MAP = new HashMap();
+
+    /**
+     * 鑾峰彇32浣嶉殢鏈哄瓧绗︿覆
+     * @return 闅忔満涓�
+     */
+    public String generateRandomString() {
+        Random random = new Random();
+        StringBuilder sb = new StringBuilder(32);
+        for (int i = 0; i < 32; i++) {
+            int index = random.nextInt(CHARACTERS.length());
+            sb.append(CHARACTERS.charAt(index));
+        }
+        return sb.toString();
+    }
+
+    /**
+     * 鑾峰彇鍟嗘埛璇佷功绉侀挜瀵硅薄
+     * @param filename 绉侀挜鏂囦欢璺緞
+     * @return 绉侀挜瀵硅薄
+     * @throws IOException
+     */
+    public PrivateKey getPrivateKey(String filename) throws IOException {
+        String content = new String(Files.readAllBytes(Paths.get(filename)), "utf-8");
+        try {
+            String privateKey = content.replace("-----BEGIN PRIVATE KEY-----", "")
+                    .replace("-----END PRIVATE KEY-----", "")
+                    .replaceAll("\\s+", "");
+            KeyFactory kf = KeyFactory.getInstance("RSA");
+            return kf.generatePrivate(new PKCS8EncodedKeySpec(Base64.getDecoder().decode(privateKey)));
+        } catch (NoSuchAlgorithmException e) {
+            throw new RuntimeException("褰撳墠Java鐜涓嶆敮鎸丷SA", e);
+        } catch (InvalidKeySpecException e) {
+            throw new RuntimeException("鏃犳晥鐨勫瘑閽ユ牸寮�");
+        }
+    }
+
+    /**
+     * 妫�楠岀櫥褰曟��
+     * @param appid 灏忕▼搴� appId
+     * @param secret 灏忕▼搴� appSecret
+     * @param openid 鐢ㄦ埛鍞竴鏍囪瘑绗�
+     * @param sessionKey 浼氳瘽瀵嗛挜
+     * @return
+     * @throws IOException
+     */
+    public JSONObject checkSessionKey(String appid, String secret, String openid, String sessionKey) throws IOException, NoSuchAlgorithmException, InvalidKeyException {
+        String accessToken = "";
+        Integer expiresIn = 0;
+        String signature = HmacSha256.getSignature(sessionKey, "");
+        String sigMethod = "hmac_sha256";
+
+        JSONObject job_token = getAccessToken(appid, secret);
+        if(job_token != null) {
+            accessToken = job_token.getString("access_token");
+            expiresIn = job_token.getInteger("expires_in");
+        }
+
+        Map<String, Object> queryParams = new HashMap<>();
+        queryParams.put("access_token", accessToken);
+        queryParams.put("openid", openid);
+        queryParams.put("signature", signature);
+        queryParams.put("sig_method", sigMethod);
+        Map<String, String> headerParams = new HashMap<>();
+        JSONObject result = restTemplateUtil.get(checkSessionUrl, queryParams, headerParams);
+        return result;
+    }
+
+    /**
+     * 閲嶇疆鐧诲綍鎬�
+     * @param appid 灏忕▼搴� appId
+     * @param secret 灏忕▼搴� appSecret
+     * @param openid 鐢ㄦ埛鍞竴鏍囪瘑绗�
+     * @param sessionKey 浼氳瘽瀵嗛挜
+     * @return
+     * @throws NoSuchAlgorithmException
+     * @throws InvalidKeyException
+     * @throws IOException
+     */
+    public JSONObject resetUserSessionKey(String appid, String secret, String openid, String sessionKey) throws NoSuchAlgorithmException, InvalidKeyException, IOException {
+        String accessToken = "";
+        Integer expiresIn = 0;
+        String signature = HmacSha256.getSignature(sessionKey, "");
+        String sigMethod = "hmac_sha256";
+
+        JSONObject job_token = getAccessToken(appid, secret);
+        if(job_token != null) {
+            accessToken = job_token.getString("access_token");
+            expiresIn = job_token.getInteger("expires_in");
+        }
+
+        Map<String, Object> queryParams = new HashMap<>();
+        queryParams.put("access_token", accessToken);
+        queryParams.put("openid", openid);
+        queryParams.put("signature", signature);
+        queryParams.put("sig_method", sigMethod);
+        Map<String, String> headerParams = new HashMap<>();
+        JSONObject result = restTemplateUtil.get(resetUserSessionKeyUrl, queryParams, headerParams);
+        return result;
+    }
+
+    /**
+     * 鑾峰彇鎺ュ彛璋冪敤鍑嵁
+     * @param appid 灏忕▼搴� appId
+     * @param secret 灏忕▼搴� appSecret
+     * @return 鍑嵁鍙婂嚟鎹湁鏁堟椂闂�
+     * @throws IOException
+     */
+    public JSONObject getAccessToken(String appid, String secret) throws IOException {
+        Map<String, Object> queryParams = new HashMap<>();
+        queryParams.put("grant_type", "client_credential");
+        queryParams.put("appid", appid);
+        queryParams.put("secret", secret);
+        Map<String, String> headerParams = new HashMap<>();
+        JSONObject job_result = restTemplateUtil.get(tokenUrl, queryParams, headerParams);
+        return job_result;
+    }
+
+    /**
+     * 鏋勯�犵鍚嶄覆_涓嬪崟
+     * @param method HTTP璇锋眰鏂规硶
+     * @param url URL
+     * @param timestamp 鏃堕棿鎴�
+     * @param nonceStr 闅忔満涓�
+     * @param body 鎶ユ枃涓婚
+     * @return 绛惧悕涓�
+     */
+    public String buildMessage_order(String method, String url, long timestamp, String nonceStr, String body) {
+        return method + "\n"
+                + url + "\n"
+                + timestamp + "\n"
+                + nonceStr + "\n"
+                + body + "\n";
+    }
+
+    /**
+     * 鏋勯�犵鍚嶄覆_鍐嶆涓嬪崟
+     * @param appid 灏忕▼搴忓敮涓�鏍囪瘑
+     * @param timestamp 鏃堕棿鎴�
+     * @param nonceStr 闅忔満涓�
+     * @param pkg package
+     * @return 绛惧悕涓�
+     */
+    public String buildMessage_signAgain(String appid, String timestamp, String nonceStr, String pkg) {
+        return appid + "\n"
+                + timestamp + "\n"
+                + nonceStr + "\n"
+                + pkg + "\n";
+    }
+
+    /**
+     * 绛惧悕
+     * @param message 琚鍚嶄俊鎭�
+     * @param certFileName 绉侀挜璇佷功鏂囦欢璺緞
+     * @return signature绛惧悕鍊硷紝绛惧悕淇℃伅涓殑涓�椤癸紝鍙備笌鐢熸垚绛惧悕淇℃伅
+     * @throws NoSuchAlgorithmException
+     * @throws InvalidKeyException
+     * @throws SignatureException
+     * @throws IOException
+     */
+    public String sign(byte[] message, String certFileName) throws NoSuchAlgorithmException, InvalidKeyException, SignatureException, IOException {
+        Signature sign = Signature.getInstance("SHA256withRSA");
+        sign.initSign(getPrivateKey(certFileName));
+        sign.update(message);
+        return Base64.getEncoder().encodeToString(sign.sign());
+    }
+
+    /**
+     * 鑾峰彇绛惧悕淇℃伅
+     * @param method
+     * @param url
+     * @param body
+     * @return 绛惧悕淇℃伅锛孒TTP澶翠腑鐨勭鍚嶄俊鎭�
+     * HTTP澶达細Authorization: 璁よ瘉绫诲瀷 绛惧悕淇℃伅
+     * 璁よ瘉绫诲瀷锛學ECHATPAY2-SHA256-RSA2048
+     */
+    public String getToken(String method, String url, String body, String nonceStr, Long timestamp, String certFileName) throws NoSuchAlgorithmException, InvalidKeySpecException, IOException, SignatureException, InvalidKeyException, NoSuchPaddingException {
+        String message = buildMessage_order(method, url, timestamp, nonceStr, body);
+        String signature = sign(message.getBytes("utf-8"), certFileName);
+
+        return "mchid=\"" + PayInfo.mchid + "\","
+                + "nonce_str=\"" + nonceStr + "\","
+                + "timestamp=\"" + timestamp + "\","
+                + "serial_no=\"" + PayInfo.serial_no + "\","
+                + "signature=\"" + signature + "\"";
+    }
+
+    /**
+     * 鏋勯�犻獙閫犵鍚嶄覆
+     * @param wechatpayTimestamp 璇锋眰澶翠腑杩斿洖鐨勬椂闂存埑
+     * @param wechatpayNonce 璇锋眰澶翠腑杩斿洖鐨勯殢鏈轰覆
+     * @param boey 璇锋眰杩斿洖鐨刡ody
+     * @return signatureStr鏋勯�犵殑楠岀鍚嶄覆
+     */
+    public String responseSign(String wechatpayTimestamp, String wechatpayNonce, String boey) {
+        String signatureStr = wechatpayTimestamp + "\n"
+                + wechatpayNonce + "\n"
+                + boey + "\n";
+        return signatureStr;
+    }
+
+    /**
+     * 閲嶆柊涓嬭浇璇佷功
+     */
+    public void refreshCertificate() throws GeneralSecurityException, IOException {
+        String method = "GET";
+        String httpUrl = "/v3/certificates";
+        String nonceStr = generateRandomString();
+        Long timestamp = System.currentTimeMillis() / 1000;
+
+        String header = PayInfo.schema + " " + getToken(method, httpUrl, "", nonceStr, timestamp, PayInfo.privateCertFileName);
+
+        Map<String, String> headers = new HashMap<>();
+        headers.put("Authorization", header);
+        headers.put("Accept", "application/json");
+
+        JSONObject job_result = restTemplateUtil.getHeaders(PayInfo.certificates,null, headers);
+        JSONObject job_headers = job_result.getJSONObject("headers");
+
+        String wechatpayNonce = job_headers.getJSONArray("Wechatpay-Nonce").getString(0);
+        String wechatpaySerial = job_headers.getJSONArray("Wechatpay-Serial").getString(0);
+        String signature_h = job_headers.getJSONArray("Wechatpay-Signature").getString(0);
+        String signatureType_h = job_headers.getJSONArray("Wechatpay-Signature-Type").getString(0);
+        String wechatpayTimestamp = job_headers.getJSONArray("Wechatpay-Timestamp").getString(0);
+
+        JSONObject job_body = job_result.getJSONObject("body");
+        if(job_body != null) {
+            JSONArray array = job_body.getJSONArray("data");
+            if(array != null && array.size() > 0) {
+                for(int i = 0; i < array.size(); i++) {
+                    JSONObject job_data = array.getJSONObject(i);
+                    String certificateSerial = job_data.getString("serial_no");
+                    String effective_time  = job_data.getString("effective_time");
+                    String expire_time  = job_data.getString("expire_time");
+                    JSONObject job_certificate = job_data.getJSONObject("encrypt_certificate");
+                    String algorithm = job_certificate.getString("algorithm");
+                    String nonce  = job_certificate.getString("nonce");
+                    String associated_data  = job_certificate.getString("associated_data");
+                    String ciphertext  = job_certificate.getString("ciphertext");
+
+                    //瀵硅瘉涔﹀瘑鏂囪繘琛岃В瀵嗗緱鍒板钩鍙拌瘉涔﹀叕閽�
+                    String publicKey = AesUtil.decryptToString(PayInfo.key.getBytes("utf-8"), associated_data.getBytes("utf-8"), nonce.getBytes("utf-8"), ciphertext);
+
+                    // 灏嗗钩鍙板叕閽ュ瓧绗︿覆杞垚Certificate瀵硅薄
+                    final CertificateFactory cf = CertificateFactory.getInstance("X509");
+                    ByteArrayInputStream inputStream = new ByteArrayInputStream(publicKey.getBytes(StandardCharsets.UTF_8));
+                    Certificate certificate = null;
+                    try {
+                        certificate = cf.generateCertificate(inputStream);
+                    } catch (CertificateException e) {
+                        e.printStackTrace();
+                    }
+
+                    // 鍝嶅簲澶磋瘉涔﹀簭鍙蜂笌鍝嶅簲浣撹瘉涔﹀簭鍒楀彿涓�鑷达紝涓旀椂闂村樊灏忎簬5鍒嗛挓鏃舵墠灏嗚瘉涔﹀瓨鍌╩ap
+                    Long timeDiff = (System.currentTimeMillis() / 1000 - Long.parseLong(wechatpayTimestamp))/60;
+                    if(wechatpaySerial.equals(certificateSerial) && timeDiff <= 5) {
+                        // 璇佷功鏀惧叆MAP
+                        CERTIFICATE_MAP.put(certificateSerial, certificate);
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * 浣跨敤寰俊骞冲彴璇佷功杩涜鍝嶅簲楠岀
+     * @param wechatpaySerial 鏉ヨ嚜鍝嶅簲澶寸殑寰俊骞冲彴璇佷功搴忓垪鍙�
+     * @param signatureStr 鏋勯�犵殑楠岀鍚嶄覆
+     * @param wechatpaySignature 鏉ヨ嚜鍝嶅簲澶寸殑寰俊骞冲彴绛惧悕
+     * @return
+     * @throws NoSuchAlgorithmException
+     * @throws InvalidKeyException
+     * @throws SignatureException
+     */
+    public Boolean responseSignVerify(String wechatpaySerial, String signatureStr, String wechatpaySignature) throws GeneralSecurityException, IOException {
+        if(CERTIFICATE_MAP.isEmpty() || !CERTIFICATE_MAP.containsKey(wechatpaySerial)) {
+            CERTIFICATE_MAP.clear();
+            refreshCertificate();
+        }
+        Certificate certificate = (Certificate)CERTIFICATE_MAP.get(wechatpaySerial);
+        if(certificate == null) {
+            return false;
+        }
+
+        // 鑾峰彇鍏挜
+        PublicKey publicKey = certificate.getPublicKey();
+
+        // 鍒濆鍖朣HA256withRSA鍓嶉潰鍣�
+        Signature signature = Signature.getInstance("SHA256withRSA");
+        // 鐢ㄥ井淇″钩鍙板叕閽ュ鍓嶉潰鍣ㄨ繘琛屽垵濮嬪寲
+        signature.initVerify(certificate);
+
+        // 灏嗘瀯閫犵殑楠岀鍚嶄覆鏇存柊鍒扮鍚嶅櫒涓�
+        signature.update(signatureStr.getBytes(StandardCharsets.UTF_8));
+
+        // 璇锋眰澶翠腑寰俊鏈嶅姟鍣ㄨ繑鍥炵殑绛惧悕鐢˙ase64瑙g爜锛屼娇鐢ㄧ鍚嶅櫒杩涜楠岃瘉
+        boolean valid = signature.verify(Base64.getDecoder().decode(wechatpaySignature));
+        return valid;
+    }
+}
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/src/main/java/com/dy/pipirrWebChat/util/RestTemplateUtil.java b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/util/RestTemplateUtil.java
similarity index 82%
rename from pipIrr-platform/pipIrr-web/pipIrr-web-webchat/src/main/java/com/dy/pipirrWebChat/util/RestTemplateUtil.java
rename to pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/util/RestTemplateUtil.java
index 980a121..7b89aea 100644
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/src/main/java/com/dy/pipirrWebChat/util/RestTemplateUtil.java
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/util/RestTemplateUtil.java
@@ -1,4 +1,4 @@
-package com.dy.pipirrWebChat.util;
+package com.dy.pipIrrSell.util;
 
 import com.alibaba.fastjson2.JSONObject;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -13,8 +13,8 @@
 
 /**
  * @author ZhuBaoMin
- * @date 2024-02-23 15:42
- * @LastEditTime 2024-02-23 15:42
+ * @date 2024-03-06 13:47
+ * @LastEditTime 2024-03-06 13:47
  * @Description
  */
 
@@ -39,6 +39,19 @@
         HttpEntity<MultiValueMap<String, Object>> httpEntity = new HttpEntity<>(null, headers);
         ResponseEntity<String> response = restTemplate.exchange(tempUrl, HttpMethod.GET, httpEntity, String.class);
         return JSONObject.parseObject(response.getBody());
+    }
+
+    public JSONObject getHeaders(String url, Map<String, Object> queryParams, Map<String, String> headerParams) throws IOException {
+        String tempUrl = setParamsByAppendUrl(queryParams, url);
+        HttpHeaders headers = new HttpHeaders();
+        headerParams.forEach(headers::add);
+        HttpEntity<MultiValueMap<String, Object>> httpEntity = new HttpEntity<>(null, headers);
+        ResponseEntity<String> response = restTemplate.exchange(tempUrl, HttpMethod.GET, httpEntity, String.class);
+
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("headers", response.getHeaders());
+        jsonObject.put("body", response.getBody());
+        return jsonObject;
     }
 
     public JSONObject get2(String url, Map<String, Object> queryParams, Map<String, String> headerParams) throws IOException {
@@ -99,4 +112,4 @@
         return url + sb;
     }
 
-}
+}
\ No newline at end of file
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/virtualCard/VirtualCardCtrl.java b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/virtualCard/VirtualCardCtrl.java
new file mode 100644
index 0000000..8593e8d
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/virtualCard/VirtualCardCtrl.java
@@ -0,0 +1,74 @@
+package com.dy.pipIrrSell.virtualCard;
+
+import com.dy.common.aop.SsoAop;
+import com.dy.common.webUtil.BaseResponse;
+import com.dy.common.webUtil.BaseResponseUtils;
+import com.dy.common.webUtil.ResultCodeMsg;
+import com.dy.pipIrrGlobal.pojoSe.SeVirtualCard;
+import com.dy.pipIrrSell.result.SellResultCode;
+import com.dy.pipIrrSell.virtualCard.enums.LastOperateENUM;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.media.Content;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
+import io.swagger.v3.oas.annotations.responses.ApiResponses;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.validation.constraints.NotNull;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.MediaType;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Date;
+
+/**
+ * @author ZhuBaoMin
+ * @date 2024-03-06 8:40
+ * @LastEditTime 2024-03-06 8:40
+ * @Description
+ */
+
+@Slf4j
+@Tag(name = "铏氭嫙鍗$鐞�", description = "铏氭嫙鍗$鐞�")
+@RestController
+@RequestMapping(path="virtual_card")
+@RequiredArgsConstructor
+@Validated
+public class VirtualCardCtrl {
+    private final VirtualCardSv virtualCardSv;
+
+    @Operation(summary = "娉ㄥ唽铏氭嫙鍗�", description = "娉ㄥ唽铏氭嫙鍗�")
+    @ApiResponses(value = {
+            @ApiResponse(
+                    responseCode = ResultCodeMsg.RsCode.SUCCESS_CODE,
+                    description = "鎿嶄綔缁撴灉锛歵rue锛氭垚鍔燂紝false锛氬け璐ワ紙BaseResponse.content锛�",
+                    content = {@Content(mediaType = MediaType.APPLICATION_JSON_VALUE,
+                            schema = @Schema(implementation = Boolean.class))}
+            )
+    })
+    @PostMapping(path = "add_vc")
+    @SsoAop()
+    public BaseResponse<Boolean> addWallet(@RequestParam("clientId") @NotNull(message = "鍐滄埛缂栧彿涓嶈兘涓虹┖") Long clientId){
+        if(clientId == null || clientId < 0) {
+            return BaseResponseUtils.buildFail(SellResultCode.CLIENT_ID_CANNOT_BE_NULL.getMessage());
+        }
+
+        SeVirtualCard seVirtualCard = new SeVirtualCard();
+        seVirtualCard.setClientId(clientId);
+        seVirtualCard.setMoney(0d);
+        seVirtualCard.setLastOperate(LastOperateENUM.OPEN_ACCOUNT.getCode());
+        seVirtualCard.setLastOperateTime(new Date());
+        seVirtualCard.setCreateTime(new Date());
+        Long rec = virtualCardSv.insertVirtualCard(seVirtualCard);
+        if(rec == null) {
+            return BaseResponseUtils.buildFail(SellResultCode.WALLET_OPEN_ACCOUNT_FAIL.getMessage());
+        }
+        return BaseResponseUtils.buildSuccess(true) ;
+    }
+
+
+}
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/virtualCard/VirtualCardSv.java b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/virtualCard/VirtualCardSv.java
new file mode 100644
index 0000000..10caf9c
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/virtualCard/VirtualCardSv.java
@@ -0,0 +1,150 @@
+package com.dy.pipIrrSell.virtualCard;
+
+import com.dy.common.webUtil.BaseResponse;
+import com.dy.common.webUtil.BaseResponseUtils;
+import com.dy.pipIrrGlobal.daoSe.SeVcRechargeMapper;
+import com.dy.pipIrrGlobal.daoSe.SeVirtualCardMapper;
+import com.dy.pipIrrGlobal.pojoSe.SeVcRecharge;
+import com.dy.pipIrrGlobal.pojoSe.SeVirtualCard;
+import com.dy.pipIrrSell.result.SellResultCode;
+import com.dy.pipIrrSell.virtualCard.dto.DtoVirtualCard;
+import com.dy.pipIrrSell.virtualCard.enums.LastOperateENUM;
+import com.dy.pipIrrSell.virtualCard.enums.OrderStateENUM;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Date;
+
+/**
+ * @author ZhuBaoMin
+ * @date 2024-03-06 8:41
+ * @LastEditTime 2024-03-06 8:41
+ * @Description
+ */
+
+@Slf4j
+@Service
+public class VirtualCardSv {
+    @Autowired
+    private SeVirtualCardMapper seVirtualCardMapper;
+
+    @Autowired
+    private SeVcRechargeMapper seVcRechargeMapper;
+
+    /**
+     * 娉ㄥ唽铏氭嫙鍗�
+     * @param po
+     * @return
+     */
+    public Long insertVirtualCard(SeVirtualCard po) {
+        seVirtualCardMapper.insert(po);
+        return po.getId();
+    }
+
+    /**
+     * 淇敼铏氭嫙鍗�
+     * 鍏呭�笺�佹秷璐广�佺敵璇烽��娆俱�佸鏍搁��娆炬椂闇�瑕佷慨鏀硅櫄鎷熷崱鐨勶細浣欓銆佹渶鍚庢搷浣溿�佹渶鍚庢搷浣滄椂闂�
+     * @param po
+     * @return
+     */
+    public Integer updateVirtualCard(SeVirtualCard po) {
+        return seVirtualCardMapper.updateByPrimaryKeySelective(po);
+    }
+
+    /**
+     * 鏍规嵁铏氭嫙鍗$紪鍙疯幏鍙栬櫄鎷熷崱瀵硅薄
+     * @param virtualId
+     * @return
+     */
+    public SeVirtualCard selectVirtuCardById(Long virtualId) {
+        return seVirtualCardMapper.selectByPrimaryKey(virtualId);
+    }
+    /**
+     * 娣诲姞铏氭嫙鍗″厖鍊艰褰�
+     * JSAPI涓嬪崟鍚庣敓鎴愰儴鍒嗗厖鍊艰褰�
+     * @param po
+     * @return
+     */
+    public BaseResponse<Boolean> insertVCRecharge(DtoVirtualCard po) {
+        String orderNumber = po.getOrderNumber();
+        Long virtualId = po.getVirtualId();
+        Long clientId = po.getClientId();
+        Integer rechargeAmount = po.getRechargeAmount();
+
+        // 楠岃瘉璇ヨ櫄鎷熷崱璐︽埛鏄惁瀛樺湪骞跺彇鍑哄綋鍓嶈处鎴蜂綑棰�
+        SeVirtualCard seVirtualCard = seVirtualCardMapper.selectByPrimaryKey(virtualId);
+        if(seVirtualCard == null) {
+            return BaseResponseUtils.buildFail(SellResultCode.NO_ACCOUNT.getMessage());
+        }
+        Double money = seVirtualCard.getMoney();
+
+        // 娣诲姞鍏呭�艰褰�
+        SeVcRecharge seVcRecharge = new SeVcRecharge();
+        seVcRecharge.setVcId(virtualId);
+        seVcRecharge.setClientId(clientId);
+        seVcRecharge.setMoney(money);
+        seVcRecharge.setOrderNumber(orderNumber);
+        seVcRecharge.setRechargeAmount(rechargeAmount);
+        seVcRecharge.setOrderTime(new Date());
+        seVcRecharge.setOrderState(OrderStateENUM.NON_PAYMENT.getCode());
+        Integer rec = seVcRechargeMapper.insert(seVcRecharge);
+        if(rec == null) {
+            return BaseResponseUtils.buildFail(SellResultCode.RECHARGE_FAIL.getMessage());
+        }
+        return BaseResponseUtils.buildSuccess(true) ;
+    }
+
+    /**
+     * 淇敼铏氭嫙鍗″厖鍊艰褰�
+     * 寰俊鏀粯閫氱煡鍚庯細
+     *      1. 鏇存柊鍏呭�艰〃锛氬厖鍊煎悗浣欓銆佹敮浠樺畬鎴愭椂闂淬�佽鍗曠姸鎬�
+     *      2. 鏇存柊铏氭嫙鍗¤〃锛氳处鎴蜂綑棰濄�佹渶鍚庢搷浣溿�佹渶鍚庢搷浣滄椂闂�
+     * @param orderNumber 璁㈠崟缂栧彿
+     * @return
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public BaseResponse<Boolean> updateVCRecharge(String orderNumber, Date rechargeTime) {
+        SeVcRecharge seVcRecharge = seVcRechargeMapper.getVCRechargeByorderNumber(orderNumber);
+        if(seVcRecharge == null) {
+            return BaseResponseUtils.buildFail(SellResultCode.RECHARGE_NOT_EXIST.getMessage());
+        }
+
+        Long virtualId = seVcRecharge.getVcId();
+        Double money = seVcRecharge.getMoney();
+        Integer rechargeAmount = seVcRecharge.getRechargeAmount();
+        Double afterRrecharge = money + rechargeAmount;
+
+        seVcRecharge.setAfterRecharge(afterRrecharge);
+        seVcRecharge.setRechargeTime(rechargeTime);
+        seVcRecharge.setOrderState(OrderStateENUM.PAID.getCode());
+        Integer rec = seVcRechargeMapper.updateByPrimaryKeySelective(seVcRecharge);
+        if(rec == null) {
+            return BaseResponseUtils.buildFail(SellResultCode.RECHARGE_FAIL.getMessage());
+        }
+
+        SeVirtualCard seVirtualCard = seVirtualCardMapper.selectByPrimaryKey(virtualId);
+        if(seVirtualCard == null) {
+            return BaseResponseUtils.buildFail(SellResultCode.VIRTUAL_CARD_NOT_EXIST.getMessage());
+        }
+        seVirtualCard.setMoney(afterRrecharge);
+        seVirtualCard.setLastOperate(LastOperateENUM.RECHARGE.getCode());
+        seVirtualCard.setLastOperateTime(new Date());
+        Integer rec2 = seVirtualCardMapper.updateByPrimaryKeySelective(seVirtualCard);
+        if(rec2 == null) {
+            return BaseResponseUtils.buildFail(SellResultCode.RECHARGE_FAIL.getMessage());
+        }
+        return BaseResponseUtils.buildSuccess(true) ;
+    }
+
+    /**
+     * 淇敼铏氭嫙鍗″厖鍊艰褰�
+     * 寰俊灏忕▼搴忔敮浠橀�氱煡鍚庝慨鏀癸細浣欓銆佸厖鍊煎悗浣欓銆佸厖鍊煎畬鎴愭椂闂�
+     * @param po
+     * @return
+     */
+    public Integer updateVCRecharge(SeVcRecharge po) {
+        return seVcRechargeMapper.updateByPrimaryKeySelective(po);
+    }
+}
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/virtualCard/dto/DtoVirtualCard.java b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/virtualCard/dto/DtoVirtualCard.java
new file mode 100644
index 0000000..381dd41
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/virtualCard/dto/DtoVirtualCard.java
@@ -0,0 +1,47 @@
+package com.dy.pipIrrSell.virtualCard.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+/**
+ * @author ZhuBaoMin
+ * @date 2024-03-06 9:40
+ * @LastEditTime 2024-03-06 9:40
+ * @Description
+ */
+
+@Data
+@Schema(name = "铏氭嫙鍗″厖鍊间紶鍏ュ璞�")
+public class DtoVirtualCard {
+    public static final long serialVersionUID = 202403060943001L;
+
+    /**
+     * 璁㈠崟鍙�
+     */
+    @Schema(description = "璁㈠崟鍙�", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @NotBlank(message = "璁㈠崟鍙蜂笉鑳戒负绌�")
+    private String orderNumber;
+
+    /**
+     * 鍐滄埛ID
+     */
+    @Schema(description = "鍐滄埛ID", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @NotNull(message = "鍐滄埛ID涓嶈兘涓虹┖")
+    private Long clientId;
+
+    /**
+     * 铏氭嫙鍗D
+     */
+    @Schema(description = "铏氭嫙鍗D", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @NotNull(message = "铏氭嫙鍗D涓嶈兘涓虹┖")
+    private Long virtualId;
+
+    /**
+     * 鍏呭�奸噾棰�
+     */
+    @Schema(description = "鍏呭�奸噾棰�", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @NotNull(message = "鍏呭�奸噾棰濅笉鑳戒负绌�")
+    private Integer rechargeAmount;
+}
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/virtualCard/enums/LastOperateENUM.java b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/virtualCard/enums/LastOperateENUM.java
new file mode 100644
index 0000000..b9ac164
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/virtualCard/enums/LastOperateENUM.java
@@ -0,0 +1,24 @@
+package com.dy.pipIrrSell.virtualCard.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @author ZhuBaoMin
+ * @date 2024-03-06 9:21
+ * @LastEditTime 2024-03-06 9:21
+ * @Description
+ */
+
+@Getter
+@AllArgsConstructor
+public enum LastOperateENUM {
+    OPEN_ACCOUNT((byte)1, "寮�鎴�"),
+    RECHARGE((byte)2, "鍏呭��"),
+    CONSUME((byte)3, "娑堣垂"),
+    APPLY_REFUND((byte)4, "鐢宠閫�娆�"),
+    AUDIT_REFUND((byte)5, "閫�娆惧鏍�");
+
+    private final Byte code;
+    private final String message;
+}
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/virtualCard/enums/OrderStateENUM.java b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/virtualCard/enums/OrderStateENUM.java
new file mode 100644
index 0000000..4af1b90
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/virtualCard/enums/OrderStateENUM.java
@@ -0,0 +1,21 @@
+package com.dy.pipIrrSell.virtualCard.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @author ZhuBaoMin
+ * @date 2024-03-06 10:00
+ * @LastEditTime 2024-03-06 10:00
+ * @Description
+ */
+
+@Getter
+@AllArgsConstructor
+public enum OrderStateENUM {
+    NON_PAYMENT((byte)1, "鏈敮浠�"),
+    PAID((byte)2, "宸叉敮浠�");
+
+    private final Byte code;
+    private final String message;
+}
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wallet/WalletCtrl.java b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wallet/WalletCtrl.java
index 500dd92..6250be5 100644
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wallet/WalletCtrl.java
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wallet/WalletCtrl.java
@@ -76,7 +76,7 @@
         }
 
         if(walletSv.getWalletByClientId(clientId) != null) {
-            return BaseResponseUtils.buildFail(SellResultCode.WALLET_ACCOUNT_EXIST.getMessage());
+            //return BaseResponseUtils.buildFail(SellResultCode.WALLET_ACCOUNT_EXIST.getMessage());
         }
 
         SeWallet seWallet = new SeWallet();
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/src/main/java/com/dy/pipirrWebChat/payment/PayInfo.java b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/PayInfo.java
similarity index 79%
rename from pipIrr-platform/pipIrr-web/pipIrr-web-webchat/src/main/java/com/dy/pipirrWebChat/payment/PayInfo.java
rename to pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/PayInfo.java
index ef11dac..4952e7a 100644
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/src/main/java/com/dy/pipirrWebChat/payment/PayInfo.java
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/PayInfo.java
@@ -1,18 +1,33 @@
-package com.dy.pipirrWebChat.payment;
+package com.dy.pipIrrSell.wechatpay;
 
 /**
  * @author ZhuBaoMin
- * @date 2024-02-22 20:20
- * @LastEditTime 2024-02-22 20:20
+ * @date 2024-03-06 13:49
+ * @LastEditTime 2024-03-06 13:49
  * @Description
  */
 public class PayInfo {
-    /*
+    /**
      * 灏忕▼搴忕櫥褰旳PI
      */
     public static String loginUrl = "https://api.weixin.qq.com/sns/jscode2session";
 
-    /*
+    /**
+     * 妫�楠岀櫥褰曟��
+     */
+    public static String checkSessionUrl = "https://api.weixin.qq.com/wxa/checksession";
+
+    /**
+     * 閲嶇疆鐧诲綍鎬�
+     */
+    public static String resetUserSessionKeyUrl = "https://api.weixin.qq.com/wxa/resetusersessionkey";
+
+    /**
+     * 鑾峰彇鎺ュ彛璋冪敤鍑嵁
+     */
+    public static String tokenUrl = "https://api.weixin.qq.com/cgi-bin/token";
+
+    /**
      * 缁熶竴涓嬪崟API
      */
     //public static String orderUrl = "https://api.mch.weixin.qq.com/pay/unifiedorder";
@@ -26,17 +41,18 @@
     /*
      * 鏀粯缁撴灉閫氱煡API
      */
-    public static String notifyUrl = "https://www.muxiaobao.com/api/Payment/OrderNotify";
+    //public static String notifyUrl = "https://www.muxiaobao.com/api/Payment/OrderNotify";
+    public static String notifyUrl = "https://44978f7456.imdo.co/webchat/payment/orderNotify";
 
     /*
      * 鏌ヨ璁㈠崟API
      */
     public static String queryUrl = "https://api.mch.weixin.qq.com/pay/orderquery";
 
-    /*
+    /**
      * 鐢宠閫�娆続PI
      */
-    public static String refundUrl = "https://api.mch.weixin.qq.com/secapi/pay/refund";
+    public static String refundUrl = "https://api.mch.weixin.qq.co/v3/refund/domestic/refunds";
 
     /*
      * 閫�娆鹃�氱煡API
@@ -128,7 +144,9 @@
     /**
      * 绉侀挜鏂囦欢璺緞
      */
-    public static String certFileName = "C:\\webchat\\apiclient_key.pem";
+    public static String privateCertFileName = "C:\\webchat\\apiclient_key.pem";
+
+    public static String publicCertFileName = "C:\\webchat\\wxp_cert.pem";
 
     /*
      * 寰俊璁㈠崟鍙凤紝浼樺厛浣跨敤
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/PaymentCtrl.java b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/PaymentCtrl.java
new file mode 100644
index 0000000..5258444
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/PaymentCtrl.java
@@ -0,0 +1,541 @@
+package com.dy.pipIrrSell.wechatpay;
+
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONObject;
+import com.dy.common.aop.SsoAop;
+import com.dy.common.webUtil.BaseResponse;
+import com.dy.common.webUtil.BaseResponseUtils;
+import com.dy.common.webUtil.ResultCodeMsg;
+import com.dy.pipIrrGlobal.pojoSe.SeVirtualCard;
+import com.dy.pipIrrGlobal.pojoSe.SeWebchatLogonState;
+import com.dy.pipIrrGlobal.voSe.VoClient;
+import com.dy.pipIrrSell.client.ClientSv;
+import com.dy.pipIrrSell.result.SellResultCode;
+import com.dy.pipIrrSell.util.AesUtil;
+import com.dy.pipIrrSell.util.PayHelper;
+import com.dy.pipIrrSell.util.RestTemplateUtil;
+import com.dy.pipIrrSell.virtualCard.VirtualCardSv;
+import com.dy.pipIrrSell.virtualCard.dto.DtoVirtualCard;
+import com.dy.pipIrrSell.wechatpay.dto.*;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.media.Content;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
+import io.swagger.v3.oas.annotations.responses.ApiResponses;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.Valid;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.*;
+
+import javax.crypto.NoSuchPaddingException;
+import java.io.IOException;
+import java.security.GeneralSecurityException;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.security.SignatureException;
+import java.security.spec.InvalidKeySpecException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * @author ZhuBaoMin
+ * @date 2024-03-06 13:49
+ * @LastEditTime 2024-03-06 13:49
+ * @Description
+ */
+
+@Slf4j
+@Tag(name = "寰俊鏀粯绠$悊", description = "寰俊鏀粯鍚勭鎿嶄綔")
+@RestController
+@RequestMapping(path="payment")
+@RequiredArgsConstructor
+public class PaymentCtrl {
+    private final PaymentSv paymentSv;
+    private final RestTemplateUtil restTemplateUtil;
+    private final PayHelper payHelper;
+    private final VirtualCardSv virtualCardSv;
+    private final ClientSv clientSv;
+
+    private String privateCertFileName = PayInfo.privateCertFileName;
+    private String appid = PayInfo.appid;
+    private String mchid = PayInfo.mchid;
+    private String schema = PayInfo.schema;
+    private String signType = PayInfo.signType;
+    private String description = PayInfo.description;
+    private String loginUrl = PayInfo.loginUrl;
+    private String notifyUrl = PayInfo.notifyUrl;
+    private String grantType = PayInfo.grantType;
+    private String refundUrl = PayInfo.refundUrl;
+
+    // 骞冲彴璇佷功鍏挜
+    private Map CERTIFICATE_MAP = new HashMap();
+
+    /**
+     * 鐧诲綍鍑瘉鏍¢獙
+     * @param appid 灏忕▼搴� appId
+     * @param secret 灏忕▼搴� appSecret
+     * @param js_code 涓存椂鐧诲綍鍑瘉code
+     * @return
+     * @throws Exception
+     */
+    @Operation(summary = "鐧诲綍鍑瘉鏍¢獙", description = "鐧诲綍鍑瘉鏍¢獙")
+    @ApiResponses(value = {
+            @ApiResponse(
+                    responseCode = ResultCodeMsg.RsCode.SUCCESS_CODE,
+                    description = "鎿嶄綔缁撴灉锛歵rue锛氭垚鍔燂紝false锛氬け璐ワ紙BaseResponse.content锛�",
+                    content = {@Content(mediaType = MediaType.APPLICATION_JSON_VALUE,
+                            schema = @Schema(implementation = Boolean.class))}
+            )
+    })
+    @PostMapping(path = "getSessionId")
+    @Transactional(rollbackFor = Exception.class)
+    @SsoAop()
+    public BaseResponse<Boolean> getSessionId(@RequestParam("appid")  String appid, @RequestParam("secret") String secret, @RequestParam("js_code") String js_code) throws Exception {
+        Map<String, Object> queryParams = new HashMap<>();
+        queryParams.put("appid", appid);
+        queryParams.put("secret", secret);
+        queryParams.put("js_code", js_code);
+        queryParams.put("grant_type", grantType);
+        Map<String, String> headerParams = new HashMap<>();
+        JSONObject job = restTemplateUtil.get(loginUrl, queryParams, headerParams);
+
+        if(job.getLong("errcode") != null && job.getLong("errcode") >= -1) {
+            return BaseResponseUtils.buildFail("鐧诲綍鍑瘉鏍¢獙澶辫触");
+        }
+
+        String openid = job.getString("openid");
+        String sessionKey = job.getString("session_key");
+
+        // 妫�楠岀櫥褰曟��
+        JSONObject checkSessionKey = payHelper.checkSessionKey(appid, secret, openid, sessionKey);
+        if(checkSessionKey != null) {
+            Integer errcode = checkSessionKey.getInteger("errcode");
+            String errmsg = checkSessionKey.getString("errmsg");
+        }
+
+        // 閲嶇疆鐧诲綍鎬�
+        JSONObject resetUserSessionKey = payHelper.resetUserSessionKey(appid, secret, openid, sessionKey);
+        if(resetUserSessionKey != null) {
+            Integer errcode = checkSessionKey.getInteger("errcode");
+            String errmsg = checkSessionKey.getString("errmsg");
+            String openid_New = checkSessionKey.getString("openid");
+            String sessionKey_New = checkSessionKey.getString("session_key");
+        }
+
+        // 娣诲姞鐧诲綍鎬佽褰�
+        SeWebchatLogonState po = new SeWebchatLogonState();
+        po.setOpenId(openid);
+        po.setSessionKey(sessionKey);
+        Date createTime = new Date();
+        po.setCreateTime(createTime);
+        Long id = paymentSv.insert(po);
+        if(id == null || id <= 0) {
+            return BaseResponseUtils.buildFail("鐧诲綍鎬佽褰曟坊鍔犲け璐�");
+        }
+        String SessionId = String.valueOf(id);
+
+        return BaseResponseUtils.buildSuccess(SessionId) ;
+    }
+
+    /**
+     * 涓嬭浇寰俊鏀粯骞冲彴璇佷功 娴嬭瘯瀹屽簾闄�
+     * @return
+     * @throws Exception
+     */
+    @Operation(summary = "涓嬭浇骞冲彴璇佷功", description = "涓嬭浇骞冲彴璇佷功")
+    @ApiResponses(value = {
+            @ApiResponse(
+                    responseCode = ResultCodeMsg.RsCode.SUCCESS_CODE,
+                    description = "鎿嶄綔缁撴灉锛歵rue锛氭垚鍔燂紝false锛氬け璐ワ紙BaseResponse.content锛�",
+                    content = {@Content(mediaType = MediaType.APPLICATION_JSON_VALUE,
+                            schema = @Schema(implementation = Boolean.class))}
+            )
+    })
+    @GetMapping(path = "certificates")
+    @Transactional(rollbackFor = Exception.class)
+    @SsoAop()
+    public BaseResponse<Boolean> certificates() throws Exception {
+        String method = "GET";
+        String httpUrl = "/v3/certificates";
+        String nonceStr = payHelper.generateRandomString();
+        Long timestamp = System.currentTimeMillis() / 1000;
+
+        String header = schema + " " + payHelper.getToken(method, httpUrl, "", nonceStr, timestamp, privateCertFileName);
+
+        Map<String, String> headers = new HashMap<>();
+        headers.put("Authorization", header);
+        headers.put("Accept", "application/json");
+        JSONObject job_result = restTemplateUtil.getHeaders(PayInfo.certificates,null, headers);
+        JSONObject job_headers = job_result.getJSONObject("headers");
+        String wechatpayNonce = job_headers.getJSONArray("Wechatpay-Nonce").getString(0);
+        String wechatpaySerial = job_headers.getJSONArray("Wechatpay-Serial").getString(0);
+        String wechatpaySignature = job_headers.getJSONArray("Wechatpay-Signature").getString(0);
+        String wechatpaySignatureType = job_headers.getJSONArray("Wechatpay-Signature-Type").getString(0);
+        String wechatpayTimestamp = job_headers.getJSONArray("Wechatpay-Timestamp").getString(0);
+
+        JSONObject job_body = job_result.getJSONObject("body");
+
+        // 鏋勯�犻獙绛惧悕涓�
+        String signatureStr = payHelper.responseSign(wechatpayTimestamp, wechatpayNonce, job_body.toJSONString());
+        // 楠岃瘉绛惧悕
+        Boolean valid = payHelper.responseSignVerify(wechatpaySerial, signatureStr, wechatpaySignature);
+
+        return BaseResponseUtils.buildSuccess();
+    }
+
+    /**
+     * JSAPI涓嬪崟
+     * @param order 涓嬪崟璇锋眰瀵硅薄锛屽寘鍚渶瑕佷紶鍏ョ殑鍙傛暟
+     * @param bindingResult
+     * @return
+     */
+    @Operation(summary = "JSAPI涓嬪崟", description = "JSAPI涓嬪崟")
+    @ApiResponses(value = {
+            @ApiResponse(
+                    responseCode = ResultCodeMsg.RsCode.SUCCESS_CODE,
+                    description = "鎿嶄綔缁撴灉锛歵rue锛氭垚鍔燂紝false锛氬け璐ワ紙BaseResponse.content锛�",
+                    content = {@Content(mediaType = MediaType.APPLICATION_JSON_VALUE,
+                            schema = @Schema(implementation = Boolean.class))}
+            )
+    })
+    @PostMapping(path = "placeOrder")
+    @Transactional(rollbackFor = Exception.class)
+    @SsoAop()
+    public BaseResponse<Boolean> placeOrder(@RequestBody @Valid DtoOrder order, BindingResult bindingResult) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeySpecException, IOException, SignatureException, InvalidKeyException {
+        if(bindingResult != null && bindingResult.hasErrors()){
+            return BaseResponseUtils.buildFail(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
+        }
+        // 鎺ユ敹鍙傛暟锛氱櫥褰曟�両D銆佸啘鎴稩D銆佽櫄鎷熷崱ID銆佸厖鍊奸噾棰�
+        String sessionId = order.getSessionId();
+        Long virtualId = order.getVirtualId();
+        Integer rechargeAmount = order.getRechargeAmount();
+
+        String prepayId = "";
+        SeWebchatLogonState po = paymentSv.selectOne(Long.parseLong(sessionId));
+        String openid = po.getOpenId();
+
+        SeVirtualCard seVirtualCard = virtualCardSv.selectVirtuCardById(virtualId);
+        Long clientId = seVirtualCard.getClientId();
+
+        VoClient voClient = clientSv.getOneClient(clientId);
+        String clientNum = voClient.getClientNum();
+
+        // 鐢熸垚璁㈠崟鍙峰苟娣诲姞鍏呭�艰褰�
+        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmssSSS");
+        String orderNumber = clientNum + dateFormat.format(new Date());
+
+        // 鐢熸垚铏氭嫙鍗″厖鍊艰褰曪紙閮ㄥ垎瀛楁锛�
+        DtoVirtualCard virtualCard = new DtoVirtualCard();
+        virtualCard.setOrderNumber(orderNumber);
+        virtualCard.setClientId(clientId);
+        virtualCard.setVirtualId(virtualId);
+        virtualCard.setRechargeAmount(rechargeAmount);
+        BaseResponse result = virtualCardSv.insertVCRecharge(virtualCard);
+        if(!result.getCode().equals("0001")) {
+            return BaseResponseUtils.buildFail(SellResultCode.RECHARGE_ADD_FAIL.getMessage());
+        }
+
+        JSONObject job_body = new JSONObject();
+        job_body.put("appid", appid);
+        job_body.put("mchid", mchid);
+        job_body.put("description", description);
+        job_body.put("out_trade_no", orderNumber);
+        job_body.put("notify_url", notifyUrl);
+
+        //璁㈠崟閲戦
+        JSONObject job_amount = new JSONObject();
+        job_amount.put("total", 1);
+        job_amount.put("currency", "CNY");
+        job_body.put("amount", job_amount);
+
+        //鏀粯鑰�
+        JSONObject job_payer = new JSONObject();
+        job_payer.put("openid", openid);
+        job_body.put("payer", job_payer);
+
+        // 鑾峰彇闅忔満涓插拰鏃堕棿鎴筹紝鏀惧湪姝ゅ浠ヤ繚璇�
+        String nonceStr = payHelper.generateRandomString();
+        Long timestamp = System.currentTimeMillis() / 1000;
+
+        String method = "POST";
+        String httpUrl = "/v3/pay/transactions/jsapi";
+
+        String body = job_body.toJSONString();
+        String header = schema + " " + payHelper.getToken(method, httpUrl, body, nonceStr, timestamp, privateCertFileName);
+
+        Map<String, String> headers = new HashMap<>();
+        headers.put("Authorization", header);
+        headers.put("Accept", "application/json");
+        headers.put("Content-Type", "application/json");
+
+        JSONObject job_result = restTemplateUtil.post(PayInfo.orderUrl, body, headers);
+        if(job_result != null) {
+            System.out.println(job_result.toString());
+            prepayId = job_result.getString("prepay_id");
+        }
+
+        return BaseResponseUtils.buildSuccess(prepayId) ;
+    }
+
+    /**
+     * 鐢宠閫�娆�
+     * @param po 閫�娆捐姹傚璞�
+     * @param bindingResult
+     * @return
+     * @throws NoSuchPaddingException
+     * @throws NoSuchAlgorithmException
+     * @throws InvalidKeySpecException
+     * @throws IOException
+     * @throws SignatureException
+     * @throws InvalidKeyException
+     */
+    @Operation(summary = "鐢宠閫�娆�", description = "鐢宠閫�娆�")
+    @ApiResponses(value = {
+            @ApiResponse(
+                    responseCode = ResultCodeMsg.RsCode.SUCCESS_CODE,
+                    description = "鎿嶄綔缁撴灉锛歵rue锛氭垚鍔燂紝false锛氬け璐ワ紙BaseResponse.content锛�",
+                    content = {@Content(mediaType = MediaType.APPLICATION_JSON_VALUE,
+                            schema = @Schema(implementation = Boolean.class))}
+            )
+    })
+    @PostMapping(path = "refunds")
+    @Transactional(rollbackFor = Exception.class)
+    @SsoAop()
+    public BaseResponse<Boolean> refunds(@RequestBody @Valid Refund po, BindingResult bindingResult) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeySpecException, IOException, SignatureException, InvalidKeyException {
+        if(bindingResult != null && bindingResult.hasErrors()){
+            return BaseResponseUtils.buildFail(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
+        }
+
+        /**
+         * 1. 鍒ゆ柇浜ゆ槗鏃堕棿鏄惁瓒呰繃涓�骞�
+         * 2. 鍒ゆ柇閫�娆炬�婚噾棰濇槸鍚﹁秴杩囪鍗曢噾棰�
+         * 3. 鍒ゆ柇褰撳墠璁㈠崟閫�娆炬鏁版槸鍚﹁秴杩�50娆�
+         * 4. 鍒ゆ柇涓庤璁㈠崟涓婃閫�娆炬槸鍚︾浉闅�1鍒嗛挓
+         */
+
+        String tradeNo = po.getTradeNo();
+        String refundNo = po.getRefundNo();
+        Integer refund = po.getRefund();
+        if(refundNo == null || refundNo.length() <= 0) {
+            // 鏂版彁閫�娆剧敵璇凤紝鐢熸垚閫�娆惧崟鍙�
+            //refundNo = generateRefundNo(tradeNo);
+        }
+
+        // 鏍规嵁璁㈠崟鍙疯幏鍙栨�绘敮浠橀噾棰濆拰鎬婚��娆鹃噾棰�
+        Integer totalTradeAmount = 0;
+        Integer totalRefundAmount = 0;
+        //Integer totalTradeAmount = getTotalTradeAmount(tradeNo);
+        //Integer totalRefundAmount = getTotalRefundAmount(tradeNo);
+        if(totalRefundAmount > totalTradeAmount) {
+            return BaseResponseUtils.buildFail(SellResultCode.TOTAL_REFUND_EXCEED_TRADE.getMessage());
+        }
+
+        // 鐢熸垚body
+        RefundRequest.Amount amount = new RefundRequest.Amount();
+        amount.setRefund(refund);
+        amount.setTotal(totalTradeAmount);
+        amount.setCurrency("CNY");
+
+        RefundRequest refundRequest = new RefundRequest();
+        refundRequest.setOut_trade_no(tradeNo);
+        refundRequest.setOut_refund_no(refundNo);
+        refundRequest.setNotify_url(notifyUrl);
+        refundRequest.setAmount(amount);
+
+        // 鐢熸垚header
+        String nonceStr = payHelper.generateRandomString();
+        Long timestamp = System.currentTimeMillis() / 1000;
+
+        String method = "POST";
+        String httpUrl = "/v3/refund/domestic/refunds";
+
+        String body = JSONObject.toJSONString(refundRequest);
+        String header = schema + " " + payHelper.getToken(method, httpUrl, body, nonceStr, timestamp, privateCertFileName);
+
+        Map<String, String> headers = new HashMap<>();
+        headers.put("Authorization", header);
+        headers.put("Accept", "application/json");
+        headers.put("Content-Type", "application/json");
+
+        JSONObject job_refundResponse = restTemplateUtil.post(PayInfo.orderUrl, body, headers);
+        RefundResponse refundResponse = JSON.parseObject(job_refundResponse.toJSONString(), RefundResponse.class);
+
+        String status = refundResponse.getStatus();
+        if(status != null && status.equals("SUCCESS")) {
+            // 閫�娆剧敵璇峰凡鍙楃悊
+            return BaseResponseUtils.buildSuccess(true) ;
+        } else if(status != null && status.equals("PROCESSING")) {
+            // 閫�娆惧鐞嗕腑
+            return BaseResponseUtils.buildFail(SellResultCode.PROCESSING.getMessage());
+        } else {
+            // 閫�娆惧紓甯�
+            return BaseResponseUtils.buildError(SellResultCode.ABNORMAL.getMessage());
+        }
+
+    }
+
+    /**
+     * 鏀粯閫氱煡/閫�娆剧粨鏋滈�氱煡
+     * @param headers
+     * @param orderNotify
+     * @param response
+     * @return
+     * @throws IOException
+     * @throws GeneralSecurityException
+     */
+    @Operation(summary = "鏀粯閫氱煡", description = "鏀粯閫氱煡")
+    @ApiResponses(value = {
+            @ApiResponse(
+                    responseCode = ResultCodeMsg.RsCode.SUCCESS_CODE,
+                    description = "鎿嶄綔缁撴灉锛歵rue锛氭垚鍔燂紝false锛氬け璐ワ紙BaseResponse.content锛�",
+                    content = {@Content(mediaType = MediaType.APPLICATION_JSON_VALUE,
+                            schema = @Schema(implementation = Boolean.class))}
+            )
+    })
+    @PostMapping(path = "orderNotify", consumes = MediaType.APPLICATION_JSON_VALUE)
+    @Transactional(rollbackFor = Exception.class)
+    @SsoAop()
+    public JSONObject orderNotify(@RequestHeader HttpHeaders headers, @RequestBody OrderNotify orderNotify, HttpServletResponse response) throws IOException, GeneralSecurityException {
+        JSONObject result = new JSONObject();
+
+        /**
+         * 1.楠岀澶勭悊
+         *      浠巋eader涓彇鍑�4涓瓙鍙傛暟锛屽悓鏃跺彇鍑篵ody
+         *      楠屾椂闂村樊锛岃秴杩�5鍒嗛挓鐨勪笉澶勭悊
+         *      楠岃瘉绛惧悕
+         *      楠岃瘉涔﹀簭鍒楀彿锛屽繀椤讳笌鏌愪竴涓瘉涔︾殑搴忓垪鍙蜂竴鑷�
+         */
+        String wechatpayNonce = String.valueOf(headers.get("Wechatpay-Nonce").get(0));
+        String wechatpaySerial = String.valueOf(headers.get("Wechatpay-Serial").get(0));
+        String wechatpaySignature = String.valueOf(headers.get("Wechatpay-Signature").get(0));
+        String wechatpayTimestamp = String.valueOf(headers.get("Wechatpay-Timestamp").get(0));
+        String bodyStr = JSONObject.toJSONString(orderNotify);
+
+        // 楠屾椂闂存埑锛屾椂闂村樊澶т簬5鍒嗛挓鐨勬嫆缁�
+        Long timeDiff = (System.currentTimeMillis() / 1000 - Long.parseLong(wechatpayTimestamp))/60;
+        if(timeDiff > 5) {
+            response.setStatus(500);
+            result.put("code", "FAIL");
+            result.put("message", "澶辫触");
+            return result;
+        }
+
+        // 鏋勯�犻獙绛惧悕涓�
+        String signatureStr = payHelper.responseSign(wechatpayTimestamp, wechatpayNonce, bodyStr);
+        // 楠岃瘉绛惧悕
+        Boolean valid = payHelper.responseSignVerify(wechatpaySerial, signatureStr, wechatpaySignature);
+        if(!valid) {
+            response.setStatus(500);
+            result.put("code", "FAIL");
+            result.put("message", "澶辫触");
+            return result;
+        }
+
+        // 搴忓垪鍙烽獙璇佽鏀惧湪楠岀鍚庯紝鍥犱负楠岀鏃跺彲鑳戒細涓嬭浇鏂扮殑璇佷功
+        boolean SerialIsValid = false;
+        for (String key : payHelper.CERTIFICATE_MAP.keySet()) {
+            if(key.equals(wechatpaySerial)) {
+                SerialIsValid = true;
+            }
+        }
+        if(!SerialIsValid) {
+            response.setStatus(500);
+            result.put("code", "FAIL");
+            result.put("message", "澶辫触");
+            return result;
+        }
+
+        /**
+         * 瑙e瘑澶勭悊
+         *      1
+         */
+        String eventType = orderNotify.getEvent_type();
+
+        if(eventType != null && eventType.equals("TRANSACTION.SUCCESS")) {
+            // 鏀粯鎴愬姛鍥炶皟
+            /**
+             * 鏀粯鎴愬姛鐨勫洖璋�
+             * 鍙栧嚭閫氱煡鏁版嵁瀵硅薄锛岀户鑰屽彇鍑鸿В瀵嗘墍闇�鐨刟ssociatedData鍜宯once锛屼互鍙婂瘑鏂嘽iphertext
+             * 瑙e瘑ciphertext寰楀埌
+             */
+            OrderNotify.NotifyResource notifyResource = orderNotify.getResource();
+            String associatedData = notifyResource.getAssociated_data();
+            String nonce = notifyResource.getNonce();
+            String ciphertext = notifyResource.getCiphertext();
+
+            String resource = AesUtil.decryptToString(PayInfo.key.getBytes("utf-8"), associatedData.getBytes("utf-8"), nonce.getBytes("utf-8"), ciphertext);
+            JSONObject job_resource = JSONObject.parseObject(resource);
+
+            // 瑙e瘑鍚庡彇鍑猴細鍟嗘埛璁㈠崟鍛樸�佸井淇℃敮浠樿鍗曞彿銆佷氦鏄撶姸鎬併�佹敮浠樺畬鎴愭椂闂�
+            String out_trade_no = job_resource.getString("out_trade_no");
+            String transaction_id = job_resource.getString("transaction_id");
+            String trade_state = job_resource.getString("trade_state");
+            Date success_time = job_resource.getDate("success_time");
+
+            // 鏇存柊铏氭嫙鍗¤〃鍙婂厖鍊艰〃鍝嶅簲瀛楁
+            BaseResponse result_ = virtualCardSv.updateVCRecharge(out_trade_no, success_time);
+            if(!result_.getCode().equals("0001")) {
+                response.setStatus(500);
+                result.put("code", "FAIL");
+                result.put("message", "澶辫触");
+                return result;
+            }
+        } else if(eventType != null && eventType.equals("REFUND.SUCCESS")) {
+            // 閫�娆炬垚鍔熷悗鍥炶皟
+
+        }
+
+        // 閫氱煡搴旂瓟
+        response.setStatus(200);
+        result.put("code", "SUCCESS");
+        result.put("message", "鎴愬姛");
+        return  result;
+    }
+
+    /**
+     * 鍐嶆绛惧悕
+     * @param prepayId 棰勬敮浠樹氦鏄撲細璇濇爣璇�
+     * @return 灏忕▼搴忚皟璧锋敮浠樺弬鏁�
+     * @throws Exception
+     */
+    @Operation(summary = "鍐嶆绛惧悕", description = "鍐嶆绛惧悕")
+    @ApiResponses(value = {
+            @ApiResponse(
+                    responseCode = ResultCodeMsg.RsCode.SUCCESS_CODE,
+                    description = "鎿嶄綔缁撴灉锛歵rue锛氭垚鍔燂紝false锛氬け璐ワ紙BaseResponse.content锛�",
+                    content = {@Content(mediaType = MediaType.APPLICATION_JSON_VALUE,
+                            schema = @Schema(implementation = Boolean.class))}
+            )
+    })
+    @GetMapping(path = "/signAgain")
+    @Transactional(rollbackFor = Exception.class)
+    @SsoAop()
+    public BaseResponse<JSONObject> signAgain(@RequestParam("prepayId")  String prepayId) throws Exception {
+
+        // 鑾峰彇闅忔満涓插拰鏃堕棿鎴筹紝鏀惧湪姝ゅ浠ヤ繚璇�
+        String appid = PayInfo.appid;
+        String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
+        String nonceStr = payHelper.generateRandomString();
+        String pkg = "prepay_id=" + prepayId;
+        String message = payHelper.buildMessage_signAgain(appid, timestamp, nonceStr, pkg);
+        String paySign = payHelper.sign(message.getBytes("utf-8"), privateCertFileName);
+
+        JSONObject job_result = new JSONObject();
+        job_result.put("timestamp", timestamp);
+        job_result.put("nonceStr", nonceStr);
+        job_result.put("package", pkg);
+        job_result.put("signType", signType);
+        job_result.put("paySign", paySign);
+
+        return BaseResponseUtils.buildSuccess(job_result) ;
+    }
+}
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/PaymentSv.java b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/PaymentSv.java
new file mode 100644
index 0000000..de4d16d
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/PaymentSv.java
@@ -0,0 +1,55 @@
+package com.dy.pipIrrSell.wechatpay;
+
+import com.dy.pipIrrGlobal.daoSe.SeVcRechargeMapper;
+import com.dy.pipIrrGlobal.daoSe.SeWebchatLogonStateMapper;
+import com.dy.pipIrrGlobal.pojoSe.SeVcRecharge;
+import com.dy.pipIrrGlobal.pojoSe.SeWebchatLogonState;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author ZhuBaoMin
+ * @date 2024-03-06 13:51
+ * @LastEditTime 2024-03-06 13:51
+ * @Description
+ */
+
+@Slf4j
+@Service
+public class PaymentSv {
+    @Autowired
+    private SeWebchatLogonStateMapper seWebchatLogonStateMapper;
+
+    @Autowired
+    private SeVcRechargeMapper seVcRechargeMapper;
+
+    /**
+     * 娣诲姞鐧诲綍鎬佺姸鎬佽褰�
+     * @param po
+     * @return
+     */
+    Long insert(SeWebchatLogonState po) {
+        seWebchatLogonStateMapper.insert(po);
+        return po.getId();
+    }
+
+    /**
+     * 鏍规嵁鐧诲綍鎬両D鑾峰彇鐧诲綍鎬佸璞�
+     * @param id
+     * @return
+     */
+    SeWebchatLogonState selectOne(Long id) {
+        return seWebchatLogonStateMapper.selectByPrimaryKey(id);
+    }
+
+    /**
+     * 娣诲姞铏氭嫙鍗″厖鍊艰褰�
+     * @param po
+     * @return
+     */
+    Long insertVCRecharge(SeVcRecharge po) {
+        seVcRechargeMapper.insert(po);
+        return po.getId();
+    }
+}
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/src/main/java/com/dy/pipirrWebChat/payment/dto/Code2Session.java b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/dto/Code2Session.java
similarity index 90%
rename from pipIrr-platform/pipIrr-web/pipIrr-web-webchat/src/main/java/com/dy/pipirrWebChat/payment/dto/Code2Session.java
rename to pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/dto/Code2Session.java
index 21cc420..ad86942 100644
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/src/main/java/com/dy/pipirrWebChat/payment/dto/Code2Session.java
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/dto/Code2Session.java
@@ -1,4 +1,4 @@
-package com.dy.pipirrWebChat.payment.dto;
+package com.dy.pipIrrSell.wechatpay.dto;
 
 import io.swagger.v3.oas.annotations.media.Schema;
 import jakarta.validation.constraints.NotBlank;
@@ -6,8 +6,8 @@
 
 /**
  * @author ZhuBaoMin
- * @date 2024-02-22 15:34
- * @LastEditTime 2024-02-22 15:34
+ * @date 2024-03-06 13:53
+ * @LastEditTime 2024-03-06 13:53
  * @Description
  */
 
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/dto/DtoOrder.java b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/dto/DtoOrder.java
new file mode 100644
index 0000000..407f244
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/dto/DtoOrder.java
@@ -0,0 +1,40 @@
+package com.dy.pipIrrSell.wechatpay.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+/**
+ * @author ZhuBaoMin
+ * @date 2024-03-06 13:54
+ * @LastEditTime 2024-03-06 13:54
+ * @Description 涓嬪崟璇锋眰瀵硅薄锛屼笅鍗曟椂浼犵粰JSAPI涓嬪崟鎺ュ彛
+ */
+
+@Data
+@Schema(name = "涓嬪崟璇锋眰瀵硅薄")
+public class DtoOrder {
+    public static final long serialVersionUID = 202403012108001L;
+
+    /**
+     * 鐧诲綍鎬両D锛岀敤鏉ヨ幏鍙杘penID
+     */
+    @Schema(description = "鐧诲綍鎬両D", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @NotBlank(message = "鐧诲綍鎬両D涓嶈兘涓虹┖")
+    private String sessionId;
+
+    /**
+     * 铏氭嫙鍗$紪鍙凤紝澶栭敭锛岀敤鏉ヨ幏鍙栬櫄鎷熷崱浣欓
+     */
+    @Schema(description = "铏氭嫙鍗$紪鍙�", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @NotNull(message = "铏氭嫙鍗$紪鍙蜂笉鑳戒负绌�")
+    private Long virtualId;
+
+    /**
+     * 鍏呭�奸噾棰濋噾棰�
+     */
+    @Schema(description = "鏀粯閲戦", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @NotNull(message = "铏氭敮浠橀噾棰濅笉鑳戒负绌�")
+    private Integer rechargeAmount;
+}
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/dto/OrderNotify.java b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/dto/OrderNotify.java
new file mode 100644
index 0000000..dff01c7
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/dto/OrderNotify.java
@@ -0,0 +1,81 @@
+package com.dy.pipIrrSell.wechatpay.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * @author ZhuBaoMin
+ * @date 2024-03-06 13:54
+ * @LastEditTime 2024-03-06 13:54
+ * @Description 鏀粯鍜岄��娆鹃�氱煡鎺ユ敹瀵硅薄
+ */
+
+@Data
+@Schema(name = "鏀粯鍜岄��娆惧洖璋冨璞�")
+public class OrderNotify {
+    public static final long serialVersionUID = 202402291431001L;
+
+    /**
+     * 閫氱煡ID
+     */
+    private String id;
+
+    /**
+     * 閫氱煡鍒涘缓鏃堕棿
+     */
+    private String create_time;
+
+    /**
+     * 閫氱煡绫诲瀷
+     * 鏀粯鎴愬姛閫氱煡鐨勭被鍨嬩负锛歍RANSACTION.SUCCESS
+     */
+    private String event_type;
+
+    /**
+     * 閫氱煡鏁版嵁绫诲瀷
+     * 鏀粯鎴愬姛閫氱煡涓猴細encrypt-resource
+     */
+    private String resource_type;
+
+    /**
+     * 閫氱煡鏁版嵁
+     */
+    private NotifyResource resource;
+
+    /**
+     * 鍥炶皟鎽樿锛岄��娆鹃�氱煡鏃犳灞炴��
+     */
+    private String summary;
+
+
+    @Data
+    public class NotifyResource {
+
+        /**
+         * 鍔犲瘑绠楁硶绫诲瀷
+         * 浠呮敮鎸丄EAD_AES_256_GCM
+         */
+        private String algorithm;
+
+        /**
+         * 鏁版嵁瀵嗘枃
+         */
+        private String ciphertext;
+
+        /**
+         * 闄勫姞鏁版嵁
+         */
+        public String associated_data;
+
+        /**
+         * 鍘熷绫诲瀷
+         * 鍘熷鍥炶皟绫诲瀷涓猴細transaction
+         */
+        private String original_type;
+
+        /**
+         * 闅忔満涓�
+         */
+        private String nonce;
+    }
+}
\ No newline at end of file
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/dto/Refund.java b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/dto/Refund.java
new file mode 100644
index 0000000..ebc7fc9
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/dto/Refund.java
@@ -0,0 +1,39 @@
+package com.dy.pipIrrSell.wechatpay.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+/**
+ * @author ZhuBaoMin
+ * @date 2024-03-06 13:55
+ * @LastEditTime 2024-03-06 13:55
+ * @Description 閫�娆捐姹傚璞★紝灏忕▼搴忚皟鐢ㄦ帴鍙f椂浼犲弬鎵�鐢ㄥ璞�
+ */
+
+@Data
+@Schema(name = "閫�娆捐姹傚璞�")
+public class Refund {
+    public static final long serialVersionUID = 202403011607001L;
+
+    /**
+     * 鍟嗘埛璁㈠崟鍙�
+     */
+    @Schema(description = "鍟嗘埛璁㈠崟鍙�", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @NotBlank(message = "鍟嗘埛璁㈠崟鍙蜂笉鑳戒负绌�")
+    private String tradeNo;
+
+    /**
+     * 閫�娆惧崟鍙凤紝閫�娆惧崟鍙锋棤鍊硷細鏂版彁浜ら��娆剧敵璇枫�傞��娆惧崟鍙锋湁鍊硷細閲嶆柊鎻愪氦閫�娆�
+     */
+    @Schema(description = "閫�娆惧崟鍙�", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    private String refundNo;
+
+    /**
+     * 閫�娆鹃噾棰�
+     */
+    @Schema(description = "閫�娆鹃噾棰�", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @NotNull(message = "閫�娆鹃噾棰濅笉鑳戒负绌�")
+    private Integer refund;
+}
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/dto/RefundRequest.java b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/dto/RefundRequest.java
new file mode 100644
index 0000000..ad42f4b
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/dto/RefundRequest.java
@@ -0,0 +1,70 @@
+package com.dy.pipIrrSell.wechatpay.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+/**
+ * @author ZhuBaoMin
+ * @date 2024-03-06 13:55
+ * @LastEditTime 2024-03-06 13:55
+ * @Description 閫�娆捐姹傚璞★紝瀵硅薄璧嬪�煎畬鏁村悗鍚戝井淇¤姹傞��娆�
+ */
+
+@Data
+@Schema(name = "閫�娆捐姹傚璞�")
+public class RefundRequest {
+    public static final long serialVersionUID = 202403011540001L;
+
+    /**
+     * 鍟嗘埛璁㈠崟鍙凤紝涓嬪崟鏃剁殑璁㈠崟鍙�
+     */
+    @Schema(description = "鍟嗘埛璁㈠崟鍙�", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @NotBlank(message = "鍟嗘埛璁㈠崟鍙蜂笉鑳戒负绌�")
+    private String out_trade_no;
+
+    /**
+     * 鍟嗘埛閫�娆惧崟鍙凤紝璁㈠崟鍙峰墠鍔犲墠缂�鈥淩鈥�
+     */
+    @Schema(description = "鍟嗘埛閫�娆惧崟鍙�", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @NotBlank(message = "鍟嗘埛閫�娆惧崟鍙蜂笉鑳戒负绌�")
+    private String out_refund_no;
+
+    /**
+     * 閫�娆剧粨鏋滃洖璋僽rl锛宺efundUrl
+     */
+    @Schema(description = "閫�娆剧粨鏋滃洖璋僽rl", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @NotBlank(message = "閫�娆剧粨鏋滃洖璋僽rl涓嶈兘涓虹┖")
+    private String notify_url;
+
+    /**
+     * 閲戦淇℃伅
+     */
+    @Schema(description = "閲戦淇℃伅", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    private Amount amount;
+
+    @Data
+    public static class Amount {
+        /**
+         * 閫�娆鹃噾棰�
+         */
+        @Schema(description = "閫�娆鹃噾棰�", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+        @NotNull(message = "閫�娆鹃噾棰濅笉鑳戒负绌�")
+        private Integer refund;
+
+        /**
+         * 鍘熻鍗曢噾棰濓紝鏍规嵁璁㈠崟鍙锋煡璇�
+         */
+        @Schema(description = "鍘熻鍗曢噾棰�", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+        @NotNull(message = "鍘熻鍗曢噾棰濅笉鑳戒负绌�")
+        private Integer total;
+
+        /**
+         * 閫�娆惧竵绉嶏紝鍥哄畾涓衡�淐NY鈥�
+         */
+        @Schema(description = "閫�娆惧竵绉�", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+        @NotBlank(message = "閫�娆惧竵绉嶄笉鑳戒负绌�")
+        private String currency;
+    }
+}
\ No newline at end of file
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/dto/RefundResponse.java b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/dto/RefundResponse.java
new file mode 100644
index 0000000..63c143a
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/dto/RefundResponse.java
@@ -0,0 +1,114 @@
+package com.dy.pipIrrSell.wechatpay.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * @author ZhuBaoMin
+ * @date 2024-03-06 13:56
+ * @LastEditTime 2024-03-06 13:56
+ * @Description 閫�娆剧敵璇疯繑鍥炵殑瀵硅薄
+ */
+
+@Data
+@Schema(name = "閫�娆剧敵璇疯繑鍥炲璞�")
+public class RefundResponse {
+    public static final long serialVersionUID = 202403011431001L;
+
+    /**
+     * 寰俊鏀粯閫�娆惧彿
+     */
+    private String refund_id;
+
+    /**
+     * 鍟嗘埛閫�娆惧崟鍙�
+     */
+    private String out_refund_no;
+
+    /**
+     * 寰俊鏀粯璁㈠崟鍙�
+     */
+    private String transaction_id;
+
+    /**
+     * 鍟嗘埛璁㈠崟鍙�
+     */
+    private String out_trade_no;
+
+    /**
+     * 閫�娆炬笭閬�
+     */
+    private String channel;
+
+    /**
+     * 閫�娆惧叆璐﹁处鎴�
+     */
+    private String user_received_account;
+
+    /**
+     * 閫�娆炬垚鍔熸椂闂�
+     */
+    private String success_time;
+
+    /**
+     * 閫�娆惧垱寤烘椂闂�
+     */
+    private String create_time;
+
+    /**
+     * 閫�娆剧姸鎬�
+     */
+    private String status;
+
+    /**
+     * 閲戦淇℃伅
+     */
+    private Amount amount;
+
+
+    @Data
+    private static class Amount {
+
+        /**
+         * 璁㈠崟鎬婚噾棰�
+         */
+        private Integer total;
+
+        /**
+         * 閫�娆鹃噾棰�
+         */
+        private Integer refund;
+
+        /**
+         * 鐢ㄦ埛鏀粯閲戦
+         */
+        private Integer payer_total;
+
+        /**
+         * 鐢ㄦ埛閫�娆鹃噾棰�
+         */
+        private Integer payer_refund;
+
+        /**
+         * 搴旂粨閫�娆鹃噾棰�
+         */
+        private Integer settlement_refund;
+
+        /**
+         * 搴旂粨璁㈠崟閲戦
+         */
+        private Integer settlement_total;
+
+        /**
+         * 浼樻儬閫�娆鹃噾棰�
+         */
+        private Integer discount_refund;
+
+        /**
+         * 閫�娆惧竵绉�
+         */
+        private String currency;
+
+    }
+
+}
\ No newline at end of file
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/.gitignore b/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/.gitignore
deleted file mode 100644
index 549e00a..0000000
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/.gitignore
+++ /dev/null
@@ -1,33 +0,0 @@
-HELP.md
-target/
-!.mvn/wrapper/maven-wrapper.jar
-!**/src/main/**/target/
-!**/src/test/**/target/
-
-### STS ###
-.apt_generated
-.classpath
-.factorypath
-.project
-.settings
-.springBeans
-.sts4-cache
-
-### IntelliJ IDEA ###
-.idea
-*.iws
-*.iml
-*.ipr
-
-### NetBeans ###
-/nbproject/private/
-/nbbuild/
-/dist/
-/nbdist/
-/.nb-gradle/
-build/
-!**/src/main/**/build/
-!**/src/test/**/build/
-
-### VS Code ###
-.vscode/
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/.mvn/wrapper/maven-wrapper.jar b/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/.mvn/wrapper/maven-wrapper.jar
deleted file mode 100644
index cb28b0e..0000000
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/.mvn/wrapper/maven-wrapper.jar
+++ /dev/null
Binary files differ
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/.mvn/wrapper/maven-wrapper.properties b/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/.mvn/wrapper/maven-wrapper.properties
deleted file mode 100644
index 5f0536e..0000000
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/.mvn/wrapper/maven-wrapper.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.5/apache-maven-3.9.5-bin.zip
-wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/mvnw b/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/mvnw
deleted file mode 100644
index 66df285..0000000
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/mvnw
+++ /dev/null
@@ -1,308 +0,0 @@
-#!/bin/sh
-# ----------------------------------------------------------------------------
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#    https://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-# ----------------------------------------------------------------------------
-
-# ----------------------------------------------------------------------------
-# Apache Maven Wrapper startup batch script, version 3.2.0
-#
-# Required ENV vars:
-# ------------------
-#   JAVA_HOME - location of a JDK home dir
-#
-# Optional ENV vars
-# -----------------
-#   MAVEN_OPTS - parameters passed to the Java VM when running Maven
-#     e.g. to debug Maven itself, use
-#       set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
-#   MAVEN_SKIP_RC - flag to disable loading of mavenrc files
-# ----------------------------------------------------------------------------
-
-if [ -z "$MAVEN_SKIP_RC" ] ; then
-
-  if [ -f /usr/local/etc/mavenrc ] ; then
-    . /usr/local/etc/mavenrc
-  fi
-
-  if [ -f /etc/mavenrc ] ; then
-    . /etc/mavenrc
-  fi
-
-  if [ -f "$HOME/.mavenrc" ] ; then
-    . "$HOME/.mavenrc"
-  fi
-
-fi
-
-# OS specific support.  $var _must_ be set to either true or false.
-cygwin=false;
-darwin=false;
-mingw=false
-case "$(uname)" in
-  CYGWIN*) cygwin=true ;;
-  MINGW*) mingw=true;;
-  Darwin*) darwin=true
-    # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
-    # See https://developer.apple.com/library/mac/qa/qa1170/_index.html
-    if [ -z "$JAVA_HOME" ]; then
-      if [ -x "/usr/libexec/java_home" ]; then
-        JAVA_HOME="$(/usr/libexec/java_home)"; export JAVA_HOME
-      else
-        JAVA_HOME="/Library/Java/Home"; export JAVA_HOME
-      fi
-    fi
-    ;;
-esac
-
-if [ -z "$JAVA_HOME" ] ; then
-  if [ -r /etc/gentoo-release ] ; then
-    JAVA_HOME=$(java-config --jre-home)
-  fi
-fi
-
-# For Cygwin, ensure paths are in UNIX format before anything is touched
-if $cygwin ; then
-  [ -n "$JAVA_HOME" ] &&
-    JAVA_HOME=$(cygpath --unix "$JAVA_HOME")
-  [ -n "$CLASSPATH" ] &&
-    CLASSPATH=$(cygpath --path --unix "$CLASSPATH")
-fi
-
-# For Mingw, ensure paths are in UNIX format before anything is touched
-if $mingw ; then
-  [ -n "$JAVA_HOME" ] && [ -d "$JAVA_HOME" ] &&
-    JAVA_HOME="$(cd "$JAVA_HOME" || (echo "cannot cd into $JAVA_HOME."; exit 1); pwd)"
-fi
-
-if [ -z "$JAVA_HOME" ]; then
-  javaExecutable="$(which javac)"
-  if [ -n "$javaExecutable" ] && ! [ "$(expr "\"$javaExecutable\"" : '\([^ ]*\)')" = "no" ]; then
-    # readlink(1) is not available as standard on Solaris 10.
-    readLink=$(which readlink)
-    if [ ! "$(expr "$readLink" : '\([^ ]*\)')" = "no" ]; then
-      if $darwin ; then
-        javaHome="$(dirname "\"$javaExecutable\"")"
-        javaExecutable="$(cd "\"$javaHome\"" && pwd -P)/javac"
-      else
-        javaExecutable="$(readlink -f "\"$javaExecutable\"")"
-      fi
-      javaHome="$(dirname "\"$javaExecutable\"")"
-      javaHome=$(expr "$javaHome" : '\(.*\)/bin')
-      JAVA_HOME="$javaHome"
-      export JAVA_HOME
-    fi
-  fi
-fi
-
-if [ -z "$JAVACMD" ] ; then
-  if [ -n "$JAVA_HOME"  ] ; then
-    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
-      # IBM's JDK on AIX uses strange locations for the executables
-      JAVACMD="$JAVA_HOME/jre/sh/java"
-    else
-      JAVACMD="$JAVA_HOME/bin/java"
-    fi
-  else
-    JAVACMD="$(\unset -f command 2>/dev/null; \command -v java)"
-  fi
-fi
-
-if [ ! -x "$JAVACMD" ] ; then
-  echo "Error: JAVA_HOME is not defined correctly." >&2
-  echo "  We cannot execute $JAVACMD" >&2
-  exit 1
-fi
-
-if [ -z "$JAVA_HOME" ] ; then
-  echo "Warning: JAVA_HOME environment variable is not set."
-fi
-
-# traverses directory structure from process work directory to filesystem root
-# first directory with .mvn subdirectory is considered project base directory
-find_maven_basedir() {
-  if [ -z "$1" ]
-  then
-    echo "Path not specified to find_maven_basedir"
-    return 1
-  fi
-
-  basedir="$1"
-  wdir="$1"
-  while [ "$wdir" != '/' ] ; do
-    if [ -d "$wdir"/.mvn ] ; then
-      basedir=$wdir
-      break
-    fi
-    # workaround for JBEAP-8937 (on Solaris 10/Sparc)
-    if [ -d "${wdir}" ]; then
-      wdir=$(cd "$wdir/.." || exit 1; pwd)
-    fi
-    # end of workaround
-  done
-  printf '%s' "$(cd "$basedir" || exit 1; pwd)"
-}
-
-# concatenates all lines of a file
-concat_lines() {
-  if [ -f "$1" ]; then
-    # Remove \r in case we run on Windows within Git Bash
-    # and check out the repository with auto CRLF management
-    # enabled. Otherwise, we may read lines that are delimited with
-    # \r\n and produce $'-Xarg\r' rather than -Xarg due to word
-    # splitting rules.
-    tr -s '\r\n' ' ' < "$1"
-  fi
-}
-
-log() {
-  if [ "$MVNW_VERBOSE" = true ]; then
-    printf '%s\n' "$1"
-  fi
-}
-
-BASE_DIR=$(find_maven_basedir "$(dirname "$0")")
-if [ -z "$BASE_DIR" ]; then
-  exit 1;
-fi
-
-MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}; export MAVEN_PROJECTBASEDIR
-log "$MAVEN_PROJECTBASEDIR"
-
-##########################################################################################
-# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
-# This allows using the maven wrapper in projects that prohibit checking in binary data.
-##########################################################################################
-wrapperJarPath="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar"
-if [ -r "$wrapperJarPath" ]; then
-    log "Found $wrapperJarPath"
-else
-    log "Couldn't find $wrapperJarPath, downloading it ..."
-
-    if [ -n "$MVNW_REPOURL" ]; then
-      wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar"
-    else
-      wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar"
-    fi
-    while IFS="=" read -r key value; do
-      # Remove '\r' from value to allow usage on windows as IFS does not consider '\r' as a separator ( considers space, tab, new line ('\n'), and custom '=' )
-      safeValue=$(echo "$value" | tr -d '\r')
-      case "$key" in (wrapperUrl) wrapperUrl="$safeValue"; break ;;
-      esac
-    done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties"
-    log "Downloading from: $wrapperUrl"
-
-    if $cygwin; then
-      wrapperJarPath=$(cygpath --path --windows "$wrapperJarPath")
-    fi
-
-    if command -v wget > /dev/null; then
-        log "Found wget ... using wget"
-        [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--quiet"
-        if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
-            wget $QUIET "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath"
-        else
-            wget $QUIET --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath"
-        fi
-    elif command -v curl > /dev/null; then
-        log "Found curl ... using curl"
-        [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--silent"
-        if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
-            curl $QUIET -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath"
-        else
-            curl $QUIET --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath"
-        fi
-    else
-        log "Falling back to using Java to download"
-        javaSource="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.java"
-        javaClass="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.class"
-        # For Cygwin, switch paths to Windows format before running javac
-        if $cygwin; then
-          javaSource=$(cygpath --path --windows "$javaSource")
-          javaClass=$(cygpath --path --windows "$javaClass")
-        fi
-        if [ -e "$javaSource" ]; then
-            if [ ! -e "$javaClass" ]; then
-                log " - Compiling MavenWrapperDownloader.java ..."
-                ("$JAVA_HOME/bin/javac" "$javaSource")
-            fi
-            if [ -e "$javaClass" ]; then
-                log " - Running MavenWrapperDownloader.java ..."
-                ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$wrapperUrl" "$wrapperJarPath") || rm -f "$wrapperJarPath"
-            fi
-        fi
-    fi
-fi
-##########################################################################################
-# End of extension
-##########################################################################################
-
-# If specified, validate the SHA-256 sum of the Maven wrapper jar file
-wrapperSha256Sum=""
-while IFS="=" read -r key value; do
-  case "$key" in (wrapperSha256Sum) wrapperSha256Sum=$value; break ;;
-  esac
-done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties"
-if [ -n "$wrapperSha256Sum" ]; then
-  wrapperSha256Result=false
-  if command -v sha256sum > /dev/null; then
-    if echo "$wrapperSha256Sum  $wrapperJarPath" | sha256sum -c > /dev/null 2>&1; then
-      wrapperSha256Result=true
-    fi
-  elif command -v shasum > /dev/null; then
-    if echo "$wrapperSha256Sum  $wrapperJarPath" | shasum -a 256 -c > /dev/null 2>&1; then
-      wrapperSha256Result=true
-    fi
-  else
-    echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available."
-    echo "Please install either command, or disable validation by removing 'wrapperSha256Sum' from your maven-wrapper.properties."
-    exit 1
-  fi
-  if [ $wrapperSha256Result = false ]; then
-    echo "Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised." >&2
-    echo "Investigate or delete $wrapperJarPath to attempt a clean download." >&2
-    echo "If you updated your Maven version, you need to update the specified wrapperSha256Sum property." >&2
-    exit 1
-  fi
-fi
-
-MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
-
-# For Cygwin, switch paths to Windows format before running java
-if $cygwin; then
-  [ -n "$JAVA_HOME" ] &&
-    JAVA_HOME=$(cygpath --path --windows "$JAVA_HOME")
-  [ -n "$CLASSPATH" ] &&
-    CLASSPATH=$(cygpath --path --windows "$CLASSPATH")
-  [ -n "$MAVEN_PROJECTBASEDIR" ] &&
-    MAVEN_PROJECTBASEDIR=$(cygpath --path --windows "$MAVEN_PROJECTBASEDIR")
-fi
-
-# Provide a "standardized" way to retrieve the CLI args that will
-# work with both Windows and non-Windows executions.
-MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $*"
-export MAVEN_CMD_LINE_ARGS
-
-WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
-
-# shellcheck disable=SC2086 # safe args
-exec "$JAVACMD" \
-  $MAVEN_OPTS \
-  $MAVEN_DEBUG_OPTS \
-  -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
-  "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
-  ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/mvnw.cmd b/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/mvnw.cmd
deleted file mode 100644
index 95ba6f5..0000000
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/mvnw.cmd
+++ /dev/null
@@ -1,205 +0,0 @@
-@REM ----------------------------------------------------------------------------
-@REM Licensed to the Apache Software Foundation (ASF) under one
-@REM or more contributor license agreements.  See the NOTICE file
-@REM distributed with this work for additional information
-@REM regarding copyright ownership.  The ASF licenses this file
-@REM to you under the Apache License, Version 2.0 (the
-@REM "License"); you may not use this file except in compliance
-@REM with the License.  You may obtain a copy of the License at
-@REM
-@REM    https://www.apache.org/licenses/LICENSE-2.0
-@REM
-@REM Unless required by applicable law or agreed to in writing,
-@REM software distributed under the License is distributed on an
-@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-@REM KIND, either express or implied.  See the License for the
-@REM specific language governing permissions and limitations
-@REM under the License.
-@REM ----------------------------------------------------------------------------
-
-@REM ----------------------------------------------------------------------------
-@REM Apache Maven Wrapper startup batch script, version 3.2.0
-@REM
-@REM Required ENV vars:
-@REM JAVA_HOME - location of a JDK home dir
-@REM
-@REM Optional ENV vars
-@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
-@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending
-@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
-@REM     e.g. to debug Maven itself, use
-@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
-@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
-@REM ----------------------------------------------------------------------------
-
-@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
-@echo off
-@REM set title of command window
-title %0
-@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'
-@if "%MAVEN_BATCH_ECHO%" == "on"  echo %MAVEN_BATCH_ECHO%
-
-@REM set %HOME% to equivalent of $HOME
-if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
-
-@REM Execute a user defined script before this one
-if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
-@REM check for pre script, once with legacy .bat ending and once with .cmd ending
-if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %*
-if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %*
-:skipRcPre
-
-@setlocal
-
-set ERROR_CODE=0
-
-@REM To isolate internal variables from possible post scripts, we use another setlocal
-@setlocal
-
-@REM ==== START VALIDATION ====
-if not "%JAVA_HOME%" == "" goto OkJHome
-
-echo.
-echo Error: JAVA_HOME not found in your environment. >&2
-echo Please set the JAVA_HOME variable in your environment to match the >&2
-echo location of your Java installation. >&2
-echo.
-goto error
-
-:OkJHome
-if exist "%JAVA_HOME%\bin\java.exe" goto init
-
-echo.
-echo Error: JAVA_HOME is set to an invalid directory. >&2
-echo JAVA_HOME = "%JAVA_HOME%" >&2
-echo Please set the JAVA_HOME variable in your environment to match the >&2
-echo location of your Java installation. >&2
-echo.
-goto error
-
-@REM ==== END VALIDATION ====
-
-:init
-
-@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
-@REM Fallback to current working directory if not found.
-
-set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
-IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
-
-set EXEC_DIR=%CD%
-set WDIR=%EXEC_DIR%
-:findBaseDir
-IF EXIST "%WDIR%"\.mvn goto baseDirFound
-cd ..
-IF "%WDIR%"=="%CD%" goto baseDirNotFound
-set WDIR=%CD%
-goto findBaseDir
-
-:baseDirFound
-set MAVEN_PROJECTBASEDIR=%WDIR%
-cd "%EXEC_DIR%"
-goto endDetectBaseDir
-
-:baseDirNotFound
-set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
-cd "%EXEC_DIR%"
-
-:endDetectBaseDir
-
-IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
-
-@setlocal EnableExtensions EnableDelayedExpansion
-for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
-@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
-
-:endReadAdditionalConfig
-
-SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
-set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
-set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
-
-set WRAPPER_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar"
-
-FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
-    IF "%%A"=="wrapperUrl" SET WRAPPER_URL=%%B
-)
-
-@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
-@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
-if exist %WRAPPER_JAR% (
-    if "%MVNW_VERBOSE%" == "true" (
-        echo Found %WRAPPER_JAR%
-    )
-) else (
-    if not "%MVNW_REPOURL%" == "" (
-        SET WRAPPER_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar"
-    )
-    if "%MVNW_VERBOSE%" == "true" (
-        echo Couldn't find %WRAPPER_JAR%, downloading it ...
-        echo Downloading from: %WRAPPER_URL%
-    )
-
-    powershell -Command "&{"^
-		"$webclient = new-object System.Net.WebClient;"^
-		"if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
-		"$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
-		"}"^
-		"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%WRAPPER_URL%', '%WRAPPER_JAR%')"^
-		"}"
-    if "%MVNW_VERBOSE%" == "true" (
-        echo Finished downloading %WRAPPER_JAR%
-    )
-)
-@REM End of extension
-
-@REM If specified, validate the SHA-256 sum of the Maven wrapper jar file
-SET WRAPPER_SHA_256_SUM=""
-FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
-    IF "%%A"=="wrapperSha256Sum" SET WRAPPER_SHA_256_SUM=%%B
-)
-IF NOT %WRAPPER_SHA_256_SUM%=="" (
-    powershell -Command "&{"^
-       "$hash = (Get-FileHash \"%WRAPPER_JAR%\" -Algorithm SHA256).Hash.ToLower();"^
-       "If('%WRAPPER_SHA_256_SUM%' -ne $hash){"^
-       "  Write-Output 'Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised.';"^
-       "  Write-Output 'Investigate or delete %WRAPPER_JAR% to attempt a clean download.';"^
-       "  Write-Output 'If you updated your Maven version, you need to update the specified wrapperSha256Sum property.';"^
-       "  exit 1;"^
-       "}"^
-       "}"
-    if ERRORLEVEL 1 goto error
-)
-
-@REM Provide a "standardized" way to retrieve the CLI args that will
-@REM work with both Windows and non-Windows executions.
-set MAVEN_CMD_LINE_ARGS=%*
-
-%MAVEN_JAVA_EXE% ^
-  %JVM_CONFIG_MAVEN_PROPS% ^
-  %MAVEN_OPTS% ^
-  %MAVEN_DEBUG_OPTS% ^
-  -classpath %WRAPPER_JAR% ^
-  "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^
-  %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
-if ERRORLEVEL 1 goto error
-goto end
-
-:error
-set ERROR_CODE=1
-
-:end
-@endlocal & set ERROR_CODE=%ERROR_CODE%
-
-if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost
-@REM check for post script, once with legacy .bat ending and once with .cmd ending
-if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat"
-if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd"
-:skipRcPost
-
-@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
-if "%MAVEN_BATCH_PAUSE%"=="on" pause
-
-if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE%
-
-cmd /C exit /B %ERROR_CODE%
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/pom.xml b/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/pom.xml
deleted file mode 100644
index 5cb8ab3..0000000
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/pom.xml
+++ /dev/null
@@ -1,172 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>com.dy</groupId>
-        <artifactId>pipIrr-web</artifactId>
-        <version>1.0.0</version>
-        <relativePath>../pom.xml</relativePath>
-    </parent>
-
-    <packaging>jar</packaging>
-
-    <artifactId>pipIrr-web-webchat</artifactId>
-    <name>pipIrr-web-webchat</name>
-    <description>web寰俊鏀粯妯″潡</description>
-
-    <dependencies>
-        <!--寰俊鏀粯-->
-        <dependency>
-            <groupId>com.github.wechatpay-apiv3</groupId>
-            <artifactId>wechatpay-java</artifactId>
-            <version>0.2.12</version>
-        </dependency>
-
-        <!--OkHttp-->
-        <dependency>
-            <groupId>com.squareup.okhttp3</groupId>
-            <artifactId>okhttp</artifactId>
-            <version>4.9.2</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.httpcomponents</groupId>
-            <artifactId>httpclient</artifactId>
-            <version>4.5.3</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.httpcomponents.client5</groupId>
-            <artifactId>httpclient5</artifactId>
-            <version>5.1.3</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.httpcomponents.client5</groupId>
-            <artifactId>httpclient5-fluent</artifactId>
-            <version>5.1.3</version>
-        </dependency>
-
-    </dependencies>
-    <build>
-        <plugins>
-            <!-- 鐢熸垚涓嶅寘鍚緷璧杍ar鐨勫彲鎵цjar鍖�
-            <plugin>
-                !- spring boot鎻愪緵鐨刴aven鎵撳寘鎻掍欢 -
-                <groupId>org.springframework.boot</groupId>
-                <artifactId>spring-boot-maven-plugin</artifactId>
-                <executions>
-                    <execution>
-                        !-
-                        <goals>
-                            <goal>repackage</goal>
-                        </goals>
-                        -
-                        <configuration>
-                            !- 涓嶅姞鐨勮瘽鏈�缁堝寘鍚嶄负: ${artifactId}-${version}.jar, 鍔犱簡鐨勮瘽鏈�缁堝寘鍚�: ${artifactId}-${version}-${classifier}.jar  -
-                            <classifier>execute</classifier>
-                            !- 涓嶆寚瀹氱敓鎴愯矾寰勭殑璇�, 榛樿淇濆瓨鍦� ${build.directory} 涓� -
-                            <outputDirectory>${project.build.directory}/execute</outputDirectory>
-                            <finalName>${artifactId}-${version}</finalName>
-                            <layout>ZIP</layout>
-                            <mainClass>com.dy.pipIrrBase.PipIrrBaseApplication</mainClass>
-                            <includes>
-                                <include>
-                                    <groupId>com.dy</groupId>
-                                    <artifactId>pipIrr-common</artifactId>
-                                </include>
-                                <include>
-                                    <groupId>com.dy</groupId>
-                                    <artifactId>pipIrr-global</artifactId>
-                                </include>
-                            </includes>
-                            <excludes>
-                                <exclude>
-                                    <groupId>org.projectlombok</groupId>
-                                    <artifactId>lombok</artifactId>
-                                </exclude>
-                            </excludes>
-                        </configuration>
-                    </execution>
-                </executions>
-
-            </plugin>
-            -->
-            <!-- 鎷疯礉渚濊禆鐨刯ar鍖呭埌lib鐩綍-->
-            <plugin>
-                <groupId>org.springframework.boot</groupId>
-                <artifactId>spring-boot-maven-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <configuration>
-                            <!-- 涓嶅姞鐨勮瘽鏈�缁堝寘鍚嶄负: ${artifactId}-${version}.jar, 鍔犱簡鐨勮瘽鏈�缁堝寘鍚�: ${artifactId}-${version}-${classifier}.jar
-                            <classifier>execute</classifier>
-                            -->
-                            <!-- ${project.build.directory}鏄痬aven鍙橀噺锛屽唴缃殑锛岃〃绀簍arget鐩綍,濡傛灉涓嶅啓锛屽皢鍦ㄦ牴鐩綍涓嬪垱寤�/lib -->
-                            <outputDirectory>${project.build.directory}/lib</outputDirectory>
-                            <!-- excludeTransitive:鏄惁涓嶅寘鍚棿鎺ヤ緷璧栧寘锛屾瘮濡傛垜浠緷璧朅锛屼絾鏄疉鍙堜緷璧栦簡B锛屾垜浠槸鍚︿篃瑕佹妸B鎵撹繘鍘� 榛樿涓嶆墦-->
-                            <excludeTransitive>false</excludeTransitive>
-                            <!-- 澶嶅埗鐨刯ar鏂囦欢鍘绘帀鐗堟湰淇℃伅 -->
-                            <stripVersion>false</stripVersion>
-                            <finalName>${project.artifactId}-${project.version}</finalName>
-                            <layout>ZIP</layout>
-                            <mainClass>com.dy.pipIrrBase.PipIrrBaseApplication</mainClass>
-                            <includes>
-                                <include>
-                                    <groupId>com.dy</groupId>
-                                    <artifactId>pipIrr-common</artifactId>
-                                </include>
-                                <include>
-                                    <groupId>com.dy</groupId>
-                                    <artifactId>pipIrr-global</artifactId>
-                                </include>
-                            </includes>
-                            <excludes>
-                                <exclude>
-                                    <groupId>org.projectlombok</groupId>
-                                    <artifactId>lombok</artifactId>
-                                </exclude>
-                            </excludes>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-
-            <plugin>
-                <!-- 璁剧疆java缂栬瘧鐗堟湰锛岃繍琛岀幆澧冪増鏈� -->
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-compiler-plugin</artifactId>
-                <!-- source锛� 婧愪唬鐮佺紪璇戠増鏈紱target锛� 鐩爣骞冲彴缂栬瘧鐗堟湰锛沞ncoding锛� 瀛楃闆嗙紪鐮併�� -->
-                <configuration>
-                    <source>${java.version}</source>
-                    <target>${java.version}</target>
-                    <encoding>${encoding}</encoding>
-                </configuration>
-            </plugin>
-            <plugin>
-                <!-- 瑙e喅璧勬簮鏂囦欢鐨勭紪鐮侀棶棰� -->
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-resources-plugin</artifactId>
-                <configuration>
-                    <encoding>${encoding}</encoding>
-                </configuration>
-            </plugin>
-            <plugin>
-                <!-- maven閲屾墽琛屾祴璇曠敤渚嬬殑鎻掍欢 -->
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-surefire-plugin</artifactId>
-                <configuration>
-                    <skipTests>true</skipTests>
-                </configuration>
-            </plugin>
-            <plugin>
-                <!-- 涓嬮潰瑙e喅锛氬綋杩涜Maven Lifecycle package鏃舵姤閿欙細Could not find artifact org.apache.mina:mina-core:bundle:2.2.1 in maven (https://repo1.maven.org/maven2/)-->
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <extensions>true</extensions>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/src/main/java/com/dy/pipirrWebChat/PipIrrWebChatApplication.java b/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/src/main/java/com/dy/pipirrWebChat/PipIrrWebChatApplication.java
deleted file mode 100644
index 2517c4a..0000000
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/src/main/java/com/dy/pipirrWebChat/PipIrrWebChatApplication.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.dy.pipirrWebChat;
-
-import com.dy.common.multiDataSource.EnableMultiDataSource;
-import org.mybatis.spring.annotation.MapperScan;
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.context.annotation.ComponentScan;
-import org.springframework.context.annotation.EnableAspectJAutoProxy;
-
-/**
- * @author ZhuBaoMin
- * @date 2024/02/21 16:07
- * @LastEditTime 2024/02/21 16:07
- * @Description
- */
-
-@SpringBootApplication
-@EnableAspectJAutoProxy
-@EnableMultiDataSource
-@ComponentScan(basePackages = {"com.dy.common", "com.dy.pipIrrGlobal", "com.dy.pipirrWebChat"})
-@MapperScan({"com.dy.pipIrrGlobal.daoSe", "com.dy.pipIrrGlobal.daoBa"})
-public class PipIrrWebChatApplication {
-
-    public static void main(String[] args) {
-        SpringApplication.run(PipIrrWebChatApplication.class, args);
-    }
-
-}
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/src/main/java/com/dy/pipirrWebChat/config/WebFilterConfiguration.java b/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/src/main/java/com/dy/pipirrWebChat/config/WebFilterConfiguration.java
deleted file mode 100644
index fd118ff..0000000
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/src/main/java/com/dy/pipirrWebChat/config/WebFilterConfiguration.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package com.dy.pipirrWebChat.config;
-
-import com.dy.common.webFilter.DevOfDataSourceNameSetFilter;
-import com.dy.common.webFilter.UserTokenFilter;
-import jakarta.servlet.Filter;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.boot.web.servlet.FilterRegistrationBean;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-/**
- * @author ZhuBaoMin
- * @date 2024-02-21 16:10
- * @LastEditTime 2024-02-21 16:10
- * @Description
- */
-
-@Configuration
-public class WebFilterConfiguration {
-
-    @Value("${pipIrr.global.dev}")
-    public String isDevStage ;//鏄惁涓哄紑鍙戦樁娈�
-    @Value("${pipIrr.global.dsName}")
-    public String dsName ;//寮�鍙戦樁娈电殑鏁版嵁婧愬悕绉�
-
-    /**
-     * DevOfDataSourceNameSetFilter涓嶶serTokenFilter鍙兘涓�涓閰嶇疆涓婏紝
-     * 鎵�浠ヤ粬浠殑order閮芥槸1
-     */
-    private static final int order_UserTokenFilter = 1 ;//涓庝笅闈�
-    private static final int order_DevOfDataSourceNameSetFilter = 1 ;
-
-
-    @Bean
-    public FilterRegistrationBean<? extends Filter> RegFilter() {
-        FilterRegistrationBean<Filter> filterRegistrationBean = new FilterRegistrationBean<>();
-        if(this.isDevStage != null && !this.isDevStage.trim().equals("") && this.isDevStage.trim().equalsIgnoreCase("true")){
-            filterRegistrationBean.setFilter(new DevOfDataSourceNameSetFilter());
-            filterRegistrationBean.addUrlPatterns("/*");//閰嶇疆杩囨护瑙勫垯
-            filterRegistrationBean.addInitParameter("dataSourceName",dsName);//璁剧疆init鍙傛暟
-            filterRegistrationBean.setName("DevOfDataSourceNameSetFilter");//璁剧疆杩囨护鍣ㄥ悕绉�
-            filterRegistrationBean.setOrder(order_DevOfDataSourceNameSetFilter);//鎵ц娆″簭
-        }else{
-            filterRegistrationBean.setFilter(new UserTokenFilter());
-            filterRegistrationBean.addUrlPatterns("/*");//閰嶇疆杩囨护瑙勫垯
-            filterRegistrationBean.setName("UserTokenFilter");//璁剧疆杩囨护鍣ㄥ悕绉�
-            filterRegistrationBean.setOrder(order_UserTokenFilter);//鎵ц娆″簭
-        }
-        return filterRegistrationBean;
-    }
-
-}
\ No newline at end of file
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/src/main/java/com/dy/pipirrWebChat/config/WebListenerConfiguration.java b/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/src/main/java/com/dy/pipirrWebChat/config/WebListenerConfiguration.java
deleted file mode 100644
index 7cd9d6e..0000000
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/src/main/java/com/dy/pipirrWebChat/config/WebListenerConfiguration.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package com.dy.pipirrWebChat.config;
-
-import com.dy.common.webListener.GenerateIdSetSuffixListener;
-import jakarta.servlet.ServletContextListener;
-import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-/**
- * @author ZhuBaoMin
- * @date 2024-02-21 16:11
- * @LastEditTime 2024-02-21 16:11
- * @Description
- */
-
-@Configuration
-public class WebListenerConfiguration {
-
-    /**
-     * 鍚姩椤哄簭
-     */
-    //private static final int order_config = 0 ;
-    private static final int order_idSetSuffix = 1 ;
-    //private static final int order_init = 2 ;
-
-    /*
-    * 瑙f瀽鍚勭***.config閰嶇疆鐨凜onfigListener锛屾殏鏃朵笉閲囩敤姝ょ閰嶇疆鏂瑰紡
-    *
-    @Bean
-    public ConfigListener getGlConfigListener(){
-        return new ConfigListener() ;
-    }
-    /**
-     * 澶栭儴鎻愪緵Listener
-     * @param listener 澶栭儴鎻愪緵Listener
-     * @return 娉ㄥ唽Bean
-    @Bean
-    public ServletListenerRegistrationBean<? extends ServletContextListener> regConfigListener(ConfigListener listener) {
-        ServletListenerRegistrationBean<ConfigListener> listenerRegistrationBean = new ServletListenerRegistrationBean<>();
-        listenerRegistrationBean.setListener(listener);
-        listenerRegistrationBean.setOrder(order_config);
-        return listenerRegistrationBean;
-    }
-    */
-
-    /**
-     * 鍐呴儴鎻愪緵listener锛岃listener鍦ㄧ郴缁熷惎鍔ㄦ椂锛屾牴鎹厤缃� 璁剧疆ID浜х敓鍣ㄧ殑鍚庣紑
-     * @return 娉ㄥ唽Bean
-     */
-    @Bean
-    public ServletListenerRegistrationBean<? extends ServletContextListener> regSsoListener() {
-        ServletListenerRegistrationBean<GenerateIdSetSuffixListener> listenerRegistrationBean = new ServletListenerRegistrationBean<>();
-        listenerRegistrationBean.setListener(new GenerateIdSetSuffixListener());
-        listenerRegistrationBean.setOrder(order_idSetSuffix);
-        return listenerRegistrationBean;
-    }
-
-//    /**
-//     * 鍐呴儴鎻愪緵listener锛岃listener鍦ㄧ郴缁熷惎鍔ㄦ椂锛屽垵濮嬪寲鏁版嵁搴撴暟鎹�
-//     * @return 娉ㄥ唽Bean
-//     */
-//    @Bean
-//    public ServletListenerRegistrationBean<? extends ServletContextListener> regInitListener() {
-//        ServletListenerRegistrationBean<InitListener> listenerRegistrationBean = new ServletListenerRegistrationBean<>();
-//        listenerRegistrationBean.setListener(new InitListener());
-//        listenerRegistrationBean.setOrder(order_init);
-//        return listenerRegistrationBean;
-//    }
-}
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/src/main/java/com/dy/pipirrWebChat/payment/PayHelper.java b/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/src/main/java/com/dy/pipirrWebChat/payment/PayHelper.java
deleted file mode 100644
index 9412ba3..0000000
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/src/main/java/com/dy/pipirrWebChat/payment/PayHelper.java
+++ /dev/null
@@ -1,119 +0,0 @@
-package com.dy.pipirrWebChat.payment;
-
-import javax.crypto.NoSuchPaddingException;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.security.*;
-import java.security.spec.InvalidKeySpecException;
-import java.security.spec.PKCS8EncodedKeySpec;
-import java.util.Base64;
-import java.util.Random;
-
-/**
- * @author ZhuBaoMin
- * @date 2024-02-22 20:31
- * @LastEditTime 2024-02-22 20:31
- * @Description
- */
-public class PayHelper {
-    private static final String CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
-
-    /**
-     * 鑾峰彇32浣嶉殢鏈哄瓧绗︿覆
-     * @return 闅忔満涓�
-     */
-    public static String generateRandomString() {
-        Random random = new Random();
-        StringBuilder sb = new StringBuilder(32);
-        for (int i = 0; i < 32; i++) {
-            int index = random.nextInt(CHARACTERS.length());
-            sb.append(CHARACTERS.charAt(index));
-        }
-        return sb.toString();
-    }
-
-    /**
-     * 鑾峰彇绉侀挜瀵硅薄
-     * @param filename 绉侀挜鏂囦欢璺緞
-     * @return 绉侀挜瀵硅薄
-     * @throws IOException
-     */
-    public static PrivateKey getPrivateKey(String filename) throws IOException {
-        //String filename = "C:\\webchat\\apiclient_key.pem";
-        String content = new String(Files.readAllBytes(Paths.get(filename)), "utf-8");
-        try {
-            String privateKey = content.replace("-----BEGIN PRIVATE KEY-----", "")
-                    .replace("-----END PRIVATE KEY-----", "")
-                    .replaceAll("\\s+", "");
-            KeyFactory kf = KeyFactory.getInstance("RSA");
-            return kf.generatePrivate(
-                    new PKCS8EncodedKeySpec(Base64.getDecoder().decode(privateKey)));
-        } catch (NoSuchAlgorithmException e) {
-            throw new RuntimeException("褰撳墠Java鐜涓嶆敮鎸丷SA", e);
-        } catch (InvalidKeySpecException e) {
-            throw new RuntimeException("鏃犳晥鐨勫瘑閽ユ牸寮�");
-        }
-    }
-
-    /**
-     * 鏋勯�犵鍚嶄覆_涓嬪崟
-     * @param method HTTP璇锋眰鏂规硶
-     * @param url URL
-     * @param timestamp 鏃堕棿鎴�
-     * @param nonceStr 闅忔満涓�
-     * @param body 鎶ユ枃涓婚
-     * @return 绛惧悕涓�
-     */
-    public static String buildMessage_order(String method, String url, long timestamp, String nonceStr, String body) {
-        return method + "\n"
-                + url + "\n"
-                + timestamp + "\n"
-                + nonceStr + "\n"
-                + body + "\n";
-    }
-
-    public static String buildMessage_signAgain(String appid, String timestamp, String nonceStr, String pkg) {
-        return appid + "\n"
-                + timestamp + "\n"
-                + nonceStr + "\n"
-                + pkg + "\n";
-    }
-
-    /**
-     * 绛惧悕
-     * @param message 琚鍚嶄俊鎭�
-     * @param certFileName 绉侀挜璇佷功鏂囦欢璺緞
-     * @return signature绛惧悕鍊硷紝绛惧悕淇℃伅涓殑涓�椤癸紝鍙備笌鐢熸垚绛惧悕淇℃伅
-     * @throws NoSuchAlgorithmException
-     * @throws InvalidKeyException
-     * @throws SignatureException
-     * @throws IOException
-     */
-    public static String sign(byte[] message, String certFileName) throws NoSuchAlgorithmException, InvalidKeyException, SignatureException, IOException {
-        Signature sign = Signature.getInstance("SHA256withRSA");
-        sign.initSign(getPrivateKey(certFileName));
-        sign.update(message);
-        return Base64.getEncoder().encodeToString(sign.sign());
-    }
-
-    /**
-     * 鑾峰彇绛惧悕淇℃伅
-     * @param method
-     * @param url
-     * @param body
-     * @return 绛惧悕淇℃伅锛孒TTP澶翠腑鐨勭鍚嶄俊鎭�
-     * HTTP澶达細Authorization: 璁よ瘉绫诲瀷 绛惧悕淇℃伅
-     * 璁よ瘉绫诲瀷锛學ECHATPAY2-SHA256-RSA2048
-     */
-    public static String getToken(String method, String url, String body, String nonceStr, Long timestamp, String certFileName) throws NoSuchAlgorithmException, InvalidKeySpecException, IOException, SignatureException, InvalidKeyException, NoSuchPaddingException {
-        String message = buildMessage_order(method, url, timestamp, nonceStr, body);
-        String signature = sign(message.getBytes("utf-8"), certFileName);
-
-        return "mchid=\"" + PayInfo.mchid + "\","
-                + "nonce_str=\"" + nonceStr + "\","
-                + "timestamp=\"" + timestamp + "\","
-                + "serial_no=\"" + PayInfo.serial_no + "\","
-                + "signature=\"" + signature + "\"";
-    }
-}
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/src/main/java/com/dy/pipirrWebChat/payment/PaymentCtrl.java b/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/src/main/java/com/dy/pipirrWebChat/payment/PaymentCtrl.java
deleted file mode 100644
index 4b4b246..0000000
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/src/main/java/com/dy/pipirrWebChat/payment/PaymentCtrl.java
+++ /dev/null
@@ -1,258 +0,0 @@
-package com.dy.pipirrWebChat.payment;
-
-import com.alibaba.fastjson2.JSONArray;
-import com.alibaba.fastjson2.JSONObject;
-import com.dy.common.aop.SsoAop;
-import com.dy.common.webUtil.BaseResponse;
-import com.dy.common.webUtil.BaseResponseUtils;
-import com.dy.common.webUtil.ResultCodeMsg;
-import com.dy.pipIrrGlobal.pojoSe.SeWebchatLogonState;
-import com.dy.pipirrWebChat.util.OkHttpUtil;
-import com.dy.pipirrWebChat.util.RestTemplateUtil;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.media.Content;
-import io.swagger.v3.oas.annotations.media.Schema;
-import io.swagger.v3.oas.annotations.responses.ApiResponse;
-import io.swagger.v3.oas.annotations.responses.ApiResponses;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.http.MediaType;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * @author ZhuBaoMin
- * @date 2024-02-22 15:24
- * @LastEditTime 2024-02-22 15:24
- * @Description
- */
-
-@Slf4j
-@Tag(name = "寰俊鏀粯绠$悊", description = "寰俊鏀粯鍚勭鎿嶄綔")
-@RestController
-@RequestMapping(path="payment")
-@RequiredArgsConstructor
-public class PaymentCtrl {
-    private final PaymentSv paymentSv;
-    private final RestTemplateUtil restTemplateUtil;
-    private String certFileName = PayInfo.certFileName;
-
-    /**
-     * 鐧诲綍鍑瘉鏍¢獙
-     * @param appid 灏忕▼搴� appId
-     * @param secret 灏忕▼搴� appSecret
-     * @param js_code 涓存椂鐧诲綍鍑瘉code
-     * @return
-     * @throws Exception
-     */
-    @Operation(summary = "鐧诲綍鍑瘉鏍¢獙", description = "鐧诲綍鍑瘉鏍¢獙")
-    @ApiResponses(value = {
-            @ApiResponse(
-                    responseCode = ResultCodeMsg.RsCode.SUCCESS_CODE,
-                    description = "鎿嶄綔缁撴灉锛歵rue锛氭垚鍔燂紝false锛氬け璐ワ紙BaseResponse.content锛�",
-                    content = {@Content(mediaType = MediaType.APPLICATION_JSON_VALUE,
-                            schema = @Schema(implementation = Boolean.class))}
-            )
-    })
-    @PostMapping(path = "getSessionId")
-    @Transactional(rollbackFor = Exception.class)
-    @SsoAop()
-    public BaseResponse<Boolean> getSessionId(@RequestParam("appid")  String appid, @RequestParam("secret") String secret, @RequestParam("js_code") String js_code) throws Exception {
-        String result = OkHttpUtil.builder().url("https://api.weixin.qq.com/sns/jscode2session")
-                .addParam("appid", appid)
-                .addParam("secret", secret)
-                .addParam("js_code", js_code)
-                .initGet()
-                .sync();
-        JSONObject job = JSONObject.parseObject(result);
-        System.out.println(job.getString("session_key"));
-
-        if(job.getLong("errcode") != null && job.getLong("errcode") >= -1) {
-            return BaseResponseUtils.buildFail("鐧诲綍鍑瘉鏍¢獙澶辫触");
-        }
-
-        // 娣诲姞鐧诲綍鎬佽褰�
-        SeWebchatLogonState po = new SeWebchatLogonState();
-        po.setOpenId(job.getString("openid"));
-        po.setSessionKey(job.getString("session_key"));
-        Date createTime = new Date();
-        po.setCreateTime(createTime);
-        Long id = paymentSv.insert(po);
-        if(id == null || id <= 0) {
-            return BaseResponseUtils.buildFail("鐧诲綍鎬佽褰曟坊鍔犲け璐�");
-        }
-
-        String SessionId = String.valueOf(id);
-        return BaseResponseUtils.buildSuccess(SessionId) ;
-    }
-
-    @Operation(summary = "涓嬭浇骞冲彴璇佷功", description = "涓嬭浇骞冲彴璇佷功")
-    @ApiResponses(value = {
-            @ApiResponse(
-                    responseCode = ResultCodeMsg.RsCode.SUCCESS_CODE,
-                    description = "鎿嶄綔缁撴灉锛歵rue锛氭垚鍔燂紝false锛氬け璐ワ紙BaseResponse.content锛�",
-                    content = {@Content(mediaType = MediaType.APPLICATION_JSON_VALUE,
-                            schema = @Schema(implementation = Boolean.class))}
-            )
-    })
-    @GetMapping(path = "certificates")
-    @Transactional(rollbackFor = Exception.class)
-    @SsoAop()
-    public BaseResponse<JSONObject> certificates() throws Exception {
-        //String prepayId = "";
-        //SeWebchatLogonState po = paymentSv.selectOne(Long.parseLong(sessionId));
-        //String openid = po.getOpenId();
-
-        String method = "GET";
-        String httpUrl = "/v3/certificates";
-        String nonceStr = PayHelper.generateRandomString();
-        Long timestamp = System.currentTimeMillis() / 1000;
-
-        String header = PayInfo.schema + " " + PayHelper.getToken(method, httpUrl, "", nonceStr, timestamp, certFileName);
-
-        Map<String, String> headers = new HashMap<>();
-        headers.put("Authorization", header);
-        headers.put("Accept", "application/json");
-        JSONObject job_result = restTemplateUtil.get(PayInfo.certificates,null, headers);
-        if(job_result != null) {
-            JSONArray array = job_result.getJSONArray("data");
-            if(array != null && array.size() > 0) {
-                for(int i = 0; i < array.size(); i++) {
-                    JSONObject job_data = array.getJSONObject(i);
-                    String serial_no = job_data.getString("serial_no");
-                    String effective_time  = job_data.getString("effective_time");
-                    String expire_time  = job_data.getString("expire_time");
-                    JSONObject job_certificate = job_data.getJSONObject("encrypt_certificate");
-                    String algorithm = job_certificate.getString("algorithm");
-                    String nonce  = job_certificate.getString("nonce");
-                    String associated_data  = job_certificate.getString("associated_data");
-                    String ciphertext  = job_certificate.getString("ciphertext");
-                }
-            }
-        }
-        System.out.println(job_result.toJSONString());
-        return BaseResponseUtils.buildSuccess(job_result.toJSONString()) ;
-    }
-
-    /**
-     * JSAPI涓嬪崟
-     * @param sessionId
-     * @param orderNumber
-     * @param payAmount
-     * @return
-     * @throws Exception
-     */
-    @Operation(summary = "缁熶竴涓嬪崟", description = "缁熶竴涓嬪崟")
-    @ApiResponses(value = {
-            @ApiResponse(
-                    responseCode = ResultCodeMsg.RsCode.SUCCESS_CODE,
-                    description = "鎿嶄綔缁撴灉锛歵rue锛氭垚鍔燂紝false锛氬け璐ワ紙BaseResponse.content锛�",
-                    content = {@Content(mediaType = MediaType.APPLICATION_JSON_VALUE,
-                            schema = @Schema(implementation = Boolean.class))}
-            )
-    })
-    @PostMapping(path = "unifiedOrder")
-    @Transactional(rollbackFor = Exception.class)
-    @SsoAop()
-    public BaseResponse<Boolean> unifiedOrder(@RequestParam("sessionId")  String sessionId, @RequestParam("orderNumber") String orderNumber, @RequestParam("payAmount") String payAmount) throws Exception {
-        String prepayId = "";
-        SeWebchatLogonState po = paymentSv.selectOne(Long.parseLong(sessionId));
-        String openid = po.getOpenId();
-
-        JSONObject job_body = new JSONObject();
-        job_body.put("appid", PayInfo.appid);
-        job_body.put("mchid", PayInfo.mchid);
-        job_body.put("description", PayInfo.description);
-        job_body.put("out_trade_no", orderNumber);
-        job_body.put("notify_url", PayInfo.notifyUrl);
-
-        //璁㈠崟閲戦
-        JSONObject job_amount = new JSONObject();
-        job_amount.put("total", 1);
-        job_amount.put("currency", "CNY");
-        job_body.put("amount", job_amount);
-
-        //鏀粯鑰�
-        JSONObject job_payer = new JSONObject();
-        job_payer.put("openid", openid);
-        job_body.put("payer", job_payer);
-
-        // 鑾峰彇闅忔満涓插拰鏃堕棿鎴筹紝鏀惧湪姝ゅ浠ヤ繚璇�
-        String nonceStr = PayHelper.generateRandomString();
-        Long timestamp = System.currentTimeMillis() / 1000;
-
-        String method = "POST";
-        String httpUrl = "/v3/pay/transactions/jsapi";
-
-        String body = job_body.toJSONString();
-        String header = PayInfo.schema + " " + PayHelper.getToken(method, httpUrl, body, nonceStr, timestamp, certFileName);
-
-        Map<String, String> headers = new HashMap<>();
-        headers.put("Authorization", header);
-        headers.put("Accept", "application/json");
-        headers.put("Content-Type", "application/json");
-
-        JSONObject job_result = restTemplateUtil.post(PayInfo.orderUrl, body, headers);
-        if(job_result != null) {
-            System.out.println(job_result.toString());
-            prepayId = job_result.getString("prepay_id");
-        }
-
-
-
-        //String result = OkHttpUtil.builder().url(PayInfo.orderUrl)
-        //        .addBody(body)
-        //        .addHeader("Authorization", header)
-        //        .addHeader("Accept", "application/json")
-        //        .addHeader("Content-Type", "application/json")
-        //        .initPost(true)
-        //        .sync();
-        //System.out.println(result);
-
-        return BaseResponseUtils.buildSuccess(prepayId) ;
-    }
-
-    /**
-     * 鍐嶆绛惧悕
-     * @param prepayId 棰勬敮浠樹氦鏄撲細璇濇爣璇�
-     * @return 灏忕▼搴忚皟璧锋敮浠樺弬鏁�
-     * @throws Exception
-     */
-    @Operation(summary = "鍐嶆绛惧悕", description = "鍐嶆绛惧悕")
-    @ApiResponses(value = {
-            @ApiResponse(
-                    responseCode = ResultCodeMsg.RsCode.SUCCESS_CODE,
-                    description = "鎿嶄綔缁撴灉锛歵rue锛氭垚鍔燂紝false锛氬け璐ワ紙BaseResponse.content锛�",
-                    content = {@Content(mediaType = MediaType.APPLICATION_JSON_VALUE,
-                            schema = @Schema(implementation = Boolean.class))}
-            )
-    })
-    @GetMapping(path = "/signAgain")
-    @Transactional(rollbackFor = Exception.class)
-    @SsoAop()
-    public BaseResponse<JSONObject> signAgain(@RequestParam("prepayId")  String prepayId) throws Exception {
-
-        // 鑾峰彇闅忔満涓插拰鏃堕棿鎴筹紝鏀惧湪姝ゅ浠ヤ繚璇�
-        String appid = PayInfo.appid;
-        String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
-        String nonceStr = PayHelper.generateRandomString();
-        String pkg = "prepay_id=" + prepayId;
-        String signType = PayInfo.signType;
-        String message = PayHelper.buildMessage_signAgain(appid, timestamp, nonceStr, pkg);
-        String paySign = PayHelper.sign(message.getBytes("utf-8"), certFileName);
-
-        JSONObject job_result = new JSONObject();
-        job_result.put("timestamp", timestamp);
-        job_result.put("nonceStr", nonceStr);
-        job_result.put("package", pkg);
-        job_result.put("signType", signType);
-        job_result.put("paySign", paySign);
-
-        return BaseResponseUtils.buildSuccess(job_result) ;
-    }
-}
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/src/main/java/com/dy/pipirrWebChat/payment/PaymentSv.java b/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/src/main/java/com/dy/pipirrWebChat/payment/PaymentSv.java
deleted file mode 100644
index 11e8d4e..0000000
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/src/main/java/com/dy/pipirrWebChat/payment/PaymentSv.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package com.dy.pipirrWebChat.payment;
-
-import com.dy.pipIrrGlobal.daoSe.SeWebchatLogonStateMapper;
-import com.dy.pipIrrGlobal.pojoSe.SeWebchatLogonState;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-/**
- * @author ZhuBaoMin
- * @date 2024-02-22 17:39
- * @LastEditTime 2024-02-22 17:39
- * @Description
- */
-
-@Slf4j
-@Service
-public class PaymentSv {
-    @Autowired
-    private SeWebchatLogonStateMapper seWebchatLogonStateMapper;
-
-    /**
-     * 娣诲姞鐧诲綍鎬佺姸鎬佽褰�
-     * @param po
-     * @return
-     */
-    Long insert(SeWebchatLogonState po) {
-        seWebchatLogonStateMapper.insert(po);
-        return po.getId();
-    }
-
-    SeWebchatLogonState selectOne(Long id) {
-        return seWebchatLogonStateMapper.selectByPrimaryKey(id);
-    }
-}
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/src/main/java/com/dy/pipirrWebChat/result/WebChatResultCode.java b/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/src/main/java/com/dy/pipirrWebChat/result/WebChatResultCode.java
deleted file mode 100644
index 2eb1327..0000000
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/src/main/java/com/dy/pipirrWebChat/result/WebChatResultCode.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.dy.pipirrWebChat.result;
-
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-
-/**
- * @author ZhuBaoMin
- * @date 2024-02-21 16:13
- * @LastEditTime 2024-02-21 16:13
- * @Description
- */
-
-@Getter
-@AllArgsConstructor
-public enum WebChatResultCode {
-    /**
-     * 寰俊鏀粯
-     */
-    DIVIDE_FAIL(10001, "鍒嗘按鎴挎坊鍔犲け璐�");
-
-    private final Integer code;
-    private final String message;
-}
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/src/main/java/com/dy/pipirrWebChat/util/ICallback.java b/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/src/main/java/com/dy/pipirrWebChat/util/ICallback.java
deleted file mode 100644
index a40aa1d..0000000
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/src/main/java/com/dy/pipirrWebChat/util/ICallback.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.dy.pipirrWebChat.util;
-
-import okhttp3.Call;
-
-/**
- * @author ZhuBaoMin
- * @date 2024-02-22 15:22
- * @LastEditTime 2024-02-22 15:22
- * @Description
- */
-
-public interface ICallback {
-    void onSuccess(Call call, String data);
-    void onFail(Call call, String errorMsg);
-}
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/src/main/java/com/dy/pipirrWebChat/util/OkHttpUtil.java b/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/src/main/java/com/dy/pipirrWebChat/util/OkHttpUtil.java
deleted file mode 100644
index 67c6ae0..0000000
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/src/main/java/com/dy/pipirrWebChat/util/OkHttpUtil.java
+++ /dev/null
@@ -1,239 +0,0 @@
-package com.dy.pipirrWebChat.util;
-
-import okhttp3.*;
-import org.jetbrains.annotations.NotNull;
-
-import javax.net.ssl.SSLContext;
-import javax.net.ssl.SSLSocketFactory;
-import javax.net.ssl.TrustManager;
-import javax.net.ssl.X509TrustManager;
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.net.URLEncoder;
-import java.security.SecureRandom;
-import java.security.cert.CertificateException;
-import java.security.cert.X509Certificate;
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.Objects;
-import java.util.concurrent.Semaphore;
-import java.util.concurrent.TimeUnit;
-
-/**
- * @author ZhuBaoMin
- * @date 2024-02-22 13:39
- * @LastEditTime 2024-02-22 13:39
- * @Description
- */
-
-public class OkHttpUtil {
-
-    private static volatile OkHttpClient okHttpClient = null;
-    private static volatile Semaphore semaphore = null;
-    private Map<String, String> headerMap;
-    private Map<String, Object> paramMap;
-    private String url;
-    private Request.Builder request;
-    private String body;
-
-    private OkHttpUtil() {
-        if (Objects.isNull(okHttpClient)) {
-            synchronized (OkHttpUtil.class) {
-                if (Objects.isNull(okHttpClient)) {
-                    TrustManager[] trustManagers = buildTrustManager();
-                    okHttpClient = new OkHttpClient.Builder()
-                            .connectTimeout(15, TimeUnit.SECONDS)
-                            .writeTimeout(20, TimeUnit.SECONDS)
-                            .readTimeout(20, TimeUnit.SECONDS)
-                            .sslSocketFactory(createSSLSocketFactory(trustManagers), (X509TrustManager)trustManagers[0])
-                            .hostnameVerifier((hostname, session) -> true)
-                            .retryOnConnectionFailure(true)
-                            .build();
-                    addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36");
-                }
-            }
-        }
-    }
-
-    public OkHttpUtil initGet() {
-        request = new Request.Builder().get();
-        StringBuilder builder = new StringBuilder(url);
-        if (Objects.nonNull(paramMap)) {
-            builder.append("?");
-            paramMap.forEach((key, value) -> {
-                try {
-                    builder.append(URLEncoder.encode(key, "utf-8"))
-                            .append("=")
-                            .append(URLEncoder.encode((String)value, "utf-8"))
-                            .append("&");
-                } catch (UnsupportedEncodingException e) {
-                    e.printStackTrace();
-                }
-            });
-            builder.deleteCharAt(builder.length() - 1);
-        }
-        request.url(builder.toString());
-        return this;
-    }
-
-    public OkHttpUtil initPost(boolean isJson) {
-        RequestBody requestBody = null;
-        if (isJson) {
-            requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), body);
-        } else {
-            FormBody.Builder formBody = new FormBody.Builder();
-            if (Objects.nonNull(paramMap)) {
-                paramMap.forEach((x, y) -> formBody.add(x, (String) y));
-            }
-            requestBody = formBody.build();
-        }
-        request = new Request.Builder().post(requestBody).url(url);
-        return this;
-    }
-
-    /**
-     * @Description:鍚屾璇锋眰
-     * @Author: zzc
-     * @Date: 2022-12-04 18:06
-     * @return: java.lang.String
-     **/
-    public String sync() throws Exception {
-        setHeader(request);
-        try {
-            Response result = okHttpClient.newCall(request.build()).execute();
-            if (result.isSuccessful()) {
-                return result.body().string();
-            }
-            throw new Exception(result.body().string());
-        } catch (IOException e) {
-            throw new Exception(e.getMessage());
-        }
-    }
-
-    /**
-     * @Description:寮傛璇锋眰锛屾湁杩斿洖鍊�
-     * @Author: zzc
-     * @Date: 2022-12-04 18:05
-     * @return: java.lang.String
-     **/
-    public String async() {
-        StringBuffer buffer = new StringBuffer();
-        setHeader(request);
-        okHttpClient.newCall(request.build()).enqueue(new Callback() {
-            @Override
-            public void onResponse(@NotNull okhttp3.Call call, @NotNull Response response) throws IOException {
-                if (Objects.nonNull(response.body())) {
-                    buffer.append(response.body().string());
-                    getSemaphore().release();
-                }
-            }
-            @Override
-            public void onFailure(@NotNull okhttp3.Call call, @NotNull IOException e) {
-                buffer.append("璇锋眰鍑洪敊").append(e.getMessage());
-            }
-        });
-        try {
-            getSemaphore().acquire();
-        } catch (InterruptedException e) {
-            e.printStackTrace();
-        }
-        return buffer.toString();
-    }
-
-    private static Semaphore getSemaphore() {
-        synchronized (OkHttpUtil.class) {
-            if (Objects.isNull(semaphore)) {
-                semaphore = new Semaphore(0);
-            }
-        }
-        return semaphore;
-    }
-
-    public static OkHttpUtil builder() {
-        return new OkHttpUtil();
-    }
-
-    public OkHttpUtil url(String url) {
-        this.url = url;
-        return this;
-    }
-
-    public OkHttpUtil addParam(String key, String value) {
-        if (Objects.isNull(paramMap)) {
-            paramMap = new LinkedHashMap<>(16);
-        }
-        paramMap.put(key, value);
-        return this;
-    }
-
-    public OkHttpUtil addBody(String body) {
-        this.body = body;
-        return this;
-    }
-
-    public void setHeader(Request.Builder request) {
-        if (Objects.nonNull(headerMap)) {
-            headerMap.forEach(request::addHeader);
-        }
-    }
-
-    public OkHttpUtil addHeader(String key, String value) {
-        if (Objects.isNull(headerMap)) {
-            headerMap = new LinkedHashMap<>(16);
-        }
-        headerMap.put(key, value);
-        return this;
-    }
-
-    /**
-     * @Description:鐢熸垚瀹夊叏濂楁帴瀛楀伐鍘傦紝鐢ㄤ簬Https璇锋眰鐨勮瘉涔﹁烦杩�
-     * @Author: zzc
-     * @Date: 2022-11-30 16:03
-     * @param trustManagers:
-     * @return: javax.net.ssl.SSLSocketFactory
-     **/
-    //private static SSLSocketFactory createSSLSocketFactory(TrustManager[] trustManagers) {
-    //    SSLSocketFactory sslSocketFactory = null;
-    //    try {
-    //        SSLContext ssl = SSLContext.getInstance("SSL");
-    //        ssl.init(null, trustManagers, new SecureRandom());
-    //        sslSocketFactory = ssl.getSocketFactory();
-    //    } catch (Exception e) {
-    //        e.printStackTrace();
-    //    }
-    //    return sslSocketFactory;
-    //}
-
-    private static SSLSocketFactory createSSLSocketFactory(TrustManager[] trustManagers) {
-        SSLSocketFactory sslSocketFactory = null;
-        try {
-            SSLContext ssl = SSLContext.getInstance("SSL");
-            ssl.init(null, trustManagers, new SecureRandom());
-            sslSocketFactory = ssl.getSocketFactory();
-
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        return sslSocketFactory;
-    }
-
-    private static TrustManager[] buildTrustManager() {
-        return new TrustManager[] {
-                new X509TrustManager() {
-                    @Override
-                    public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
-                    }
-
-                    @Override
-                    public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
-                    }
-
-                    @Override
-                    public X509Certificate[] getAcceptedIssuers() {
-                        return new X509Certificate[]{};
-                    }
-                }
-        };
-    }
-
-}
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/src/main/resources/application.yml b/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/src/main/resources/application.yml
deleted file mode 100644
index 3702633..0000000
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/src/main/resources/application.yml
+++ /dev/null
@@ -1,18 +0,0 @@
-spring:
-  profiles:
-    include: global, database, database-ym, database-pj
-
-#actutor鐨剋eb绔彛
-management:
-  server:
-    port: ${pipIrr.webchat.actutorPort}
-#web鏈嶅姟绔彛锛�8086
-server:
-  port: ${pipIrr.webchat.webPort}
-  servlet:
-    context-path: /webchat #webchat璁块棶涓婁笅鏂囪矾寰�
-    context-parameters:
-      #GenerateIdSetSuffixListener涓簲鐢紝鍙栧�艰寖鍥存槸0-99
-      idSuffix: ${pipIrr.webchat.idSuffix}
-      #ConfigListener涓簲鐢�
-      #configFileNames: config-global.xml,config-demo.xml
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/src/main/resources/log4j2.yml b/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/src/main/resources/log4j2.yml
deleted file mode 100644
index 924901d..0000000
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/src/main/resources/log4j2.yml
+++ /dev/null
@@ -1,73 +0,0 @@
-Configuration:
-  #status锛岃繖涓敤浜庤缃甽og4j2鑷韩鍐呴儴鐨勪俊鎭緭鍑猴紝鍙互涓嶈缃紝褰撹缃垚trace鏃讹紝浣犱細鐪嬪埌log4j2鍐呴儴鍚勭璇︾粏杈撳嚭锛涘彲浠ヨ缃垚Off(鍏抽棴)鎴朎rror(鍙緭鍑洪敊璇俊鎭�)
-  status: Error
-
-  Properties: # 瀹氫箟鍏ㄥ眬鍙橀噺
-    Property:
-      #鏃ュ織鏂囦欢瀛樺偍鐨勭洰褰�
-      - name: log.path
-        value: ./logs
-      #鏃ュ織鏂囦欢瀛樺偍鍚嶇О
-      - name: project.name
-        value: pipIrrBase
-
-  #瀹氫箟杈撳嚭鍣紝鍙互杈撳嚭鍒版帶鍒跺彴鍜屾枃浠�.
-  Appenders:
-    #杈撳嚭鍒版帶鍒跺彴
-    Console:
-      #Appender鍛藉悕
-      name: CONSOLE
-      target: SYSTEM_OUT
-      ThresholdFilter:
-        level: debug #杈撳嚭鏃ュ織绾у埆锛岃緭鍑烘棩蹇楁椂锛岄鍏堢敱Loggers.Root.level鎴朙oggers.Logger.level鍒ゆ柇鏄惁杈撳嚭锛岀劧鍚庡啀鐢辨湰level鍒ゆ柇鏄惁杈撳嚭
-        onMatch: ACCEPT #onMatch=ACCEPT 澶т簬绛変簬 "level" 閰嶇疆鐨勭瓑绾у湴鏃ュ織杈撳嚭
-        onMismatch: DENY #onMismatch=DENY 灏忎簬 "level" 閰嶇疆鐨勭瓑绾у湴鏃ュ織涓嶈緭鍑�
-      #鏃ュ織鍐呭鏍峰紡
-      PatternLayout:
-        #%n-鎹㈣
-        #%m-鏃ュ織鍐呭锛岃緭鍑轰唬鐮佷腑鎸囧畾鐨勬棩蹇椾俊鎭�
-        #%p-杈撳嚭浼樺厛绾э紝鍗矰EBUG,INFO,WARN,ERROR,FATAL
-        #%r-绋嬪簭鍚姩鍒扮幇鍦ㄧ殑姣鏁�
-        #%%- 杈撳嚭涓�涓�"%" 瀛楃
-        #%t-褰撳墠绾跨▼鍚�
-        #%d-鏃ユ湡鍜屾椂闂�, 甯哥敤鐨勬牸寮忔湁%d{DATE},%d{ABSOLUTE},%d{HH:mm:ss,SSS},%d{ddMMyyyyHH:mm:ss,SSS}
-        #%l-鍚�%F%L%C%M
-        #%F-java婧愭枃浠跺悕
-        #%L-java婧愮爜琛屾暟
-        #%C-java绫诲悕,%C{1}杈撳嚭鏈�鍚庝竴涓厓绱�
-        #%M-java鏂规硶鍚�
-        pattern: "%d{yyyy-MM-dd HH:mm:ss,SSS}:%4p %t (%C.%M:%L) - %m%n"
-    # 杈撳嚭鍒版枃浠讹紝瓒呰繃10MB褰掓。
-    RollingFile:
-      - name: ROLLING_FILE
-        ignoreExceptions: false
-        fileName: ${log.path}/${project.name}.log
-        filePattern: "${log.path}/$${date:yyyy-MM}/${project.name}-%d{yyyy-MM-dd}-%i.log.gz"
-        ThresholdFilter:
-          level: error #杈撳嚭鏃ュ織绾у埆锛岃緭鍑烘棩蹇楁椂锛岄鍏堢敱Loggers.Root.level鎴朙oggers.Logger.level鍒ゆ柇鏄惁杈撳嚭锛岀劧鍚庡啀鐢辨湰level鍒ゆ柇鏄惁杈撳嚭
-          onMatch: ACCEPT #onMatch=ACCEPT 澶т簬绛変簬 "level" 閰嶇疆鐨勭瓑绾у湴鏃ュ織杈撳嚭
-          onMismatch: DENY #onMismatch=DENY 灏忎簬 "level" 閰嶇疆鐨勭瓑绾у湴鏃ュ織涓嶈緭鍑�
-        #鏃ュ織鍐呭鏍峰紡
-        PatternLayout:
-          pattern: "%d{yyyy-MM-dd HH:mm:ss,SSS}:%4p %t (%C.%M:%L) - %m%n"
-        Policies:
-          SizeBasedTriggeringPolicy:
-            size: "10 MB"
-        DefaultRolloverStrategy:
-          max: 1000
-
-  Loggers:
-    Root:
-      level: info #鏃ュ織杈撳嚭绾у埆锛屽叡鏈�8涓骇鍒紝鎸夌収浠庝綆鍒伴珮涓猴細all < trace < debug < info < warn < error < fatal < off
-      AppenderRef: #Root鐨勫瓙鑺傜偣锛岀敤鏉ユ寚瀹氳鏃ュ織杈撳嚭鍒板摢涓狝ppender.
-        - ref: CONSOLE #杈撳嚭鏃ュ織鏃讹紝棣栧厛鐢辨湰level鍒ゆ柇鏄惁杈撳嚭锛岀劧鍚庡啀鐢变笂闈㈢殑Appenders.Console.ThresholdFilter.level鍒ゆ柇鏄惁杈撳嚭
-        - ref: ROLLING_FILE  #杈撳嚭鏃ュ織鏃讹紝棣栧厛鐢辨湰level鍒ゆ柇鏄惁杈撳嚭锛岀劧鍚庡啀鐢变笂闈㈢殑Appenders.RollingFile.ThresholdFilter.level鍒ゆ柇鏄惁杈撳嚭
-    # 涓哄寘閰嶇疆鐗规畩鐨凩og绾у埆锛屾柟渚胯皟璇曪紝
-    # 涓嶅彈Loggers.Root.level闄愬埗
-    Logger:
-      - name: com.dy.pipIrrGlobal.daoSe
-        additivity: false #鍘婚櫎閲嶅鐨刲og
-        level: debug #杈撳嚭鏃ュ織绾у埆
-        AppenderRef:
-          - ref: CONSOLE #杈撳嚭鏃ュ織鏃讹紝棣栧厛鐢辨湰.level鍒ゆ柇鏄惁杈撳嚭锛岀劧鍚庡啀鐢变笂闈㈢殑Appenders.Console.ThresholdFilter.level鍒ゆ柇鏄惁杈撳嚭
-          - ref: ROLLING_FILE #杈撳嚭鏃ュ織鏃讹紝棣栧厛鐢辨湰level鍒ゆ柇鏄惁杈撳嚭锛岀劧鍚庡啀鐢变笂闈㈢殑Appenders.RollingFile.ThresholdFilter.level鍒ゆ柇鏄惁杈撳嚭
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/src/test/java/com/dy/pipirrWebChat/PipIrrWebWebchatApplicationTests.java b/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/src/test/java/com/dy/pipirrWebChat/PipIrrWebWebchatApplicationTests.java
deleted file mode 100644
index e9dfe9d..0000000
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-webchat/src/test/java/com/dy/pipirrWebChat/PipIrrWebWebchatApplicationTests.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.dy.pipirrWebChat;
-
-import org.junit.jupiter.api.Test;
-import org.springframework.boot.test.context.SpringBootTest;
-
-@SpringBootTest
-class PipIrrWebWebchatApplicationTests {
-
-    @Test
-    void contextLoads() {
-    }
-
-}
diff --git a/pipIrr-platform/pipIrr-web/pom.xml b/pipIrr-platform/pipIrr-web/pom.xml
index 2562ee2..06ace49 100644
--- a/pipIrr-platform/pipIrr-web/pom.xml
+++ b/pipIrr-platform/pipIrr-web/pom.xml
@@ -26,7 +26,6 @@
         <module>pipIrr-web-gis</module>
         <module>pipIrr-web-sell</module>
         <module>pipIrr-web-project</module>
-        <module>pipIrr-web-webchat</module>
     </modules>
 
     <dependencies>

--
Gitblit v1.8.0