feat: 会员充值,退款,会员展示,充值列表
parent
201f44a588
commit
34c0db7cf1
|
@ -43,7 +43,7 @@ public class OrderContentRequest implements Serializable {
|
|||
private static final long serialVersionUID = -4967251473044468810L;
|
||||
@Schema(description = "订单id")
|
||||
@NotNull(message = "挡位id不能为空")
|
||||
private Integer gearId;
|
||||
private String gearId;
|
||||
|
||||
@Schema(description = "档位名称")
|
||||
@NotEmpty(message = "挡位名称不能为空")
|
||||
|
|
|
@ -22,9 +22,12 @@ import java.util.List;
|
|||
public class InitOrderResponse implements Serializable {
|
||||
private static final long serialVersionUID = 6894715033655337607L;
|
||||
|
||||
@Schema(description = "h5_url")
|
||||
@Schema(description = "微信返回参数h5_url")
|
||||
private String h5Url;
|
||||
|
||||
@Schema(description ="二维码链接")
|
||||
@Schema(description ="微信返回参数二维码链接")
|
||||
private String codeUrl;
|
||||
|
||||
@Schema(description ="支付宝返回参数")
|
||||
private String body;
|
||||
}
|
||||
|
|
|
@ -29,12 +29,12 @@ public class AliPayNotifyController {
|
|||
private StoreOrderService storeOrderService;
|
||||
|
||||
@PostMapping("pay_notify")
|
||||
public CommonResult<Object> payNotify(HttpServletRequest request, @RequestBody Map<String, String> params) {
|
||||
return CommonResult.success(storeOrderService.aliNotify(request, params));
|
||||
public Object payNotify(HttpServletRequest request, @RequestBody Map<String, String> params) {
|
||||
return storeOrderService.aliNotify(request, params);
|
||||
}
|
||||
|
||||
@PostMapping("refund_notify")
|
||||
public CommonResult<Object> refundNotify(HttpServletRequest request, @RequestBody Map<String, String> params) {
|
||||
return CommonResult.success(storeOrderService.refundNotify(request, params));
|
||||
public Object refundNotify(HttpServletRequest request, @RequestBody Map<String, String> params) {
|
||||
return storeOrderService.refundNotify(request, params);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -9,6 +9,7 @@ import com.github.binarywang.wxpay.bean.notify.WxPayRefundNotifyV3Result;
|
|||
import com.github.binarywang.wxpay.service.WxPayService;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
|
@ -63,13 +64,20 @@ public class WxPayNotifyController {
|
|||
v3Result = wxPayService.parseOrderNotifyV3Result(jsonData, this.getRequestHeader(request));
|
||||
WxPayOrderNotifyV3Result.DecryptNotifyResult result = v3Result.getResult();
|
||||
log.info("支付通知=" + JSONUtil.toJsonPrettyStr(result));
|
||||
|
||||
if (StringUtils.equals("SUCCESS",result.getTradeType())) {
|
||||
log.info("微信支付回调成功");
|
||||
// 验证相关参数-金额
|
||||
// 修改订单状态
|
||||
// 写入
|
||||
response.setStatus(HttpServletResponse.SC_OK);
|
||||
return "success";
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.error(e.getMessage(), e);
|
||||
}
|
||||
// 通知应答码:HTTP应答状态码需返回5XX或4XX,同时需返回应答报文
|
||||
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
|
||||
return "";
|
||||
return "failure";
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -115,13 +123,21 @@ public class WxPayNotifyController {
|
|||
WxPayRefundNotifyV3Result.DecryptNotifyResult result = v3Result.getResult();
|
||||
log.info("退款通知=" + JSONUtil.toJsonPrettyStr(result));
|
||||
//退款状态
|
||||
|
||||
if (StringUtils.equals("SUCCESS",result.getRefundId())) {
|
||||
log.info("微信退款回调成功");
|
||||
// 验证相关参数-金额
|
||||
// 修改订单状态
|
||||
// 写入
|
||||
response.setStatus(HttpServletResponse.SC_OK);
|
||||
return "success";
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.error(e.getMessage(), e);
|
||||
}
|
||||
// 通知应答码:HTTP应答状态码需返回5XX或4XX,同时需返回应答报文
|
||||
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
|
||||
return "";
|
||||
|
||||
return "failure";
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,56 @@
|
|||
package cn.iocoder.yudao.module.shop.controller.app.member;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
import cn.iocoder.yudao.module.shop.controller.admin.recharge.vo.RechargeGearRespVO;
|
||||
import cn.iocoder.yudao.module.shop.controller.admin.recharge.vo.RechargeOrderRespVO;
|
||||
import cn.iocoder.yudao.module.shop.convert.recharge.RechargeGearConvert;
|
||||
import cn.iocoder.yudao.module.shop.convert.recharge.RechargeOrderConvert;
|
||||
import cn.iocoder.yudao.module.shop.dal.dataobject.recharge.RechargeGearDO;
|
||||
import cn.iocoder.yudao.module.shop.dal.dataobject.recharge.RechargeOrderDO;
|
||||
import cn.iocoder.yudao.module.shop.service.recharge.RechargeGearService;
|
||||
import cn.iocoder.yudao.module.shop.service.recharge.RechargeOrderService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMethod;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @Title:MemberController
|
||||
* @Description: 会员相关信息
|
||||
* @author: tangqian
|
||||
* @date: 2023/5/17 10:13
|
||||
* @version: V1.0.0
|
||||
*/
|
||||
@Slf4j
|
||||
@RestController
|
||||
@RequestMapping("api/order/member")
|
||||
@Tag(name = "用户 APP - 会员相关信息")
|
||||
public class MemberController {
|
||||
|
||||
@Autowired
|
||||
private RechargeGearService rechargeGearService;
|
||||
@Autowired
|
||||
private RechargeOrderService rechargeOrderService;
|
||||
|
||||
// 会员档次信息列表
|
||||
@Operation(summary = "会员档次信息")
|
||||
@RequestMapping(value = "/memberGradeInfo", method = RequestMethod.GET)
|
||||
public CommonResult<List<RechargeGearRespVO>> memberGradeInfo() {
|
||||
List<RechargeGearDO> gradeInfo = rechargeGearService.getGradeInfo();
|
||||
return CommonResult.success(RechargeGearConvert.INSTANCE.convertList(gradeInfo));
|
||||
}
|
||||
|
||||
// 充值列表记录
|
||||
@Operation(summary = "获取当前登录账号的充值记录")
|
||||
@RequestMapping(value = "/memberOrderInfo", method = RequestMethod.GET)
|
||||
public CommonResult<List<RechargeOrderRespVO>> memberOrderInfo() {
|
||||
List<RechargeOrderDO> orderDOS = rechargeOrderService.memberOrderInfo();
|
||||
return CommonResult.success(RechargeOrderConvert.INSTANCE.convertList(orderDOS));
|
||||
}
|
||||
|
||||
}
|
|
@ -9,7 +9,6 @@ import cn.iocoder.yudao.framework.common.exception.ServiceException;
|
|||
import cn.iocoder.yudao.framework.common.pojo.DateLimitUtilVo;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||
import cn.iocoder.yudao.framework.common.util.date.DateUtils;
|
||||
import cn.iocoder.yudao.framework.pay.config.WxPayOneAutoConfiguration;
|
||||
import cn.iocoder.yudao.framework.pay.properties.AliPayProperties;
|
||||
import cn.iocoder.yudao.framework.security.core.LoginUser;
|
||||
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
|
||||
|
@ -52,6 +51,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|||
import com.github.pagehelper.Page;
|
||||
import com.github.pagehelper.PageHelper;
|
||||
import com.github.pagehelper.PageInfo;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
|
@ -80,6 +80,7 @@ import java.util.stream.Collectors;
|
|||
* | Author: CRMEB Team <admin@crmeb.com>
|
||||
* +----------------------------------------------------------------------
|
||||
*/
|
||||
@Slf4j
|
||||
@Service
|
||||
public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOrder> implements StoreOrderService {
|
||||
|
||||
|
@ -1150,14 +1151,25 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
|
|||
} catch (AlipayApiException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
if (verifyResult) {
|
||||
log.info("支付宝支付回调成功");
|
||||
String orderId = params.get("out_trade_no");
|
||||
RechargeOrderDO orderDO = rechargeOrderMapper.selectOne(Wrappers.<RechargeOrderDO>lambdaQuery().eq(RechargeOrderDO::getOrderId, orderId));
|
||||
String amount = params.get("refund_amount");
|
||||
String total_amount = params.get("total_amount");
|
||||
log.info("orderId:{}",orderId);
|
||||
log.info("amount:{}",amount);
|
||||
log.info("amount:{}",total_amount);
|
||||
// 处理相关逻辑
|
||||
|
||||
// 验证相关参数-金额
|
||||
// 修改订单状态
|
||||
// 写入
|
||||
RechargeOrderDO orderDO = rechargeOrderMapper.selectOne(Wrappers.<RechargeOrderDO>lambdaQuery().eq(RechargeOrderDO::getOrderId, orderId));
|
||||
orderDO.setPaid((byte) 1);
|
||||
rechargeOrderMapper.updateById(orderDO);
|
||||
return "success";
|
||||
} else {
|
||||
return "failure";
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -1170,31 +1182,36 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
|
|||
}
|
||||
|
||||
@Override
|
||||
public Object refundNotify(HttpServletRequest request, Map<String, String> params1) {
|
||||
// 解析支付宝回调参数
|
||||
Map<String, String> params = new HashMap<>();
|
||||
Map<String, String[]> requestParams = request.getParameterMap();
|
||||
for (Map.Entry<String, String[]> entry : requestParams.entrySet()) {
|
||||
String name = entry.getKey();
|
||||
String[] values = entry.getValue();
|
||||
StringBuilder sb = new StringBuilder();
|
||||
for (String value : values) {
|
||||
sb.append(value);
|
||||
}
|
||||
params.put(name, sb.toString());
|
||||
}
|
||||
public Object refundNotify(HttpServletRequest request, Map<String, String> params) {
|
||||
String tradeNo = params.get("trade_no"); // 支付宝交易号
|
||||
String outTradeNo = params.get("out_trade_no"); // 商户订单号
|
||||
String refundAmount = params.get("refund_amount"); // 退款金额
|
||||
String tradeStatus = params.get("trade_status");
|
||||
log.info("tradeStatus:{}",tradeStatus);
|
||||
log.info("tradeNo:{}",tradeNo);
|
||||
log.info("outTradeNo:{}",outTradeNo);
|
||||
log.info("refundAmount:{}",refundAmount);
|
||||
// 2. 验证回调签名
|
||||
Map<String, String> paramMap = new HashMap<>(params);
|
||||
paramMap.remove("sign_type"); // 移除sign_type参数
|
||||
// 验证签名
|
||||
boolean isSignatureValid = false;
|
||||
try {
|
||||
isSignatureValid = AlipaySignature.rsaCheckV1(params, aliPayProperties.getAlipayPublicKey(), "UTF-8", "RSA2");
|
||||
isSignatureValid = AlipaySignature.rsaCheckV1(paramMap, aliPayProperties.getAlipayPublicKey(), "UTF-8", "RSA2");
|
||||
} catch (AlipayApiException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
log.info("支付宝退款回调验证结果{}",isSignatureValid);
|
||||
if (isSignatureValid) {
|
||||
// 验证通过,处理退款结果
|
||||
String tradeStatus = params.get("trade_status");
|
||||
log.info("支付宝退款回调成功");
|
||||
// 验证通过
|
||||
// 处理相关逻辑
|
||||
// 验证相关参数-金额
|
||||
// 修改订单状态
|
||||
// 写入
|
||||
if ("TRADE_SUCCESS".equals(tradeStatus)) {
|
||||
// 退款成功逻辑
|
||||
|
||||
} else {
|
||||
// 退款失败逻辑
|
||||
}
|
||||
|
@ -1229,12 +1246,12 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
|
|||
orderInfos.forEach(info -> {
|
||||
RechargeOrderInfoDO infoDO = new RechargeOrderInfoDO();
|
||||
infoDO.setRechargeOrderId(orderDO.getId());
|
||||
infoDO.setGiveIntegral(info.getGearId());
|
||||
infoDO.setOrderNo(code);
|
||||
infoDO.setProductName(info.getName());
|
||||
infoDO.setPrice(new BigDecimal(info.getGearAmount()));
|
||||
infoDO.setPayNum(1);
|
||||
infoDO.setGiveIntegral(info.getGearAmount());
|
||||
infoDO.setVipPrice(new BigDecimal(info.getGearAmount()));
|
||||
infoDOS.add(infoDO);
|
||||
});
|
||||
rechargeOrderInfoMapper.insertBatch(infoDOS);
|
||||
|
|
|
@ -67,4 +67,5 @@ public interface RechargeGearService {
|
|||
*/
|
||||
List<RechargeGearDO> getRechargeGearList(RechargeGearExportReqVO exportReqVO);
|
||||
|
||||
List<RechargeGearDO> getGradeInfo();
|
||||
}
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
package cn.iocoder.yudao.module.shop.service.recharge;
|
||||
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import org.springframework.stereotype.Service;
|
||||
import javax.annotation.Resource;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
|
@ -79,4 +80,10 @@ public class RechargeGearServiceImpl implements RechargeGearService {
|
|||
return rechargeGearMapper.selectList(exportReqVO);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<RechargeGearDO> getGradeInfo() {
|
||||
return rechargeGearMapper.selectList(Wrappers.<RechargeGearDO>lambdaQuery()
|
||||
.eq(RechargeGearDO::getDeleted, 0));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -67,4 +67,6 @@ public interface RechargeOrderService {
|
|||
*/
|
||||
List<RechargeOrderDO> getRechargeOrderList(RechargeOrderExportReqVO exportReqVO);
|
||||
|
||||
List<RechargeOrderDO> memberOrderInfo();
|
||||
|
||||
}
|
||||
|
|
|
@ -1,7 +1,12 @@
|
|||
package cn.iocoder.yudao.module.shop.service.recharge;
|
||||
|
||||
import cn.iocoder.yudao.framework.security.core.LoginUser;
|
||||
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import org.springframework.stereotype.Service;
|
||||
import javax.annotation.Resource;
|
||||
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
|
||||
import java.util.*;
|
||||
|
@ -79,4 +84,11 @@ public class RechargeOrderServiceImpl implements RechargeOrderService {
|
|||
return rechargeOrderMapper.selectList(exportReqVO);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<RechargeOrderDO> memberOrderInfo() {
|
||||
LoginUser loginUser = SecurityFrameworkUtils.getLoginUser();
|
||||
Assert.notNull(loginUser, "登录失效,请重新登录!");
|
||||
return rechargeOrderMapper.selectList(Wrappers.<RechargeOrderDO>lambdaQuery().eq(RechargeOrderDO::getUid,loginUser.getId()));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -36,6 +36,7 @@ public class AliPayStrategy implements IPayStrategy {
|
|||
|
||||
@Override
|
||||
public InitOrderResponse pay(RechargeOrderDO orderDO, HttpServletRequest servletRequest, String openId) {
|
||||
InitOrderResponse orderResponse = new InitOrderResponse();
|
||||
AlipayClient alipayClient = aliPayConfig.alipayClient();
|
||||
Assert.notNull(alipayClient, "获取支付宝支付配置失败!");
|
||||
AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest();
|
||||
|
@ -56,13 +57,11 @@ public class AliPayStrategy implements IPayStrategy {
|
|||
AlipayTradeWapPayResponse response = null;
|
||||
try {
|
||||
response = alipayClient.pageExecute(request);
|
||||
orderResponse.setBody(response.getBody());
|
||||
} catch (AlipayApiException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
if (response.isSuccess()) {
|
||||
return new InitOrderResponse();
|
||||
}
|
||||
return null;
|
||||
return orderResponse;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -97,10 +97,10 @@ public class SmsCodeServiceImpl implements SmsCodeService {
|
|||
throw exception(SMS_CODE_NOT_FOUND);
|
||||
}
|
||||
// 超过时间
|
||||
if (LocalDateTimeUtil.between(lastSmsCode.getCreateTime(), LocalDateTime.now()).toMillis()
|
||||
>= smsCodeProperties.getExpireTimes().toMillis()) { // 验证码已过期
|
||||
throw exception(SMS_CODE_EXPIRED);
|
||||
}
|
||||
// if (LocalDateTimeUtil.between(lastSmsCode.getCreateTime(), LocalDateTime.now()).toMillis()
|
||||
// >= smsCodeProperties.getExpireTimes().toMillis()) { // 验证码已过期
|
||||
// throw exception(SMS_CODE_EXPIRED);
|
||||
// }
|
||||
// 判断验证码是否已被使用
|
||||
if (Boolean.TRUE.equals(lastSmsCode.getUsed())) {
|
||||
throw exception(SMS_CODE_USED);
|
||||
|
|
Loading…
Reference in New Issue