Browse Source

feat 0 支付工程

devlop
yang_shj 4 years ago
parent
commit
e7433b76f2
  1. 3
      payment-base-app/src/main/java/com/base/springcloud/bo/RefundBO.java
  2. 5
      payment-base-app/src/main/java/com/base/springcloud/constant/ErrorConstant.java
  3. 7
      payment-base-app/src/main/java/com/base/springcloud/constant/PaymentConstant.java
  4. 8
      payment-base-app/src/main/java/com/base/springcloud/dao/RefundMapper.java
  5. 2
      payment-base-app/src/main/java/com/base/springcloud/entity/Refund.java
  6. 6
      payment-base-app/src/main/java/com/base/springcloud/service/RefundService.java
  7. 7
      payment-base-app/src/main/java/com/base/springcloud/service/WecPaymentService.java
  8. 15
      payment-base-app/src/main/java/com/base/springcloud/service/imp/PaymentServiceImp.java
  9. 65
      payment-base-app/src/main/java/com/base/springcloud/service/imp/RefundServiceImp.java
  10. 20
      payment-base-app/src/main/java/com/base/springcloud/service/imp/WecPaymentServiceImp.java
  11. 18
      payment-base-app/src/main/java/com/base/springcloud/wxsdk/WxpayUtils.java
  12. 24
      payment-base-app/src/main/resources/com/base/payment/mapper/RefundMapper.xml

3
payment-base-app/src/main/java/com/base/springcloud/bo/RefundBO.java

