Commit 3ab6e756 authored by shengnan hu's avatar shengnan hu
Browse files

init

parents
Pipeline #294 passed with stage
in 2 minutes and 13 seconds
package com.mall4j.cloud.payment.service.impl;
import cn.hutool.core.util.StrUtil;
import com.mall4j.cloud.api.leaf.feign.SegmentFeignClient;
import com.mall4j.cloud.api.order.feign.OrderFeignClient;
import com.mall4j.cloud.api.order.vo.OrderAmountVO;
import com.mall4j.cloud.common.exception.Mall4cloudException;
import com.mall4j.cloud.common.order.bo.PayNotifyBO;
import com.mall4j.cloud.common.response.ResponseEnum;
import com.mall4j.cloud.common.response.ServerResponseEntity;
import com.mall4j.cloud.common.rocketmq.config.RocketMqConstant;
import com.mall4j.cloud.common.security.AuthUserContext;
import com.mall4j.cloud.payment.bo.PayInfoBO;
import com.mall4j.cloud.payment.bo.PayInfoResultBO;
import com.mall4j.cloud.payment.constant.PayStatus;
import com.mall4j.cloud.payment.dto.PayInfoDTO;
import com.mall4j.cloud.payment.mapper.PayInfoMapper;
import com.mall4j.cloud.payment.model.PayInfo;
import com.mall4j.cloud.payment.service.PayInfoService;
import org.apache.rocketmq.client.producer.SendStatus;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.support.GenericMessage;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.List;
import java.util.Objects;
/**
* 订单支付记录
*
* @author FrozenWatermelon
* @date 2020-12-25 09:50:59
*/
@Service
public class PayInfoServiceImpl implements PayInfoService {
@Autowired
private PayInfoMapper payInfoMapper;
@Autowired
private SegmentFeignClient segmentFeignClient;
@Autowired
private OrderFeignClient orderFeignClient;
@Autowired
private RocketMQTemplate orderNotifyTemplate;
@Override
@Transactional(rollbackFor = Exception.class)
public PayInfoBO pay(Long userId, PayInfoDTO payParam) {
// 支付单号
ServerResponseEntity<Long> segmentIdResponse = segmentFeignClient.getSegmentId(PayInfo.DISTRIBUTED_ID_KEY);
if (!segmentIdResponse.isSuccess()) {
throw new Mall4cloudException(ResponseEnum.EXCEPTION);
}
Long payId = segmentIdResponse.getData();
List<Long> orderIds = payParam.getOrderIds();
ServerResponseEntity<OrderAmountVO> ordersAmountAndIfNoCancelResponse = orderFeignClient.getOrdersAmountAndIfNoCancel(orderIds);
// 如果订单已经关闭了,此时不能够支付了
if (!ordersAmountAndIfNoCancelResponse.isSuccess()) {
throw new Mall4cloudException(ordersAmountAndIfNoCancelResponse.getMsg());
}
OrderAmountVO orderAmount = ordersAmountAndIfNoCancelResponse.getData();
PayInfo payInfo = new PayInfo();
payInfo.setPayId(payId);
payInfo.setUserId(userId);
payInfo.setPayAmount(orderAmount.getPayAmount());
payInfo.setPayStatus(PayStatus.UNPAY.value());
payInfo.setSysType(AuthUserContext.get().getSysType());
payInfo.setVersion(0);
// 保存多个支付订单号
payInfo.setOrderIds(StrUtil.join(StrUtil.COMMA, orderIds));
// 保存预支付信息
payInfoMapper.save(payInfo);
PayInfoBO payInfoDto = new PayInfoBO();
payInfoDto.setBody("商城订单");
payInfoDto.setPayAmount(orderAmount.getPayAmount());
payInfoDto.setPayId(payId);
return payInfoDto;
}
@Override
public PayInfo getByPayId(Long payId) {
return payInfoMapper.getByPayId(payId);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void paySuccess(PayInfoResultBO payInfoResult, List<Long> orderIds) {
// 标记为支付成功状态
PayInfo payInfo = new PayInfo();
payInfo.setPayId(payInfoResult.getPayId());
payInfo.setBizPayNo(payInfoResult.getBizPayNo());
payInfo.setCallbackContent(payInfoResult.getCallbackContent());
payInfo.setCallbackTime(new Date());
payInfo.setPayStatus(PayStatus.PAYED.value());
payInfoMapper.update(payInfo);
// 发送消息,订单支付成功
SendStatus sendStatus = orderNotifyTemplate.syncSend(RocketMqConstant.ORDER_NOTIFY_TOPIC, new GenericMessage<>(new PayNotifyBO(orderIds))).getSendStatus();
if (!Objects.equals(sendStatus, SendStatus.SEND_OK)) {
// 消息发不出去就抛异常,因为订单回调会有多次,几乎不可能每次都无法发送出去,发的出去无所谓因为接口是幂等的
throw new Mall4cloudException(ResponseEnum.EXCEPTION);
}
}
@Override
public Integer getPayStatusByOrderIds(String orderIds) {
return payInfoMapper.getPayStatusByOrderIds(orderIds);
}
@Override
public Integer isPay(String orderIds, Long userId) {
return payInfoMapper.isPay(orderIds, userId);
}
}
server:
port: 9113
spring:
application:
name: @artifactId@
cloud:
nacos:
discovery:
server-addr: ${NACOS_HOST:192.168.1.46}:${NACOS_PORT:8848}
username: nacos
password: nacos
config:
server-addr: ${spring.cloud.nacos.discovery.server-addr}
file-extension: yml
namespace: @nacos.namespace@
shared-configs:
- application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
username: ${spring.cloud.nacos.discovery.username}
password: ${spring.cloud.nacos.discovery.password}
profiles:
active: @profiles.active@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mall4j.cloud.payment.mapper.PayInfoMapper">
<resultMap id="payInfoMap" type="com.mall4j.cloud.payment.model.PayInfo">
<id column="pay_id" property="payId" />
<result column="create_time" property="createTime"/>
<result column="update_time" property="updateTime"/>
<result column="user_id" property="userId"/>
<result column="biz_pay_no" property="bizPayNo"/>
<result column="sys_type" property="sysType"/>
<result column="pay_status" property="payStatus"/>
<result column="pay_amount" property="payAmount"/>
<result column="version" property="version"/>
<result column="callback_content" property="callbackContent"/>
<result column="callback_time" property="callbackTime"/>
<result column="confirm_time" property="confirmTime"/>
</resultMap>
<sql id="Vo_Column_List">
`pay_id`,`create_time`,`update_time`,`user_id`,`order_ids`,`biz_pay_no`,`sys_type`,`pay_status`,
`pay_amount`,`version`,`callback_content`,`callback_time`,`confirm_time`
</sql>
<select id="getByPayId" resultMap="payInfoMap">
select <include refid="Vo_Column_List"/> from pay_info where pay_id = #{payId}
</select>
<insert id="save">
insert into pay_info (`pay_id`, `user_id`,`order_ids`,`biz_pay_no`,`sys_type`,`pay_status`,
`pay_amount`,`version`,`callback_content`,`callback_time`,`confirm_time`)
values (#{payInfo.payId},#{payInfo.userId},#{payInfo.orderIds},#{payInfo.bizPayNo},#{payInfo.sysType},#{payInfo.payStatus},
#{payInfo.payAmount},#{payInfo.version},#{payInfo.callbackContent},#{payInfo.callbackTime},#{payInfo.confirmTime});
</insert>
<update id="update">
update pay_info
<set>
<if test="payInfo.userId != null">
`user_id` = #{payInfo.userId},
</if>
<if test="payInfo.bizPayNo != null">
`biz_pay_no` = #{payInfo.bizPayNo},
</if>
<if test="payInfo.sysType != null">
`sys_type` = #{payInfo.sysType},
</if>
<if test="payInfo.payStatus != null">
`pay_status` = #{payInfo.payStatus},
</if>
<if test="payInfo.payAmount != null">
`pay_amount` = #{payInfo.payAmount},
</if>
<if test="payInfo.version != null">
`version` = #{payInfo.version},
</if>
<if test="payInfo.callbackContent != null">
`callback_content` = #{payInfo.callbackContent},
</if>
<if test="payInfo.callbackTime != null">
`callback_time` = #{payInfo.callbackTime},
</if>
<if test="payInfo.confirmTime != null">
`confirm_time` = #{payInfo.confirmTime},
</if>
</set>
where pay_id = #{payInfo.payId}
</update>
<delete id="deleteById">
delete from pay_info where pay_id = #{payId}
</delete>
<select id="getPayStatusByOrderIds" resultType="java.lang.Integer">
select pay_status from pay_info where order_ids = #{orderIds}
</select>
<select id="isPay" resultType="java.lang.Integer">
select count(*) from pay_info where order_ids = #{orderIds} and pay_status = 1 and user_id = #{userId}
</select>
</mapper>
server:
port: 9113
spring:
application:
name: mall4cloud-payment
cloud:
nacos:
discovery:
server-addr: ${NACOS_HOST:192.168.1.46}:${NACOS_PORT:8848}
username: nacos
password: nacos
config:
server-addr: ${spring.cloud.nacos.discovery.server-addr}
file-extension: yml
namespace:
shared-configs:
- application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
username: ${spring.cloud.nacos.discovery.username}
password: ${spring.cloud.nacos.discovery.password}
profiles:
active: dev
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mall4j.cloud.payment.mapper.PayInfoMapper">
<resultMap id="payInfoMap" type="com.mall4j.cloud.payment.model.PayInfo">
<id column="pay_id" property="payId" />
<result column="create_time" property="createTime"/>
<result column="update_time" property="updateTime"/>
<result column="user_id" property="userId"/>
<result column="biz_pay_no" property="bizPayNo"/>
<result column="sys_type" property="sysType"/>
<result column="pay_status" property="payStatus"/>
<result column="pay_amount" property="payAmount"/>
<result column="version" property="version"/>
<result column="callback_content" property="callbackContent"/>
<result column="callback_time" property="callbackTime"/>
<result column="confirm_time" property="confirmTime"/>
</resultMap>
<sql id="Vo_Column_List">
`pay_id`,`create_time`,`update_time`,`user_id`,`order_ids`,`biz_pay_no`,`sys_type`,`pay_status`,
`pay_amount`,`version`,`callback_content`,`callback_time`,`confirm_time`
</sql>
<select id="getByPayId" resultMap="payInfoMap">
select <include refid="Vo_Column_List"/> from pay_info where pay_id = #{payId}
</select>
<insert id="save">
insert into pay_info (`pay_id`, `user_id`,`order_ids`,`biz_pay_no`,`sys_type`,`pay_status`,
`pay_amount`,`version`,`callback_content`,`callback_time`,`confirm_time`)
values (#{payInfo.payId},#{payInfo.userId},#{payInfo.orderIds},#{payInfo.bizPayNo},#{payInfo.sysType},#{payInfo.payStatus},
#{payInfo.payAmount},#{payInfo.version},#{payInfo.callbackContent},#{payInfo.callbackTime},#{payInfo.confirmTime});
</insert>
<update id="update">
update pay_info
<set>
<if test="payInfo.userId != null">
`user_id` = #{payInfo.userId},
</if>
<if test="payInfo.bizPayNo != null">
`biz_pay_no` = #{payInfo.bizPayNo},
</if>
<if test="payInfo.sysType != null">
`sys_type` = #{payInfo.sysType},
</if>
<if test="payInfo.payStatus != null">
`pay_status` = #{payInfo.payStatus},
</if>
<if test="payInfo.payAmount != null">
`pay_amount` = #{payInfo.payAmount},
</if>
<if test="payInfo.version != null">
`version` = #{payInfo.version},
</if>
<if test="payInfo.callbackContent != null">
`callback_content` = #{payInfo.callbackContent},
</if>
<if test="payInfo.callbackTime != null">
`callback_time` = #{payInfo.callbackTime},
</if>
<if test="payInfo.confirmTime != null">
`confirm_time` = #{payInfo.confirmTime},
</if>
</set>
where pay_id = #{payInfo.payId}
</update>
<delete id="deleteById">
delete from pay_info where pay_id = #{payId}
</delete>
<select id="getPayStatusByOrderIds" resultType="java.lang.Integer">
select pay_status from pay_info where order_ids = #{orderIds}
</select>
<select id="isPay" resultType="java.lang.Integer">
select count(*) from pay_info where order_ids = #{orderIds} and pay_status = 1 and user_id = #{userId}
</select>
</mapper>
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment