refactor(payment): 调整支付宝支付

master
yang 2025-02-08 17:35:16 +08:00
parent 79bf09e235
commit e97b6492b2
17 changed files with 274 additions and 47 deletions

View File

@ -6,12 +6,11 @@ import com.mcwl.common.utils.SecurityUtils;
import com.mcwl.memberCenter.domain.MemberConsume;
import com.mcwl.memberCenter.domain.Member;
import com.mcwl.memberCenter.domain.MemberLevel;
import com.mcwl.memberCenter.service.MemberBenefitService;
import com.mcwl.memberCenter.domain.MemberPromotion;
import com.mcwl.memberCenter.enums.PromotionEnum;
import com.mcwl.memberCenter.service.*;
import com.mcwl.memberCenter.domain.dto.RechargePointsDto;
import com.mcwl.memberCenter.domain.dto.UserMemberDto;
import com.mcwl.memberCenter.service.MemberConsumeService;
import com.mcwl.memberCenter.service.MemberLevelService;
import com.mcwl.memberCenter.service.MemberService;
import com.mcwl.system.service.ISysUserService;
import com.mcwl.memberCenter.domain.vo.PointsVO;
import io.swagger.annotations.Api;
@ -23,6 +22,7 @@ import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
@RestController
@ -41,6 +41,8 @@ public class MemberController {
private final MemberLevelService memberLevelService;
private final MemberPromotionService memberPromotionService;
/**
*
*
@ -152,7 +154,20 @@ public class MemberController {
*/
@GetMapping("calculatePayment")
@ApiOperation(value = "根据会员等级和活动计算支付金额")
public AjaxResult calculatePayment(@NotNull(message = "请选择会员") Long memberLevelId, @RequestParam(required = false) Long promotionId) {
public AjaxResult calculatePayment(@Valid @NotNull(message = "请选择会员") Long memberLevelId, @RequestParam(required = false) Long promotionId) {
// 获取当前用户
Long userId = SecurityUtils.getUserId();
MemberPromotion memberPromotion = memberPromotionService.lambdaQuery()
.eq(MemberPromotion::getUserId, userId)
.eq(MemberPromotion::getPromotionId, promotionId)
.eq(MemberPromotion::getStatus, PromotionEnum.PARTICIPATE)
.one();
// if (Objects.isNull(memberPromotion)) {
// return AjaxResult.warn("未参与活动或已过期");
// }
MemberLevel memberLevel = memberLevelService.getById(memberLevelId);
Double unitPrice = memberLevel.getUnitPrice();
unitPrice = memberService.calculatePayment(unitPrice, promotionId);

View File

@ -13,6 +13,7 @@ import com.mcwl.common.utils.SecurityUtils;
import com.mcwl.common.utils.ShareCodeUtils;
import com.mcwl.pay.domain.OrderTrade;
import com.mcwl.pay.domain.OrderTradeDto;
import com.mcwl.pay.domain.vo.PayVo;
import com.mcwl.pay.service.AliPayService;
import com.mcwl.pay.service.OrderTradeService;
import io.swagger.annotations.Api;
@ -119,21 +120,22 @@ public class AliPayController extends BaseController {
@Anonymous
@PostMapping("/doPay")
@ApiOperation(value = "支付宝支付")
public void doPay(@Valid
@ResponseBody
public AjaxResult doPay(@Valid
@RequestBody
OrderTradeDto orderTradeDto,
HttpServletResponse response) throws Exception {
String qrUrl = null;
PayVo payVo = null;
String type = orderTradeDto.getType();
if ("member".equalsIgnoreCase(type)) {
qrUrl = aliPayService.memberPay(orderTradeDto);
payVo = aliPayService.memberPay(orderTradeDto);
} else if ("points".equalsIgnoreCase(type)) {
qrUrl = aliPayService.pointsPay(orderTradeDto.getPaymentAmount());
payVo = aliPayService.pointsPay(orderTradeDto.getPaymentAmount());
}
QrCodeUtil.generate(qrUrl, 300, 300, "png", response.getOutputStream());
return AjaxResult.success(payVo);
}
/**

View File

@ -23,12 +23,16 @@ import com.mcwl.pay.domain.OrderTrade;
import com.mcwl.pay.domain.OrderTradeDto;
import com.mcwl.pay.service.AliPayService;
import com.mcwl.pay.service.OrderTradeService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
@ -49,6 +53,7 @@ import java.util.Random;
@RestController
@RequestMapping("/web/pay")
@Validated
@Api(tags = "订单模块")
public class OrderTradeController extends BaseController {
@Autowired
@ -61,6 +66,7 @@ public class OrderTradeController extends BaseController {
*
*/
@GetMapping("/list")
@ApiOperation(value = "查询订单列表")
public TableDataInfo list(OrderTrade orderTrade) {
startPage();
List<OrderTrade> list = orderTradeService.selectMallProductList(orderTrade);
@ -71,6 +77,7 @@ public class OrderTradeController extends BaseController {
*
*/
@PostMapping("/add")
@ApiOperation(value = "新增订单")
public AjaxResult add(@RequestBody OrderTrade orderTrade) {
// 获取当前用户
Long userId = SecurityUtils.getUserId();
@ -86,6 +93,7 @@ public class OrderTradeController extends BaseController {
*
*/
@PostMapping("/upda")
@ApiOperation(value = "修改订单")
public AjaxResult upda(@RequestBody OrderTrade orderTrade) {
// 获取当前用户
Long userId = SecurityUtils.getUserId();
@ -101,14 +109,19 @@ public class OrderTradeController extends BaseController {
*
*/
@PostMapping
@ApiOperation(value = "删除订单")
public AjaxResult remove(@RequestBody IdsParam ids) {
orderTradeService.deleteMallProductByIds(ids);
return success();
}
/**
*
*/
@GetMapping("/queryTradeStatus")
public Object queryTradeStatus(@RequestParam String outTradeNo) throws Exception {
@ApiOperation(value = "查询交易状态")
public Object queryTradeStatus(@Valid @NotBlank(message = "订单号不能为空") @RequestParam String outTradeNo) throws Exception {
Factory.setOptions(config);
AlipayTradeQueryResponse query = Factory.Payment.Common().query(outTradeNo);
Map<String, Object> map = JSONUtils.jsonToMap(query.getHttpBody());

View File

@ -0,0 +1,41 @@
package com.mcwl.memberCenter.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.mcwl.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
*
*/
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("mem_benefit")
public class Benefit extends BaseEntity {
@TableId
private Long id;
/**
*
*/
private String benefitName;
/**
*
*/
private String benefitDesc;
/**
*
*/
private String benefitType;
/**
*
*/
private Double benefitDiscount;
/**
*
*/
private Integer benefitOrder;
}

View File

@ -8,7 +8,7 @@ import lombok.Data;
import lombok.EqualsAndHashCode;
/**
*
*
*/
@Data
@EqualsAndHashCode(callSuper = false)
@ -21,17 +21,8 @@ public class MemberBenefit extends BaseEntity {
// 会员等级id
private Long memberLevelId;
// 权益名称
private String benefitName;
// 权益描述
private String benefitDesc;
// 权益类型
private MemberBenefitTypeEnum benefitType;
// 权益折扣 当权益类型为折扣时记录折扣的具体数值如0.9代表9折
private Double benefitDiscount;
// 权益id
private Long benefitId;
}

View File

@ -1,5 +1,6 @@
package com.mcwl.memberCenter.domain.vo;
import com.mcwl.memberCenter.domain.Benefit;
import com.mcwl.memberCenter.domain.MemberBenefit;
import com.mcwl.memberCenter.domain.MemberLevel;
import io.swagger.annotations.ApiModel;
@ -19,7 +20,7 @@ public class MemberBenefitVO {
private String memberLevelName;
// 会员权益
private List<MemberBenefit> memberBenefitList = new ArrayList<>();
private List<Benefit> memberBenefitList = new ArrayList<>();
}

View File

@ -0,0 +1,23 @@
package com.mcwl.memberCenter.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.mcwl.memberCenter.domain.Benefit;
import com.mcwl.memberCenter.domain.MemberBenefit;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* Mapper
*/
@Mapper
public interface BenefitMapper extends BaseMapper<Benefit> {
List<Benefit> getBenefitList();
List<Benefit> getBenefitListByMemberLevelId(@Param("memberLevelId") Long memberLevelId);
List<Benefit> getNotBenefitList(@Param("memberLevelId") Long memberLevelId);
Benefit getBenefitByType(@Param("memberLevelId") Long memberLevelId, @Param("benefitType") String benefitType);
}

View File

@ -5,7 +5,7 @@ import com.mcwl.memberCenter.domain.MemberBenefit;
import org.apache.ibatis.annotations.Mapper;
/**
* Mapper
* Mapper
*/
@Mapper
public interface MemberBenefitMapper extends BaseMapper<MemberBenefit> {

View File

@ -0,0 +1,20 @@
package com.mcwl.memberCenter.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.mcwl.memberCenter.domain.Benefit;
import com.mcwl.memberCenter.enums.MemberBenefitTypeEnum;
import java.util.List;
public interface BenefitService extends IService<Benefit> {
List<Benefit> getBenefitList();
List<Benefit> getBenefitListByMemberLevelId(Long memberLevelId);
List<Benefit> getNotBenefitList(Long memberLevelId);
Benefit getBenefitByType(Long memberLevelId, MemberBenefitTypeEnum memberBenefitTypeEnum);
}

View File

@ -0,0 +1,45 @@
package com.mcwl.memberCenter.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.mcwl.memberCenter.domain.Benefit;
import com.mcwl.memberCenter.domain.MemberBenefit;
import com.mcwl.memberCenter.domain.MemberLevel;
import com.mcwl.memberCenter.domain.vo.MemberBenefitVO;
import com.mcwl.memberCenter.enums.MemberBenefitTypeEnum;
import com.mcwl.memberCenter.mapper.BenefitMapper;
import com.mcwl.memberCenter.mapper.MemberBenefitMapper;
import com.mcwl.memberCenter.service.BenefitService;
import com.mcwl.memberCenter.service.MemberBenefitService;
import com.mcwl.memberCenter.service.MemberLevelService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@Service
@RequiredArgsConstructor
public class BenefitServiceImpl extends ServiceImpl<BenefitMapper, Benefit> implements BenefitService {
@Override
public List<Benefit> getBenefitList() {
return baseMapper.getBenefitList();
}
@Override
public List<Benefit> getBenefitListByMemberLevelId(Long memberLevelId) {
return baseMapper.getBenefitListByMemberLevelId(memberLevelId);
}
@Override
public List<Benefit> getNotBenefitList(Long memberLevelId) {
return baseMapper.getNotBenefitList(memberLevelId);
}
@Override
public Benefit getBenefitByType(Long memberLevelId, MemberBenefitTypeEnum memberBenefitTypeEnum) {
return baseMapper.getBenefitByType(memberLevelId, memberBenefitTypeEnum.getValue());
}
}

View File

@ -3,17 +3,19 @@ package com.mcwl.memberCenter.service.impl;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.mcwl.memberCenter.domain.Benefit;
import com.mcwl.memberCenter.domain.MemberBenefit;
import com.mcwl.memberCenter.domain.MemberLevel;
import com.mcwl.memberCenter.domain.vo.MemberBenefitVO;
import com.mcwl.memberCenter.enums.MemberBenefitTypeEnum;
import com.mcwl.memberCenter.mapper.MemberBenefitMapper;
import com.mcwl.memberCenter.service.BenefitService;
import com.mcwl.memberCenter.service.MemberBenefitService;
import com.mcwl.memberCenter.service.MemberLevelService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.*;
@Service
@RequiredArgsConstructor
@ -21,6 +23,8 @@ public class MemberBenefitServiceImpl extends ServiceImpl<MemberBenefitMapper, M
private final MemberLevelService memberLevelService;
private final BenefitService benefitService;
@Override
public List<MemberBenefitVO> getMemberBenefitList() {
List<MemberBenefitVO> memberBenefitVOList = initList();
@ -30,10 +34,17 @@ public class MemberBenefitServiceImpl extends ServiceImpl<MemberBenefitMapper, M
MemberBenefitVO memberBenefitVO = new MemberBenefitVO();
memberBenefitVO.setMemberLevelName(memberLevel.getMemberName());
// 获取会员等级对应的权益
List<MemberBenefit> memberBenefitList = baseMapper.selectList(new LambdaQueryWrapper<MemberBenefit>()
.eq(MemberBenefit::getMemberLevelId, memberLevel.getId()));
List<Benefit> benefitList = benefitService.getBenefitListByMemberLevelId(memberLevel.getId());
memberBenefitVO.setMemberBenefitList(memberBenefitList);
// 获取会员等级没有的权益
List<Benefit> notBenefitList = benefitService.getNotBenefitList(memberLevel.getId());
benefitList.addAll(notBenefitList);
// 排序
benefitList.sort(Comparator.comparingInt(Benefit::getBenefitOrder));
memberBenefitVO.setMemberBenefitList(benefitList);
memberBenefitVOList.add(memberBenefitVO);
}
@ -44,7 +55,7 @@ public class MemberBenefitServiceImpl extends ServiceImpl<MemberBenefitMapper, M
List<MemberBenefitVO> memberBenefitVOList = new ArrayList<>();
MemberBenefitVO memberBenefitVO = new MemberBenefitVO();
memberBenefitVO.setMemberLevelName("会员权益");
memberBenefitVO.setMemberBenefitList(baseMapper.selectList(null));
memberBenefitVO.setMemberBenefitList(benefitService.getBenefitList());
memberBenefitVOList.add(memberBenefitVO);
return memberBenefitVOList;
}

View File

@ -37,6 +37,8 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> impleme
private final MemberConsumeService memberConsumeService;
private final BenefitService benefitService;
@Override
public Member createUserMember(Long userId, Long memberLevelId, String paymentMethod, Long promotionId) {
if (userId == null) {
@ -80,12 +82,9 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> impleme
}
// 设置积分
MemberBenefit memberBenefit = memberBenefitService.lambdaQuery()
.eq(MemberBenefit::getMemberLevelId, memberLevelId)
.eq(MemberBenefit::getBenefitType, MemberBenefitTypeEnum.POINTS)
.one();
if (memberBenefit != null) {
Double points = memberBenefit.getBenefitDiscount();
Benefit benefit = benefitService.getBenefitByType(memberLevelId, MemberBenefitTypeEnum.POINTS);
if (Objects.nonNull(benefit)) {
Double points = benefit.getBenefitDiscount();
// 根据活动id查询活动类型如果为积分则积分加成
if (promotionId != null) {
Promotion promotion = promotionMapper.selectById(promotionId);

View File

@ -0,0 +1,42 @@
<?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.mcwl.memberCenter.mapper.BenefitMapper">
<select id="getBenefitList" resultType="com.mcwl.memberCenter.domain.Benefit">
select id, benefit_name, benefit_desc, benefit_discount, benefit_order
from mem_benefit
where del_flag = '0'
order by benefit_order
</select>
<select id="getBenefitListByMemberLevelId" resultType="com.mcwl.memberCenter.domain.Benefit">
select b.id, benefit_name, benefit_desc, benefit_discount, benefit_order
from mem_benefit b
left join mem_member_benefit mb on b.id = mb.benefit_id
where mb.member_level_id = #{memberLevelId}
and b.del_flag = '0'
and mb.del_flag = '0'
order by b.benefit_order
</select>
<select id="getNotBenefitList" resultType="com.mcwl.memberCenter.domain.Benefit">
select benefit_name, benefit_desc, benefit_order
from mem_benefit b
where b.id not in (select mb.benefit_id
from mem_member_benefit mb
where mb.member_level_id = #{memberLevelId}
and mb.del_flag = '0')
and b.del_flag = '0'
order by b.benefit_order
</select>
<select id="getBenefitByType" resultType="com.mcwl.memberCenter.domain.Benefit">
select mb.id, benefit_name, benefit_desc, benefit_type, benefit_discount, benefit_order
from mem_benefit mb
left join mem_member_benefit mmb on mb.id = mmb.benefit_id
where mb.del_flag = '0'
and mmb.del_flag = '0'
and member_level_id = #{memberLevelId}
and benefit_type = #{benefitType}
</select>
</mapper>

View File

@ -0,0 +1,12 @@
package com.mcwl.pay.domain.vo;
import lombok.Data;
@Data
public class PayVo {
private String url;
private String orderNo;
}

View File

@ -3,13 +3,14 @@ package com.mcwl.pay.service;
import com.alipay.api.AlipayApiException;
import com.mcwl.common.core.domain.AjaxResult;
import com.mcwl.pay.domain.OrderTradeDto;
import com.mcwl.pay.domain.vo.PayVo;
public interface AliPayService {
String bindingCallback(String authCode, String state);
String memberPay(OrderTradeDto orderTradeDto) throws Exception;
PayVo memberPay(OrderTradeDto orderTradeDto) throws Exception;
String pointsPay(Double paymentAmount) throws Exception;
PayVo pointsPay(Double paymentAmount) throws Exception;
AjaxResult fetch(String outBizNo, String amount) throws AlipayApiException;

View File

@ -33,6 +33,7 @@ import com.mcwl.memberCenter.service.MemberLevelService;
import com.mcwl.pay.config.AliConfig;
import com.mcwl.pay.domain.OrderTrade;
import com.mcwl.pay.domain.OrderTradeDto;
import com.mcwl.pay.domain.vo.PayVo;
import com.mcwl.pay.service.AliPayService;
import com.mcwl.system.domain.SysUserPayAccount;
import com.mcwl.system.domain.SysUserPayAccountLog;
@ -132,7 +133,7 @@ public class AliPayServiceImpl implements AliPayService {
* @throws Exception
*/
@Override
public String memberPay(OrderTradeDto orderTradeDto) throws Exception {
public PayVo memberPay(OrderTradeDto orderTradeDto) throws Exception {
// 会员等级id
Integer productId = orderTradeDto.getProductId();
@ -168,7 +169,11 @@ public class AliPayServiceImpl implements AliPayService {
//参照官方文档响应示例,解析返回结果
String httpBodyStr = payResponse.getHttpBody();
JSONObject jsonObject = JSONObject.parseObject(httpBodyStr);
return jsonObject.getJSONObject("alipay_trade_precreate_response").get("qr_code").toString();
PayVo payVo = new PayVo();
payVo.setOrderNo(tradeEntity.getCode());
payVo.setUrl(jsonObject.getJSONObject("alipay_trade_precreate_response").get("qr_code").toString());
return payVo;
}
@ -180,7 +185,7 @@ public class AliPayServiceImpl implements AliPayService {
* @throws Exception
*/
@Override
public String pointsPay(Double paymentAmount) throws Exception {
public PayVo pointsPay(Double paymentAmount) throws Exception {
// 设置orderTrade信息
OrderTrade tradeEntity = new OrderTrade();
tradeEntity.setCode(UUID.randomUUID().toString(true).substring(0, 30));
@ -200,7 +205,13 @@ public class AliPayServiceImpl implements AliPayService {
//参照官方文档响应示例,解析返回结果
String httpBodyStr = payResponse.getHttpBody();
JSONObject jsonObject = JSONObject.parseObject(httpBodyStr);
return jsonObject.getJSONObject("alipay_trade_precreate_response").get("qr_code").toString();
String url = jsonObject.getJSONObject("alipay_trade_precreate_response").get("qr_code").toString();
PayVo payVo = new PayVo();
payVo.setOrderNo(tradeEntity.getCode());
payVo.setUrl(url);
return payVo;
}
/**

View File

@ -60,7 +60,7 @@
</sql>
<select id="selectUserList" parameterType="SysUser" resultMap="SysUserResult">
select u.user_id, u.dept_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.sex,u.wallet u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark, d.dept_name, d.leader from sys_user u
select u.user_id, u.dept_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.sex,u.wallet, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark, d.dept_name, d.leader from sys_user u
left join sys_dept d on u.dept_id = d.dept_id
where u.del_flag = '0'
<if test="userId != null and userId != 0">