Explorar o código

优化订单状态查询的定时任务和二维码支付通知

lighter %!s(int64=2) %!d(string=hai) anos
pai
achega
09ff4a7373

+ 13 - 5
src/main/java/thyyxxk/wxservice_server/dao/WxApiDao.java

@@ -42,10 +42,21 @@ public interface WxApiDao {
     void updatePayStatusAndPayTime(@Param("tradeNo") String tradeNo, @Param("status") Integer status,
                                    @Param("successTime") String successTime);
 
+    @Update("update t_wechat_pay_order set pay_status=#{status},pay_datetime=#{successTime},open_id=#{openId}, " +
+            "query_state_times=(query_state_times+1),last_query_state=getdate() where trade_no=#{tradeNo}")
+    void updatePayStatusAndPayTimeAndOpenId(@Param("tradeNo") String tradeNo, @Param("status") Integer status,
+                                   @Param("successTime") String successTime, @Param("openId") String openId);
+
     @Update("update t_wechat_pay_order set pay_status=#{status},query_state_times=(query_state_times+1), " +
             "last_query_state=getdate() where trade_no=#{tradeNo}")
     void updatePayStatusAndQueryTimes(@Param("tradeNo") String tradeNo, @Param("status") Integer status);
 
+    @Update("update t_wechat_pay_order set pay_status=#{status},query_state_times=(query_state_times+1), " +
+            "open_id=#{openId},last_query_state=getdate() where trade_no=#{tradeNo}")
+    void updatePayStatusAndQueryTimesAndOpenId(@Param("tradeNo") String tradeNo,
+                                               @Param("status") Integer status,
+                                               @Param("openId") String openId);
+
     @Update("update t_wechat_pay_order set pay_status=#{status} where trade_no=#{tradeNo}")
     void updatePayStatusOnly(@Param("tradeNo") String tradeNo, @Param("status") Integer status);
 
@@ -59,15 +70,12 @@ public interface WxApiDao {
     @Update("update t_wechat_pay_order set his_status=1,pay_status=1 where trade_no=#{tradeNo}")
     void updateSuccessHisStatus(@Param("tradeNo") String tradeNo);
 
-    @Update("update t_wechat_pay_order set open_id=#{openId} where trade_no=#{tradeNo}")
-    void updatePayOpenId(@Param("tradeNo") String tradeNo,
-                                  @Param("openId") String openId);
-
     @Select("select * from t_wechat_pay_order with(nolock) where trade_no=#{tradeNo}")
     WxPayOrder selectOrderByTradeNo(@Param("tradeNo") String tradeNo);
 
     @Select("select trade_no, query_state_times,offset=datediff(minute,create_datetime,last_query_state) " +
-            "from t_wechat_pay_order with(nolock) where his_status=0 and order_type<=3 and pay_status in (99, 0, 5, 6, 100) ")
+            "from t_wechat_pay_order with(nolock) where his_status=0 and order_type<=3 and open_id!='' " +
+            "and pay_status in (99, 0, 5, 6, 100) ")
     List<TradeNo> selectTradeNosForScheduleTask();
 
     @Select("select open_id from t_wechat_patient_bind with(nolock) where patient_id=#{cardNo} and del_flag=0")

+ 1 - 2
src/main/java/thyyxxk/wxservice_server/service/WxApiService.java

@@ -220,8 +220,7 @@ public class WxApiService {
                 }
             }
             JSONObject obj = retryService.queryOrderStateFromTencent(tradeNo, orderType, source);
-            String value = obj.getString("trade_state");
-            TradeState tradeState = TradeState.get(value);
+            TradeState tradeState = TradeState.get(obj.getString("trade_state"));
             if (tradeState.equals(TradeState.SUCCESS)) {
                 String successTime = obj.getString("success_time")
                         .split("\\+")[0].replace("T", " ");

+ 26 - 8
src/main/java/thyyxxk/wxservice_server/service/WxPayNotifyService.java

@@ -4,9 +4,12 @@ import com.alibaba.fastjson.JSONObject;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import thyyxxk.wxservice_server.constant.OrderType;
 import thyyxxk.wxservice_server.constant.QuerySource;
+import thyyxxk.wxservice_server.constant.TradeState;
 import thyyxxk.wxservice_server.dao.WxApiDao;
 import thyyxxk.wxservice_server.entity.wxapi.PaymentNotify;
+import thyyxxk.wxservice_server.entity.wxapi.WxPayOrder;
 import thyyxxk.wxservice_server.utils.WxPaySignUtil;
 
 import java.nio.charset.StandardCharsets;
@@ -19,29 +22,44 @@ import java.security.GeneralSecurityException;
 @Service
 public class WxPayNotifyService {
     private final WxApiDao dao;
-    private final WxApiService wxApiService;
+    private final SavePayResultService savePayResultService;
 
     @Autowired
-    public WxPayNotifyService(WxApiDao dao, WxApiService wxApiService) {
+    public WxPayNotifyService(WxApiDao dao, SavePayResultService savePayResultService) {
         this.dao = dao;
-        this.wxApiService = wxApiService;
+        this.savePayResultService = savePayResultService;
     }
 
     public void paymentNotify(PaymentNotify param) throws Exception {
-        log.info("微信支付通知: {}", param);
+        log.info("微信扫码支付通知: {}", param);
         String nonce = param.getResource().getNonce();
         String associatedData = param.getResource().getAssociated_data();
         String ciphertext = param.getResource().getCiphertext();
         ciphertext = WxPaySignUtil.decryptToString(associatedData.getBytes(StandardCharsets.UTF_8),
                 nonce.getBytes(StandardCharsets.UTF_8), ciphertext);
         JSONObject cipherObj = JSONObject.parseObject(ciphertext);
-        log.info("微信支付通知解密:{}", ciphertext);
+        log.info("微信扫码支付通知解密:{}", ciphertext);
         JSONObject payer = cipherObj.getJSONObject("payer");
         String tradeNo = cipherObj.getString("out_trade_no");
         String openId = payer.getString("openid");
-        dao.updatePayOpenId(tradeNo, openId);
-        log.info("二维码支付查询订单状态:{}", tradeNo);
-        wxApiService.queryOrderState(tradeNo, QuerySource.QRCODE);
+        TradeState tradeState = TradeState.get(cipherObj.getString("trade_state"));
+        if (tradeState.equals(TradeState.SUCCESS)) {
+            String successTime = cipherObj.getString("success_time")
+                    .split("\\+")[0].replace("T", " ");
+            dao.updatePayStatusAndPayTimeAndOpenId(tradeNo, tradeState.getCode(), successTime, openId);
+            WxPayOrder order = dao.selectOrderByTradeNo(tradeNo);
+            OrderType orderType = OrderType.get(order.getOrderType());
+            switch (orderType) {
+                case OUTPATIENT:
+                    savePayResultService.saveMzChargeInfo(order, QuerySource.QRCODE, successTime);
+                    break;
+                case INPATIENT_PRE_PAY:
+                    savePayResultService.saveZyYjjInfo(order);
+                    break;
+            }
+        } else {
+            dao.updatePayStatusAndQueryTimesAndOpenId(tradeNo, tradeState.getCode(), openId);
+        }
     }
 
     public void paymentNotify2(PaymentNotify param) throws GeneralSecurityException {