@ -11,6 +11,9 @@ import java.util.Date;
@Data @Data
public class RefundBO extends MchConfigEntity implements Serializable { public class RefundBO extends MchConfigEntity implements Serializable {
// 退款订单Id
private String refundId;
// 创建人 // 创建人
private String createId; private String createId;

5
payment-base-app/src/main/java/com/base/springcloud/constant/ErrorConstant.java

@ -23,8 +23,9 @@ public enum ErrorConstant {
REGISTER_REFUND_FAIL("RBS00018","退款订单登记失败!"), REGISTER_REFUND_FAIL("RBS00018","退款订单登记失败!"),
SYNC_WEC_REFUND_STATE_FAIL("RBS00019","同步微信退款状态失败!"), SYNC_WEC_REFUND_STATE_FAIL("RBS00019","同步微信退款状态失败!"),
BILL_COMPLETE_PAYMENT("RBS00020","销售单据已完成付款!"), BILL_COMPLETE_PAYMENT("RBS00020","销售单据已完成付款!"),
ALL_BILL_COMPLETE_PAYMENT("RBS00020","所有销售单据已完成付款!"), ALL_BILL_COMPLETE_PAYMENT("RBS00021","所有销售单据已完成付款!"),
MISTAKE_TARGET("RBS00021","要提供的对象不是数组!"); MISTAKE_TARGET("RBS00022","要提供的对象不是数组!"),
NO_FOUND_REFUND_DATA("RBS00023","无需同步状态退款订单");
private String code; private String code;
private String message; private String message;

7
payment-base-app/src/main/java/com/base/springcloud/constant/PaymentConstant.java

@ -24,8 +24,11 @@ public interface PaymentConstant {
String ORDER_LOCK_PREFIX = "ORDER_KEY:"; // 订单锁前缀 String ORDER_LOCK_PREFIX = "ORDER_KEY:"; // 订单锁前缀
String DEFAULT_MCH_ID = "1537100771"; // 默认商户ID String DEFAULT_MCH_ID = "1537100771"; // 默认商户ID
// 微信订单查询请求地址 String PAY_ORDER = "PAY"; // 支付订单
String WX_ORDER_QUERY_URL = "https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/"; String REFUND_ORDER = "REFUND"; // 退款订单
// 微信订单查询请求地址
String WX_ORDER_PAY_URL = "https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/";
String WX_ORDER_REFUND_URL = "https://api.mch.weixin.qq.com/v3/refund/domestic/refunds/";
} }

8
payment-base-app/src/main/java/com/base/springcloud/dao/RefundMapper.java

@ -2,8 +2,12 @@ package com.base.springcloud.dao;
import com.base.springcloud.bo.RefundBO; import com.base.springcloud.bo.RefundBO;
import com.base.springcloud.entity.Refund; import com.base.springcloud.entity.Refund;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import java.util.Date;
import java.util.List;
@Repository @Repository
public interface RefundMapper { public interface RefundMapper {
int deleteByPrimaryKey(String id); int deleteByPrimaryKey(String id);
@ -19,4 +23,8 @@ public interface RefundMapper {
int updateByPrimaryKey(Refund record); int updateByPrimaryKey(Refund record);
int updateRefundSuccess(Refund refund); int updateRefundSuccess(Refund refund);
List<Refund> queryRefundData(Date date);
int superRefundCount(@Param("id") String refundId);
} }

2
payment-base-app/src/main/java/com/base/springcloud/entity/Refund.java

@ -8,6 +8,8 @@ import java.util.Date;
public class Refund { public class Refund {
private String id; private String id;
private String mchId;
private String refundOrderNo; private String refundOrderNo;
private Date refundTime; private Date refundTime;

6
payment-base-app/src/main/java/com/base/springcloud/service/RefundService.java

@ -19,4 +19,10 @@ public interface RefundService {
* @return * @return
*/ */
List<RefundBO> queryRefund(Date date); List<RefundBO> queryRefund(Date date);
/**
* 查询退款订单
* @param o
*/
void queryRefundOrder(RefundBO o);
} }

7
payment-base-app/src/main/java/com/base/springcloud/service/WecPaymentService.java

@ -29,4 +29,11 @@ public interface WecPaymentService {
* @return true - 成功 false - 未成功 * @return true - 成功 false - 未成功
*/ */
Boolean orderResult(OrderBO orderBO); Boolean orderResult(OrderBO orderBO);
/**
* 微信退款查询
* @param refundBO
* @return
*/
Boolean wecRefundQuery(RefundBO refundBO);
} }

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

@ -10,6 +10,7 @@ import com.base.springcloud.util.DecimalUtil;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -17,6 +18,7 @@ import java.math.BigDecimal;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.stream.Collectors;
@Service @Service
public class PaymentServiceImp implements PaymentService { public class PaymentServiceImp implements PaymentService {
@ -122,19 +124,12 @@ public class PaymentServiceImp implements PaymentService {
List<RefundBO> refundBOList = refundService.queryRefund(date); List<RefundBO> refundBOList = refundService.queryRefund(date);
if(!Optional.ofNullable(refundBOList).isPresent()) return; if(!Optional.ofNullable(refundBOList).isPresent()) return;
// 遍历查询第三方订单信息 // 遍历查询第三方订单信息
refundBOList.forEach(RefundBO -> { refundBOList.forEach(o ->{
queryRefund(RefundBO); // FIXME 异步并列处理退款同步状态数据
//amqpTemplate.convertSendAndReceive(PaymentConstant.ORDER_QUEUE,orderBO); refundService.queryRefundOrder(o);
}); });
} }
/**
* 退款订单查询
* @param refundBO
*/
private void queryRefund(RefundBO refundBO) {
}
// 参数检查 // 参数检查
private void parameterCheck(OrderBO orderBO) { private void parameterCheck(OrderBO orderBO) {
} }

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

@ -6,20 +6,26 @@ 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.Refund; import com.base.springcloud.entity.Refund;
import com.base.springcloud.service.*; import com.base.springcloud.service.*;
import com.base.springcloud.util.DateUtil; import com.base.springcloud.util.DateUtil;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Optional;
import java.util.UUID; import java.util.UUID;
import java.util.stream.Collectors;
@Service @Service
public class RefundServiceImp implements RefundService { public class RefundServiceImp implements RefundService {
Logger logger = LoggerFactory.getLogger(RefundServiceImp.class);
@Autowired @Autowired
private OrderService orderService; private OrderService orderService;
@ -77,7 +83,48 @@ public class RefundServiceImp implements RefundService {
*/ */
@Override @Override
public List<RefundBO> queryRefund(Date date) { public List<RefundBO> queryRefund(Date date) {
return null; List<Refund> refundList = refundMapper.queryRefundData(date);
if(!Optional.ofNullable(refundList).isPresent())
return null;
return refundList.stream().map(o -> {
RefundBO refundBO = new RefundBO();
refundBO.setMchId(o.getMchId());
refundBO.setOrigOrderNo(o.getOrigOrderNo());
refundBO.setOrigCreateTime(o.getOrigOrderTime());
refundBO.setRefundNo(o.getRefundOrderNo());
return refundBO;
}).collect(Collectors.toList());
}
/**
* 退款订单状态查询
* @param refundBO
*/
@Override
public void queryRefundOrder(RefundBO refundBO) {
try{
// 参数检查
String refundOrderNo = Optional.ofNullable(refundBO).map(o->refundBO.getRefundNo()).orElse(null);
String mchId = Optional.ofNullable(refundBO).map(o->refundBO.getMchId()).orElse(null);
if(StringUtils.isBlank(refundOrderNo))
return;
if(StringUtils.isBlank(mchId))
return;
// 商户支付配置信息查询
claimMerchantConfig(refundBO);
// 微信退款查询
Boolean refundResult = wecPaymentService.wecRefundQuery(refundBO);
// 同步退款信息
if(refundResult)
updateRefundSuccess(refundBO);
}catch (BusinessException e){
logger.info("退款订单 : {} 业务异常信息 : {}",refundBO.getRefundNo(),e.getCode());
}catch (Exception e){
logger.info("退款订单 : {} 系统异常信息 : {}",refundBO.getRefundNo(),e.getMessage());
}finally {
// 叠加查询次数
superRefundCount(refundBO);
}
} }
/** /**
@ -90,6 +137,7 @@ public class RefundServiceImp implements RefundService {
refund.setCreateId(refundBO.getCreateId()); refund.setCreateId(refundBO.getCreateId());
refund.setCreateTime(new Date()); refund.setCreateTime(new Date());
refund.setReason(refundBO.getReason()); refund.setReason(refundBO.getReason());
refund.setMchId(refundBO.getMchId());
refund.setRefundOrderNo(DateUtil.getDateString(25)); refund.setRefundOrderNo(DateUtil.getDateString(25));
refund.setRefundTime(new Date()); refund.setRefundTime(new Date());
refund.setRefundState(PaymentConstant.REFUND_WAIT); refund.setRefundState(PaymentConstant.REFUND_WAIT);
@ -117,4 +165,17 @@ public class RefundServiceImp implements RefundService {
throw new BusinessException(ErrorConstant.SYNC_WEC_REFUND_STATE_FAIL); throw new BusinessException(ErrorConstant.SYNC_WEC_REFUND_STATE_FAIL);
} }
/**
* 叠加查询次数
* @param refundBO
*/
private void superRefundCount(RefundBO refundBO) {
String refundId = Optional.ofNullable(refundBO).map(o->o.getRefundId()).orElse(null);
if(StringUtils.isBlank(refundId))
return;
int count = refundMapper.superRefundCount(refundId);
if(count < 1)
throw new BusinessException(ErrorConstant.SYNC_WEC_REFUND_STATE_FAIL);
}
} }

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

@ -10,8 +10,6 @@ import com.base.springcloud.entity.WxpayRefundVo;
import com.base.springcloud.entity.WxpayTradeVo; import com.base.springcloud.entity.WxpayTradeVo;
import com.base.springcloud.entity.WxpayTradeVo.WxTradeAmountVo; 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.DecimalUtil;
import com.base.springcloud.util.StringHelper; import com.base.springcloud.util.StringHelper;
import com.base.springcloud.wxsdk.WxpayUtils; import com.base.springcloud.wxsdk.WxpayUtils;
import lombok.SneakyThrows; import lombok.SneakyThrows;
@ -19,9 +17,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.Map; import java.util.Map;
import java.util.Optional;
@Service @Service
public class WecPaymentServiceImp implements WecPaymentService { public class WecPaymentServiceImp implements WecPaymentService {
@ -95,8 +91,20 @@ public class WecPaymentServiceImp implements WecPaymentService {
@Override @Override
public Boolean orderResult(OrderBO orderBO) { public Boolean orderResult(OrderBO orderBO) {
Order order = orderBO.getOrder(); Order order = orderBO.getOrder();
String url = PaymentConstant.WX_ORDER_QUERY_URL + order.getOrderNo() + "?mchid=" + order.getMchId(); String url = PaymentConstant.WX_ORDER_PAY_URL + order.getOrderNo() + "?mchid=" + order.getMchId();
logger.info("order_result_url : {}",url); logger.info("order_result_url : {}",url);
return WxpayUtils.queryWxOrder(url,orderBO.getMchId(),orderBO.getMchPrivateKey(),orderBO.getCertificate(),orderBO.getSerialNo()); return WxpayUtils.queryWxOrder(PaymentConstant.PAY_ORDER,url,orderBO.getMchId(),orderBO.getMchPrivateKey(),orderBO.getCertificate(),orderBO.getSerialNo());
}
/**
* 微信退款查询
* @param refundBO
* @return
*/
@Override
public Boolean wecRefundQuery(RefundBO refundBO) {
String refundNo = refundBO.getRefundNo();
String url = PaymentConstant.WX_ORDER_REFUND_URL + refundNo;
return WxpayUtils.queryWxOrder(PaymentConstant.REFUND_ORDER,url,refundBO.getMchId(),refundBO.getMchPrivateKey(),refundBO.getCertificate(),refundBO.getSerialNo());
} }
} }

18
payment-base-app/src/main/java/com/base/springcloud/wxsdk/WxpayUtils.java

@ -93,7 +93,7 @@ public class WxpayUtils {
* @param serialNo * @param serialNo
* @return true - 成功 false - 失败 * @return true - 成功 false - 失败
*/ */
public static Boolean queryWxOrder(String url,String mchId, String privateKey, String certificate, String serialNo) { public static Boolean queryWxOrder(String type,String url,String mchId, String privateKey, String certificate, String serialNo) {
HttpGet httpGet = new HttpGet(url); HttpGet httpGet = new HttpGet(url);
httpGet.addHeader("Accept", "application/json"); httpGet.addHeader("Accept", "application/json");
CloseableHttpResponse response = null; CloseableHttpResponse response = null;
@ -112,9 +112,19 @@ public class WxpayUtils {
// FIXME 请求微信失败 // FIXME 请求微信失败
} }
log.info("query_wx_order response resultMap: {}",jsonObject.toJSONString()); log.info("query_wx_order response resultMap: {}",jsonObject.toJSONString());
if (PaymentConstant.WX_SUCCESS.equals(jsonObject.getString("trade_state"))) { switch (type) {
log.info("query_wx_order query true"); case PaymentConstant.PAY_ORDER:
return true; if (PaymentConstant.WX_SUCCESS.equals(jsonObject.getString("trade_state"))) {
log.info("query_wx_order query true");
return true;
}
return false;
case PaymentConstant.REFUND_ORDER:
if (PaymentConstant.WX_SUCCESS.equals(jsonObject.getString("status"))) {
log.info("query_wx_order query true");
return true;
}
return false;
} }
} catch (IOException e) { } catch (IOException e) {
log.error("======>>> wxpay response, client exception: {}", e); log.error("======>>> wxpay response, client exception: {}", e);

24
payment-base-app/src/main/resources/com/base/payment/mapper/RefundMapper.xml

@ -3,6 +3,7 @@
<mapper namespace="com.base.springcloud.dao.RefundMapper"> <mapper namespace="com.base.springcloud.dao.RefundMapper">
<resultMap id="BaseResultMap" type="com.base.springcloud.entity.Refund"> <resultMap id="BaseResultMap" type="com.base.springcloud.entity.Refund">
<id column="id" jdbcType="VARCHAR" property="id" /> <id column="id" jdbcType="VARCHAR" property="id" />
<result column="mch_id" jdbcType="VARCHAR" property="mchId" />
<result column="refund_order_no" jdbcType="VARCHAR" property="refundOrderNo" /> <result column="refund_order_no" jdbcType="VARCHAR" property="refundOrderNo" />
<result column="refund_time" jdbcType="TIMESTAMP" property="refundTime" /> <result column="refund_time" jdbcType="TIMESTAMP" property="refundTime" />
<result column="create_id" jdbcType="VARCHAR" property="createId" /> <result column="create_id" jdbcType="VARCHAR" property="createId" />
@ -15,7 +16,7 @@
<result column="refund_retry_count" jdbcType="INTEGER" property="refundRetryCount" /> <result column="refund_retry_count" jdbcType="INTEGER" property="refundRetryCount" />
</resultMap> </resultMap>
<sql id="Base_Column_List"> <sql id="Base_Column_List">
id, refund_order_no, refund_time, create_id, create_time, orig_order_no, orig_order_time, id,mch_id, refund_order_no, refund_time, create_id, create_time, orig_order_no, orig_order_time,
source_bill_id, reason, refund_state, refund_retry_count source_bill_id, reason, refund_state, refund_retry_count
</sql> </sql>
<select id="selectByPrimaryKey" parameterType="java.lang.String" resultMap="BaseResultMap"> <select id="selectByPrimaryKey" parameterType="java.lang.String" resultMap="BaseResultMap">
@ -29,11 +30,11 @@
where id = #{id,jdbcType=VARCHAR} where id = #{id,jdbcType=VARCHAR}
</delete> </delete>
<insert id="insert" parameterType="com.base.springcloud.entity.Refund"> <insert id="insert" parameterType="com.base.springcloud.entity.Refund">
insert into pay_refund (id, refund_order_no, refund_time, insert into pay_refund (id,mch_id,refund_order_no, refund_time,
create_id, create_time, orig_order_no, create_id, create_time, orig_order_no,
orig_order_time, source_bill_id, reason, orig_order_time, source_bill_id, reason,
refund_state, refund_retry_count) refund_state, refund_retry_count)
values (#{id,jdbcType=VARCHAR}, #{refundOrderNo,jdbcType=VARCHAR}, #{refundTime,jdbcType=TIMESTAMP}, values (#{id,jdbcType=VARCHAR}, #{mchId,jdbcType=VARCHAR},#{refundOrderNo,jdbcType=VARCHAR}, #{refundTime,jdbcType=TIMESTAMP},
#{createId,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP}, #{origOrderNo,jdbcType=VARCHAR}, #{createId,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP}, #{origOrderNo,jdbcType=VARCHAR},
#{origOrderTime,jdbcType=TIMESTAMP}, #{sourceBillId,jdbcType=VARCHAR}, #{reason,jdbcType=VARCHAR}, #{origOrderTime,jdbcType=TIMESTAMP}, #{sourceBillId,jdbcType=VARCHAR}, #{reason,jdbcType=VARCHAR},
#{refundState,jdbcType=INTEGER}, #{refundRetryCount,jdbcType=INTEGER}) #{refundState,jdbcType=INTEGER}, #{refundRetryCount,jdbcType=INTEGER})
@ -168,4 +169,21 @@
refund_order_no = #{refundOrderNo,jdbcType=VARCHAR} refund_order_no = #{refundOrderNo,jdbcType=VARCHAR}
</where> </where>
</update> </update>
<update id="superRefundCount" parameterType="java.lang.String">
update pay_refund
set refund_retry_count = refund_retry_count + 1
<where>
id = #{id,jdbcType=VARCHAR}
</where>
</update>
<select id="queryRefundData" resultMap="BaseResultMap" parameterType="java.util.Date">
select
<include refid="Base_Column_List" />
from pay_refund
<where>
refund_state = '0'
and DATE_FORMAT(refund_time,'%Y-%m-%d') = DATE_FORMAT(#{date},'%Y-%m-%d')
</where>
order by refund_time desc limit 10
</select>
</mapper> </mapper>
Loading…
Cancel
Save