Explorar el Código

支付回调入库第一版

skyfffire hace 1 mes
padre
commit
7feb6f3a56

+ 2 - 0
src/main/java/common/jfinal/AppConfig.java

@@ -10,6 +10,7 @@ import common.interceptor.role.RoleInterceptor;
 import common.interceptor.ExceptionInterceptor;
 import common.interceptor.empty.EmptyInterceptor;
 import common.model._MappingKit;
+import modules.deposit.DepositController;
 import modules.hello.HelloController;
 import modules.news.NewsController;
 import modules.nftt.NfttController;
@@ -63,6 +64,7 @@ public class AppConfig extends JFinalConfig {
         routes.add("/order", OrderController.class);
         routes.add("/news", NewsController.class);
         routes.add("/withdraw", WithdrawController.class);
+        routes.add("/deposit", DepositController.class);
     }
 
     @Override

+ 17 - 4
src/main/java/common/model/base/BaseDeposit.java

@@ -22,14 +22,14 @@ public abstract class BaseDeposit<M extends BaseDeposit<M>> extends Model<M> imp
 		return getLong("id");
 	}
 	/**
-	 * 充值的user
+	 * 充值的user,-1代表未匹配上
 	 */
 	public void setUserId(java.lang.Long userId) {
 		set("user_id", userId);
 	}
 	
 	/**
-	 * 充值的user
+	 * 充值的user,-1代表未匹配上
 	 */
 	public java.lang.Long getUserId() {
 		return getLong("user_id");
@@ -61,18 +61,31 @@ public abstract class BaseDeposit<M extends BaseDeposit<M>> extends Model<M> imp
 		return getStr("wx_original");
 	}
 	/**
-	 * 微信的充值单号,如果是重复的就不要给用户重复充值了
+	 * 微信的充值单号
 	 */
 	public void setWxOrderNo(java.lang.String wxOrderNo) {
 		set("wx_order_no", wxOrderNo);
 	}
 	
 	/**
-	 * 微信的充值单号,如果是重复的就不要给用户重复充值了
+	 * 微信的充值单号
 	 */
 	public java.lang.String getWxOrderNo() {
 		return getStr("wx_order_no");
 	}
+	/**
+	 * 微信的回调状态
+	 */
+	public void setWxOrderStatus(java.lang.String wxOrderStatus) {
+		set("wx_order_status", wxOrderStatus);
+	}
+	
+	/**
+	 * 微信的回调状态
+	 */
+	public java.lang.String getWxOrderStatus() {
+		return getStr("wx_order_status");
+	}
 	/**
 	 * 充值数量
 	 */

+ 127 - 0
src/main/java/modules/deposit/DepositController.java

