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