org.linlinjava
litemall-core
diff --git a/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/util/IpUtil.java b/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/util/IpUtil.java
index ebb3d803..f0b6412d 100644
--- a/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/util/IpUtil.java
+++ b/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/util/IpUtil.java
@@ -1,6 +1,8 @@
package org.linlinjava.litemall.wx.util;
import javax.servlet.http.HttpServletRequest;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
public class IpUtil {
public static String client(HttpServletRequest request) {
@@ -10,4 +12,42 @@ public class IpUtil {
}
return xff;
}
+
+ public static String getIpAddr(HttpServletRequest request) {
+ String ipAddress = null;
+ try {
+ ipAddress = request.getHeader("x-forwarded-for");
+ if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
+ ipAddress = request.getHeader("Proxy-Client-IP");
+ }
+ if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
+ ipAddress = request.getHeader("WL-Proxy-Client-IP");
+ }
+ if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
+ ipAddress = request.getRemoteAddr();
+ if (ipAddress.equals("127.0.0.1")) {
+ // 根据网卡取本机配置的IP
+ InetAddress inet = null;
+ try {
+ inet = InetAddress.getLocalHost();
+ } catch (UnknownHostException e) {
+ e.printStackTrace();
+ }
+ ipAddress = inet.getHostAddress();
+ }
+ }
+ // 对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
+ if (ipAddress != null && ipAddress.length() > 15) { // "***.***.***.***".length()
+ // = 15
+ if (ipAddress.indexOf(",") > 0) {
+ ipAddress = ipAddress.substring(0, ipAddress.indexOf(","));
+ }
+ }
+ } catch (Exception e) {
+ ipAddress="";
+ }
+ // ipAddress = this.getRequest().getRemoteAddr();
+
+ return ipAddress;
+ }
}
diff --git a/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxOrderController.java b/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxOrderController.java
index d6d78032..ee1cd33e 100644
--- a/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxOrderController.java
+++ b/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxOrderController.java
@@ -2,24 +2,24 @@ package org.linlinjava.litemall.wx.web;
import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse;
import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
-import com.github.binarywang.wxpay.bean.order.WxPayAppOrderResult;
import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult;
-import com.github.binarywang.wxpay.bean.request.BaseWxPayRequest;
import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
import com.github.binarywang.wxpay.bean.result.BaseWxPayResult;
import com.github.binarywang.wxpay.service.WxPayService;
import org.apache.commons.io.IOUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.linlinjava.litemall.core.notify.LitemallNotifyService;
+import org.linlinjava.litemall.core.notify.NotifyUtils;
+import org.linlinjava.litemall.core.util.JacksonUtil;
+import org.linlinjava.litemall.core.util.ResponseUtil;
import org.linlinjava.litemall.db.domain.*;
import org.linlinjava.litemall.db.service.*;
import org.linlinjava.litemall.db.util.OrderHandleOption;
import org.linlinjava.litemall.db.util.OrderUtil;
-import org.linlinjava.litemall.core.util.JacksonUtil;
-import org.linlinjava.litemall.core.util.ResponseUtil;
import org.linlinjava.litemall.wx.annotation.LoginUser;
+import org.linlinjava.litemall.wx.util.IpUtil;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
@@ -81,6 +81,9 @@ public class WxOrderController {
@Autowired
private WxPayService wxPayService;
+ @Autowired
+ private LitemallNotifyService litemallNotifyService;
+
public WxOrderController() {
}
@@ -290,7 +293,7 @@ public class WxOrderController {
// 根据订单商品总价计算运费,满88则免运费,否则8元;
BigDecimal freightPrice = new BigDecimal(0.00);
if (checkedGoodsPrice.compareTo(new BigDecimal(88.00)) < 0) {
- freightPrice = new BigDecimal(8.00);
+ freightPrice = new BigDecimal(0.00);
}
// 可以使用的其他钱,例如用户积分
@@ -440,7 +443,7 @@ public class WxOrderController {
/**
* 付款订单的预支付会话标识
- *
+ *
* 1. 检测当前订单是否能够付款
* 2. 微信支付平台返回支付订单ID
* 3. 设置订单付款状态
@@ -452,8 +455,8 @@ public class WxOrderController {
* 失败则 { errno: XXX, errmsg: XXX }
*/
@PostMapping("prepay")
- public Object prepay(@LoginUser Integer userId, @RequestBody String body) {
- if(userId == null){
+ public Object prepay(@LoginUser Integer userId, @RequestBody String body, HttpServletRequest request) {
+ if (userId == null) {
return ResponseUtil.unlogin();
}
Integer orderId = JacksonUtil.parseInteger(body, "orderId");
@@ -477,7 +480,7 @@ public class WxOrderController {
LitemallUser user = userService.findById(userId);
String openid = user.getWeixinOpenid();
- if(openid == null){
+ if (openid == null) {
return ResponseUtil.fail(403, "订单不能支付");
}
WxPayMpOrderResult result = null;
@@ -486,16 +489,16 @@ public class WxOrderController {
orderRequest.setOutTradeNo(order.getOrderSn());
orderRequest.setOpenid(openid);
// TODO 更有意义的显示名称
- orderRequest.setBody("litemall小商场-订单测试支付");
+ orderRequest.setBody("订单:" + order.getOrderSn());
// 元转成分
- Integer fee = 1;
+ Integer fee = 0;
// 这里演示仅支付1分
// 实际项目取消下面两行注释
- // BigDecimal actualPrice = order.getActualPrice();
- // fee = actualPrice.multiply(new BigDecimal(100)).intValue();
+ BigDecimal actualPrice = order.getActualPrice();
+ fee = actualPrice.multiply(new BigDecimal(100)).intValue();
orderRequest.setTotalFee(fee);
// TODO 用户IP地址
- orderRequest.setSpbillCreateIp("123.12.12.123");
+ orderRequest.setSpbillCreateIp(IpUtil.getIpAddr(request));
result = wxPayService.createOrder(orderRequest);
} catch (Exception e) {
@@ -518,7 +521,7 @@ public class WxOrderController {
* @return 订单操作结果
* 成功则 WxPayNotifyResponse.success的XML内容
* 失败则 WxPayNotifyResponse.fail的XML内容
- *
+ *
* 注意,这里pay-notify是示例地址,开发者应该设立一个隐蔽的回调地址
*/
@PostMapping("pay-notify")
@@ -533,19 +536,19 @@ public class WxOrderController {
String totalFee = BaseWxPayResult.feeToYuan(result.getTotalFee());
LitemallOrder order = orderService.findBySn(orderSn);
- if(order == null){
+ if (order == null) {
throw new Exception("订单不存在 sn=" + orderSn);
}
// 检查这个订单是否已经处理过
- if(OrderUtil.isPayStatus(order) && order.getPayId() != null){
+ if (OrderUtil.isPayStatus(order) && order.getPayId() != null) {
return WxPayNotifyResponse.success("处理成功!");
}
// 检查支付订单金额
// TODO 这里1分钱需要改成实际订单金额
- if(!totalFee.equals("0.01")){
- throw new Exception("支付金额不符合 totalFee=" + totalFee);
+ if (!totalFee.equals(order.getActualPrice().toString())) {
+ throw new Exception(order.getOrderSn() + " : 支付金额不符合 totalFee=" + totalFee);
}
order.setPayId(payId);
@@ -553,6 +556,10 @@ public class WxOrderController {
order.setOrderStatus(OrderUtil.STATUS_PAY);
orderService.updateById(order);
+ //TODO 发送邮件和短信通知,这里采用异步发送
+ litemallNotifyService.notifyMailMessage("订单通知", order.toString());
+ litemallNotifyService.notifySMSTemplate(order.getMobile(), new String[]{""}, NotifyUtils.NotifyType.PAY_COMPLATED);
+
return WxPayNotifyResponse.success("处理成功!");
} catch (Exception e) {
logger.error("微信回调结果异常,异常原因 " + e.getMessage());
@@ -560,7 +567,6 @@ public class WxOrderController {
}
}
-
/**
* 订单申请退款
* 1. 检测当前订单是否能够退款
@@ -714,5 +720,4 @@ public class WxOrderController {
LitemallOrderGoods orderGoods = orderGoodsList.get(0);
return ResponseUtil.ok(orderGoods);
}
-
}
\ No newline at end of file