From 788deca1b4a24f8a24e49c24f7d89975a1d74bbe Mon Sep 17 00:00:00 2001 From: admin <2780501319@qq.com> Date: 星期日, 03 十一月 2019 23:31:25 +0800 Subject: [PATCH] 商城订单退款处理 --- fanli/src/main/java/com/yeshi/fanli/dto/mq/order/OrderTopicTagEnum.java | 4 /dev/null | 24 ---- utils/src/main/java/org/yeshi/utils/wx/WXPayUtil.java | 89 +++++++++++++++++ fanli/src/main/java/com/yeshi/fanli/entity/shop/BanLiShopOrder.java | 5 fanli/src/main/java/com/yeshi/fanli/service/inter/shop/BanLiShopOrderPayService.java | 8 + utils/src/main/java/org/yeshi/utils/exception/WXOrderException.java | 28 +++++ fanli/src/main/java/com/yeshi/fanli/service/impl/shop/BanLiShopOrderServiceImpl.java | 11 + fanli/src/main/java/com/yeshi/fanli/util/shop/BanLiShopOrderUtil.java | 51 ++++++++++ fanli/src/main/java/com/yeshi/fanli/service/impl/shop/BanLiShopOrderPayServiceImpl.java | 59 +++++++++++ 9 files changed, 247 insertions(+), 32 deletions(-) diff --git a/fanli/src/main/java/com/yeshi/fanli/dto/mq/order/OrderTopicTagEnum.java b/fanli/src/main/java/com/yeshi/fanli/dto/mq/order/OrderTopicTagEnum.java index 9a4eec2..d04ecf8 100644 --- a/fanli/src/main/java/com/yeshi/fanli/dto/mq/order/OrderTopicTagEnum.java +++ b/fanli/src/main/java/com/yeshi/fanli/dto/mq/order/OrderTopicTagEnum.java @@ -1,5 +1,6 @@ package com.yeshi.fanli.dto.mq.order; +import com.yeshi.fanli.dto.mq.order.body.BanLiShopOrderMQMsg; import com.yeshi.fanli.util.annotation.UserActive; public enum OrderTopicTagEnum { @@ -7,7 +8,8 @@ orderUpdate(UserActive.class), // 璁㈠崟淇敼 orderFanLiActual(UserActive.class), // 璁㈠崟瀹炴椂鍒拌处 orderFanLiDelay(UserActive.class), // 璁㈠崟鍒拌处寤舵椂娑堟伅 - banLiShopOrderDelay(UserActive.class);// 鏉挎牀鍟嗗煄涓嬪崟 + banLiShopOrderDelay(BanLiShopOrderMQMsg.class),// 鏉挎牀鍟嗗煄涓嬪崟 + banLiShopOrderRefund(BanLiShopOrderMQMsg.class);//鏉挎牀鍟嗗煄璁㈠崟閫�娆� private final Class<?> clazz; diff --git a/fanli/src/main/java/com/yeshi/fanli/entity/shop/BanLiShopOrder.java b/fanli/src/main/java/com/yeshi/fanli/entity/shop/BanLiShopOrder.java index f96181d..f32a44f 100644 --- a/fanli/src/main/java/com/yeshi/fanli/entity/shop/BanLiShopOrder.java +++ b/fanli/src/main/java/com/yeshi/fanli/entity/shop/BanLiShopOrder.java @@ -17,12 +17,15 @@ public final static int PAY_STATE_NOPAY = 0;// 鏈敮浠� public final static int PAY_STATE_PAID = 1;// 宸叉敮浠� + public final static int PAY_STATE_REFUND = 2;// 浠ラ��娆� public final static int STATE_INVALID = -1;// 澶辨晥 public final static int STATE_NO_PAY = 0;// 鏈敮浠� public final static int STATE_PART_PAY = 1;// 閮ㄥ垎鏀粯 public final static int STATE_PAID = 5;// 宸叉敮浠�,寰呭鏍� - public final static int STATE_REJECT = 10;// 瀹℃牳鎷掔粷 + public final static int STATE_REJECT = 10;// 瀹℃牳鎷掔粷锛岄��娆句腑 + public final static int STATE_REJECT_REFUND_SUCCESS = 11;// 瀹℃牳鎷掔粷-閫�娆炬垚鍔� + public final static int STATE_REJECT_REFUND_FAIL = 12;// 瀹℃牳鎷掔粷-閫�娆惧け璐� public final static int STATE_SUCCESS = 20;// 浜ゆ槗鎴愬姛 @Column(name = "so_id") diff --git a/fanli/src/main/java/com/yeshi/fanli/service/impl/shop/BanLiShopOrderPayServiceImpl.java b/fanli/src/main/java/com/yeshi/fanli/service/impl/shop/BanLiShopOrderPayServiceImpl.java index 4db3d5b..14fc3b4 100644 --- a/fanli/src/main/java/com/yeshi/fanli/service/impl/shop/BanLiShopOrderPayServiceImpl.java +++ b/fanli/src/main/java/com/yeshi/fanli/service/impl/shop/BanLiShopOrderPayServiceImpl.java @@ -7,6 +7,9 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.yeshi.utils.entity.wx.WXAPPInfo; +import org.yeshi.utils.exception.WXOrderException; +import org.yeshi.utils.wx.WXPayUtil; import com.yeshi.fanli.entity.redpack.RedPackDetail; import com.yeshi.fanli.entity.shop.BanLiShopGoods; @@ -23,6 +26,7 @@ import com.yeshi.fanli.service.inter.shop.BanLiShopGoodsSetService; import com.yeshi.fanli.service.inter.shop.BanLiShopOrderPayService; import com.yeshi.fanli.service.inter.shop.BanLiShopOrderService; +import com.yeshi.fanli.util.Constant; import com.yeshi.fanli.util.factory.RedPackDetailFactory; @Service @@ -101,7 +105,7 @@ if (order.getMoneyPayment() == null) throw new BanLiShopOrderException(2, "涓嶉渶瑕侀噰鐢ㄧ幇閲戞敮浠�"); - if (order.getMoneyPaymentState() != null && order.getMoneyPaymentState() == BanLiShopOrder.PAY_STATE_PAID) { + if (order.getMoneyPaymentState() != null && order.getMoneyPaymentState() != BanLiShopOrder.PAY_STATE_NOPAY) { throw new BanLiShopOrderException(3, "閲嶅鏀粯"); } @@ -145,4 +149,57 @@ } } + @Transactional + @Override + public void refund(Long orderId) throws BanLiShopOrderException { + // 璁㈠崟閫�娆� + // 鏌ヨ璁㈠崟鏄惁宸茬粡琚嫆缁� + BanLiShopOrder order = banLiShopOrderService.selectByPrimaryKeyForUpdate(orderId); + if (order == null) + throw new BanLiShopOrderException(1, "璁㈠崟涓嶅瓨鍦�"); + if (order.getState() != BanLiShopOrder.STATE_REJECT) + throw new BanLiShopOrderException(2, "璁㈠崟鏈鎷掔粷/璁㈠崟宸查��娆�"); + + BanLiShopOrder update = new BanLiShopOrder(); + update.setId(order.getId()); + if (order.getHongBaoPaymentState() != null && order.getHongBaoPaymentState() == BanLiShopOrder.PAY_STATE_PAID) { + BanLiShopGoods goods = banLiShopGoodsService.selectByPrimaryKey(order.getGoods().getId()); + BanLiShopGoodsClass goodsClass = banLiShopGoodsClassService + .selectByPrimaryKey(goods.getGoodsClass().getId()); + BanLiShopGoodsSets set = banLiShopGoodsSetService.selectByPrimaryKey(order.getGoodsSet().getId()); + // 绾㈠寘閫�娆� + RedPackDetail detail = null; + try { + detail = RedPackDetailFactory.createShopOrderDrawBack(orderId, order.getUid(), goodsClass.getName(), + set.getName(), order.getHongBaoPayment()); + } catch (RedPackDetailException e) { + e.printStackTrace(); + } + + if (detail == null) + throw new BanLiShopOrderException(4, "绾㈠寘璇︽儏澶辫触"); + try { + redPackBalanceService.addRedPack(order.getUid(), order.getHongBaoPayment(), detail); + } catch (RedPackBalanceException e) { + throw new BanLiShopOrderException(5, "绾㈠寘閫�娆惧け璐�"); + } + update.setHongBaoPaymentState(BanLiShopOrder.PAY_STATE_REFUND); + } + + // TODO 寰俊鏀粯閫�娆� + if (order.getMoneyPaymentState() != null && order.getMoneyPaymentState() == BanLiShopOrder.PAY_STATE_PAID) { + try { + boolean success = WXPayUtil.refund(order.getOrderNo(), order.getMoneyPayment(), order.getMoneyPayment(), + null, new WXAPPInfo(), null, null); + if (success) { + update.setMoneyPaymentState(BanLiShopOrder.PAY_STATE_REFUND); + } else + throw new BanLiShopOrderException(6, "寰俊鏀粯閫�娆惧け璐�"); + + } catch (WXOrderException e) { + throw new BanLiShopOrderException(6, "寰俊鏀粯閫�娆惧け璐�"); + } + } + } + } diff --git a/fanli/src/main/java/com/yeshi/fanli/service/impl/shop/BanLiShopOrderServiceImpl.java b/fanli/src/main/java/com/yeshi/fanli/service/impl/shop/BanLiShopOrderServiceImpl.java index 729e8da..8e801e0 100644 --- a/fanli/src/main/java/com/yeshi/fanli/service/impl/shop/BanLiShopOrderServiceImpl.java +++ b/fanli/src/main/java/com/yeshi/fanli/service/impl/shop/BanLiShopOrderServiceImpl.java @@ -35,7 +35,7 @@ import com.yeshi.fanli.util.Constant; import com.yeshi.fanli.util.factory.RedPackDetailFactory; import com.yeshi.fanli.util.rocketmq.MQTopicName; -import com.yeshi.fanli.util.shop.BanLiShopUtil; +import com.yeshi.fanli.util.shop.BanLiShopOrderUtil; @Service public class BanLiShopOrderServiceImpl implements BanLiShopOrderService { @@ -106,7 +106,7 @@ banLiShopOrderMapper.insertSelective(order); // 娣诲姞璁㈠崟鍙� - String orderNo = BanLiShopUtil.createOrderNo(order.getId()); + String orderNo = BanLiShopOrderUtil.createOrderNo(order.getId()); // 鏇存柊璁㈠崟鍙� BanLiShopOrder update = new BanLiShopOrder(); update.setId(order.getId()); @@ -284,6 +284,7 @@ } } + @Transactional @Override public void rejectOrder(Long id, String msg) throws BanLiShopOrderException { // 鍒ゆ柇璁㈠崟鏄惁澶勪簬浠樻鐘舵�� @@ -295,7 +296,11 @@ throw new BanLiShopOrderException(1, "璁㈠崟鏈浜庡緟瀹℃牳鐘舵��"); // TODO 璁㈠崟閫�娆� - + BanLiShopOrder update = new BanLiShopOrder(); + update.setState(BanLiShopOrder.STATE_REJECT); + update.setStateDesc(msg); + update.setUpdateTime(new Date()); + banLiShopOrderMapper.updateByPrimaryKeySelective(update); } } diff --git a/fanli/src/main/java/com/yeshi/fanli/service/inter/shop/BanLiShopOrderPayService.java b/fanli/src/main/java/com/yeshi/fanli/service/inter/shop/BanLiShopOrderPayService.java index a98a74d..cd5b2af 100644 --- a/fanli/src/main/java/com/yeshi/fanli/service/inter/shop/BanLiShopOrderPayService.java +++ b/fanli/src/main/java/com/yeshi/fanli/service/inter/shop/BanLiShopOrderPayService.java @@ -29,4 +29,12 @@ * @throws BanLiShopOrderException */ public void payOrderByMoney(Long orderId, BigDecimal money) throws BanLiShopOrderException; + + /** + * 璁㈠崟閫�娆� + * + * @param orderId + * @throws BanLiShopOrderException + */ + public void refund(Long orderId) throws BanLiShopOrderException; } diff --git a/fanli/src/main/java/com/yeshi/fanli/util/shop/BanLiShopOrderUtil.java b/fanli/src/main/java/com/yeshi/fanli/util/shop/BanLiShopOrderUtil.java new file mode 100644 index 0000000..59bb87e --- /dev/null +++ b/fanli/src/main/java/com/yeshi/fanli/util/shop/BanLiShopOrderUtil.java @@ -0,0 +1,51 @@ +package com.yeshi.fanli.util.shop; + +import com.yeshi.fanli.util.TimeUtil; + +public class BanLiShopOrderUtil { + + /** + * 鍒堕�犺鍗曞彿 + * + * @param orderId + * @return + */ + public static String createOrderNo(Long orderId) { + String orderNo = TimeUtil.getGernalTime(System.currentTimeMillis(), "yyyyMMdd"); + String orderIdStr = orderId + ""; + int length = 8 - orderIdStr.length(); + for (int i = 0; i < length; i++) { + orderIdStr = "0" + orderIdStr; + } + orderNo += orderIdStr; + return orderNo; + } + + /** + * 鏍规嵁鍟嗗煄璁㈠崟鍙疯幏鍙栧井淇℃敮浠樼殑鍟嗘埛璁㈠崟鍙� + * + * @param orderNo + * @return + */ + public static String getWXPayOrderNo(String orderNo) { + + return "banlishop-" + orderNo; + } + + /** + * 鏍规嵁寰俊鏀粯鍟嗘埛璁㈠崟鍙疯幏鍙栧晢鍩庤鍗� + * + * @param wxPayOrderNo + * @return + */ + public static String getOrderNoFromWXPayOrderNo(String wxPayOrderNo) { + if (wxPayOrderNo == null) + return null; + wxPayOrderNo = wxPayOrderNo.trim(); + if (wxPayOrderNo.startsWith("banlishop-")) + return wxPayOrderNo.replace("banlishop-", "").trim(); + else + return null; + } + +} diff --git a/fanli/src/main/java/com/yeshi/fanli/util/shop/BanLiShopUtil.java b/fanli/src/main/java/com/yeshi/fanli/util/shop/BanLiShopUtil.java deleted file mode 100644 index 73e57aa..0000000 --- a/fanli/src/main/java/com/yeshi/fanli/util/shop/BanLiShopUtil.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.yeshi.fanli.util.shop; - -import com.yeshi.fanli.util.TimeUtil; - -public class BanLiShopUtil { - - /** - * 鍒堕�犺鍗曞彿 - * - * @param orderId - * @return - */ - public static String createOrderNo(Long orderId) { - String orderNo = TimeUtil.getGernalTime(System.currentTimeMillis(), "yyyyMMdd"); - String orderIdStr = orderId + ""; - int length = 8 - orderIdStr.length(); - for (int i = 0; i < length; i++) { - orderIdStr = "0" + orderIdStr; - } - orderNo += orderIdStr; - return orderNo; - } - -} diff --git a/utils/src/main/java/org/yeshi/utils/exception/WXOrderException.java b/utils/src/main/java/org/yeshi/utils/exception/WXOrderException.java new file mode 100644 index 0000000..115ad43 --- /dev/null +++ b/utils/src/main/java/org/yeshi/utils/exception/WXOrderException.java @@ -0,0 +1,28 @@ +package org.yeshi.utils.exception; + +public class WXOrderException extends Exception { + private static final long serialVersionUID = 1L; + private int code; + private String msg; + + public int getCode() { + return code; + } + + public String getMsg() { + return msg; + } + + public WXOrderException(int code, String msg) { + this.code = code; + this.msg = msg; + } + + public WXOrderException() { + } + + @Override + public String getMessage() { + return this.msg; + } +} diff --git a/utils/src/main/java/org/yeshi/utils/wx/WXPayUtil.java b/utils/src/main/java/org/yeshi/utils/wx/WXPayUtil.java index d2878a4..9c3b6c0 100644 --- a/utils/src/main/java/org/yeshi/utils/wx/WXPayUtil.java +++ b/utils/src/main/java/org/yeshi/utils/wx/WXPayUtil.java @@ -10,6 +10,7 @@ import org.yeshi.utils.entity.wx.RedPackParams; import org.yeshi.utils.entity.wx.WXAPPInfo; import org.yeshi.utils.entity.wx.WXPlaceOrderParams; +import org.yeshi.utils.exception.WXOrderException; import org.yeshi.utils.exception.WXPlaceOrderParamsException; /** @@ -20,6 +21,21 @@ */ public class WXPayUtil { + /** + * 浠樻鍒伴浂閽� + * + * @param appId + * @param openId + * @param mchId + * @param key + * @param pwd + * @param cert + * @param orderNo + * @param money + * @param desc + * @param ip + * @return + */ public static String payToOpenId(String appId, String openId, String mchId, String key, String pwd, InputStream cert, String orderNo, BigDecimal money, String desc, String ip) { Map<String, String> map = new HashMap<>(); @@ -164,8 +180,8 @@ if (StringUtil.isNullOrEmpty(params.getTradeType())) throw new WXPlaceOrderParamsException(8, "璇蜂紶鍏radeType"); -// if (StringUtil.isNullOrEmpty(params.getOpenId())) -// throw new WXPlaceOrderParamsException(9, "璇蜂紶鍏penId"); + // if (StringUtil.isNullOrEmpty(params.getOpenId())) + // throw new WXPlaceOrderParamsException(9, "璇蜂紶鍏penId"); Map<String, String> map = new HashMap<String, String>(); map.put("appid", params.getInfo().getAppId()); @@ -189,4 +205,73 @@ return resultMap; } + + /** + * 璁㈠崟閫�娆� + * + * @param orderNo-璁㈠崟鍙� + * @param orderMoney-璁㈠崟鎬昏祫閲� + * @param refundMoney-閫�娆鹃噾棰� + * @param reason-閫�娆惧師鍥� + * @param appInfo + * @param pwd-璇佷功瀵嗙爜 + * @param cert-璇佷功 + */ + public static boolean refund(String orderNo, BigDecimal orderMoney, BigDecimal refundMoney, String reason, + WXAPPInfo appInfo, String pwd, InputStream cert) throws WXOrderException { + Map<String, String> map = new HashMap<String, String>(); + map.put("appid", appInfo.getAppId()); + map.put("mch_id", appInfo.getMchId()); + map.put("nonce_str", StringUtil.getRandomCode(32)); + map.put("out_trade_no", orderNo); + map.put("out_refund_no", orderNo);// 鍟嗘埛閫�娆惧崟鍙� + map.put("total_fee", orderMoney.multiply(new BigDecimal(100)).intValue() + "");// 璁㈠崟閲戦 + map.put("refund_fee", orderMoney.multiply(new BigDecimal(100)).intValue() + "");// 閫�娆鹃噾棰� + if (!StringUtil.isNullOrEmpty(reason)) + map.put("refund_desc", reason); + map.put("sign", WXUtil.getSignMD5(map, appInfo.getMchKey())); + try { + String result = HttpUtil.httpsPost("https://api.mch.weixin.qq.com/secapi/pay/refund", + WXUtil.loadWXMessage(map), pwd, cert); + System.out.println("璁㈠崟閫�娆剧粨鏋�:" + result); + Map<String, String> resultMap = WXUtil.parseXML(result); + if ("SUCCESS".equalsIgnoreCase(resultMap.get("return_code")) + && "SUCCESS".equalsIgnoreCase(resultMap.get("result_code"))) + return true; + throw new WXOrderException(100, "寰俊鏀粯鎺ュ彛鍑洪敊:" + result); + } catch (Exception e) { + e.printStackTrace(); + } + return false; + } + + /** + * 鏌ヨ璁㈠崟鍙锋槸鍚︽敮浠樻垚鍔� + * + * @param orderNo + * @param app + * @return + * @throws WXOrderException + */ + public static boolean isPaySuccess(String orderNo, WXAPPInfo app) throws WXOrderException { + Map<String, String> map = new HashMap<String, String>(); + map.put("appid", app.getAppId()); + map.put("mch_id", app.getMchId()); + map.put("nonce_str", StringUtil.getRandomCode(32)); + map.put("out_trade_no", orderNo); + map.put("sign", WXUtil.getSignMD5(map, app.getMchKey())); + String result = HttpUtil.post("https://api.mch.weixin.qq.com/pay/orderquery", WXUtil.loadWXMessage(map)); + System.out.println("璁㈠崟鏌ヨ缁撴灉:" + result); + Map<String, String> resultMap = WXUtil.parseXML(result); + if ("SUCCESS".equalsIgnoreCase(resultMap.get("return_code")) + && "SUCCESS".equalsIgnoreCase(resultMap.get("result_code"))) { + if ("SUCCESS".equalsIgnoreCase(resultMap.get("trade_state")))// 鏀粯鎴愬姛 + return true; + else + return false; + } else { + throw new WXOrderException(100, "寰俊鏀粯鎺ュ彛鍑洪敊:" + result); + } + } + } -- Gitblit v1.8.0