From 426b53f326e876342d8c327598efc0b16d0c9ae6 Mon Sep 17 00:00:00 2001 From: yang_shj Date: Fri, 4 Mar 2022 17:02:41 +0800 Subject: [PATCH] =?UTF-8?q?feat=200=20=E6=94=AF=E4=BB=98=E5=B7=A5=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- payment-base-app/payment-base-app.iml | 10 +- payment-base-app/pom.xml | 6 +- .../com/base/springcloud/bo/SaleBillBO.java | 13 ++ .../springcloud/constant/ErrorConstant.java | 8 +- .../springcloud/constant/PaymentConstant.java | 6 + .../controller/PaymentController.java | 22 +-- .../base/springcloud/dao/SaleBillMapper.java | 2 + .../com/base/springcloud/entity/Order.java | 2 + .../base/springcloud/service/BillService.java | 9 ++ .../service/imp/BillServiceImp.java | 28 +++- .../service/imp/MerchantServiceImp.java | 11 +- .../service/imp/OrderServiceImp.java | 17 ++- .../service/imp/PaymentServiceImp.java | 12 +- .../service/imp/WecPaymentServiceImp.java | 133 +++++++----------- .../base/springcloud/util/ParameterUtil.java | 42 ++++++ .../base/springcloud/wxsdk/WxpayUtils.java | 73 ++++++++-- .../com/base/payment/mapper/OrderMapper.xml | 9 +- .../base/payment/mapper/SaleBillMapper.xml | 7 + 18 files changed, 269 insertions(+), 141 deletions(-) create mode 100644 payment-base-app/src/main/java/com/base/springcloud/bo/SaleBillBO.java create mode 100644 payment-base-app/src/main/java/com/base/springcloud/util/ParameterUtil.java diff --git a/payment-base-app/payment-base-app.iml b/payment-base-app/payment-base-app.iml index e3fda62..77af3c2 100644 --- a/payment-base-app/payment-base-app.iml +++ b/payment-base-app/payment-base-app.iml @@ -74,13 +74,13 @@ - + - + @@ -106,7 +106,7 @@ - + @@ -166,9 +166,9 @@ - + - + diff --git a/payment-base-app/pom.xml b/payment-base-app/pom.xml index dc40eb1..d408ada 100644 --- a/payment-base-app/pom.xml +++ b/payment-base-app/pom.xml @@ -78,7 +78,7 @@ com.github.wechatpay-apiv3 wechatpay-apache-httpclient - 0.2.2 + 0.4.2 @@ -142,7 +142,7 @@ org.apache.httpcomponents httpclient - 4.5.11 + 4.5.12 commons-codec @@ -155,7 +155,7 @@ commons-httpclient commons-httpclient - 3.0.1 + 3.1 commons-logging diff --git a/payment-base-app/src/main/java/com/base/springcloud/bo/SaleBillBO.java b/payment-base-app/src/main/java/com/base/springcloud/bo/SaleBillBO.java new file mode 100644 index 0000000..381fd18 --- /dev/null +++ b/payment-base-app/src/main/java/com/base/springcloud/bo/SaleBillBO.java @@ -0,0 +1,13 @@ +package com.base.springcloud.bo; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class SaleBillBO { + + private String id; + + private BigDecimal payAmount; +} diff --git a/payment-base-app/src/main/java/com/base/springcloud/constant/ErrorConstant.java b/payment-base-app/src/main/java/com/base/springcloud/constant/ErrorConstant.java index d2d40fa..5f5c173 100644 --- a/payment-base-app/src/main/java/com/base/springcloud/constant/ErrorConstant.java +++ b/payment-base-app/src/main/java/com/base/springcloud/constant/ErrorConstant.java @@ -2,8 +2,12 @@ package com.base.springcloud.constant; public enum ErrorConstant { - SUECCESS("RBS00000","交易成功"), - NULL_OBJ("RBS00001","参数异常"); + SUECCESS("RBS00000","交易成功!"), + NULL_OBJ("RBS00001","参数异常!"), + MCH_ID_PARAM_ERR("RBS00002","商户支付配置异常!"), + BILL_AMOUNT_ERR("RBS00003","销售单合计结算金额异常!"), + BILL_INVALID("RBS00004","无效销售单据!"), + BILL_WRITE_OFF_FAIL("RBS00005","销售单据核销失败!"); private String code; private String message; diff --git a/payment-base-app/src/main/java/com/base/springcloud/constant/PaymentConstant.java b/payment-base-app/src/main/java/com/base/springcloud/constant/PaymentConstant.java index 00f8b30..f70767e 100644 --- a/payment-base-app/src/main/java/com/base/springcloud/constant/PaymentConstant.java +++ b/payment-base-app/src/main/java/com/base/springcloud/constant/PaymentConstant.java @@ -9,6 +9,7 @@ public interface PaymentConstant { String WAIT = "W"; // 等待付款 String SUECCESS = "S"; // 支付成功 + String WX_SUCCESS = "SUCCESS"; // 微信支付成功状态 String REFUND = "R"; // 退款成功 String CANCLE = "C"; // 撤销 @@ -30,4 +31,9 @@ public interface PaymentConstant { String ORDER_QUEUE = "order_queue"; // 订单队列 String ORDER_LOCK_PREFIX = "ORDER_KEY:"; // 订单锁前缀 + + String DEFAULT_MCH_ID = "1537100771"; // 默认商户ID + String METHOD_GET = "GET"; // GET请求 + String METHOD_POST = "POST"; // POST请求 + String WX_ORDER_QUERY_URL = "https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/"; } diff --git a/payment-base-app/src/main/java/com/base/springcloud/controller/PaymentController.java b/payment-base-app/src/main/java/com/base/springcloud/controller/PaymentController.java index 16f6296..ebd9f44 100644 --- a/payment-base-app/src/main/java/com/base/springcloud/controller/PaymentController.java +++ b/payment-base-app/src/main/java/com/base/springcloud/controller/PaymentController.java @@ -1,13 +1,11 @@ package com.base.springcloud.controller; -import com.base.springcloud.base.CommonResult; import com.base.springcloud.base.ReportResult; import com.base.springcloud.bo.OrderBO; -import com.base.springcloud.constant.ErrorConstant; +import com.base.springcloud.constant.PaymentConstant; import com.base.springcloud.dto.NativePlaceOrderDTO; -import com.base.springcloud.entity.Order; import com.base.springcloud.service.PaymentService; -import com.base.springcloud.util.DateUtil; +import com.base.springcloud.util.ParameterUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; @@ -17,9 +15,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import java.math.BigDecimal; import java.util.ArrayList; -import java.util.Date; import java.util.List; @RestController @@ -28,21 +24,17 @@ import java.util.List; @RequestMapping("/payment") public class PaymentController { + @Autowired + private ParameterUtil parameterUtil; + @Autowired private PaymentService paymentService; @ApiOperation(value = "native下单", notes = "微信native下单") @GetMapping("/nativePlaceOrder") public ReportResult nativePlaceOrder(@RequestParam String salesBillId) { - String mchId = "888027018000004"; - OrderBO orderBO = new OrderBO(); - orderBO.setBillId(salesBillId); - orderBO.setMchId(mchId); + OrderBO orderBO = parameterUtil.nativePlaceOrderBefore(salesBillId); String codeUrl = paymentService.placeOrder(orderBO); - List array = new ArrayList<>(); - NativePlaceOrderDTO nativePlaceOrderDTO = new NativePlaceOrderDTO(); - nativePlaceOrderDTO.setCodeUrl(codeUrl); - array.add(nativePlaceOrderDTO); - return new ReportResult(array); + return new ReportResult(parameterUtil.nativePlaceOrderAfter(codeUrl)); } } diff --git a/payment-base-app/src/main/java/com/base/springcloud/dao/SaleBillMapper.java b/payment-base-app/src/main/java/com/base/springcloud/dao/SaleBillMapper.java index 1c98d39..be2ebdc 100644 --- a/payment-base-app/src/main/java/com/base/springcloud/dao/SaleBillMapper.java +++ b/payment-base-app/src/main/java/com/base/springcloud/dao/SaleBillMapper.java @@ -19,4 +19,6 @@ public interface SaleBillMapper { int updateByPrimaryKey(SaleBill record); SaleBill queryBillInfo(SaleBill saleBill); + + int writeOffBill(SaleBill bill); } \ No newline at end of file diff --git a/payment-base-app/src/main/java/com/base/springcloud/entity/Order.java b/payment-base-app/src/main/java/com/base/springcloud/entity/Order.java index 0eb92c5..89fb713 100644 --- a/payment-base-app/src/main/java/com/base/springcloud/entity/Order.java +++ b/payment-base-app/src/main/java/com/base/springcloud/entity/Order.java @@ -33,6 +33,8 @@ public class Order extends BaseEntity { private String goodId; + private String sourceBillId; + private String orderType; private String orderState; diff --git a/payment-base-app/src/main/java/com/base/springcloud/service/BillService.java b/payment-base-app/src/main/java/com/base/springcloud/service/BillService.java index 9c05304..bc3a0c2 100644 --- a/payment-base-app/src/main/java/com/base/springcloud/service/BillService.java +++ b/payment-base-app/src/main/java/com/base/springcloud/service/BillService.java @@ -1,6 +1,8 @@ package com.base.springcloud.service; import com.base.springcloud.bo.OrderBO; +import com.base.springcloud.bo.SaleBillBO; +import com.base.springcloud.entity.SaleBill; public interface BillService { @@ -9,4 +11,11 @@ public interface BillService { * @param orderBO */ void billCheck(OrderBO orderBO); + + /** + * 核销销售单据 + * @param saleBillBO + * @return + */ + void writeOffBill(SaleBillBO saleBillBO); } diff --git a/payment-base-app/src/main/java/com/base/springcloud/service/imp/BillServiceImp.java b/payment-base-app/src/main/java/com/base/springcloud/service/imp/BillServiceImp.java index 049f81c..c593a20 100644 --- a/payment-base-app/src/main/java/com/base/springcloud/service/imp/BillServiceImp.java +++ b/payment-base-app/src/main/java/com/base/springcloud/service/imp/BillServiceImp.java @@ -1,6 +1,10 @@ package com.base.springcloud.service.imp; +import com.base.springcloud.aspect.annotation.BusinessException; import com.base.springcloud.bo.OrderBO; +import com.base.springcloud.bo.SaleBillBO; +import com.base.springcloud.constant.ErrorConstant; +import com.base.springcloud.constant.PaymentConstant; import com.base.springcloud.dao.SaleBillMapper; import com.base.springcloud.entity.SaleBill; import com.base.springcloud.service.BillService; @@ -20,17 +24,33 @@ public class BillServiceImp implements BillService { @Autowired private SaleBillMapper saleBillMapper; + /** + * 销售单据核查 + * @param orderBO + */ @Override public void billCheck(OrderBO orderBO) { SaleBill saleBill = new SaleBill(); saleBill.setId(orderBO.getBillId()); SaleBill queryResult = saleBillMapper.queryBillInfo(saleBill); if(!Optional.ofNullable(queryResult).isPresent()){ - saleBill.setTotalAmount(new BigDecimal(1)); - orderBO.setSaleBill(saleBill); - logger.warn("==================销售单据查询失败!============================="); - return; + throw new BusinessException(ErrorConstant.BILL_INVALID); } orderBO.setSaleBill(queryResult); } + + /** + * 核销销售单据 + * @param saleBillBO + * @return + */ + @Override + public void writeOffBill(SaleBillBO saleBillBO) { + SaleBill saleBill = new SaleBill(); + saleBill.setId(saleBillBO.getId()); + saleBill.setPayAmount(saleBillBO.getPayAmount()); + int count = saleBillMapper.writeOffBill(saleBill); + if(count > 0) return; + throw new BusinessException(ErrorConstant.BILL_WRITE_OFF_FAIL); + } } diff --git a/payment-base-app/src/main/java/com/base/springcloud/service/imp/MerchantServiceImp.java b/payment-base-app/src/main/java/com/base/springcloud/service/imp/MerchantServiceImp.java index 4e999b2..042b8b3 100644 --- a/payment-base-app/src/main/java/com/base/springcloud/service/imp/MerchantServiceImp.java +++ b/payment-base-app/src/main/java/com/base/springcloud/service/imp/MerchantServiceImp.java @@ -1,7 +1,9 @@ package com.base.springcloud.service.imp; +import com.base.springcloud.aspect.annotation.BusinessException; import com.base.springcloud.bo.MerchantConfigBO; import com.base.springcloud.bo.OrderBO; +import com.base.springcloud.constant.ErrorConstant; import com.base.springcloud.dao.MerchantConfigMapper; import com.base.springcloud.entity.MerchantConfig; import com.base.springcloud.service.MerchantService; @@ -110,15 +112,16 @@ public class MerchantServiceImp implements MerchantService { @Override public void claimMerchantConfig(OrderBO orderBO) { if(!Optional.ofNullable(orderBO).map(o->orderBO.getMchId()).isPresent()){ - // TODO 抛出业务异常 - return; + throw new BusinessException(ErrorConstant.MCH_ID_PARAM_ERR); } MerchantConfig merchantConfig = merchantConfigMapper.claimMerchantConfig(orderBO.getMchId()); if(!Optional.ofNullable(merchantConfig).isPresent()){ - // TODO 抛出业务异常 - return; + throw new BusinessException(ErrorConstant.MCH_ID_PARAM_ERR); } + orderBO.setAppId(merchantConfig.getAppId()); orderBO.setMchPrivateKey(merchantConfig.getMchPrivateKey()); + orderBO.setCertificate(merchantConfig.getCertPath()); + orderBO.setSerialNo(merchantConfig.getSerialNo()); } /** diff --git a/payment-base-app/src/main/java/com/base/springcloud/service/imp/OrderServiceImp.java b/payment-base-app/src/main/java/com/base/springcloud/service/imp/OrderServiceImp.java index 70a9cdd..96b72c3 100644 --- a/payment-base-app/src/main/java/com/base/springcloud/service/imp/OrderServiceImp.java +++ b/payment-base-app/src/main/java/com/base/springcloud/service/imp/OrderServiceImp.java @@ -1,9 +1,13 @@ package com.base.springcloud.service.imp; +import com.base.springcloud.aspect.annotation.BusinessException; import com.base.springcloud.bo.OrderBO; +import com.base.springcloud.constant.ErrorConstant; import com.base.springcloud.constant.PaymentConstant; import com.base.springcloud.dao.OrderMapper; +import com.base.springcloud.entity.MerchantConfig; import com.base.springcloud.entity.Order; +import com.base.springcloud.entity.SaleBill; import com.base.springcloud.service.OrderService; import com.base.springcloud.util.DateUtil; import com.base.springcloud.util.DecimalUtil; @@ -23,21 +27,26 @@ public class OrderServiceImp implements OrderService { @Override public void registerOrder(OrderBO orderBO) { + SaleBill saleBill = orderBO.getSaleBill(); + BigDecimal amount = saleBill.getTotalAmount(); + if(amount.compareTo(BigDecimal.ZERO) <= 0){ + throw new BusinessException(ErrorConstant.BILL_AMOUNT_ERR); + } Order order = new Order(); order.setId(UUID.randomUUID().toString().replace("-", "")); order.setCreateTime(new Date()); - order.setExpireTime(new Date()); + //order.setExpireTime(new Date()); order.setTimeStamp(new Date()); order.setOrderNo(DateUtil.getDateString(new Date(),25)); - order.setOrderType("AL"); + order.setOrderType("WEC"); order.setRequestNo(DateUtil.getDateString(new Date(),25)); order.setGoodName("maomaogongzai"); order.setReserved("memo"); order.setTimeStamp(new Date()); order.setMchId(orderBO.getMchId()); order.setOrderState(PaymentConstant.WAIT); - BigDecimal amount = orderBO.getSaleBill().getTotalAmount(); - order.setOrderAmount(DecimalUtil.divide(Optional.ofNullable(amount).orElse(new BigDecimal(0.01)),new BigDecimal(100))); + order.setSourceBillId(Optional.ofNullable(saleBill.getSourceId()).orElse(saleBill.getId())); + order.setOrderAmount(DecimalUtil.multiply(amount,new BigDecimal(100)).setScale(0,BigDecimal.ROUND_DOWN)); orderMapper.insert(order); orderBO.setOrder(order); } diff --git a/payment-base-app/src/main/java/com/base/springcloud/service/imp/PaymentServiceImp.java b/payment-base-app/src/main/java/com/base/springcloud/service/imp/PaymentServiceImp.java index 11507a6..93b91ca 100644 --- a/payment-base-app/src/main/java/com/base/springcloud/service/imp/PaymentServiceImp.java +++ b/payment-base-app/src/main/java/com/base/springcloud/service/imp/PaymentServiceImp.java @@ -2,14 +2,18 @@ package com.base.springcloud.service.imp; import com.base.springcloud.aspect.annotation.Rlock; import com.base.springcloud.bo.OrderBO; +import com.base.springcloud.bo.SaleBillBO; import com.base.springcloud.constant.PaymentConstant; import com.base.springcloud.entity.Order; +import com.base.springcloud.entity.SaleBill; import com.base.springcloud.service.*; +import com.base.springcloud.util.DecimalUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.math.BigDecimal; import java.util.Date; import java.util.List; import java.util.Optional; @@ -46,8 +50,7 @@ public class PaymentServiceImp implements PaymentService { // 登记订单 orderService.registerOrder(orderBO); // 请求微信生成二维码 - String codeUrl = wecPaymentService.nativePay(orderBO); - return codeUrl; + return wecPaymentService.wecNativePay(orderBO); } /** @@ -84,6 +87,11 @@ public class PaymentServiceImp implements PaymentService { // 同步订单状态 String orderNo = order.getOrderNo(); orderService.updateOrderSuccess(orderNo); + // 核销销售单据金额 + SaleBillBO saleBillBO = new SaleBillBO(); + saleBillBO.setId(order.getSourceBillId()); + saleBillBO.setPayAmount(DecimalUtil.divide(order.getOrderAmount(),new BigDecimal(100))); + billService.writeOffBill(saleBillBO); } // 参数检查 diff --git a/payment-base-app/src/main/java/com/base/springcloud/service/imp/WecPaymentServiceImp.java b/payment-base-app/src/main/java/com/base/springcloud/service/imp/WecPaymentServiceImp.java index 6e7797e..d79c04a 100644 --- a/payment-base-app/src/main/java/com/base/springcloud/service/imp/WecPaymentServiceImp.java +++ b/payment-base-app/src/main/java/com/base/springcloud/service/imp/WecPaymentServiceImp.java @@ -1,13 +1,14 @@ package com.base.springcloud.service.imp; +import com.alibaba.fastjson.JSONObject; import com.base.springcloud.bo.CodePayBO; import com.base.springcloud.bo.OrderBO; import com.base.springcloud.bo.RefundBO; import com.base.springcloud.constant.PaymentConstant; import com.base.springcloud.entity.Order; import com.base.springcloud.entity.WxpayRefundVo; -import com.base.springcloud.entity.WxpayRefundVo.WxRefundAmountVo; import com.base.springcloud.entity.WxpayTradeVo; +import com.base.springcloud.entity.WxpayTradeVo.WxTradeAmountVo; import com.base.springcloud.service.WecPaymentService; import com.base.springcloud.util.DateUtil; import com.base.springcloud.util.DecimalUtil; @@ -16,15 +17,14 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ObjectNode; import com.hisun.iposm.HiCASignUtil2; import com.hisun.iposm.HiiposmUtil; +import lombok.SneakyThrows; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.text.StrBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; -import java.io.IOException; import java.math.BigDecimal; -import java.util.Map; import java.util.Optional; @Service @@ -133,12 +133,10 @@ public class WecPaymentServiceImp implements WecPaymentService { * 微信Native支付 * @param orderBO */ + @SneakyThrows @Override public String wecNativePay(OrderBO orderBO) { - Order order = Optional.ofNullable(orderBO).map(o->orderBO.getOrder()).orElse(null); - if(order == null) { - // TODO 抛出业务异常 - } + Order order = orderBO.getOrder(); WxpayTradeVo wxpayTradeVo = new WxpayTradeVo(); wxpayTradeVo.setAppid(orderBO.getAppId()); wxpayTradeVo.setMchid(orderBO.getMchId()); @@ -146,18 +144,17 @@ public class WecPaymentServiceImp implements WecPaymentService { wxpayTradeVo.setOut_trade_no(order.getOrderNo()); // FIXME 待定为商户系统||RBS系统回调接收 wxpayTradeVo.setNotify_url("https://www.weixin.qq.com/wxpay/pay.php"); - WxpayTradeVo.WxTradeAmountVo wxTradeAmountVo = new WxpayTradeVo.WxTradeAmountVo(); + WxTradeAmountVo wxTradeAmountVo = new WxTradeAmountVo(); wxTradeAmountVo.setTotal(order.getOrderAmount()); wxpayTradeVo.setAmount(wxTradeAmountVo); - ObjectNode objectNode = WxpayUtils.getWxpay( + JSONObject jsonObject = WxpayUtils.getWxpay( wxpayTradeVo, PaymentConstant.NATIVE, orderBO.getMchPrivateKey(), orderBO.getCertificate(), orderBO.getSerialNo()); - logger.info("Native支付订单 :{} 接收响应数据 :{}",order.getOrderNo(),objectNode.toString()); - JsonNode jsonNode = objectNode.get("code_url"); - return jsonNode.toString(); + logger.info("Native支付订单 :{} 接收响应数据 :{}",order.getOrderNo(),jsonObject.toString()); + return jsonObject.get("code_url").toString(); } /** @@ -169,7 +166,7 @@ public class WecPaymentServiceImp implements WecPaymentService { WxpayRefundVo wxpayRefundVo = new WxpayRefundVo(); wxpayRefundVo.setTransaction_id(refundBO.getOrigOrderNo()); wxpayRefundVo.setReason(refundBO.getReason()); - WxRefundAmountVo wxRefundAmountVo = new WxRefundAmountVo(); + WxpayRefundVo.WxRefundAmountVo wxRefundAmountVo = new WxpayRefundVo.WxRefundAmountVo(); wxRefundAmountVo.setTotal(refundBO.getOrderAmount()); wxRefundAmountVo.setRefund(refundBO.getRefundAmount()); wxpayRefundVo.setNotify_url(refundBO.getNotifyUrl()); @@ -186,35 +183,6 @@ public class WecPaymentServiceImp implements WecPaymentService { public void codePay(CodePayBO codePayBO) { } - /*public static void main(String[] args) { - CodePayBO codePayBO = new CodePayBO(); - codePayBO.setAppId("wxa91984b310053c3d"); - codePayBO.setMchId("1610494969"); - codePayBO.setDeviceInfo("sb0001"); - codePayBO.setSpbillCreateIp("8.8.8.8"); - codePayBO.setBody("Image形象店-深圳腾大-QQ公仔"); - codePayBO.setOrderNo(DateUtil.getDateString(25)); - codePayBO.setAmount(new BigDecimal(1)); - codePayBO.setMchPrivateKey("MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCVVy4CUrRTPJZ49vuK9Tr5Rurd3dE3eiz7lsnWPAYgZtdWsC6TORUaP0Px/ZMtaJYNURMpVKC5koXZSPTNr9ROHa6B6IX4lTMERzHgiVzGIqLlE/twBYXbSuh8yXy3k59adFDYZZNN+2THWdst2Ao7pD+GXlDby8gfF67ax9CbWq5yyx6MYMKHwOVe3H/ON2pcmZR6I809Lwa4zfmUyOez1U5pwNiwv2cyorM5UXzVMsvK5jfIKDaskNVIV/+ax15tf+OQ/6t9iaWzRAV1zeeJd/TuVVGB/QU5slg5xyIwaqKzJM1H3n64er5QNRKpU31Ru0dHzJTW7ljtILWCQZubAgMBAAECggEAVga6QixSJACqzVO44vsQ1be8Y8H7WvHOJ79c1UQOY2vab91ddwFS3qPDCAsCVQ4CIfmqCAzv6PY2lEwqeLHooncGp17Cjcekc7pvSODXyGr7Wup/1K/Zw9EKy5dleHpZOUn3qDAbArjl/NAOKgJhIqoizcxW18YzqXWDDBQ+Xr6kqmjWXWZ3Kj6ghZNoSkdoynTQ7Ti0C2lq0UeXg611ea6Zs3fgjOgYEBMSSI7v4zE/6RN7jFGlZe5Z1NgO15rl8r3YdDnXTCIpEiTV+yHsDkluqJquB0E1Xrr1AXl9AGMuq6lYEB4houJUPtGgQ6bLs93MrnyzgnGTLbLSnXDNwQKBgQDD6Z+0xZ8lApXZylI2N4zuSrCsi6wB6Qp/64jr+C7GAdmC7w9WRoIlIF7Q2s9p5ulGyxD2hAbrajY5CsjV3S0uIDAaULoG3dw5vxYFEdvcKgxphf8j0gcajUnPGzCxF5vm29B9D+o1mrylr04dtWHlP0KpKwQ6HiTX7if+DcXMhwKBgQDDJOFpoCcVdZ0clfpvJPZpgRTu3I4HFTs27elCQ98g1UWav/VY7729YLAKU27d6lG+iqH1X5lVu2lr/du8wdJoMbpBPD34V+V6ye8gV9lCG7wSCgsNnPqM/HoyBSe6+JUgwG+vCRh1KMhNBmqEMCqPRAtbW3wfDdCShfTBHAjxTQKBgCjYrNOj4Gp2/4dJB5sGOfv01qEi/dnoHKhPE10fgaEHAbKq5Se3y6qx9RLWjCgoXLrF2+OJ42dx3ZxHA1iTpLfZPi4+ZorH9wKTNKQZ9R0SJ0RZC7kMMS74BkuH/77sjTS03+MzTkGe4XYp9r968c46QkvDDD6Ryly66tutQ3BBAoGBAJiE/MDncWSuVit/dQrlYso3HztJmqAikfNuoz8tePlad1pp6cKnLi8ToMORTjeX6mf4RnlXTKrbHZxP/yxaeK8DHsXZ5b1yRWNg7MrknmOy9Z1LyDPNm24R7xelO9ZAb533idLOUxVO2K6K8zl5w+nRjubKbAqBa6D5ncBIvxyJAoGAP9cSun39cFuzjdTaWojmbQMM8k5pyvFWr2UdY50GFrFCdajkAxqoTLkFEUP5fx8InIU/X9aSbVE6Va5fdOKiifbx5KaSKFrH/xZS6XykAbIkWDWqOPMovHoMWj3lGO96wDInry9YZNy7JA8AuZsLSBUA7Xb33FqZ2WU5ePeFOAA="); - codePayBO.setAuthCode("135276524069149568"); - - Map params = MicroPayModel - .builder() - .appid(codePayBO.getAppId()) - .mch_id(codePayBO.getMchId()) - .device_info(codePayBO.getDeviceInfo()) - .nonce_str(WxPayKit.generateStr()) - .body(codePayBO.getBody()) - //.attach(codePayBO.getAttach()) - .out_trade_no(codePayBO.getOrderNo()) - .total_fee(codePayBO.getAmount().toPlainString()) - .spbill_create_ip(codePayBO.getSpbillCreateIp()) - .auth_code(codePayBO.getAuthCode()) - .build() - .createSign(codePayBO.getMchPrivateKey(), SignType.HMACSHA256); - System.out.println(WxPayApi.microPay(false,params)); - } -*/ /** * 订单状态查询 * @@ -224,50 +192,45 @@ public class WecPaymentServiceImp implements WecPaymentService { @Override public Boolean orderResult(OrderBO orderBO) { Order order = orderBO.getOrder(); - String orderId = order.getOrderNo(); - String req_url = "https://ipos.10086.cn/cps/cmpayService"; - String type = "AggregQueryCPS"; - String version = "1.0.0"; - String reserved = order.getReserved(); - String signType = PaymentConstant.SIGN_TYPE; - String requestId = DateUtil.getDateString(25); - String merchantId = order.getMchId(); - String privateKey = orderBO.getMchPrivateKey(); - String characterSet = PaymentConstant.CHARACTER_SET; - - StringBuilder signData = new StringBuilder(); - signData.append(merchantId); - signData.append(requestId); - signData.append(signType); - signData.append(type); - signData.append(version); - signData.append(orderId); - signData.append(reserved); - try { - StrBuilder requestParam = new StrBuilder(); - HiCASignUtil2 rsa = new HiCASignUtil2(privateKey, "111"); - requestParam.append("hmac=").append(rsa.sign(signData.toString())); - requestParam.append("&characterSet=").append(PaymentConstant.CHARACTER_SET); - requestParam.append("&merchantId=").append(merchantId); - requestParam.append("&requestId=").append(requestId); - requestParam.append("&signType=").append(signType); - requestParam.append("&type=").append(type); - requestParam.append("&version=").append(version); - requestParam.append("&orderId=").append(orderId); - requestParam.append("&reserved1=").append(reserved); + String url = PaymentConstant.WX_ORDER_QUERY_URL + order.getOrderNo() + "?mchid=" + order.getMchId(); + logger.info("order_result_url : {}",url); + return WxpayUtils.queryWxOrder(url,orderBO.getMchId(),orderBO.getMchPrivateKey(),orderBO.getCertificate(),orderBO.getSerialNo()); + } - HiiposmUtil util = new HiiposmUtil(); - String res = util.sendAndRecv(req_url, requestParam.toString(), characterSet); - logger.info("订单: {} 查询参数响应: {}",order.getOrderNo(),res); - if(util.getValue(res, "status").equals("SUCCESS")){ - return true; - } - return false; - } catch (IOException e) { - e.printStackTrace(); - } catch (Exception e) { - e.printStackTrace(); + public static void main(String[] args) { + OrderBO orderBO = new OrderBO(); + orderBO.setAppId("wxe61ee6c21345d74d"); + orderBO.setMchId("1537100771"); + orderBO.setMchPrivateKey("MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDU7qXRin2MGdDGPQLgMCMlAWccseGXDz99Ulu0KL3u7QBH0eJZoxDpHGqE/sMtQnDUD446Khi3AZgd2xwWOoshkleSOkNd20+tVaq91vw/lJEF4kv4DbFFNLObs1kBqGYZi4HUrbyRH1UqFujImJXDvSOKd53SPjEPs6rRFDwXAQaEQEftwQVvv6ycHc7symgYL486KCVZLm2yfsMA0fu/MiSTIeZCMR1OEx+YK61K4Rzv6rdE8Yf6o2Rwl0xWqcrm2C2RFLgGqmrYmxscgI6ufEEdbWO0YkqFQndcVhT8vooTYdwShrB5rp7TDs3G3qQMzqQpfi2J/gWsWT1S4ZnLAgMBAAECggEAUavLfCijaQZJ1o92N+kewcXc99uejGMz1eyt8dciqq7KycFOEVWDWfYlQSe6UvTF9ACXa+XTnvYEk4cEKd6AmPrZjeO9DRXeZLyUBcac8AIa8efPfbA6yzGgplrPC9y8dJXW0W1mAz/CWad51972qqI0LJsetJJYHQ6ruRAK0ENH7LUAHAzrSbD96y+YuXB6n2x7GQZF1e8PCzVdpNEsDfEwNBB19CyLpCIW3JQMZvVcWUv+8MJwdzvNprwkDKeMC0F/p7R+ErZL1z1pfi9aMV2DzQ25qKW758juTTnGf6z+tTND+cQoeMh1GxqK3CuUpz1Y7lUctF2jyP/6EPctWQKBgQD5m4ZaiW+ucQ1hEkxW4T9TPugyHxvNBtOQvs3F5kin2QVeIkY9ssGHmTx5I5r63sDQylSQRildaIX6EAxYzoy5AHtAKiltiB3ppLdQxX7adoSWNORZ/pjd/sNKTAZtqd0IBNtjuI3y/BxYrqii7cUC/aWv+gxHFUjoyG01aU8mHwKBgQDaYqwrm0gRmpKlhigoXRYGEo24kJHsGjXnpxy9Klq3S7A9zAfEF4WqfuAM3vXbUm8RrDU045N4kyakwfJNewVSzkL9N0vcGHqoB5DNWSrS6qmIZgUAuU55iRXR16Kluv0k3pF1Ar4gtJuDHpEvjlqV8J4Z0bWNrOkXZ5sjIAje1QKBgGJDX7j0sgqyZtn4IiVxt0RGV5KjvIYSUeeBtfBan++z9/D+/Tf8z0Nah/wIkFKCrtWDUZcah95F77hp6PJtHekWz26LKpP8Kgp41dHubeoDDl8zo1HqcLO0P51YII+7d1BY2SWA2iD2LxKab7j0ccKjqD6G6Z5yOqmpfZSxSH9xAoGAPqSVPIDzYFFVhXOBK2rgOWezDWEy6mXuVn/CJ6Txlqh4apGPHLmelvSD8k02eu4ffBNIw94P3ENhj1su1PjX4xPVdWsaMI05Cd/5sl3EgfHcJYsWHkoJb6VaA/J17lI/8QaC9OyPezQzc54eCWUtKNt3jnJwQK57wkHu51l2Ee0CgYBuqDJjYcw1xHYtA+hH/tTrU1t8arwdeoz0QN+Cj1DgGW6zY0WRyIcnl4M1v51bIyrluqpN4e0Dh2VVV0r1LAIlhvAzsz3alCIJzVTVaJXKAGwN9vMxRbnCdg1h+QzAeZ+VC1zLNzHKUPYsGEnH5Hig5mml1pZz4b6LSNDFG6VBqw=="); + orderBO.setCertificate("MIID8DCCAtigAwIBAgIUbAm85GX1um+ESCWizOGXEoH6gnowDQYJKoZIhvcNAQELBQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsTFFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3QgQ0EwHhcNMjExMTE2MDczNDUzWhcNMjYxMTE1MDczNDUzWjCBgTETMBEGA1UEAwwKMTUzNzEwMDc3MTEbMBkGA1UECgwS5b6u5L+h5ZWG5oi357O757ufMS0wKwYDVQQLDCTlm5vlt53nm5vlkozmnLrmorDorr7lpIfmnInpmZDlhazlj7gxCzAJBgNVBAYMAkNOMREwDwYDVQQHDAhTaGVuWmhlbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANTupdGKfYwZ0MY9AuAwIyUBZxyx4ZcPP31SW7Qove7tAEfR4lmjEOkcaoT+wy1CcNQPjjoqGLcBmB3bHBY6iyGSV5I6Q13bT61Vqr3W/D+UkQXiS/gNsUU0s5uzWQGoZhmLgdStvJEfVSoW6MiYlcO9I4p3ndI+MQ+zqtEUPBcBBoRAR+3BBW+/rJwdzuzKaBgvjzooJVkubbJ+wwDR+78yJJMh5kIxHU4TH5grrUrhHO/qt0Txh/qjZHCXTFapyubYLZEUuAaqatibGxyAjq58QR1tY7RiSoVCd1xWFPy+ihNh3BKGsHmuntMOzcbepAzOpCl+LYn+BaxZPVLhmcsCAwEAAaOBgTB/MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgTwMGUGA1UdHwReMFwwWqBYoFaGVGh0dHA6Ly9ldmNhLml0cnVzLmNvbS5jbi9wdWJsaWMvaXRydXNjcmw/Q0E9MUJENDIyMEU1MERCQzA0QjA2QUQzOTc1NDk4NDZDMDFDM0U4RUJEMjANBgkqhkiG9w0BAQsFAAOCAQEArtZJ2FICGrykPJziJxPjTaaA/nn//tXI6rUW9aSHe6atLWgduUDlBQjn8pckAeReuXF6J1D9u45iQY8fc5Mb5BAQsg4qC1zxoRINBNL5HVEf+9uolfJI2urw3cfwbAdrymMDUWc0xFZWgo5z3KFXso8ERb73j/5utbIqZ+C7MtesHs1Em5FRSZgX86wy9zDcbIMtw2LeHymQ3MV8C6cASwlBIJ/UptDieuHRr0FoUxkmtSN1POQRhhYVT2gaHpNOVHmrK6Tbd6nblQ70GdLH7kdb9LPr4kS0GXPz+Gvk8y15PKI02MFcNqJCuLJTpFlAf4gTwWule2Z5/1WlOF1+sA=="); + orderBO.setSerialNo("6C09BCE465F5BA6F844825A2CCE1971281FA827A"); + Order order1 = new Order(); + order1.setGoodName("形象大公仔"); + order1.setOrderNo("20220304112022"); + order1.setOrderAmount(new BigDecimal(1)); + orderBO.setOrder(order1); + Order order = Optional.ofNullable(orderBO).map(o->orderBO.getOrder()).orElse(null); + if(order == null) { + // TODO 抛出业务异常 } - return false; + WxpayTradeVo wxpayTradeVo = new WxpayTradeVo(); + wxpayTradeVo.setAppid(orderBO.getAppId()); + wxpayTradeVo.setMchid(orderBO.getMchId()); + wxpayTradeVo.setDescription(order.getGoodName()); + wxpayTradeVo.setOut_trade_no(order.getOrderNo()); + // FIXME 待定为商户系统||RBS系统回调接收 + wxpayTradeVo.setNotify_url("https://www.weixin.qq.com/wxpay/pay.php"); + WxpayTradeVo.WxTradeAmountVo wxTradeAmountVo = new WxpayTradeVo.WxTradeAmountVo(); + wxTradeAmountVo.setTotal(order.getOrderAmount()); + wxpayTradeVo.setAmount(wxTradeAmountVo); + JSONObject objectNode = WxpayUtils.getWxpay( + wxpayTradeVo, + PaymentConstant.NATIVE, + orderBO.getMchPrivateKey(), + orderBO.getCertificate(), + orderBO.getSerialNo()); + System.out.println("Native支付订单 :{} " + order.getOrderNo() + " 接收响应数据 :{} "+ objectNode.toString()); + System.out.println(objectNode.toString()); } + } diff --git a/payment-base-app/src/main/java/com/base/springcloud/util/ParameterUtil.java b/payment-base-app/src/main/java/com/base/springcloud/util/ParameterUtil.java new file mode 100644 index 0000000..f7de1ab --- /dev/null +++ b/payment-base-app/src/main/java/com/base/springcloud/util/ParameterUtil.java @@ -0,0 +1,42 @@ +package com.base.springcloud.util; + +import com.base.springcloud.bo.OrderBO; +import com.base.springcloud.constant.PaymentConstant; +import com.base.springcloud.dto.NativePlaceOrderDTO; +import org.apache.commons.lang.StringUtils; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + +@Component +public class ParameterUtil { + + /** + * native下单入场设置 + * @param billId + * @return + */ + public OrderBO nativePlaceOrderBefore(String billId){ + OrderBO orderBO = new OrderBO(); + orderBO.setBillId(billId); + orderBO.setMchId(PaymentConstant.DEFAULT_MCH_ID); + return orderBO; + } + + /** + * native下单响应设置 + * @param codeUrl + * @return + */ + public List nativePlaceOrderAfter(String codeUrl){ + if(StringUtils.isEmpty(codeUrl)){ + return null; + } + List nativePlaceOrderDTOList = new ArrayList<>(); + NativePlaceOrderDTO nativePlaceOrderDTO = new NativePlaceOrderDTO(); + nativePlaceOrderDTO.setCodeUrl(codeUrl); + nativePlaceOrderDTOList.add(nativePlaceOrderDTO); + return nativePlaceOrderDTOList; + } +} diff --git a/payment-base-app/src/main/java/com/base/springcloud/wxsdk/WxpayUtils.java b/payment-base-app/src/main/java/com/base/springcloud/wxsdk/WxpayUtils.java index 9281578..b550095 100644 --- a/payment-base-app/src/main/java/com/base/springcloud/wxsdk/WxpayUtils.java +++ b/payment-base-app/src/main/java/com/base/springcloud/wxsdk/WxpayUtils.java @@ -1,6 +1,7 @@ package com.base.springcloud.wxsdk; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; import com.base.springcloud.constant.PaymentConstant; import com.base.springcloud.entity.CallbackBodyVo; import com.base.springcloud.entity.WxpayRefundVo; @@ -13,6 +14,7 @@ import com.wechat.pay.contrib.apache.httpclient.util.PemUtil; import lombok.extern.slf4j.Slf4j; import org.apache.http.HttpEntity; import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.ContentType; import org.apache.http.entity.StringEntity; @@ -60,35 +62,80 @@ public class WxpayUtils { * @param serialNo * @return */ - public static ObjectNode getWxpay(WxpayTradeVo tradeVo, String scene, String privateKey, String certificate, String serialNo) { + public static JSONObject getWxpay(WxpayTradeVo tradeVo, String scene, String privateKey, String certificate, String serialNo) { // ... String responseBody = response(JSON.toJSONString(tradeVo), getUrl(scene), tradeVo.getMchid(), privateKey, certificate, serialNo); log.info("======>>> wxpay response body: ", responseBody); // parse Map resultMap = StringHelper.json2map(responseBody); - ObjectMapper objectMapper = new ObjectMapper(); - ObjectNode objectNode = objectMapper.createObjectNode(); + JSONObject jsonObject = new JSONObject(); if (PaymentConstant.NATIVE.equals(scene)) {// pc - 扫码支付(Native) - objectNode.put("code_url", resultMap.get("code_url")); + jsonObject.put("code_url", resultMap.get("code_url")); } else if (PaymentConstant.H5.equals(scene)) {// 手机网页(H5) - objectNode.put("h5_url", resultMap.get("h5_url")); + jsonObject.put("h5_url", resultMap.get("h5_url")); } else if (PaymentConstant.JSAPI.equals(scene)) {// 微信公众号(H5) String prepayId = resultMap.get("prepay_id"); - objectNode.put("prepay_id", prepayId); + jsonObject.put("prepay_id", prepayId); // ... - objectNode.put("appId", tradeVo.getAppid()); + jsonObject.put("appId", tradeVo.getAppid()); String timestamp = getTimestamp(); - objectNode.put("timeStamp", timestamp); + jsonObject.put("timeStamp", timestamp); String nonceStr = CreateNoncestr(); - objectNode.put("nonceStr", nonceStr); + jsonObject.put("nonceStr", nonceStr); String packageStr = "prepay_id=" + prepayId; - objectNode.put("package", packageStr); + jsonObject.put("package", packageStr); // 签名 String paySign = doRequestSign(privateKey, tradeVo.getAppid(), timestamp, nonceStr, packageStr); - objectNode.put("paySign", paySign); - objectNode.put("signType", "RSA"); + jsonObject.put("paySign", paySign); + jsonObject.put("signType", "RSA"); } - return objectNode; + return jsonObject; + } + + /** + * 订单查询 + * @param url + * @param mchId + * @param privateKey + * @param certificate + * @param serialNo + * @return true - 成功 false - 失败 + */ + public static Boolean queryWxOrder(String url,String mchId, String privateKey, String certificate, String serialNo) { + HttpGet httpGet = new HttpGet(url); + httpGet.addHeader("Accept", "application/json"); + CloseableHttpResponse response = null; + try { + // 商户私钥 + PrivateKey merchantPrivateKey = PemUtil.loadPrivateKey(new ByteArrayInputStream(privateKey.getBytes("utf-8"))); + response = getClient(mchId, serialNo, merchantPrivateKey, certificate).execute(httpGet); + log.info("query_wx_order response: {}",response); + int statusCode = response.getStatusLine().getStatusCode(); + HttpEntity entity = response.getEntity(); + String body = EntityUtils.toString(entity); + EntityUtils.consume(entity); + JSONObject jsonObject = JSONObject.parseObject(body); + if (statusCode != 200) { + Map errorMsg = StringHelper.json2map(body); + // FIXME 请求微信失败 + } + log.info("query_wx_order response resultMap: {}",jsonObject.toJSONString()); + if (PaymentConstant.WX_SUCCESS.equals(jsonObject.getString("trade_state"))) { + log.info("query_wx_order query true"); + return true; + } + } catch (IOException e) { + log.error("======>>> wxpay response, client exception: {}", e); + } catch (Exception e) { + log.error("======>>> wxpay response, exception: {}", e); + } finally { + try { + response.close(); + } catch (IOException e) { + log.error("======>>> wxpay response, ioe exception: {}", e); + } + } + return false; } /** diff --git a/payment-base-app/src/main/resources/com/base/payment/mapper/OrderMapper.xml b/payment-base-app/src/main/resources/com/base/payment/mapper/OrderMapper.xml index 86a5cf6..a484412 100644 --- a/payment-base-app/src/main/resources/com/base/payment/mapper/OrderMapper.xml +++ b/payment-base-app/src/main/resources/com/base/payment/mapper/OrderMapper.xml @@ -12,12 +12,13 @@ + id, order_no,order_state,mch_id,create_time, expire_time, request_no, order_amount, good_name, good_id, - order_type, reserved + order_type, reserved,source_bill_id + + + update stk_io_bill + set lock_amount = IF(lock_amount = 0,total_amount - #{payAmount,jdbcType=DECIMAL},lock_amount - #{payAmount,jdbcType=DECIMAL}), + pay_amount = pay_amount + #{payAmount,jdbcType=DECIMAL} + where id = #{id,jdbcType=VARCHAR} + \ No newline at end of file