diff --git a/jpress-commons/src/main/java/io/jpress/commons/pay/PayConfigUtil.java b/jpress-commons/src/main/java/io/jpress/commons/pay/PayConfigUtil.java index 0aae0188fcfb1c6148e62f7b5e4b8b6900a93ba2..9f62c3c67d066027fc87016fafaacd67461e776d 100644 --- a/jpress-commons/src/main/java/io/jpress/commons/pay/PayConfigUtil.java +++ b/jpress-commons/src/main/java/io/jpress/commons/pay/PayConfigUtil.java @@ -20,6 +20,9 @@ import com.egzosn.pay.ali.api.AliPayService; import com.egzosn.pay.paypal.api.PayPalPayService; import com.egzosn.pay.wx.api.WxPayService; import com.jfinal.core.Controller; +import io.jboot.utils.StrUtil; + +import java.util.Map; public class PayConfigUtil { @@ -49,6 +52,12 @@ public class PayConfigUtil { return config.isEnable() && config.isConfigOk() ? new WxPayService(config.toConfigStorage()) : null; } + public static WxPayService getWxPayService(Map paras) { + String queryString = StrUtil.mapToQueryString(paras); + WechatPayConfig config = getWechatPayConfig(); + config.setReturnUrl(config.getReturnUrl() + "?" + queryString); + return config.isEnable() && config.isConfigOk() ? new WxPayService(config.toConfigStorage()) : null; + } public static AliPayService getAlipayService() { AlipayPayConfig config = getAlipayPayConfig(); diff --git a/jpress-web/src/main/java/io/jpress/web/front/CheckoutController.java b/jpress-web/src/main/java/io/jpress/web/front/CheckoutController.java index fd0ca2f87e3f1697df9582532ce5ec83b1ce65bc..1871f45116c5631ab8b728100b4899a827e10f3c 100644 --- a/jpress-web/src/main/java/io/jpress/web/front/CheckoutController.java +++ b/jpress-web/src/main/java/io/jpress/web/front/CheckoutController.java @@ -27,9 +27,11 @@ import io.jpress.core.finance.ProductManager; import io.jpress.model.*; import io.jpress.service.*; import io.jpress.web.base.UcenterControllerBase; +import io.jpress.web.commons.finance.PayNotifytKit; import java.math.BigDecimal; import java.util.ArrayList; +import java.util.Date; import java.util.List; import java.util.StringJoiner; @@ -381,7 +383,6 @@ public class CheckoutController extends UcenterControllerBase { payment.setPayerUserId(getLoginedUser().getId()); payment.setPayerName(getLoginedUser().getNickname()); payment.setPayerFee(BigDecimal.ZERO); - payment.setPayStatus(PayStatus.UNPAY.getStatus());//预支付 payment.setPayAmount(userOrder.getOrderRealAmount()); payment.setPayType(getPara("paytype")); @@ -390,20 +391,53 @@ public class CheckoutController extends UcenterControllerBase { payment.setOrderRefererUrl(getReferer()); - payment.setStatus(PaymentRecord.STATUS_PAY_PRE); //预支付 + // 支付的金额为0,直接跳转支付成功,不调用第三方支付 + if (payment.getPayAmount().compareTo(BigDecimal.ZERO) == 0) { + payment.setStatus(PaymentRecord.STATUS_PAY_SUCCESS); //支付成功 + payment.setPayStatus(PayStatus.getSuccessIntStatusByType(payment.getPayType())); + payment.setPaySuccessAmount(payment.getPayAmount()); + payment.setPaySuccessTime(new Date()); + payment.setPayCompleteTime(new Date()); + //保存 或 更新 payment + paymentService.saveOrUpdate(payment); - //保存 或 更新 payment - paymentService.saveOrUpdate(payment); + //更新 order 的 payment id + if (userOrder.getPaymentId() == null) { + userOrder.setPaymentId(payment.getId()); + userOrderService.update(userOrder); + } + + // 订单支付成功 + paymentService.notifySuccess(payment.getId()); + + + PayNotifytKit.notify(payment, getLoginedUser()); + + if (payment.isPaySuccess()) { + redirect("/pay/success/" + payment.getTrxNo()); + } else { + redirect("/pay/fail/" + payment.getTrxNo()); + } + } else { + //预支付 + payment.setStatus(PaymentRecord.STATUS_PAY_PRE); + payment.setPayStatus(PayStatus.UNPAY.getStatus()); + + //保存 或 更新 payment + paymentService.saveOrUpdate(payment); + + //更新 order 的 payment id + if (userOrder.getPaymentId() == null) { + userOrder.setPaymentId(payment.getId()); + userOrderService.update(userOrder); + } + + PayKit.redirect(payment.getPayType(), payment.getTrxNo()); - //更新 order 的 payment id - if (userOrder.getPaymentId() == null) { - userOrder.setPaymentId(payment.getId()); - userOrderService.update(userOrder); } - PayKit.redirect(payment.getPayType(), payment.getTrxNo()); } diff --git a/jpress-web/src/main/java/io/jpress/web/front/PayController.java b/jpress-web/src/main/java/io/jpress/web/front/PayController.java index fb791cc10c28b0599e1acb803941d3323d10c469..1e04a26d197d497507e7ba9497f52237219d8326 100644 --- a/jpress-web/src/main/java/io/jpress/web/front/PayController.java +++ b/jpress-web/src/main/java/io/jpress/web/front/PayController.java @@ -37,10 +37,12 @@ import io.jpress.web.commons.finance.PrePayNotifytKit; import io.jpress.web.interceptor.UserMustLoginedInterceptor; import io.jpress.web.interceptor.WechatInterceptor; +import javax.servlet.http.HttpServletRequest; import java.awt.image.BufferedImage; import java.io.IOException; import java.math.BigDecimal; import java.util.Date; +import java.util.HashMap; import java.util.Map; @RequestMapping(value = "/pay") @@ -123,12 +125,16 @@ public class PayController extends TemplateControllerBase { return; } - PayService service = PayConfigUtil.getWxPayService(); - render404If(service == null); - PaymentRecord payment = paymentService.findByTrxNo(getPara()); render404If(payment == null); + Map para = new HashMap<>(); + para.put("trxNo",payment.getTrxNo()); + + PayService service = PayConfigUtil.getWxPayService(para); + render404If(service == null); + + if (payment.isPaySuccess()) { redirect("/pay/success/" + payment.getTrxNo()); return; @@ -592,26 +598,25 @@ public class PayController extends TemplateControllerBase { PayService service = getPayService(); render404If(service == null); - Map params = getParams(service); - if (Jboot.isDevMode()) { - LOG.debug("back:" + JSON.toJSONString(params)); - } - - String trxNo = getTrxNo(service, params); - if (StrUtil.isBlank(trxNo)){ - redirect("/pay/fail"); - return; - } - - if (params == null || !service.verify(params)) { - redirect("/pay/fail/" + trxNo); - return; - } + String trxNo = null; + PaymentRecord payment = null; // paypal 不走异步回调,需要在这进行处理,只要 service.verify(params) 验证通过 // 就代表 paypal 支付成功了 - PaymentRecord payment = paymentService.findByTrxNo(trxNo); - if (service instanceof PayPalPayService){ + if (service instanceof PayPalPayService) { + Map params = getParams(service); + if (Jboot.isDevMode()) { + LOG.debug("back:" + JSON.toJSONString(params)); + } + + trxNo = getTrxNo(service, params); + + if (params == null || !service.verify(params)) { + redirect("/pay/fail/" + trxNo); + return; + } + + payment = paymentService.findByTrxNo(trxNo); if (payment.getPaySuccessAmount() == null) { payment.setPaySuccessAmount(payment.getPayAmount()); @@ -630,6 +635,14 @@ public class PayController extends TemplateControllerBase { if (paymentService.update(payment)) { paymentService.notifySuccess(payment.getId()); } + } else { + trxNo = getPara("trxNo"); + if (StrUtil.isBlank(trxNo)) { + redirect("/pay/fail"); + return; + } + + payment = paymentService.findByTrxNo(trxNo); } @@ -643,7 +656,17 @@ public class PayController extends TemplateControllerBase { private Map getParams(PayService service) { try { - return service.getParameter2Map(getRequest().getParameterMap(), getRequest().getInputStream()); + HttpServletRequest request = getOrginalRequest();// + int available = request.getInputStream().available(); + if (available > 0) { + return service.getParameter2Map(request.getParameterMap(), request.getInputStream()); + } else { + Map ret = new HashMap<>(); + for (String key : getParas().keySet()) { + ret.put(key,getPara(key)); + } + return ret; + } } catch (IOException e) { e.printStackTrace(); }