From d93c645e68387a82c442c5c76d8e5f86b19e0251 Mon Sep 17 00:00:00 2001 From: Stormeye Wu Date: Thu, 8 Aug 2019 09:29:52 +0800 Subject: [PATCH] =?UTF-8?q?[POS][=E4=BF=AE=E6=94=B9]:=E6=A0=B8=E9=94=80?= =?UTF-8?q?=E5=8F=96=E6=B6=88=E6=94=AF=E6=8C=81=E5=BC=BA=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../iformall/controller/PosController.java | 7 +-- .../iformall/service/impl/PosServiceImpl.java | 43 ++++++++++----- .../com/iformall/pos/test/PosAppTest.java | 52 +++++++++++++++++++ .../java/com/iformall/pay/WxPayConstant.java | 1 + 4 files changed, 88 insertions(+), 15 deletions(-) diff --git a/mallinkPosApi/src/main/java/com/iformall/controller/PosController.java b/mallinkPosApi/src/main/java/com/iformall/controller/PosController.java index c7d893de6..bf3159b42 100644 --- a/mallinkPosApi/src/main/java/com/iformall/controller/PosController.java +++ b/mallinkPosApi/src/main/java/com/iformall/controller/PosController.java @@ -284,9 +284,10 @@ public class PosController extends BaseController { "\"tenant_id\":\"string(必填)\"," + "\"merchant_id\":\"string(必填)\"," + "\"bu_user_id\":\"string(必填)\"," + - "\"coupon_order_id\":\"string(必填)\" +" + - "\"nonce_str\":\"string(必填)\" +" + - "\"pos_order_id\":\"string(必填)\" }") + "\"coupon_order_id\":\"string(必填)\"" + + "\"nonce_str\":\"string(必填)\"" + + "\"pos_order_id\":\"string(必填)\"" + + "\"force\":\"string(选填true/false)\" }") @PostMapping("/couponOrderVerifyCancel") public Map couponOrderIndependentVerifyCancel(@RequestBody Map params) { JSONObject payContent = new JSONObject(); diff --git a/mallinkPosApi/src/main/java/com/iformall/service/impl/PosServiceImpl.java b/mallinkPosApi/src/main/java/com/iformall/service/impl/PosServiceImpl.java index 57aee9586..93d0a71f7 100644 --- a/mallinkPosApi/src/main/java/com/iformall/service/impl/PosServiceImpl.java +++ b/mallinkPosApi/src/main/java/com/iformall/service/impl/PosServiceImpl.java @@ -396,6 +396,7 @@ public class PosServiceImpl implements PosService { String buUserIdStr = params.get(WxPayConstant.BUSER_ID); // POS操作员ID String couponOrderIdStr = params.get(WxPayConstant.COUPON_ORDER_ID); // 券ID String posOrderIdStr = params.get(WxPayConstant.COUPON_ORDER_ID); // POS订单ID + String forceStr = params.get(WxPayConstant.FORCE); // 是否强制 if (StringUtils.isBlank(tenantId)) { String errMessage = "request params[tenant_id] error."; @@ -486,6 +487,12 @@ public class PosServiceImpl implements PosService { if (couponOrderCVo.getCouponOrderStatus().equals(EnumCouponOrderStatus.COUPON_ORDER_USED.getCode()) && actionType.equals(EnumVerifyActionType.VERIFY_CANCEL)) { logger.info("券已被核销: " + couponOrderIdStr); + boolean force = false; + if (StringUtils.isNotBlank(forceStr)) { + force = Boolean.valueOf(forceStr); + } + // 检查是否有发放的券, 有则无法退券 + try { cancelVerify(couponOrderCVo, buUserId, posOrderId); return retMap; @@ -527,6 +534,7 @@ public class PosServiceImpl implements PosService { try { WxCouponOrder couponOrder = new WxCouponOrder(); couponOrder.setId(couponOrderCVo.getId()); + couponOrder.setTenantId(couponOrderCVo.getTenantId()); couponOrder.setCouponOrderStatus(EnumCouponOrderStatus.POS_PRE_VERIFY.getCode()); couponOrder.setBUserId(buUserId); couponOrder.setUpdateDate(new Date()); @@ -558,15 +566,20 @@ public class PosServiceImpl implements PosService { posCouponOrderVerify.setState(EnumEnableType.Enable.getCode()); List posCouponOrderVerifyList = posCouponOrderVerifyService.getList(posCouponOrderVerify); if (posCouponOrderVerifyList.size() == 1) { - try { - PosCouponOrderVerify updateOrder = new PosCouponOrderVerify(); - updateOrder.setId(posCouponOrderVerify.getId()); - updateOrder.setState(EnumEnableType.Disable.getCode()); - updateOrder.setUpdateDate(new Date()); - posCouponOrderVerifyService.saveOrUpdate(updateOrder); - } catch (Exception e) { - logger.error("db failed: couponOrder-" + couponOrderCVo.getId() + ", e:" + e.getMessage()); - throw new MallinkException(ErrorCode.DB_FAIL.getCode(), "DB FAILD " + e.getMessage()); + posCouponOrderVerify = posCouponOrderVerifyList.get(0); + if(posCouponOrderVerify != null) { + try { + PosCouponOrderVerify updateCouponOrderVerify = new PosCouponOrderVerify(); + updateCouponOrderVerify.setId(posCouponOrderVerify.getId()); + updateCouponOrderVerify.setTenantId(posCouponOrderVerify.getTenantId()); + updateCouponOrderVerify.setState(EnumEnableType.Disable.getCode()); + updateCouponOrderVerify.setUpdateDate(new Date()); + posCouponOrderVerifyService.saveOrUpdate(updateCouponOrderVerify); + // posCouponOrderVerifyService.deleteById(posCouponOrderVerify.getId()); + } catch (Exception e) { + logger.error("db failed: couponOrder-" + couponOrderCVo.getId() + ", e:" + e.getMessage()); + throw new MallinkException(ErrorCode.DB_FAIL.getCode(), "DB FAILD " + e.getMessage()); + } } } else { logger.error(ErrorCode.VERIFY_PRE_POS_ORDER_NOT_EQUAL.getMessage() + ": " + posOrderId); @@ -577,10 +590,10 @@ public class PosServiceImpl implements PosService { try { WxCouponOrder couponOrder = new WxCouponOrder(); couponOrder.setId(couponOrderCVo.getId()); + couponOrder.setTenantId(couponOrderCVo.getTenantId()); couponOrder.setCouponOrderStatus(EnumCouponOrderStatus.COUPON_ORDER_USE_WAIT.getCode()); - couponOrder.setBUserId(buUserId); couponOrder.setUpdateDate(new Date()); - num = couponOrderMapper.updateVerifyCouponOrder(couponOrder); + num = couponOrderMapper.cancelVerifyCouponOrder(couponOrder); } catch (Exception e) { logger.error("db failed: couponOrder-" + couponOrderCVo.getId() + ", e:" + e.getMessage()); throw new MallinkException(ErrorCode.DB_FAIL.getCode(), "DB FAILD " + e.getMessage()); @@ -725,7 +738,13 @@ public class PosServiceImpl implements PosService { posCouponOrderVerify = posCouponOrderVerifyList.get(0); if (posCouponOrderVerify != null) { try { - posCouponOrderVerifyService.deleteById(posCouponOrderVerify.getId()); + PosCouponOrderVerify updateCouponOrderVerify = new PosCouponOrderVerify(); + updateCouponOrderVerify.setId(posCouponOrderVerify.getId()); + updateCouponOrderVerify.setTenantId(posCouponOrderVerify.getTenantId()); + updateCouponOrderVerify.setState(EnumEnableType.Disable.getCode()); + updateCouponOrderVerify.setUpdateDate(new Date()); + posCouponOrderVerifyService.saveOrUpdate(updateCouponOrderVerify); + //posCouponOrderVerifyService.deleteById(posCouponOrderVerify.getId()); } catch(Exception e){ logger.error("db failed: couponOrder-" + couponOrderCVo.getId() + ", e:" + e.getMessage()); throw new MallinkException(ErrorCode.DB_FAIL.getCode(), "DB FAILD " + e.getMessage()); diff --git a/mallinkPosApi/src/test/java/com/iformall/pos/test/PosAppTest.java b/mallinkPosApi/src/test/java/com/iformall/pos/test/PosAppTest.java index 90c130d63..681f1f3da 100644 --- a/mallinkPosApi/src/test/java/com/iformall/pos/test/PosAppTest.java +++ b/mallinkPosApi/src/test/java/com/iformall/pos/test/PosAppTest.java @@ -199,4 +199,56 @@ public class PosAppTest { System.out.println("response sign: " + resSigned); Assert.assertEquals(resSigned, true); } + + @Test + public void couponOrderPreVerifyTest() throws Exception { + Map reqObj = new HashMap<>(); + reqObj.put(WxPayConstant.DEV_ID, devId); + reqObj.put(WxPayConstant.TENANT_ID, "456"); + reqObj.put(WxPayConstant.MERCHANT_ID, "317109453987631104"); + reqObj.put(WxPayConstant.BUSER_ID, "317111133332426752"); + reqObj.put(WxPayConstant.COUPON_ORDER_ID, "318978990426783744"); + reqObj.put(WxPayConstant.NONCE_STR, "1"); + reqObj.put(WxPayConstant.POS_ORDER_ID, "1"); + reqObj.put(WxPayConstant.SIGN, WxPayment.createSignHMAC(reqObj, devReqKey)); + String reqJsonStr = JSONObject.toJSONString(reqObj); + RequestBuilder request = MockMvcRequestBuilders.post("/couponOrderPreVerify") + .contentType(MediaType.APPLICATION_JSON) + .content(reqJsonStr); + MvcResult result = mockMvc.perform(request).andReturn(); + String responseStr = result.getResponse().getContentAsString(); + System.out.println(responseStr); + + ObjectMapper mapper = new ObjectMapper(); + Map respMap = mapper.readValue(responseStr, Map.class); + boolean resSigned = WxPayment.verifyNotifyHMAC(respMap, devResKey); + System.out.println("response sign: " + resSigned); + Assert.assertEquals(resSigned, true); + } + + @Test + public void couponOrderPreVerifyCancelTest() throws Exception { + Map reqObj = new HashMap<>(); + reqObj.put(WxPayConstant.DEV_ID, devId); + reqObj.put(WxPayConstant.TENANT_ID, "456"); + reqObj.put(WxPayConstant.MERCHANT_ID, "317109453987631104"); + reqObj.put(WxPayConstant.BUSER_ID, "317111133332426752"); + reqObj.put(WxPayConstant.COUPON_ORDER_ID, "318978990426783744"); + reqObj.put(WxPayConstant.NONCE_STR, "1"); + reqObj.put(WxPayConstant.POS_ORDER_ID, "1"); + reqObj.put(WxPayConstant.SIGN, WxPayment.createSignHMAC(reqObj, devReqKey)); + String reqJsonStr = JSONObject.toJSONString(reqObj); + RequestBuilder request = MockMvcRequestBuilders.post("/couponOrderPreVerifyCancel") + .contentType(MediaType.APPLICATION_JSON) + .content(reqJsonStr); + MvcResult result = mockMvc.perform(request).andReturn(); + String responseStr = result.getResponse().getContentAsString(); + System.out.println(responseStr); + + ObjectMapper mapper = new ObjectMapper(); + Map respMap = mapper.readValue(responseStr, Map.class); + boolean resSigned = WxPayment.verifyNotifyHMAC(respMap, devResKey); + System.out.println("response sign: " + resSigned); + Assert.assertEquals(resSigned, true); + } } diff --git a/mallinkService/src/main/java/com/iformall/pay/WxPayConstant.java b/mallinkService/src/main/java/com/iformall/pay/WxPayConstant.java index b0eecf929..756267714 100644 --- a/mallinkService/src/main/java/com/iformall/pay/WxPayConstant.java +++ b/mallinkService/src/main/java/com/iformall/pay/WxPayConstant.java @@ -15,6 +15,7 @@ public class WxPayConstant { public final static String NONCE_STR = "nonce_str"; public final static String DEV_ID = "dev_id"; public final static String SIGN = "sign"; + public final static String FORCE = "force"; public final static String TENANT_ID = "tenant_id";