Browse Source

feat 0 支付工程

devlop
yang_shj 4 years ago
parent
commit
37f46ba485
  1. 5
      payment-base-app/src/main/java/com/base/springcloud/bo/MerchantConfigBO.java
  2. 5
      payment-base-app/src/main/java/com/base/springcloud/bo/RefundBO.java
  3. 5
      payment-base-app/src/main/java/com/base/springcloud/entity/WxpayRefundVo.java
  4. 4
      payment-base-app/src/main/java/com/base/springcloud/service/MerchantService.java
  5. 20
      payment-base-app/src/main/java/com/base/springcloud/service/imp/MerchantServiceImp.java
  6. 11
      payment-base-app/src/main/java/com/base/springcloud/service/imp/OrderServiceImp.java
  7. 20
      payment-base-app/src/main/java/com/base/springcloud/service/imp/PaymentServiceImp.java
  8. 28
      payment-base-app/src/main/java/com/base/springcloud/service/imp/RefundServiceImp.java
  9. 13
      payment-base-app/src/main/java/com/base/springcloud/service/imp/WecPaymentServiceImp.java
  10. 71
      payment-base-app/src/main/java/com/base/springcloud/util/FtpUtil.java
  11. 2
      payment-base-app/src/main/resources/com/base/payment/mapper/OrderBillMapper.xml
  12. 2
      payment-base-app/src/main/resources/com/base/payment/mapper/OrderMapper.xml

5
payment-base-app/src/main/java/com/base/springcloud/bo/MerchantConfigBO.java

@ -53,4 +53,9 @@ public class MerchantConfigBO {
* 公司Id * 公司Id
*/ */
private String companyId; private String companyId;
/**
* 证书
*/
private String certificate;
} }

