瀏覽代碼

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	iamberry-wechat-web/src/main/java/com/iamberry/wechat/handles/pay/ResponseWechatPayHandler.java
xian 5 年之前
父節點
當前提交
98f68a6a26

+ 37 - 30
iamberry-wechat-service/src/main/java/com/iamberry/wechat/service/mq/EfastOrderServiceImpl.java

@@ -160,7 +160,7 @@ public class EfastOrderServiceImpl implements EfastOrderService {
 
 
 	@Override
-	public boolean addOrderInfoToEfast(MQMessage message) throws Exception {
+	public boolean addOrderInfoToEfast(MQMessage message) {
 		logger.info("推送订单开始,订单号:"+message.getServiceToMessage());
 		
 		// orderInfo
@@ -176,24 +176,28 @@ public class EfastOrderServiceImpl implements EfastOrderService {
 		
 		// set Requeset Data
 		Map<String, String> requestData = new HashMap<String, String>();
-		
-		int money = order.getSalesYetAmount();
-		
-		if (order.getCouponId() != null && !"".equals(order.getCouponId())) {
-			CouponItem couponItem = new CouponItem();
-			couponItem.setCouponItemId(order.getCouponId());
-			couponItem.setCouponItemUseropenid(order.getSalesOpenid());
-			CouponType couponType = cartService.getCouponReduceByItemId(couponItem);
-			if (null != couponType) {
-				switch (couponType.getCouponType()) {
-				case 1:
-					money += couponType.getCouponReduce();
-					break;
-				case 2:
-					money += order.getSalesAmount() * couponType.getCouponReduce()/100;
-					break;
-				}
+
+		//总优惠
+		Double couponMoney =  Double.valueOf(order.getSalesAmount() - order.getSalesYetAmount());
+
+		//计算分摊优惠
+		//R(X1) =  X1 / X1+X2+…X(n)  * reduce   订单项分摊优惠
+		Integer allcouponMoney = order.getSalesAmount() - order.getSalesYetAmount();
+		Integer  salesYetAmount = order.getSalesYetAmount();
+		double yetAmount = order.getSalesAmount();
+		for (int k=0;k<items.size();k++) {
+			Double itemTotal = Double.valueOf(items.get(k).getItemTotal());
+			Double itemPayMonry = itemTotal / yetAmount * couponMoney;	//在第K项使用的优惠
+
+			Integer newItemTotal = items.get(k).getItemTotal();
+			if((k+1) == items.size()){
+				newItemTotal -= allcouponMoney;
+			}else{
+				Integer newPayMonry = (itemPayMonry.intValue()/100)*100;
+				allcouponMoney = allcouponMoney - newPayMonry;	//总优惠减去 第K项使用的优惠
+				newItemTotal -= newPayMonry;
 			}
+			items.get(k).setItemTotal(newItemTotal);
 		}
 		
 		requestData.put("app_act", "rst.trade.new.add");
@@ -228,25 +232,26 @@ public class EfastOrderServiceImpl implements EfastOrderService {
 		orderData.put("city_name", addressDesc[1]); 									// 城市
 		orderData.put("consignee", order.getSalesAddressName());						// 收货人
 		orderData.put("district_name", addressDesc[2]);									// 区域
+		orderData.put("postalcode", order.getSalesAddressPostnum());     // 邮政编码
 		orderData.put("email", "");														// email
 		orderData.put("goods_amount", order.getSalesAmount());					// 产品总价
 		orderData.put("goods_count", items.size());										// 产品数量
 		orderData.put("mobile", order.getSalesAddressTel());							// 手机号码
-		orderData.put("money_paid", money);					// 已付款
 		orderData.put("oid", order.getSalesOrderid());									// 订单号
-		orderData.put("order_amount", order.getSalesAmount());					// 订单金额
-		
+
 		/**
 		 * 产品信息
 		 */
 		List<Map<String, Object>> maps = new ArrayList<Map<String, Object>>();
 		for (OrderItem item : items) {
 			Map<String, Object> orders1 = new HashMap<String, Object>();
-			orders1.put("goods_name", item.getItemProductName());							// 产品名称
-			orders1.put("goods_number", item.getItemNum());									// 产品数量
-			orders1.put("goods_price", item.getItemProductPrice());					// 产品原价
-			orders1.put("outer_sku", item.getProduectRemark());										// 产品SKU
-			orders1.put("payment_ft", item.getItemProductDiscount());												// 产品分摊价
+			orders1.put("goods_name", item.getItemProductName());                            // 产品名称
+			orders1.put("goods_number", item.getItemNum());                                    // 产品数量
+			orders1.put("goods_price", (item.getItemProductPrice()));                    // 产品原价
+			orders1.put("goods_discount", (item.getItemProductDiscount()));                    // 产品售价
+			orders1.put("goods_total", (item.getItemTotal()));                    // 产品售价
+			orders1.put("outer_sku", item.getProduectRemark());                                // 产品SKU
+//			orders1.put("payment_ft", item.getItemProductDiscount());												// 产品分摊价
 			maps.add(orders1);
 		}
 		
@@ -264,9 +269,11 @@ public class EfastOrderServiceImpl implements EfastOrderService {
 		orderData.put("shipping_name", "yto");											// 快递公司代码
 		orderData.put("tel", order.getSalesAddressTel());											// 我司电话
 		orderData.put("to_buyer", "");													// 商家备注
-		orderData.put("total_amount", order.getSalesAmount());					// 商家备注
 		orderData.put("user_name", order.getSalesOpenid());							// 买家账户   百胜根据user_name来判断是否有重复,传openId是为了防止重复
-		orderData.put("zipcode", order.getSalesAddressPostnum());						// 邮编
+		orderData.put("zipcode", order.getSalesAddressPostnum());                        // 邮编
+		orderData.put("total_amount", (order.getSalesAmount()));                    // 订单总额
+		orderData.put("money_paid", order.getSalesYetAmount());                     // 已付款
+		orderData.put("order_amount", order.getSalesYetAmount());                   // 应付款,应付款金额要与已付款金额相同
 		
 		
 		com.fasterxml.jackson.databind.ObjectMapper mapper = new ObjectMapper();
@@ -296,10 +303,10 @@ public class EfastOrderServiceImpl implements EfastOrderService {
 				}
 			}
 			logger.error(this, "add-推送订单失败,订单号为:" + order.getSalesOrderid() + "的订单,RST返回信息:" + result);
-			throw new Exception(jsonObject.getString("msg"));
+			return true;
 		} catch (Exception e) {
 			e.printStackTrace();
-			throw e;
+			return false;
 		}
 	}
 	

+ 1 - 0
iamberry-wechat-web/src/main/java/com/iamberry/wechat/handles/order/OrderHandler.java

@@ -822,6 +822,7 @@ public class OrderHandler {
 		orderData.put("city_name", addressDesc[1]); 									// 城市
 		orderData.put("consignee", order.getSalesAddressName());						// 收货人
 		orderData.put("district_name", addressDesc[2]);									// 区域
+		orderData.put("postalcode", order.getSalesAddressPostnum());     // 邮政编码
 		orderData.put("email", "");														// email
 		orderData.put("goods_amount", order.getSalesAmount());					// 产品总价
 		orderData.put("goods_count", items.size());										// 产品数量

+ 156 - 77
iamberry-wechat-web/src/main/java/com/iamberry/wechat/handles/pay/ResponseWechatPayHandler.java

@@ -12,17 +12,18 @@ import java.util.Map;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import com.iamberry.wechat.core.entity.ResultMsg;
 import com.iamberry.wechat.core.entity.order.OrderItem;
-import com.iamberry.wechat.face.coupon.WelfareService;
 import com.iamberry.wechat.tools.ResultInfo;
 import com.iamberry.wechat.tools.SendMessageUtil;
 import org.jdom.Document;
 import org.jdom.Element;
 import org.jdom.input.SAXBuilder;
-import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
 import org.xml.sax.InputSource;
 
 import com.iamberry.app.tool.log.RatFWLogger;
@@ -56,25 +57,42 @@ import com.iamberry.wechat.tools.StaticInfo;
 @RequestMapping("/callback")
 public class ResponseWechatPayHandler {
 
-	private final Object lock = new Object();
 	@Autowired
 	private RatFWLogger ratFWLogger;
+	
+	private Object lock = new Object();
+	
 	@Autowired
 	private CartService cartService;
+	
 	@Autowired
 	private PlaceOrderService placeOrderService;
+	
+	@Autowired
+	private PlaceInfoService placeInfoService;
+	
+	@Autowired
+	private MemberService memberService;
+
 	@Autowired
 	private SendMessageUtil sendMessageUtil;
+	
 	@Autowired
 	private AdminOrderService adminOrderService;
+	
 	@Autowired
 	private MQServiceProxy mQservice;
+	
+	@Autowired
+	private RebackServices rebackServices;
+	
+	@Autowired
+	private QrcodeService qrcodeService;			//二维码处理
+	
 	@Autowired
 	CashLogService cashLogService;
 	@Autowired
 	CouponItemService couponItemService;
-	@Autowired
-	private WelfareService welfareService;
 
 	/**
 	 * 销售订单支付回调方法
@@ -85,90 +103,150 @@ public class ResponseWechatPayHandler {
 			HttpServletResponse response) throws IOException {
 		synchronized (lock) {
 			String inputLine;
-			StringBuilder notityXml = new StringBuilder();
+			String notityXml = "";
 			String resXml = "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
 			try {
 				//获取XML参数
 				while ((inputLine = request.getReader().readLine()) != null) {
-					notityXml.append(inputLine);
+					notityXml += inputLine;
 				}
 				request.getReader().close();
-				// 解析XML格式的数据
-				Map m = parseXmlToList2(notityXml.toString());
+				//解析XML格式的数据
+				Map m = parseXmlToList2(notityXml);
 				WxPayResult wpr = new WxPayResult();
-				wpr = setWxPayResultObj(wpr,m);
-				// 判断微信返回的内容是否为SUCCESS
-				assert "SUCCESS".equalsIgnoreCase(wpr.getResultCode());
-				// 验证数据
-				String orderIdMD5 = StaticInfo.orderIdMD5.decrypt(wpr.getAttach());
-				assert orderIdMD5.equals(wpr.getOutTradeNo());
-				// 组装数据
-				Date nowDate = new Date();
-				Order order = new Order();
-				order.setSalesOrderid(orderIdMD5);
-				order.setSalesStatus(2);
-				order.setSalesTransactionId(wpr.getTransactionId());
-				order.setSalesTransactionDate(nowDate);
-				order.setSalesOpenid(wpr.getOpenid());
-				Order or = adminOrderService.getShopOrderByOrderId(orderIdMD5);
-				assert or.getSalesStatus() == 1;
-				List<OrderItem> orderItemList = adminOrderService.getShopOrderItemByOrderId(or.getSalesOrderid());
-				// 修改订单状态
-				int count = cartService.updateOrderStatus(order);
-				// 修改优惠券状态
-				order=cartService.selectOrderInfoById(order);
-				String couponId=order.getCouponId();
-				if (couponId!=null && !"".equals(couponId)) {
-					welfareService.useCoupon(wpr.getOpenid(), orderIdMD5, couponId);
-				}
-				assert count >= 1;
-				// 给订单的回调修改状态
-				{
-					MQMessage message = new MQMessage();
-					message.setServiceToMessage(orderIdMD5);
-					message.setServiceOtherMessage(wpr.getTransactionId());
-					message.setServiceIsSend(2);
-					message.setServiceStatus(1);
-					message.setServiceHandlerObjectName("cartServiceImpl");
-					message.setServiceHandlerMethodName("supdateStateByOrderId");
-					message.setServiceType(1);
-					mQservice.insertMQMessage(message);
-				}
-				// 给RST推送信息
-				{
-					MQMessage message = new MQMessage();
-					message.setServiceToMessage(orderIdMD5);
-					message.setServiceOtherMessage("efast.trade.new.add");
-					message.setServiceIsSend(2);
-					message.setServiceStatus(1);
-					message.setServiceType(1);
-					message.setServiceHandlerObjectName("efastOrderServiceImpl");
-					message.setServiceHandlerMethodName("addOrderInfoToEfast");
-					mQservice.insertMQMessage(message);
-				}
-				//推送消息到微信
-				{
-					DecimalFormat df=new DecimalFormat("0.00");
-					String payMoney = df.format((float)or.getSalesYetAmount()/100) + "元";
-					sendMessageUtil.probationPaySuccess(
-							ResultInfo.PAYSUCCESS,
-							orderItemList.get(0).getItemProductName()+"...",
-							or.getSalesOrderid(),
-							payMoney,
-							ResultInfo.sendRemark1,
-							order.getSalesOpenid(),
-							ResultInfo.ORDER_DETAIL+order.getSalesOrderid());
+				wpr=setWxPayResultObj(wpr,m);
+				//判断
+				if("SUCCESS".equalsIgnoreCase(wpr.getResultCode())){
+					//resXml:返回给微信服务器的数据
+					resXml = "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
+					String orderIdMD5 = StaticInfo.orderIdMD5.decrypt(wpr.getAttach());
+//System.out.println("===========pay 117==============");
+					
+					if (orderIdMD5.equals(wpr.getOutTradeNo())) {
+						Date nowDate = new Date();
+						// 组装数据
+						Order order = new Order();
+						order.setSalesOrderid(orderIdMD5);
+						order.setSalesStatus(2); // 已支付
+						order.setSalesTransactionId(wpr.getTransactionId()); // 微信支付ID
+						order.setSalesTransactionDate(new Date()); // 微信支付时间
+						order.setSalesOpenid(wpr.getOpenid());
+
+						Order or = adminOrderService.getShopOrderByOrderId(orderIdMD5);
+						if(or.getSalesStatus() != 1){
+							return;
+						}
+
+						List<OrderItem> orderItemList = adminOrderService.getShopOrderItemByOrderId(or.getSalesOrderid());
+						
+						// 修改订单状态
+						int count = cartService.updateOrderStatus(order);
+						
+//System.out.println("===========pay 132 修改订单状态==============");
+						//修改优惠券状态
+						order=cartService.selectOrderInfoById(order);
+						
+//System.out.println("===========pay 136 修改订单状态=============="+order.getSalesOrderid());
+						String couponId=order.getCouponId();
+						
+						if(couponId!=null && !couponId.equals("")){
+							CouponItem couponItem=new CouponItem();
+							couponItem.setCouponItemId(couponId);
+							couponItem.setCouponUseStatus(2);
+							couponItem.setCouponUseDate(new Date());
+							couponItemService.updateCouponItemById(couponItem);
+						}
+						//更新账户余额
+						int balancePayAmount=order.getBalancePayAmount();
+						if(balancePayAmount>0){
+							Member member=new Member();
+							member.setUserOpenid(order.getSalesOpenid());
+							member.setUserIncome(-balancePayAmount);
+							memberService.updateUserIncomeByOpenId(member);
+							
+							//现金使用记录
+							CashLog log=new CashLog();
+							log.setCashLogsIntroduction("订单支出");
+							log.setCashLogsNum(balancePayAmount);
+							log.setCashLogsOpenid(member.getUserOpenid());
+							log.setCashLogsType(2);
+							log.setCashLogsResType(3);
+							log.setCashLogsOrderid(order.getSalesOrderid());
+							log.setCashLogsCreateDate(nowDate);
+							count=cashLogService.addCashLog(log);
+						}
+						if (count < 1) {
+							resXml = "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[报文有误]]></return_msg></xml>";
+						}
+//System.out.println("===========pay 168 快速插入=============="+count);
+						// 给订单的回调修改状态
+						try {
+							MQMessage message = new MQMessage();
+							message.setServiceToMessage(orderIdMD5);
+							message.setServiceOtherMessage(wpr.getTransactionId());
+							message.setServiceIsSend(2);			// 没有推送的信息
+							message.setServiceStatus(1); 			// 推送成功
+							message.setServiceHandlerObjectName("cartServiceImpl");
+							message.setServiceHandlerMethodName("supdateStateByOrderId");
+							message.setServiceType(1);
+							mQservice.insertMQMessage(message);
+						} catch (Exception e) {
+							// TODO: handle exception
+						}
+//System.out.println("===========pay 182  插入返利到mq=============="+count);
+						//rebackServices.loadSingleOrderReward(order);
+						
+						//添加到返利表
+						//rebackServices.loadSingleOrderReward(order);
+						// 给百胜推送信息
+						try {
+								MQMessage message = new MQMessage();
+								message.setServiceToMessage(orderIdMD5);
+								message.setServiceOtherMessage("efast.trade.new.add");
+								message.setServiceIsSend(2);			// 没有推送的信息
+								message.setServiceStatus(1); 			// 推送成功
+								message.setServiceType(1); 				// 添加订单信息
+								message.setServiceHandlerObjectName("efastOrderServiceImpl");
+								message.setServiceHandlerMethodName("addOrderInfoToEfast");
+								mQservice.insertMQMessage(message);
+						} catch (Exception e) {
+						}
+
+						//推送消息到微信
+						DecimalFormat df=new DecimalFormat("0.00");
+						String payMoney = df.format((float)or.getSalesYetAmount()/100) + "元";
+						try {
+							sendMessageUtil.probationPaySuccess(
+									ResultInfo.PAYSUCCESS,
+									orderItemList.get(0).getItemProductName()+"...",
+									or.getSalesOrderid(),
+									payMoney,
+									ResultInfo.sendRemark1,
+									order.getSalesOpenid(),
+									ResultInfo.ORDER_DETAIL+order.getSalesOrderid());
+						} catch (Exception e) {
+							System.out.println("推送支付成功消息失败!");
+						}
+
+						try {
+							//给父节点推送返利消息
+//							rewardsMessage(member,orderIdMD5);
+						} catch (Exception e) {
+							e.printStackTrace();
+						}
+					} else {
+						resXml = "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[报文有误]]></return_msg></xml>";
+						ratFWLogger.error(this, "订单:" + orderIdMD5 + "支付成功,但是没有通过校验!");
+					}
+				}else{
+					resXml = "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[报文为空]]></return_msg></xml>";
 				}
 				BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
 				out.write(resXml.getBytes());
 				out.flush();
 				out.close();
 			} catch (Exception e) {
-				BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
-				out.write("<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[报文有误]]></return_msg></xml>".getBytes());
-				out.flush();
-				out.close();
-				LoggerFactory.getLogger(this.getClass()).error("", e);
+				e.printStackTrace();
 			}
 		}
 	}
@@ -244,9 +322,10 @@ public class ResponseWechatPayHandler {
 			sb.setFeature("http://xml.org/sax/features/external-general-entities", false);
 			sb.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
 			sb.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
+
 			// 通过输入源构造一个Document
 			Document doc = (Document) sb.build(source);
-			Element root = doc.getRootElement();
+			Element root = doc.getRootElement();// 指向根节点
 			List<Element> es = root.getChildren();
 			if (es != null && es.size() != 0) {
 				for (Element element : es) {