Commit 1faa50c7 authored by tangtuo's avatar tangtuo

收费管理

parent 83c576d0
......@@ -5,7 +5,7 @@
<parent>
<artifactId>fzm-joying</artifactId>
<groupId>com.fzm</groupId>
<version>1.0.0</version>
<version>1.1.0</version>
</parent>
<artifactId>joying-admin</artifactId>
......
package com.fzm.admin.controller;
import com.fzm.common.annotation.Authentication;
import com.fzm.common.entity.Charge;
import com.fzm.common.model.ResponseModel;
import com.fzm.common.service.ChargeService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
/**
* @author tangtuo
* @date 2022/1/25 10:13
*/
@Authentication
@RestController
@RequestMapping(value = "/charge")
@Api(tags = "收费管理")
public class ChargeController {
@Resource
private ChargeService chargeService;
@PostMapping("/update")
@ApiOperation("编辑")
public ResponseModel<String> update(@RequestBody Charge charge) {
chargeService.updateById(charge);
return ResponseModel.success("编辑成功");
}
@GetMapping("/detail/{type}")
@ApiOperation("根据收费类型获取详情")
public ResponseModel<Charge> getByType(@ApiParam("收费类型 1-nft发行 2-版权申请") @PathVariable Integer type) {
Charge charge = chargeService.getByType(type);
return ResponseModel.success(charge);
}
}
package com.fzm.common.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @author tangtuo
* @date 2022/1/25 10:07
*/
@Data
@TableName("tb_charge")
public class Charge {
@TableId(type = IdType.AUTO)
private Integer id;
@ApiModelProperty("收费金额")
private Long fee;
@ApiModelProperty("收费类型 1-nft发行 2-版权申请")
private Integer type;
}
......@@ -73,6 +73,9 @@ public class Nft extends BaseEntity {
@ApiModelProperty("nft发行时间")
private Date publishTime;
@ApiModelProperty("发行状态 0-待支付 1-发行中 2-发行成功 3-发行失败")
private Integer publishStatus;
@ApiModelProperty("交易转让hash")
private String transferHash;
......
......@@ -24,12 +24,12 @@ public class Payment {
@ApiModelProperty("交易类型")
private String tradeType;
@ApiModelProperty("交易状态")
private String tradeState;
@ApiModelProperty("支付金额(分)")
private Integer totalFee;
@ApiModelProperty("是否有退款, 0-否 1-是")
private Integer isRefund;
@ApiModelProperty("商品订单编号")
private String successTime;
......
package com.fzm.common.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
@Data
@TableName("tb_refund")
public class Refund {
private Long id;
@ApiModelProperty("商品订单编号")
private Long orderId;
@ApiModelProperty("支付系统交易编号")
private String transactionId;
@ApiModelProperty("状态")
private String refundId;
@ApiModelProperty("退款状态 1- 退款中 2-退款成功 3-退款失败")
private Integer refundStatus;
@ApiModelProperty("当前退款单的退款入账方")
private String userReceivedAccount;
@ApiModelProperty("支付金额(分)")
private Long fee;
@ApiModelProperty("商品订单编号")
private String successTime;
@ApiModelProperty("通知参数")
private String content;
private Date createDate;
private Date updateDate;
}
\ No newline at end of file
......@@ -13,6 +13,8 @@ import lombok.NoArgsConstructor;
@AllArgsConstructor
public class OrderProcessMsg {
private Long orderId;
private Integer productId;
private Integer payScene;
......
package com.fzm.common.entity.vo;
/**
* @author tangtuo
* @date 2022/1/24 16:44
*/
public class OrderVo {
private Long id;
}
package com.fzm.common.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author tangtuo
* @date 2022/1/24 17:19
*
* <p>
* nft发行状态
* </p>
*/
@Getter
@AllArgsConstructor
public enum PublishStatus {
TO_BE_PAY(0, "待支付"),
PUBLISHING(1, "发行中"),
SUSSED(2, "发行成功"),
FAILED(3, "发行失败");
private Integer code;
private String type;
}
package com.fzm.common.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author tangtuo
* @date 2022/1/24 15:02
*/
@Getter
@AllArgsConstructor
public enum RefundStatus {
REFUNDING(1),
SUCCESS(2),
FAINED(3),
;
private Integer status;
}
package com.fzm.common.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author tangtuo
* @date 2022/1/24 11:03
*/
@AllArgsConstructor
@Getter
public enum WxPayStatus {
SUCCESS("SUCCESS", "支付成功"),
REFUND("REFUND", "转入退款"),
NOTPAY("NOTPAY", "未支付"),
CLOSED("CLOSED", "已关闭"),
REVOKED("REVOKED", "已撤销(仅付款码支付会返回)"),
USERPAYING("USERPAYING", "用户支付中(仅付款码支付会返回)"),
PAYERROR("PAYERROR", "支付失败(仅付款码支付会返回)");
private String status;
private String desc;
}
package com.fzm.common.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.fzm.common.entity.Charge;
import org.apache.ibatis.annotations.Mapper;
/**
* @author tangtuo
* @date 2022/1/25 10:10
*/
@Mapper
public interface ChargeMapper extends BaseMapper<Charge> {
}
package com.fzm.common.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.fzm.common.entity.Refund;
import org.apache.ibatis.annotations.Mapper;
/**
* @author tangtuo
* @date 2022/1/24 14:27
*/
@Mapper
public interface RefundMapper extends BaseMapper<Refund> {
}
package com.fzm.common.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.fzm.common.entity.Charge;
/**
* @author tangtuo
* @date 2022/1/25 10:10
*/
public interface ChargeService extends IService<Charge> {
/**
* 根据收费类型获取详情
*
* @param type
* @return
*/
Charge getByType(Integer type);
}
......@@ -64,7 +64,7 @@ public interface CopyrightApplyService extends IService<CopyrightApply> {
*
* @param copyrightDTO
*/
Boolean update(CopyrightDTO copyrightDTO);
Integer update(CopyrightDTO copyrightDTO);
/**
* 分页查询
......
......@@ -176,4 +176,10 @@ public interface NftService extends IService<Nft> {
* @param isEntrust
*/
void updateEntrust(String nftHash, Integer isEntrust);
/**
* 删除
* @param id
*/
void delete(Integer id);
}
......@@ -5,6 +5,8 @@ import com.fzm.common.entity.Order;
import com.fzm.common.entity.dto.OrderDto;
import com.fzm.common.enums.OrderStatus;
import java.util.List;
/**
* @author tangtuo
* @date 2022/1/19 15:41
......@@ -18,7 +20,7 @@ public interface OrderService extends IService<Order> {
* @param productId
* @return
*/
Order getByPaySceneAndProductId(Integer payScene, Integer productId);
Order getByPaySceneAndProductId(Integer payScene, Integer productId, Integer orderStatus);
/**
* 更新订单状态
......@@ -30,15 +32,34 @@ public interface OrderService extends IService<Order> {
/**
* 下单
*
* @param orderDto
* @return
*/
Long createOrder(OrderDto orderDto);
/**
*
* @param orderId
* @param payType
*/
Boolean updatePayType(Long orderId, Integer payType);
/**
* 取消订单
*
* @param orderId
* @param orderStatus
* @return
*/
Boolean cancel(Long orderId, OrderStatus orderStatus);
/**
* 获取我的订单
*
* @param payScene
* @return
*/
List<Order> listOrder(Integer payScene);
void processOrder(Long orderId, Integer productId, Integer payScene);
}
......@@ -8,4 +8,6 @@ import com.fzm.common.entity.Payment;
* @date 2022/1/20 16:40
*/
public interface PaymentService extends IService<Payment> {
Payment getByOrderId(Long orderId);
}
package com.fzm.common.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.fzm.common.entity.Refund;
/**
* @author tangtuo
* @date 2022/1/24 14:26
*/
public interface RefundService extends IService<Refund> {
}
......@@ -33,9 +33,9 @@ public interface WxPayService {
*
* @param jsonObject
*/
void processOrder(JSONObject jsonObject) throws GeneralSecurityException;
void processOrder(JSONObject jsonObject) throws GeneralSecurityException, InterruptedException;
String queryOrder(Long orderId);
String queryOrder(Long orderId) throws IOException;
/**
* 退款
......@@ -57,5 +57,5 @@ public interface WxPayService {
*
* @param jsonObject
*/
void processRefund(JSONObject jsonObject);
void processRefund(JSONObject jsonObject) throws InterruptedException;
}
package com.fzm.common.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fzm.common.entity.Charge;
import com.fzm.common.mapper.ChargeMapper;
import com.fzm.common.service.ChargeService;
import org.springframework.stereotype.Service;
/**
* @author tangtuo
* @date 2022/1/25 10:11
*/
@Service
public class ChargeServiceImpl extends ServiceImpl<ChargeMapper, Charge> implements ChargeService {
@Override
public Charge getByType(Integer type) {
QueryWrapper<Charge> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("type", type);
return getOne(queryWrapper);
}
}
......@@ -249,7 +249,7 @@ public class CopyrightApplyServiceImpl extends ServiceImpl<CopyrightApplyMapper,
}
@Override
public Boolean update(CopyrightDTO copyrightDTO) {
public Integer update(CopyrightDTO copyrightDTO) {
// 只有撤回 驳回和登记失败的才能编辑
CopyrightApply copyright = this.getById(copyrightDTO.getId());
if (CopyrightApplyState.REJECTED.getCode() != copyright.getRegisterState() &&
......@@ -304,7 +304,8 @@ public class CopyrightApplyServiceImpl extends ServiceImpl<CopyrightApplyMapper,
}
copyrightApply.setApplyTime(new Date());
copyrightApply.setRegisterState(CopyrightApplyState.TO_BE_PAY.getCode());
return updateById(copyrightApply);
this.updateById(copyrightApply);
return copyrightDTO.getId();
}
@Override
......
......@@ -4,20 +4,22 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fzm.common.entity.Order;
import com.fzm.common.entity.dto.OrderDto;
import com.fzm.common.entity.dto.OrderProcessMsg;
import com.fzm.common.enums.OrderStatus;
import com.fzm.common.enums.PayScene;
import com.fzm.common.enums.PayType;
import com.fzm.common.mapper.OrderMapper;
import com.fzm.common.service.CopyrightApplyService;
import com.fzm.common.service.NftService;
import com.fzm.common.service.OrderService;
import com.fzm.common.utils.JwtUtil;
import com.fzm.common.utils.SnowflakeUtil;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
/**
* @author tangtuo
......@@ -39,11 +41,15 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
@Resource
private HttpServletRequest request;
@Resource
private RabbitTemplate rabbitTemplate;
@Override
public Order getByPaySceneAndProductId(Integer payScene, Integer productId) {
public Order getByPaySceneAndProductId(Integer payScene, Integer productId, Integer orderStatus) {
QueryWrapper<Order> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("pay_scene", payScene)
.eq("product_id", productId);
.eq("product_id", productId)
.eq("order_status", orderStatus);
return this.getOne(queryWrapper);
}
......@@ -61,19 +67,28 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
long id = snowflakeUtil.snowflakeId();
Integer productId = orderDto.getProductId();
String orderName;
if (PayScene.NFT.getCode().equals(orderDto.getPayScene())) {
Integer payScene = orderDto.getPayScene();
if (PayScene.NFT.getCode().equals(payScene)) {
orderName = nftService.getById(productId).getName();
} else {
orderName = copyrightApplyService.getById(productId).getOpusName();
}
order.setId(id);
order.setOrderName(orderName);
order.setPayScene(orderDto.getPayScene());
order.setPayScene(payScene);
order.setOrderName(orderName);
order.setFee(orderDto.getFee());
order.setProductId(productId);
order.setUserId(JwtUtil.getUserIdFromToken(request.getHeader("Authorization")));
order.setOrderStatus(OrderStatus.PAYING.getStatus());
Integer orderStatus;
if (orderDto.getFee() > 0) {
orderStatus = OrderStatus.PAYING.getStatus();
} else {
// 订单金额为0的话,创建订单时,状态为支付成功
orderStatus = OrderStatus.PAYED.getStatus();
processOrder(id, productId, payScene);
}
order.setOrderStatus(orderStatus);
this.save(order);
return id;
}
......@@ -85,4 +100,37 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
o.setPayType(payType);
return updateById(o);
}
@Override
public Boolean cancel(Long orderId, OrderStatus orderStatus) {
Order order = this.getById(orderId);
Integer productId = order.getProductId();
// 判断订单的类型
if (PayScene.NFT.getCode().equals(order.getPayScene())) {
// 删除nft的相关信息
nftService.delete(productId);
} else {
// 删除版权申请的相关信息
copyrightApplyService.delete(productId);
}
// 修改订单状态为取消
this.updateOrderStatus(orderId, orderStatus);
return true;
}
@Override
public List<Order> listOrder(Integer payScene) {
Integer userId = JwtUtil.getUserIdFromToken(request.getHeader("Authorization"));
QueryWrapper<Order> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("pay_scene", payScene);
queryWrapper.eq("user_id", userId);
return this.list(queryWrapper);
}
@Override
public void processOrder(Long orderId, Integer productId, Integer payScene) {
// 订单支付成功后,给mq发送一条消息,处理nft发行或版权申请的状态
OrderProcessMsg orderProcessMsg = new OrderProcessMsg(orderId, productId, payScene);
rabbitTemplate.convertAndSend("order-exchange", "order.process", orderProcessMsg);
}
}
package com.fzm.common.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fzm.common.entity.Payment;
import com.fzm.common.mapper.PaymentMapper;
......@@ -14,4 +15,11 @@ import org.springframework.transaction.annotation.Transactional;
@Service
@Transactional(rollbackFor = RuntimeException.class)
public class PaymentServiceImpl extends ServiceImpl<PaymentMapper, Payment> implements PaymentService {
@Override
public Payment getByOrderId(Long orderId) {
QueryWrapper<Payment> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("order_id", orderId);
return getOne(queryWrapper);
}
}
package com.fzm.common.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fzm.common.entity.Refund;
import com.fzm.common.mapper.RefundMapper;
import com.fzm.common.service.RefundService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
* @author tangtuo
* @date 2022/1/24 14:27
*/
@Service
@Transactional(rollbackFor = RuntimeException.class)
public class RefundServiceImpl extends ServiceImpl<RefundMapper, Refund> implements RefundService {
}
package com.fzm.portal;
import com.fzm.common.entity.dto.OrderProcessMsg;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.scheduling.support.SimpleTriggerContext;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* @author tangtuo
* @date 2022/1/21 16:28
*/
@Slf4j
@RestController
@RequestMapping("/test")
public class TestController {
@Resource
private RabbitTemplate rabbitTemplate;
@GetMapping("/send")
public String send(){
log.info("发送消息: {}",123);
rabbitTemplate.convertAndSend("nft-exchange", "nft.publish", 123);
return "SUCCESS";
}
}
package com.fzm.portal.controller;
import com.fzm.common.annotation.Authentication;
import com.fzm.common.entity.Charge;
import com.fzm.common.model.ResponseModel;
import com.fzm.common.service.ChargeService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
/**
* @author tangtuo
* @date 2022/1/25 10:13
*/
@Authentication
@RestController
@RequestMapping(value = "/charge")
@Api(tags = "收费管理")
public class ChargeController {
@Resource
private ChargeService chargeService;
@GetMapping("/fee/{type}")
@ApiOperation("根据收费类型查询收费")
public ResponseModel<Long> getByType(@ApiParam("收费类型 1-nft发行 2-版权申请") @PathVariable Integer type) {
Charge charge = chargeService.getByType(type);
return ResponseModel.success(charge.getFee());
}
}
......@@ -78,7 +78,7 @@ public class CopyrightApplyController {
@Authentication
@PostMapping(value = "/update")
@ApiOperation(value = "编辑")
public ResponseModel<Boolean> update(@RequestBody CopyrightDTO copyrightDTO) {
public ResponseModel<Integer> update(@RequestBody CopyrightDTO copyrightDTO) {
return ResponseModel.success(copyrightApplyService.update(copyrightDTO));
}
......
package com.fzm.portal.controller;
import com.fzm.common.annotation.Authentication;
import com.fzm.common.entity.Order;
import com.fzm.common.entity.dto.OrderDto;
import com.fzm.common.enums.OrderStatus;
import com.fzm.common.model.ResponseModel;
import com.fzm.common.service.OrderService;
import io.swagger.annotations.Api;
......@@ -9,8 +11,7 @@ import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
import java.util.List;
/**
* @author tangtuo
......@@ -39,4 +40,22 @@ public class OrderController {
public ResponseModel<Integer> queryOrderStatus(@PathVariable Long orderId) {
return ResponseModel.success(orderService.getById(orderId).getOrderStatus());
}
@PostMapping("/cancel")
@ApiOperation("取消订单")
public ResponseModel<Boolean> cancelOrder(@RequestParam Long orderId) {
Boolean result = orderService.cancel(orderId, OrderStatus.CANCEL);
return ResponseModel.success(result);
}
@GetMapping("/list/{payScene}")
@ApiOperation(value = "获取我的订单列表")
public ResponseModel<List<Order>> listOrder(@PathVariable Integer payScene) {
List<Order> orders = orderService.listOrder(payScene);
return ResponseModel.success(orders);
}
}
......@@ -71,5 +71,11 @@ public class WxPayController {
}
@GetMapping("/refund/{orderId}")
public ResponseModel<String> refund(@PathVariable Long orderId) throws IOException {
wxPayService.refund(orderId);
return ResponseModel.success("退款成功");
}
}
......@@ -5,18 +5,26 @@ import cn.fzm.chain.simplesdk.constant.TxStatusEnum;
import cn.fzm.chain.simplesdk.model.TxResult;
import com.fzm.common.constant.SystemConstant;
import com.fzm.common.entity.Nft;
import com.fzm.common.entity.Order;
import com.fzm.common.entity.User;
import com.fzm.common.entity.dto.NftPublishMsg;
import com.fzm.common.enums.OrderStatus;
import com.fzm.common.enums.PayScene;
import com.fzm.common.enums.PublishStatus;
import com.fzm.common.enums.ResultCode;
import com.fzm.common.exception.GlobalException;
import com.fzm.common.service.NftService;
import com.fzm.common.service.OrderService;
import com.fzm.common.service.UserService;
import com.fzm.common.service.WxPayService;
import com.fzm.common.utils.RedisUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.io.IOException;
import java.util.Date;
/**
......@@ -39,36 +47,53 @@ public class NftListener {
@Resource
private RedisUtil redisUtil;
@Resource
private OrderService orderService;
@Resource
private WxPayService wxPayService;
/**
* 监听nft发行结果
*
* @param msg
*/
@RabbitListener(queues = "nft.publish.queue")
public void listenNftPublish(NftPublishMsg msg) {
public void listenNftPublish(NftPublishMsg msg) throws IOException {
log.info("收到处理确认nft发行结果的消息: {}", msg);
Nft nft = nftService.getById(msg.getId());
User user = userService.getUserByWallet(nft.getPublishAddress());
String hash = msg.getHash();
// 确认交易结果
TxResult txResult = paraChainClient.cycleConfirmTxWithHash(hash, true, 1000);
if (!TxStatusEnum.SUCCESS.equals(txResult.getStatus())) {
throw GlobalException.newException(ResultCode.PUBLISH_ERROR, txResult.getErrMsg().getValue());
}
String realHash = paraChainClient.getRealTxHashFromGrp(hash);
/*TxResult txResult = paraChainClient.cycleConfirmTxWithHash(realHash, false, 1000);
if (!TxStatusEnum.SUCCESS.equals(txResult.getStatus())) {
throw GlobalException.newException(ResultCode.PUBLISH_ERROR, txResult.getErrMsg().getValue());
}*/
nft.setNftHash(realHash);
nft.setTokenId(msg.getTokenId());
nft.setPublishTime(new Date());
nftService.updateById(nft);
// 如果用户是第一次发行作品,把用户的isPublish修改成1,并清空用户统计的缓存信息
if (SystemConstant.BOOLEAN_DATA_FALSE.equals(user.getIsPublish())) {
User u = new User().setId(user.getId()).setIsPublish(SystemConstant.BOOLEAN_DATA_TRUE);
userService.updateById(u);
redisUtil.delete("user::statistic");
try {
User user = userService.getUserByWallet(nft.getPublishAddress());
String hash = msg.getHash();
// 确认交易结果
TxResult txResult = paraChainClient.cycleConfirmTxWithHash(hash, true, 1000);
if (!TxStatusEnum.SUCCESS.equals(txResult.getStatus())) {
throw GlobalException.newException(ResultCode.PUBLISH_ERROR, txResult.getErrMsg().getValue());
}
String realHash = paraChainClient.getRealTxHashFromGrp(hash);
if (StringUtils.isBlank(realHash)) {
throw GlobalException.newException(ResultCode.PUBLISH_ERROR);
}
nft.setNftHash(realHash);
nft.setTokenId(msg.getTokenId());
nft.setPublishTime(new Date());
nft.setPublishStatus(PublishStatus.SUSSED.getCode());
nftService.updateById(nft);
// 如果用户是第一次发行作品,把用户的isPublish修改成1,并清空用户统计的缓存信息
if (SystemConstant.BOOLEAN_DATA_FALSE.equals(user.getIsPublish())) {
User u = new User().setId(user.getId()).setIsPublish(SystemConstant.BOOLEAN_DATA_TRUE);
userService.updateById(u);
redisUtil.delete("user::statistic");
}
} catch (Exception e) {
log.error(e.getMessage(), e);
// nft发行失败,需要把nft的发行状态改成failed,然后主动发起退款
nft.setPublishStatus(PublishStatus.FAILED.getCode());
nftService.updateById(nft);
Order order = orderService.getByPaySceneAndProductId(PayScene.NFT.getCode(), nft.getId(), OrderStatus.PAYED.getStatus());
if (order != null) {
wxPayService.refund(order.getId());
}
}
}
}
......@@ -5,11 +5,13 @@ import com.fzm.common.enums.CopyrightApplyState;
import com.fzm.common.enums.PayScene;
import com.fzm.common.service.CopyrightApplyService;
import com.fzm.common.service.NftService;
import com.fzm.common.service.WxPayService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.io.IOException;
/**
* @author tangtuo
......@@ -25,15 +27,23 @@ public class OrderListener {
@Resource
private CopyrightApplyService copyrightApplyService;
@Resource
private WxPayService wxPayService;
@RabbitListener(queues = "order.process.queue")
public void listenProcessOrder(OrderProcessMsg msg) {
public void listenProcessOrder(OrderProcessMsg msg) throws IOException {
log.info("收到处理订单的消息: {}", msg);
if (PayScene.NFT.getCode().equals(msg.getPayScene())) {
// 如果支付场景是发行nft的话,需要把此订单的nft发行
nftService.publish(msg.getProductId());
} else {
// 如果支付场景是版权申请的话,需要把当前订单对应的版权状态改为待核验
copyrightApplyService.updateRegisterState(msg.getProductId(), CopyrightApplyState.TO_BE_REVIEWED.getCode());
try {
if (PayScene.NFT.getCode().equals(msg.getPayScene())) {
// 如果支付场景是发行nft的话,需要把此订单的nft发行
nftService.publish(msg.getProductId());
} else {
// 如果支付场景是版权申请的话,需要把当前订单对应的版权状态改为待核验
copyrightApplyService.updateRegisterState(msg.getProductId(), CopyrightApplyState.TO_BE_REVIEWED.getCode());
}
} catch (Exception e) {
// 处理失败,需要主动发起退款
wxPayService.refund(msg.getOrderId());
}
}
......
......@@ -126,5 +126,5 @@ wx-pay:
api-v3-key: D864DA53FEF8ACD41519064967DC10D2
mch-serial-num: 72A62544B0A08A214FAEC780108692EDC6E7D5FA
private-key-path: apiclient_key.pem
pay-notify-url: https://test.inmvo.com:8985/proxyApi/wx-pay/notify/jsapi
refund-notify-url: https://test.inmvo.com:8985/proxyApi/wx-pay/notify/refund
pay-notify-url: https://test.inmvo.com/proxyApi/wx-pay/notify/jsapi
refund-notify-url: https://test.inmvo.com/proxyApi/wx-pay/notify/refund
......@@ -53,8 +53,8 @@ public class WxPayTest {
@Test
public void testH5Pay() throws IOException {
OrderProcessMsg orderProcessMsg = new OrderProcessMsg(1, 1);
rabbitTemplate.convertAndSend("order-exchange", "order.process", orderProcessMsg);
// OrderProcessMsg orderProcessMsg = new OrderProcessMsg(1, 1);
// rabbitTemplate.convertAndSend("order-exchange", "order.process", orderProcessMsg);
// for (int i = 0; i < 10; i++) {
// log.info(String.valueOf(snowflakeUtil.snowflakeId()));// }
// String url = "https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi";
......
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -610,4 +610,9 @@ CREATE TABLE `tb_order` (
`create_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
\ No newline at end of file
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- v2.3.0
alter table tb_nft add column publish_status TINYINT(1) not null default 1 comment '发行状态 1-待支付 2-发行成功 3-发行失败' after publish_time;
update tb_nft set publish_status =2 where nft_hash !='';
\ No newline at end of file
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