5
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.io.Serializable;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.Date;
@Data @Data
public class RefundBO extends MchConfigEntity implements Serializable { public class RefundBO extends MchConfigEntity implements Serializable {
@ -19,8 +20,8 @@ public class RefundBO extends MchConfigEntity implements Serializable {
// 原订单编号 // 原订单编号
private String origOrderNo; private String origOrderNo;
// 原订单 // 原订单创建时间
private Order order; private Date origCreateTime;
// 退款订单号 // 退款订单号
private String refundNo; private String refundNo;

5
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 { public class WxpayRefundVo implements Serializable {
private static final long serialVersionUID = 8189139771687842957L; private static final long serialVersionUID = 8189139771687842957L;
// 原支付交易对应的微信订单号 // 原支付订单对应商户订单号
// 示例值:1217752501201407033233368018 private String out_trade_no;
private String transaction_id;
// 若商户传入,会在下发给用户的退款消息中体现退款原因 // 若商户传入,会在下发给用户的退款消息中体现退款原因
// 示例值:商品已售完 // 示例值:商品已售完
private String reason; private String reason;

4
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);
} }

20
payment-base-app/src/main/java/com/base/springcloud/service/imp/MerchantServiceImp.java

@ -132,20 +132,26 @@ public class MerchantServiceImp implements MerchantService {
return merchantConfigBOList; return merchantConfigBOList;
} }
/**
* 商户支付配置信息查询
* @param mchId
*/
@Override @Override
public void claimMerchantConfig(OrderBO orderBO) { public MerchantConfigBO claimMerchantConfig(String mchId) {
if(!Optional.ofNullable(orderBO).map(o->orderBO.getMchId()).isPresent()){ if(StringUtils.isBlank(mchId)){
throw new BusinessException(ErrorConstant.MCH_ID_PARAM_ERR); throw new BusinessException(ErrorConstant.MCH_ID_PARAM_ERR);
} }
MerchantConfig merchantConfig = merchantConfigMapper.claimMerchantConfig(orderBO.getMchId()); MerchantConfig merchantConfig = merchantConfigMapper.claimMerchantConfig(mchId);
if(!Optional.ofNullable(merchantConfig).isPresent()){ if(!Optional.ofNullable(merchantConfig).isPresent()){
throw new BusinessException(ErrorConstant.MCH_ID_PARAM_ERR); throw new BusinessException(ErrorConstant.MCH_ID_PARAM_ERR);
} }
orderBO.setAppId(merchantConfig.getAppId()); MerchantConfigBO merchantConfigBO = new MerchantConfigBO();
orderBO.setMchPrivateKey(merchantConfig.getMchPrivateKey()); merchantConfigBO.setAppId(merchantConfig.getAppId());
merchantConfigBO.setMchPrivateKey(merchantConfig.getMchPrivateKey());
merchantConfigBO.setSerialNo(merchantConfig.getSerialNo());
String certificate = readCertificate(merchantConfig.getCertPath()); String certificate = readCertificate(merchantConfig.getCertPath());
orderBO.setCertificate(certificate); merchantConfigBO.setCertificate(certificate);
orderBO.setSerialNo(merchantConfig.getSerialNo()); return merchantConfigBO;
} }
/** /**

11
payment-base-app/src/main/java/com/base/springcloud/service/imp/OrderServiceImp.java

@ -100,14 +100,17 @@ public class OrderServiceImp implements OrderService {
@Override @Override
public void origOrderCheck(RefundBO refundBO) { public void origOrderCheck(RefundBO refundBO) {
String billId = refundBO.getBillId(); String billId = refundBO.getBillId();
String orderNo = orderBillService.queryOrderNo(billId); String orderId = orderBillService.queryOrderNo(billId);
if(StringUtils.isBlank(orderNo)) if(StringUtils.isBlank(orderId))
throw new BusinessException(ErrorConstant.BILL_INVALID); throw new BusinessException(ErrorConstant.BILL_INVALID);
Order order = orderMapper.origOrderInfo(orderNo); Order order = orderMapper.origOrderInfo(orderId);
if (!Optional.ofNullable(order).isPresent()) if (!Optional.ofNullable(order).isPresent())
throw new BusinessException(ErrorConstant.PAY_ORDER_NOT_FOUND); throw new BusinessException(ErrorConstant.PAY_ORDER_NOT_FOUND);
if(!PaymentConstant.SUCCESS.equals(order.getOrderState())) if(!PaymentConstant.SUCCESS.equals(order.getOrderState()))
throw new BusinessException(ErrorConstant.ORDER_STATE_NOT_SUPPORT_REFUND); 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());
} }
} }

20
payment-base-app/src/main/java/com/base/springcloud/service/imp/PaymentServiceImp.java

@ -1,5 +1,6 @@
package com.base.springcloud.service.imp; package com.base.springcloud.service.imp;
import com.base.springcloud.bo.MerchantConfigBO;
import com.base.springcloud.bo.OrderBO; import com.base.springcloud.bo.OrderBO;
import com.base.springcloud.bo.RefundBO; import com.base.springcloud.bo.RefundBO;
import com.base.springcloud.bo.SaleBillBO; import com.base.springcloud.bo.SaleBillBO;
@ -52,16 +53,29 @@ public class PaymentServiceImp implements PaymentService {
billService.billCheck(orderBO); billService.billCheck(orderBO);
// 获取子销售单据 // 获取子销售单据
//billService.childBill(orderBO,true); //billService.childBill(orderBO,true);
// 查询商户支付信息配置
merchantService.claimMerchantConfig(orderBO);
// 登记订单 // 登记订单
orderService.registerOrder(orderBO); orderService.registerOrder(orderBO);
// 登记销售单据和订单关联 // 登记销售单据和订单关联
orderBillService.registerOrderBill(orderBO); orderBillService.registerOrderBill(orderBO);
// 查询商户支付配置信息
claimMerchantConfig(orderBO);
// 请求微信生成二维码 // 请求微信生成二维码
return wecPaymentService.wecNativePay(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); Order order = Optional.ofNullable(orderBO).map(o->orderBO.getOrder()).orElse(null);
if(!Optional.ofNullable(order).isPresent()) return; if(!Optional.ofNullable(order).isPresent()) return;
// 获取商户支付配置信息 // 获取商户支付配置信息
merchantService.claimMerchantConfig(orderBO); claimMerchantConfig(orderBO);
// 查询微信订单结果 // 查询微信订单结果
Boolean state = wecPaymentService.orderResult(orderBO); Boolean state = wecPaymentService.orderResult(orderBO);
if(!state) return; if(!state) return;

28
payment-base-app/src/main/java/com/base/springcloud/service/imp/RefundServiceImp.java

@ -1,16 +1,14 @@
package com.base.springcloud.service.imp; package com.base.springcloud.service.imp;
import com.base.springcloud.aspect.annotation.BusinessException; import com.base.springcloud.aspect.annotation.BusinessException;
import com.base.springcloud.bo.MerchantConfigBO;
import com.base.springcloud.bo.RefundBO; import com.base.springcloud.bo.RefundBO;
import com.base.springcloud.constant.ErrorConstant; import com.base.springcloud.constant.ErrorConstant;
import com.base.springcloud.constant.PaymentConstant; import com.base.springcloud.constant.PaymentConstant;
import com.base.springcloud.dao.RefundMapper; import com.base.springcloud.dao.RefundMapper;
import com.base.springcloud.entity.Order; import com.base.springcloud.entity.Order;
import com.base.springcloud.entity.Refund; import com.base.springcloud.entity.Refund;
import com.base.springcloud.service.BillService; import com.base.springcloud.service.*;
import com.base.springcloud.service.OrderService;
import com.base.springcloud.service.RefundService;
import com.base.springcloud.service.WecPaymentService;
import com.base.springcloud.util.DateUtil; import com.base.springcloud.util.DateUtil;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -34,6 +32,9 @@ public class RefundServiceImp implements RefundService {
@Autowired @Autowired
private BillService billService; private BillService billService;
@Autowired
private MerchantService merchantService;
/** /**
* 退款 * 退款
* @param refundBO * @param refundBO
@ -45,6 +46,8 @@ public class RefundServiceImp implements RefundService {
// TODO 退款限制检查 // TODO 退款限制检查
// 查询原支付订单 // 查询原支付订单
orderService.origOrderCheck(refundBO); orderService.origOrderCheck(refundBO);
// 商户支付信息配置
claimMerchantConfig(refundBO);
// 登记退款信息 // 登记退款信息
registerRfund(refundBO); registerRfund(refundBO);
// 发送微信退款 // 发送微信退款
@ -55,6 +58,18 @@ public class RefundServiceImp implements RefundService {
// RBS-业务逻辑处理 // 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 * @param date
@ -79,9 +94,8 @@ public class RefundServiceImp implements RefundService {
refund.setRefundTime(new Date()); refund.setRefundTime(new Date());
refund.setRefundState(PaymentConstant.REFUND_WAIT); refund.setRefundState(PaymentConstant.REFUND_WAIT);
refund.setRefundRetryCount(PaymentConstant.START_REFUND_COUNT); refund.setRefundRetryCount(PaymentConstant.START_REFUND_COUNT);
Order order = refundBO.getOrder(); refund.setOrigOrderNo(refundBO.getOrigOrderNo());
refund.setOrigOrderNo(order.getOrderNo()); refund.setOrigOrderTime(refundBO.getOrigCreateTime());
refund.setOrigOrderTime(order.getCreateTime());
// FIXME 原销售单据id // FIXME 原销售单据id
// refund.setSourceBillId(); // refund.setSourceBillId();
int count = refundMapper.insert(refund); int count = refundMapper.insert(refund);

13
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.service.WecPaymentService;
import com.base.springcloud.util.DateUtil; import com.base.springcloud.util.DateUtil;
import com.base.springcloud.util.DecimalUtil; import com.base.springcloud.util.DecimalUtil;
import com.base.springcloud.util.StringHelper;
import com.base.springcloud.wxsdk.WxpayUtils; import com.base.springcloud.wxsdk.WxpayUtils;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import org.slf4j.Logger; import org.slf4j.Logger;
@ -19,6 +20,7 @@ import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.Map;
import java.util.Optional; import java.util.Optional;
@Service @Service
@ -61,16 +63,19 @@ public class WecPaymentServiceImp implements WecPaymentService {
@Override @Override
public Boolean wecRefund(RefundBO refundBO) { public Boolean wecRefund(RefundBO refundBO) {
WxpayRefundVo wxpayRefundVo = new WxpayRefundVo(); WxpayRefundVo wxpayRefundVo = new WxpayRefundVo();
wxpayRefundVo.setTransaction_id(refundBO.getOrigOrderNo());
wxpayRefundVo.setReason(refundBO.getReason()); 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(); WxpayRefundVo.WxRefundAmountVo wxRefundAmountVo = new WxpayRefundVo.WxRefundAmountVo();
wxRefundAmountVo.setTotal(refundBO.getRefundAmount()); wxRefundAmountVo.setTotal(refundBO.getRefundAmount());
wxRefundAmountVo.setRefund(refundBO.getRefundAmount()); wxRefundAmountVo.setRefund(refundBO.getRefundAmount());
wxpayRefundVo.setNotify_url(refundBO.getNotifyUrl());
wxpayRefundVo.setOut_refund_no(refundBO.getRefundNo());
wxpayRefundVo.setAmount(wxRefundAmountVo); wxpayRefundVo.setAmount(wxRefundAmountVo);
String refundRsp = WxpayUtils.refund(wxpayRefundVo,refundBO.getMchId(),refundBO.getMchPrivateKey(),refundBO.getCertificate(),refundBO.getSerialNo()); String refundRsp = WxpayUtils.refund(wxpayRefundVo,refundBO.getMchId(),refundBO.getMchPrivateKey(),refundBO.getCertificate(),refundBO.getSerialNo());
return true; Map<String, String> resultMap = StringHelper.json2map(refundRsp);
if(PaymentConstant.WX_SUCCESS.equals(resultMap.get("status")))
return true;
return false;
} }
/** /**

71
payment-base-app/src/main/java/com/base/springcloud/util/FtpUtil.java

@ -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;
}
}

2
payment-base-app/src/main/resources/com/base/payment/mapper/OrderBillMapper.xml

@ -111,7 +111,7 @@
order_id = #{orderId,jdbcType=VARCHAR} order_id = #{orderId,jdbcType=VARCHAR}
</where> </where>
</select> </select>
<select id="getOrderNo" parameterType="java.lang.String" resultType="java.lang.String"> <select id="getOrderId" parameterType="java.lang.String" resultType="java.lang.String">
select order_id select order_id
from pay_order_bill from pay_order_bill
<where> <where>

2
payment-base-app/src/main/resources/com/base/payment/mapper/OrderMapper.xml

@ -181,7 +181,7 @@
<include refid="Base_Column_List" /> <include refid="Base_Column_List" />
from pay_order from pay_order
<where> <where>
order_id = #{orderId,jdbcType=VARCHAR} id = #{orderId,jdbcType=VARCHAR}
</where> </where>
</select> </select>
</mapper> </mapper>
Loading…
Cancel
Save