@@ -0,0 +1,127 @@
+package modules.deposit;
+
+import com.jfinal.aop.Inject;
+import com.jfinal.json.Json;
+import com.jfinal.kit.HttpKit;
+import com.jfinal.kit.StrKit;
+import com.wechat.pay.java.service.payments.model.Transaction;
+import common.jfinal.AppConfig;
+import common.model.Deposit;
+import common.model.User;
+import common.utils.http.MyController;
+import common.utils.http.MyRet;
+import common.utils.wechat.WeChatService;
+import modules.user.UserService;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class DepositController extends MyController {
+    @Inject
+    DepositService service;
+    @Inject
+    UserService userService;
+    
+    public void hello() {
+        renderJson(MyRet.ok(service.hello()));
+    }
+
+    // 微信充值回调地址
+    public void deposited() {
+        String originalBody = HttpKit.readData(getRequest());
+        AppConfig.LOGGER.info("wechat notify {}", originalBody);
+
+        // 保证每条回调都保存到数据库
+        Deposit deposit = new Deposit();
+        deposit.setCreateTime(System.currentTimeMillis());
+        deposit.setWxOriginal(originalBody);
+        deposit.setIsDeleted(0);
+
+        // 获取回调通知中的相关数据
+        String wechatPaySerial = getRequest().getHeader("Wechatpay-Serial");
+        String wechatpayNonce = getRequest().getHeader("Wechatpay-Nonce");
+        String wechatSignature = getRequest().getHeader("Wechatpay-Signature");
+        String wechatTimestamp = getRequest().getHeader("Wechatpay-Timestamp");
+
+        try {
+            // 解析完成
+            Transaction tx = WeChatService.parseTransaction(originalBody, wechatPaySerial, wechatpayNonce, wechatSignature, wechatTimestamp);
+            Json json = Json.getJson();
+            String txJson = json.toJson(tx);
+
+            // 商户下单时传入的商户系统内部订单号。
+            String orderNo = tx.getOutTradeNo();
+            // 获取库中存放的tx
+            Deposit dbDeposit = service.findDepositByWxOrderNo(orderNo);
+            // 付款数量
+            Integer paymentAmount = tx.getAmount().getTotal();
+            // 状态描述
+            String status = tx.getTradeState().toString();
+            
+            if (dbDeposit == null) {
+                deposit.setWxDecrypted(txJson);
+                deposit.setWxOrderStatus(status);
+                deposit.setDescription("未提前入库的订单,wx:" + tx.getTradeStateDesc());
+                deposit.setWxOrderStatus(tx.getTradeState().toString());
+                deposit.setAmount(paymentAmount);
+                deposit.save();
+                
+                AppConfig.LOGGER.warn("未提前入库的订单 {}", deposit);
+            } else {
+                deposit = dbDeposit;
+                
+                // 记录解密后的信息
+                deposit.setAmount(paymentAmount);
+                deposit.setWxDecrypted(txJson);
+
+                // 不要重复处理已存在的充值单号,并且要加款成功
+                if (StrKit.isBlank(deposit.getWxOrderStatus())) {
+                    User user = userService.findUserById(deposit.getUserId() + "");
+                    
+                    // 记录订单状态
+                    deposit.setWxOrderStatus(tx.getTradeState().toString());
+                    
+                    // 有充值信息但是未找到充值者
+                    if (user == null) {
+                        deposit.setDescription("未找到充值者,wx:" + tx.getTradeStateDesc());
+                    } else {
+                        // 判断订单状态
+                        if (tx.getTradeState() == Transaction.TradeStateEnum.SUCCESS) {
+                            // 如果充值成功,对用户进行充值
+                            user.setBalance(user.getBalance() + paymentAmount);
+                            user.update();
+
+                            deposit.setDescription("用户充值成功,wx:" + tx.getTradeStateDesc());
+                        } else {
+                            deposit.setDescription("用户充值失败,wx:" + tx.getTradeStateDesc());
+                        }
+                    }
+                }
+
+                // 充值记录入库
+                deposit.update();
+
+                AppConfig.LOGGER.info("入库成功 {}", deposit);
+            }
+
+            // 成功入库后给微信的回调信息
+            getResponse().setStatus(200);
+            renderText("");
+        } catch (Exception e) {
+            // 回调日志入库
+            if (StrKit.notBlank(wechatPaySerial, wechatpayNonce, wechatSignature, wechatTimestamp)) {
+                deposit.save();
+            }
+
+            Map<String, Object> responseJson = new HashMap<>();
+            responseJson.put("code", "FAIL");
+            responseJson.put("message", "回调失败 " + e.getMessage());
+
+            AppConfig.LOGGER.error("回调失败 {}", e.getMessage());
+
+            // 返回500错误码
+            getResponse().setStatus(500);
+            renderJson(responseJson);
+        }
+    }
+}

+ 13 - 0
src/main/java/modules/deposit/DepositService.java

@@ -0,0 +1,13 @@
+package modules.deposit;
+
+import common.model.Deposit;
+
+public class DepositService {
+    public String hello() {
+        return "Hello deposit";
+    }
+    
+    public Deposit findDepositByWxOrderNo(String wxOrderNo) {
+        return Deposit.dao.findFirst("SELECT * FROM t_deposit WHERE wx_order_no=?", wxOrderNo);
+    }
+}

+ 3 - 7
src/main/java/modules/user/BalanceLogService.java

@@ -9,15 +9,11 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-public class BalanceLogService {
-    public BalanceLog findByOrderNo(String orderNo) {
-        return BalanceLog.dao.findFirst("SELECT * FROM t_deposit_log WHERE hyg_order_no=?", orderNo);
-    }
-    
+public class BalanceLogService {    
     public MyRet findForUser(int pageNumber, int pageSize, long userId) {
         String columns = "id, amount, description, create_time";
         String select = "SELECT " + columns;
-        String fromWhere = "FROM t_deposit_log WHERE user_id = ?"; // 基础 from 子句
+        String fromWhere = "FROM t_balance_log WHERE user_id = ?"; // 基础 from 子句
         String orderBy = "ORDER BY create_time DESC";
 
         List<Object> paramsForList = new ArrayList<>(); // 用于 SELECT 列表查询的参数
@@ -44,7 +40,7 @@ public class BalanceLogService {
             return MyRet.ok("查询成功").setData(response);
         }
         
-        long totalRowLong = Db.queryLong("SELECT COUNT(id) FROM t_deposit_log WHERE user_id=?", userId);
+        long totalRowLong = Db.queryLong("SELECT COUNT(id) FROM t_balance_log WHERE user_id=?", userId);
         // 手动计算 total_page
         int totalPage = (int) Math.ceil((double) totalRowLong / pageSize);
         if (totalPage == 0 && totalRowLong > 0) { // 解决总行数大于0但总页数为0(pageSize大于totalRow)的问题

+ 0 - 73
src/main/java/modules/user/UserController.java

@@ -385,79 +385,6 @@ public class UserController extends MyController {
             renderJson(responseJson);
         }
     }
-    
-    // 微信充值回调地址
-    public void wxDeposited() {
-        String originalBody = HttpKit.readData(getRequest());
-        AppConfig.LOGGER.info("wx notify {}", originalBody);
-
-        // 保证每条回调都保存到数据库
-        Deposit deposit = new Deposit();
-        deposit.setCreateTime(System.currentTimeMillis());
-        deposit.setWxOriginal(originalBody);
-        deposit.setIsDeleted(0);
-        
-        try {
-            // 获取回调通知中的相关数据
-            String wechatPaySerial = getRequest().getHeader("Wechatpay-Serial");
-            String wechatpayNonce = getRequest().getHeader("Wechatpay-Nonce");
-            String wechatSignature = getRequest().getHeader("Wechatpay-Signature");
-            String wechatTimestamp = getRequest().getHeader("Wechatpay-Timestamp");
-
-            // 解析完成
-            Transaction tx = WeChatService.parseTransaction(originalBody, wechatPaySerial, wechatpayNonce, wechatSignature, wechatTimestamp);
-            Json json = Json.getJson();
-            String txJson = json.toJson(tx);
-
-            // // 这里开始进行日志记录
-            // String payerAccount = businessBody.getString("businessBody");
-            // String orderNo = businessBody.getString("orderNo");
-            // // 不要重复处理已存在的充值单号,并且要加款成功
-            // if (depositLogService.findByOrderNo(orderNo) == null && businessBody.getString("rechargeStatus").equals("20")) {
-            //     User user = service.findUserByBankCard(payerAccount);
-            //
-            //     // 有充值信息但是未找到充值者
-            //     Integer paymentAmount = businessBody.getInteger("paymentAmount");
-            //     if (user == null) {
-            //         log.setDescription("未找到充值者");
-            //         log.setAmount(paymentAmount);
-            //         log.setUserId((long) -1);
-            //     } else {
-            //         // 对用户进行充值
-            //         user.setBalance(user.getBalance() + paymentAmount);
-            //         user.update();
-            //
-            //         // 交易者信息存档
-            //         log.setDescription("用户充值");
-            //         log.setAmount(paymentAmount);
-            //         log.setUserId(user.getId());
-            //     }
-            // }
-
-            // 日志入库
-            deposit.setWxDecrypted(txJson);
-            deposit.update();
-            
-            AppConfig.LOGGER.info("入库成功 {}", deposit);
-
-            // 成功入库后给微信的回调信息
-            getResponse().setStatus(200);
-            renderText("");
-        } catch (Exception e) {
-            // 回调日志入库
-            deposit.save();
-            
-            Map<String, Object> responseJson = new HashMap<>();
-            responseJson.put("code", "FAIL");
-            responseJson.put("message", "回调失败 " + e.getMessage());
-
-            AppConfig.LOGGER.error("回调失败 {}", e.getMessage());
-
-            // 返回500错误码
-            getResponse().setStatus(500);
-            renderJson(responseJson);
-        }
-    }
 
     @Before(LoginInterceptor.class)
     public void getBalance() {

+ 7 - 7
src/main/java/modules/user/UserService.java

@@ -157,13 +157,13 @@ public class UserService {
         return User.dao.findFirst(sql, MobileNumber);
     }
 
-    public User findUserByBankCard(String bankCard) {
-        //, hyg_sign_rst
-        String columns = "id, balance";
-        String sql = "select " + columns + " from t_user where hyg_bank_card = ?";
-
-        return User.dao.findFirst(sql, bankCard);
-    }
+    // public User findUserByBankCard(String bankCard) {
+    //     //, hyg_sign_rst
+    //     String columns = "id, balance";
+    //     String sql = "select " + columns + " from t_user where hyg_bank_card = ?";
+    //
+    //     return User.dao.findFirst(sql, bankCard);
+    // }
     
     public boolean isUserExists(String mobileNumber) {        
         return Db.queryLong("SELECT COUNT(1) FROM t_user WHERE mobile_number = ?", mobileNumber) > 0;