feat:免密支付

This commit is contained in:
dzc committed 2025-12-25 16:06:52 +08:00
1 parent d84bf561ac
commit 8990e31f78
9 files changed
+162 -13

No files matched your search

@@ -0,0 +1,29 @@
package com.bsd.pjcloud.hard.api.constant;
import cn.hutool.core.util.ObjectUtil;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Arrays;
/**
* 第三方面密类型
*/
@AllArgsConstructor
@Getter
public enum HardThirdMiStatusEnum {
CREATE_ORDER("10", "创建订单"),
PAY("20", "支付订单"),
REFUND("30", "取消/退款"),
;
private final String type;
private final String description;
public static HardThirdMiStatusEnum valueOfByType(String type) {
if (ObjectUtil.isEmpty(type)) return null;
return Arrays.stream(values()).filter(v -> ObjectUtil.equals(type, v.getType())).findFirst().get();
}
}
@@ -39,6 +39,12 @@ public class HardThirdMiOrderEntity extends Model<HardThirdMiOrderEntity> {
@Schema(description = "用户id")
private Long userId;
/**
* 用户类型
*/
@Schema(description = "用户类型")
private String userType;
/**
* 授权id
*/
@@ -91,13 +97,31 @@ public class HardThirdMiOrderEntity extends Model<HardThirdMiOrderEntity> {
* 订单状态
*/
@Schema(description = "订单状态")
private Integer orderStatus;
private String orderStatus;
/**
* 押金
*/
@Schema(description = "押金")
private int depositPrice;
/**
* 订单金额
*/
@Schema(description = "订单金额")
private int orderPrice;
/**
* 支付金额
*/
@Schema(description = "支付金额")
private int payPrice;
/**
* 原始json数据
*/
@Schema(description = "原始json数据")
private String orgJson;
private String orgOrderJson;
/**
* 创建人
@@ -59,7 +59,7 @@ public class HardAuthController {
public R<Long> appAuthHardDoor(@Valid @RequestBody HardAuthAppDto dto) {
PjcloudUser user = SecurityUtils.getUser();
dto.setUserId(user.getId());
dto.setUserType(UserTypeEnum.valueOfByStatus(user.getUserType()));
dto.setUserType(UserTypeEnum.TOB);
return R.ok(hardAuthService.appAuthHardDoor(dto));
}
@@ -27,13 +27,23 @@ import java.util.Objects;
*/
@RestController
@RequiredArgsConstructor
@RequestMapping("/hardThirdMiOrder")
@RequestMapping("/hard-third-mi-order")
@Tag(description = "hardThirdMiOrder", name = "硬件商品免密订单管理")
@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)
public class HardThirdMiOrderController {
private final HardThirdMiOrderService hardThirdMiOrderService;
/**
* 刷新订单
*/
@Operation(summary = "刷新订单", description = "刷新订单")
@GetMapping("/refresh")
public R refresh(@RequestParam("id") Long id) {
hardThirdMiOrderService.refresh(id);
return R.ok();
}
/**
* 分页查询
*/
@@ -5,4 +5,9 @@ import com.bsd.pjcloud.hard.api.entity.HardThirdMiOrderEntity;
public interface HardThirdMiOrderService extends IService<HardThirdMiOrderEntity> {
/**
* 刷新订单
*/
void refresh(Long id);
}
@@ -2,6 +2,7 @@ package com.bsd.pjcloud.hard.service;
import com.alipay.api.response.*;
import com.bsd.pjcloud.common.core.constant.enums.UserTypeEnum;
public interface MiniAlipayService {
@@ -13,17 +14,17 @@ public interface MiniAlipayService {
/**
* 创建支付宝免密订单
*/
AlipayTradeCreateResponse miCreateOrder(String openId, Long authId);
AlipayTradeCreateResponse miCreateOrder(String openId, Long authId, Long userId, UserTypeEnum userType);
/**
* 查询支付宝免密订单
*/
ZhimaCreditPayafteruseCreditbizorderQueryResponse miQueryOrder(String alipayOrderNo, String authId);
ZhimaCreditPayafteruseCreditbizorderQueryResponse miQueryOrder(String alipayOrderNo, Long authId);
/**
* 支付宝免密扣款
*/
AlipayTradeOrderPayResponse miQueryPay(String authId, String alipayTradeNo, int price);
AlipayTradeOrderPayResponse miPay(String authId, String alipayTradeNo, int price);
/**
* 支付宝免密(取消/退款)
@@ -147,7 +147,7 @@ public class HardAuthServiceImpl extends ServiceImpl<HardAuthMapper, HardAuthEnt
HardAppCreateThirdDoorOrderVo res = new HardAppCreateThirdDoorOrderVo();
AlipayTradeCreateResponse alipayRes = miniAlipayService.miCreateOrder(appUser.getOpenid(), authEntity.getId());
AlipayTradeCreateResponse alipayRes = miniAlipayService.miCreateOrder(appUser.getOpenid(), authEntity.getId(), dto.getUserId(), dto.getUserType());
if (ObjectUtil.isEmpty(alipayRes)) {
throw new RuntimeException("创建支付宝免密订单失败");
}
@@ -1,15 +1,77 @@
package com.bsd.pjcloud.hard.service.impl;
import cn.hutool.core.util.ObjectUtil;
import com.alipay.api.response.ZhimaCreditPayafteruseCreditbizorderQueryResponse;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bsd.pjcloud.hard.api.constant.HardThirdMiStatusEnum;
import com.bsd.pjcloud.hard.api.constant.HardThirdMiTypeEnum;
import com.bsd.pjcloud.hard.api.entity.HardThirdMiOrderEntity;
import com.bsd.pjcloud.hard.mapper.HardThirdMiOrderMapper;
import com.bsd.pjcloud.hard.service.HardThirdMiOrderService;
import com.bsd.pjcloud.hard.service.MiniAlipayService;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
/**
* 硬件商品免密订单
*/
@Service
@AllArgsConstructor
public class HardThirdMiOrderServiceImpl extends ServiceImpl<HardThirdMiOrderMapper, HardThirdMiOrderEntity> implements HardThirdMiOrderService {
private final MiniAlipayService miniAlipayService;
/**
* 刷新订单
*/
@Override
public void refresh(Long id) {
HardThirdMiOrderEntity order = baseMapper.selectById(id);
if (ObjectUtil.isEmpty(order)) {
throw new RuntimeException("订单不存在");
}
// 微信免密支付
if (ObjectUtil.equals(order.getBizType(), HardThirdMiTypeEnum.MI_WECHAT.getType())) {
return;
}
// 支付宝-芝麻先享
if (ObjectUtil.equals(order.getBizType(), HardThirdMiTypeEnum.MI_ALIPAY.getType())) {
ZhimaCreditPayafteruseCreditbizorderQueryResponse res = miniAlipayService.miQueryOrder(null, order.getAuthId());
if (ObjectUtil.isEmpty(res)) {
throw new RuntimeException("支付宝-芝麻先享中,未查询到此订单");
}
HardThirdMiOrderEntity updateObj = new HardThirdMiOrderEntity();
updateObj.setId(order.getId());
// 押金
updateObj.setDepositPrice(new BigDecimal(res.getTotalAmount()).multiply(BigDecimal.valueOf(100)).intValue());
// 扣款金额
if (ObjectUtil.isNotEmpty(res.getTotalCreditPayAmount())) {
updateObj.setPayPrice(new BigDecimal(res.getTotalCreditPayAmount()).multiply(BigDecimal.valueOf(100)).intValue());
}
// 订单状态
if (ObjectUtil.isNotEmpty(res.getOrderStatus())) {
String orderStatus = res.getOrderStatus();
switch (orderStatus) {
// 下单状态
case "INIT":
updateObj.setOrderStatus(HardThirdMiStatusEnum.CREATE_ORDER.getType());
break;
// 订单取消或者交易全额退款
case "TRADE_CLOSED":
updateObj.setOrderStatus(HardThirdMiStatusEnum.REFUND.getType());
break;
// 扣款成功状态
case "TRADE_FINISHED":
updateObj.setOrderStatus(HardThirdMiStatusEnum.PAY.getType());
break;
}
}
baseMapper.updateById(updateObj);
return;
}
}
}
@@ -11,7 +11,12 @@ import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.*;
import com.alipay.api.request.*;
import com.alipay.api.response.*;
import com.bsd.pjcloud.common.core.constant.enums.UserTypeEnum;
import com.bsd.pjcloud.hard.api.constant.HardThirdMiStatusEnum;
import com.bsd.pjcloud.hard.api.constant.HardThirdMiTypeEnum;
import com.bsd.pjcloud.hard.api.entity.HardThirdMiOrderEntity;
import com.bsd.pjcloud.hard.config.MiniAlipayConf;
import com.bsd.pjcloud.hard.mapper.HardThirdMiOrderMapper;
import com.bsd.pjcloud.hard.service.MiniAlipayService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -29,6 +34,8 @@ import java.time.LocalDateTime;
@Slf4j
public class MiniAlipayServiceImpl implements MiniAlipayService {
private final HardThirdMiOrderMapper hardThirdMiOrderMapper;
private final MiniAlipayConf conf;
static private AlipayClient client = null;
@@ -83,7 +90,14 @@ public class MiniAlipayServiceImpl implements MiniAlipayService {
* 创建支付宝免密订单
*/
@Override
public AlipayTradeCreateResponse miCreateOrder(String openId, Long authId) {
public AlipayTradeCreateResponse miCreateOrder(String openId, Long authId, Long userId, UserTypeEnum userType) {
HardThirdMiOrderEntity thirdOrder = new HardThirdMiOrderEntity();
thirdOrder.setBizType(HardThirdMiTypeEnum.MI_ALIPAY.getType());
thirdOrder.setAuthId(authId);
thirdOrder.setUserId(userId);
thirdOrder.setUserType(userType.getStatus());
thirdOrder.setCreateOrderTime(LocalDateTime.now());
thirdOrder.setOrderStatus(HardThirdMiStatusEnum.CREATE_ORDER.getType());
AlipayTradeCreateRequest request = new AlipayTradeCreateRequest();
try {
JSONObject bizContent = new JSONObject();
@@ -108,18 +122,21 @@ public class MiniAlipayServiceImpl implements MiniAlipayService {
extraParam.putOnce("creditTradeScene", "CREDIT_PAY");
bizContent.putOnce("extend_params", extraParam);
request.setBizContent(bizContent.toString());
// request.setNotifyUrl("https://www.notifyURL.com");
AlipayTradeCreateResponse response = getClient().execute(request);
if (!response.isSuccess()) {
log.error("|创建支付宝订单|失败,json|{}", response.getBody());
return null;
}
log.info("|创建支付宝订单|成功,json|{}", response.getBody());
thirdOrder.setOutOrderNo(String.valueOf(authId));
thirdOrder.setThirdOrderNo(response.getTradeNo());
return response;
} catch (Exception e) {
e.printStackTrace();
log.error("|创建支付宝订单|意外的错误", e);
return null;
} finally {
hardThirdMiOrderMapper.insert(thirdOrder);
}
}
@@ -127,15 +144,16 @@ public class MiniAlipayServiceImpl implements MiniAlipayService {
* 查询支付宝免密订单
*/
@Override
public ZhimaCreditPayafteruseCreditbizorderQueryResponse miQueryOrder(String alipayOrderNo, String authId) {
public ZhimaCreditPayafteruseCreditbizorderQueryResponse miQueryOrder(String alipayOrderNo, Long authId) {
ZhimaCreditPayafteruseCreditbizorderQueryRequest request = new ZhimaCreditPayafteruseCreditbizorderQueryRequest();
ZhimaCreditPayafteruseCreditbizorderQueryModel model = new ZhimaCreditPayafteruseCreditbizorderQueryModel();
if (ObjectUtil.isNotEmpty(alipayOrderNo)) {
model.setCreditBizOrderId(alipayOrderNo);
}
if (ObjectUtil.isNotEmpty(authId)) {
model.setOutOrderNo(authId);
model.setOutOrderNo(String.valueOf(authId));
}
request.setBizModel(model);
try {
ZhimaCreditPayafteruseCreditbizorderQueryResponse response = getClient().execute(request);
if (!response.isSuccess()) {
@@ -155,7 +173,7 @@ public class MiniAlipayServiceImpl implements MiniAlipayService {
* 支付宝免密扣款
*/
@Override
public AlipayTradeOrderPayResponse miQueryPay(String authId, String alipayTradeNo, int price) {
public AlipayTradeOrderPayResponse miPay(String authId, String alipayTradeNo, int price) {
AlipayTradeOrderPayRequest request = new AlipayTradeOrderPayRequest();
JSONObject bizContent = new JSONObject();
// 商家外部协议号,自定义确保唯一