diff --git a/payment-base-app/src/main/java/com/base/springcloud/bo/MerchantConfigBO.java b/payment-base-app/src/main/java/com/base/springcloud/bo/MerchantConfigBO.java index a47420e..2cdc716 100644 --- a/payment-base-app/src/main/java/com/base/springcloud/bo/MerchantConfigBO.java +++ b/payment-base-app/src/main/java/com/base/springcloud/bo/MerchantConfigBO.java @@ -53,4 +53,9 @@ public class MerchantConfigBO { * 公司Id */ private String companyId; + + /** + * 证书 + */ + private String certificate; } diff --git a/payment-base-app/src/main/java/com/base/springcloud/bo/RefundBO.java b/payment-base-app/src/main/java/com/base/springcloud/bo/RefundBO.java index 14d8e59..eea8ff2 100644 --- a/payment-base-app/src/main/java/com/base/springcloud/bo/RefundBO.java +++ b/payment-base-app/src/main/java/com/base/springcloud/bo/RefundBO.java @@ -6,6 +6,7 @@ import lombok.Data; import java.io.Serializable; import java.math.BigDecimal; +import java.util.Date; @Data public class RefundBO extends MchConfigEntity implements Serializable { @@ -19,8 +20,8 @@ public class RefundBO extends MchConfigEntity implements Serializable { // 原订单编号 private String origOrderNo; - // 原订单 - private Order order; + // 原订单创建时间 + private Date origCreateTime; // 退款订单号 private String refundNo; diff --git a/payment-base-app/src/main/java/com/base/springcloud/entity/WxpayRefundVo.java b/payment-base-app/src/main/java/com/base/springcloud/entity/WxpayRefundVo.java index d59723f..ce5df07 100644 --- a/payment-base-app/src/main/java/com/base/springcloud/entity/WxpayRefundVo.java +++ b/payment-base-app/src/main/java/com/base/springcloud/entity/WxpayRefundVo.java @@ -14,9 +14,8 @@ import java.math.BigDecimal; public class WxpayRefundVo implements Serializable { private static final long serialVersionUID = 8189139771687842957L; - // 原支付交易对应的微信订单号 - // 示例值:1217752501201407033233368018 - private String transaction_id; + // 原支付订单对应商户订单号 + private String out_trade_no; // 若商户传入,会在下发给用户的退款消息中体现退款原因 // 示例值:商品已售完 private String reason; diff --git a/payment-base-app/src/main/java/com/base/springcloud/service/MerchantService.java b/payment-base-app/src/main/java/com/base/springcloud/service/MerchantService.java index 9f4ed5b..3a49d1e 100644 --- a/payment-base-app/src/main/java/com/base/springcloud/service/MerchantService.java +++ b/payment-base-app/src/main/java/com/base/springcloud/service/MerchantService.java @@ -32,7 +32,7 @@ public interface MerchantService { /** * 获取商户支付信息配置 - * @param orderBO + * @param mchId */ - void claimMerchantConfig(OrderBO orderBO); + MerchantConfigBO claimMerchantConfig(String mchId); } 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 a36cc31..eb71bf7 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 @@ -132,20 +132,26 @@ public class MerchantServiceImp implements MerchantService { return merchantConfigBOList; } + /** + * 商户支付配置信息查询 + * @param mchId + */ @Override - public void claimMerchantConfig(OrderBO orderBO) { - if(!Optional.ofNullable(orderBO).map(o->orderBO.getMchId()).isPresent()){ + public MerchantConfigBO claimMerchantConfig(String mchId) { + if(StringUtils.isBlank(mchId)){ throw new BusinessException(ErrorConstant.MCH_ID_PARAM_ERR); } - MerchantConfig merchantConfig = merchantConfigMapper.claimMerchantConfig(orderBO.getMchId()); + MerchantConfig merchantConfig = merchantConfigMapper.claimMerchantConfig(mchId); if(!Optional.ofNullable(merchantConfig).isPresent()){ throw new BusinessException(ErrorConstant.MCH_ID_PARAM_ERR); } - orderBO.setAppId(merchantConfig.getAppId()); - orderBO.setMchPrivateKey(merchantConfig.getMchPrivateKey()); + MerchantConfigBO merchantConfigBO = new MerchantConfigBO(); + merchantConfigBO.setAppId(merchantConfig.getAppId()); + merchantConfigBO.setMchPrivateKey(merchantConfig.getMchPrivateKey()); + merchantConfigBO.setSerialNo(merchantConfig.getSerialNo()); String certificate = readCertificate(merchantConfig.getCertPath()); - orderBO.setCertificate(certificate); - orderBO.setSerialNo(merchantConfig.getSerialNo()); + merchantConfigBO.setCertificate(certificate); + return merchantConfigBO; } /** 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 7d621a1..568b772 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 @@ -100,14 +100,17 @@ public class OrderServiceImp implements OrderService { @Override public void origOrderCheck(RefundBO refundBO) { String billId = refundBO.getBillId(); - String orderNo = orderBillService.queryOrderNo(billId); - if(StringUtils.isBlank(orderNo)) + String orderId = orderBillService.queryOrderNo(billId); + if(StringUtils.isBlank(orderId)) throw new BusinessException(ErrorConstant.BILL_INVALID); - Order order = orderMapper.origOrderInfo(orderNo); + Order order = orderMapper.origOrderInfo(orderId); if (!Optional.ofNullable(order).isPresent()) throw new BusinessException(ErrorConstant.PAY_ORDER_NOT_FOUND); if(!PaymentConstant.SUCCESS.equals(order.getOrderState())) throw new BusinessException(ErrorConstant.ORDER_STATE_NOT_SUPPORT_REFUND); - refundBO.setOrder(order); + refundBO.setOrigOrderNo(order.getOrderNo()); + refundBO.setOrigCreateTime(order.getCreateTime()); + refundBO.setRefundAmount(order.getOrderAmount()); + refundBO.setMchId(order.getMchId()); } } 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 ce4a1e9..1782fd2 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 @@ -1,5 +1,6 @@ package com.base.springcloud.service.imp; +import com.base.springcloud.bo.MerchantConfigBO; import com.base.springcloud.bo.OrderBO; import com.base.springcloud.bo.RefundBO; import com.base.springcloud.bo.SaleBillBO; @@ -52,16 +53,29 @@ public class PaymentServiceImp implements PaymentService { billService.billCheck(orderBO); // 获取子销售单据 //billService.childBill(orderBO,true); - // 查询商户支付信息配置 - merchantService.claimMerchantConfig(orderBO); // 登记订单 orderService.registerOrder(orderBO); // 登记销售单据和订单关联 orderBillService.registerOrderBill(orderBO); + // 查询商户支付配置信息 + claimMerchantConfig(orderBO); // 请求微信生成二维码 return wecPaymentService.wecNativePay(orderBO); } + /** + * 查询商户支付配置信息 + * @param orderBO + */ + private void claimMerchantConfig(OrderBO orderBO) { + MerchantConfigBO merchantConfigBO = merchantService.claimMerchantConfig(orderBO.getMchId()); + orderBO.setAppId(merchantConfigBO.getAppId()); + orderBO.setMchPrivateKey(merchantConfigBO.getMchPrivateKey()); + orderBO.setSerialNo(merchantConfigBO.getSerialNo()); + orderBO.setCertificate(merchantConfigBO.getCertificate()); + + } + /** * 订单查询 */ @@ -87,7 +101,7 @@ public class PaymentServiceImp implements PaymentService { Order order = Optional.ofNullable(orderBO).map(o->orderBO.getOrder()).orElse(null); if(!Optional.ofNullable(order).isPresent()) return; // 获取商户支付配置信息 - merchantService.claimMerchantConfig(orderBO); + claimMerchantConfig(orderBO); // 查询微信订单结果 Boolean state = wecPaymentService.orderResult(orderBO); if(!state) return; diff --git a/payment-base-app/src/main/java/com/base/springcloud/service/imp/RefundServiceImp.java b/payment-base-app/src/main/java/com/base/springcloud/service/imp/RefundServiceImp.java index 783900b..842e085 100644 --- a/payment-base-app/src/main/java/com/base/springcloud/service/imp/RefundServiceImp.java +++ b/payment-base-app/src/main/java/com/base/springcloud/service/imp/RefundServiceImp.java @@ -1,16 +1,14 @@ package com.base.springcloud.service.imp; import com.base.springcloud.aspect.annotation.BusinessException; +import com.base.springcloud.bo.MerchantConfigBO; import com.base.springcloud.bo.RefundBO; import com.base.springcloud.constant.ErrorConstant; import com.base.springcloud.constant.PaymentConstant; import com.base.springcloud.dao.RefundMapper; import com.base.springcloud.entity.Order; import com.base.springcloud.entity.Refund; -import com.base.springcloud.service.BillService; -import com.base.springcloud.service.OrderService; -import com.base.springcloud.service.RefundService; -import com.base.springcloud.service.WecPaymentService; +import com.base.springcloud.service.*; import com.base.springcloud.util.DateUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -34,6 +32,9 @@ public class RefundServiceImp implements RefundService { @Autowired private BillService billService; + @Autowired + private MerchantService merchantService; + /** * 退款 * @param refundBO @@ -45,6 +46,8 @@ public class RefundServiceImp implements RefundService { // TODO 退款限制检查 // 查询原支付订单 orderService.origOrderCheck(refundBO); + // 商户支付信息配置 + claimMerchantConfig(refundBO); // 登记退款信息 registerRfund(refundBO); // 发送微信退款 @@ -55,6 +58,18 @@ public class RefundServiceImp implements RefundService { // RBS-业务逻辑处理 } + /** + * 商户支付信息查询 + * @param refundBO + */ + private void claimMerchantConfig(RefundBO refundBO) { + MerchantConfigBO merchantConfigBO = merchantService.claimMerchantConfig(refundBO.getMchId()); + refundBO.setAppId(merchantConfigBO.getAppId()); + refundBO.setMchPrivateKey(merchantConfigBO.getMchPrivateKey()); + refundBO.setSerialNo(merchantConfigBO.getSerialNo()); + refundBO.setCertificate(merchantConfigBO.getCertificate()); + } + /** * 退款列表查询 * @param date @@ -79,9 +94,8 @@ public class RefundServiceImp implements RefundService { refund.setRefundTime(new Date()); refund.setRefundState(PaymentConstant.REFUND_WAIT); refund.setRefundRetryCount(PaymentConstant.START_REFUND_COUNT); - Order order = refundBO.getOrder(); - refund.setOrigOrderNo(order.getOrderNo()); - refund.setOrigOrderTime(order.getCreateTime()); + refund.setOrigOrderNo(refundBO.getOrigOrderNo()); + refund.setOrigOrderTime(refundBO.getOrigCreateTime()); // FIXME 原销售单据id // refund.setSourceBillId(); int count = refundMapper.insert(refund); 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 eb3a14d..3983b6d 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 @@ -12,6 +12,7 @@ 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; +import com.base.springcloud.util.StringHelper; import com.base.springcloud.wxsdk.WxpayUtils; import lombok.SneakyThrows; import org.slf4j.Logger; @@ -19,6 +20,7 @@ import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import java.math.BigDecimal; +import java.util.Map; import java.util.Optional; @Service @@ -61,16 +63,19 @@ public class WecPaymentServiceImp implements WecPaymentService { @Override public Boolean wecRefund(RefundBO refundBO) { WxpayRefundVo wxpayRefundVo = new WxpayRefundVo(); - wxpayRefundVo.setTransaction_id(refundBO.getOrigOrderNo()); wxpayRefundVo.setReason(refundBO.getReason()); + wxpayRefundVo.setNotify_url("https://www.weixin.qq.com/wxpay/pay.php"); + wxpayRefundVo.setOut_trade_no(refundBO.getOrigOrderNo()); + wxpayRefundVo.setOut_refund_no(refundBO.getRefundNo()); WxpayRefundVo.WxRefundAmountVo wxRefundAmountVo = new WxpayRefundVo.WxRefundAmountVo(); wxRefundAmountVo.setTotal(refundBO.getRefundAmount()); wxRefundAmountVo.setRefund(refundBO.getRefundAmount()); - wxpayRefundVo.setNotify_url(refundBO.getNotifyUrl()); - wxpayRefundVo.setOut_refund_no(refundBO.getRefundNo()); wxpayRefundVo.setAmount(wxRefundAmountVo); String refundRsp = WxpayUtils.refund(wxpayRefundVo,refundBO.getMchId(),refundBO.getMchPrivateKey(),refundBO.getCertificate(),refundBO.getSerialNo()); - return true; + Map resultMap = StringHelper.json2map(refundRsp); + if(PaymentConstant.WX_SUCCESS.equals(resultMap.get("status"))) + return true; + return false; } /** diff --git a/payment-base-app/src/main/java/com/base/springcloud/util/FtpUtil.java b/payment-base-app/src/main/java/com/base/springcloud/util/FtpUtil.java deleted file mode 100644 index a89bd68..0000000 --- a/payment-base-app/src/main/java/com/base/springcloud/util/FtpUtil.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.base.springcloud.util; - -import org.apache.commons.net.ftp.FTPClient; -import org.apache.commons.net.ftp.FTPReply; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -import java.io.IOException; -import java.io.InputStream; - -@Component -public class FtpUtil { - - Logger logger = LoggerFactory.getLogger(FtpUtil.class); - - //ftp服务器ip地址 - @Value("${ftp.ftp_ip}") - private String FTP_ADDRESS; - //端口号 - @Value("${ftp.ftp_prot}") - private int FTP_PORT; - //用户名 - @Value("${ftp.ftp_username}") - private String FTP_USERNAME; - //密码 - @Value("${ftp.ftp_password}") - private String FTP_PASSWORD; - - //路径都是/home/加上用户名 - @Value("${ftp.ftp_basepath}") - public String FTP_BASEPATH; - - - // 文件上传 - public boolean uploadFile(String originFileName, InputStream input) { - //这是最开始引入的依赖里的方法 - FTPClient ftp = new FTPClient(); - ftp.setControlEncoding("utf-8"); - try { - int reply; - ftp.connect(FTP_ADDRESS, FTP_PORT);// 连接FTP服务器 - ftp.login(FTP_USERNAME, FTP_PASSWORD);// 登录 - reply = ftp.getReplyCode();//连接成功会的到一个返回状态码 - System.out.println(reply);//可以输出看一下是否连接成功 - ftp.setFileType(FTPClient.BINARY_FILE_TYPE);//设置文件类型 - ftp.changeWorkingDirectory(FTP_BASEPATH);//修改操作空间 - //对了这里说明一下你所操作的文件夹必须要有可读权限,chomd 777 文件夹名//这里我就是用的我的home文件夹 - ftp.storeFile(originFileName, input); - if (!FTPReply.isPositiveCompletion(reply)) { - logger.warn("ftp connect fail...."); - ftp.disconnect(); - return false; - } - input.close(); - ftp.logout(); - return true; - }catch (Exception e){ - e.printStackTrace(); - }finally { - if (ftp.isConnected()) { - try { - ftp.disconnect(); - } catch (IOException ioe) { - } - } - } - return false; - } -} \ No newline at end of file diff --git a/payment-base-app/src/main/resources/com/base/payment/mapper/OrderBillMapper.xml b/payment-base-app/src/main/resources/com/base/payment/mapper/OrderBillMapper.xml index ca99c46..5ddef56 100644 --- a/payment-base-app/src/main/resources/com/base/payment/mapper/OrderBillMapper.xml +++ b/payment-base-app/src/main/resources/com/base/payment/mapper/OrderBillMapper.xml @@ -111,7 +111,7 @@ order_id = #{orderId,jdbcType=VARCHAR} - select order_id from pay_order_bill 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 ee2d0a9..82bc4ff 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 @@ -181,7 +181,7 @@ from pay_order - order_id = #{orderId,jdbcType=VARCHAR} + id = #{orderId,jdbcType=VARCHAR} \ No newline at end of file