feat:浦江免密支付完成

This commit is contained in:
dzc committed 2025-12-29 13:29:23 +08:00
1 parent 8990e31f78
commit d84b294966
14 files changed
+444 -33

No files matched your search

@@ -0,0 +1,26 @@
package com.bsd.pjcloud.hard.api.dto;
import com.bsd.pjcloud.common.core.constant.enums.UserTypeEnum;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
@Data
public class HardAppThirdOpenDoorDto {
/**
* 用户id
*/
private Long userId;
/**
* 用户类型
*/
private UserTypeEnum userType;
/**
* 授权id
*/
@NotNull(message = "授权id不能为空")
private Long authId;
}
@@ -0,0 +1,10 @@
package com.bsd.pjcloud.hard.api.dto;
import lombok.Data;
@Data
public class HardThirdMiPayDto {
private Long id;
}
@@ -117,6 +117,12 @@ public class HardThirdMiOrderEntity extends Model<HardThirdMiOrderEntity> {
@Schema(description = "支付金额")
private int payPrice;
/**
* 原始 sign json 数据
*/
@Schema(description = "原始 sign json 数据")
private String orgSignJson;
/**
* 原始json数据
*/
@@ -68,10 +68,19 @@ public class HardAuthController {
public R<HardAppCreateThirdDoorOrderVo> appCreateThirdDoorOrder(@Valid @RequestBody HardAuthAppDto dto) {
PjcloudUser user = SecurityUtils.getUser();
dto.setUserId(user.getId());
dto.setUserType(UserTypeEnum.valueOfByStatus(user.getUserType()));
dto.setUserType(UserTypeEnum.TOC);
return R.ok(hardAuthService.appCreateThirdDoorOrder(dto));
}
@Operation(summary = "app创建第三方免密开门", description = "app创建第三方免密开门")
@PostMapping("/app/third-door-open")
public R<Long> appThirdDoorOpen(@Valid @RequestBody HardAppThirdOpenDoorDto dto) {
PjcloudUser user = SecurityUtils.getUser();
dto.setUserId(user.getId());
dto.setUserType(UserTypeEnum.TOC);
return R.ok(hardAuthService.appThirdDoorOpen(dto));
}
/* ************************************* end app end ************************************* */
@Operation(summary = "流程错误手动处理", description = "流程错误手动处理")
@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bsd.pjcloud.common.core.util.R;
import com.bsd.pjcloud.common.log.annotation.SysLog;
import com.bsd.pjcloud.hard.api.dto.HardThirdMiPayDto;
import com.bsd.pjcloud.hard.api.entity.HardThirdMiOrderEntity;
import com.bsd.pjcloud.hard.service.HardThirdMiOrderService;
import org.springframework.security.access.prepost.PreAuthorize;
@@ -44,6 +45,17 @@ public class HardThirdMiOrderController {
return R.ok();
}
/**
* 支付订单
*/
@Operation(summary = "支付订单", description = "支付订单")
@PostMapping("/admin-pay")
public R adminPay(@RequestBody HardThirdMiPayDto dto) {
hardThirdMiOrderService.adminPay(dto);
return R.ok();
}
/**
* 分页查询
*/
@@ -1,5 +1,6 @@
package com.bsd.pjcloud.hard.mapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper;
import com.bsd.pjcloud.hard.api.entity.HardThirdMiOrderEntity;
import org.apache.ibatis.annotations.Mapper;
@@ -7,4 +8,15 @@ import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface HardThirdMiOrderMapper extends PjcloudBaseMapper<HardThirdMiOrderEntity> {
default HardThirdMiOrderEntity getByAuthId(Long authId) {
return selectOne(new LambdaQueryWrapper<HardThirdMiOrderEntity>()
.eq(HardThirdMiOrderEntity::getAuthId, authId)
);
}
default HardThirdMiOrderEntity getByOrderId(Long orderId) {
return selectOne(new LambdaQueryWrapper<HardThirdMiOrderEntity>()
.eq(HardThirdMiOrderEntity::getOrderId, orderId)
);
}
}
@@ -3,10 +3,7 @@ package com.bsd.pjcloud.hard.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.bsd.pjcloud.common.data.datascope.DataScope;
import com.bsd.pjcloud.hard.api.dto.HardAuthAppDto;
import com.bsd.pjcloud.hard.api.dto.HardAuthDto;
import com.bsd.pjcloud.hard.api.dto.HardAuthErrorChangeDto;
import com.bsd.pjcloud.hard.api.dto.HardGetAuthAppDto;
import com.bsd.pjcloud.hard.api.dto.*;
import com.bsd.pjcloud.hard.api.entity.HardAuthEntity;
import com.bsd.pjcloud.hard.api.vo.HardAuthVo;
import com.bsd.pjcloud.hard.api.vo.HardGetAuthAppVo;
@@ -32,6 +29,11 @@ public interface HardAuthService extends IService<HardAuthEntity> {
*/
HardAppCreateThirdDoorOrderVo appCreateThirdDoorOrder(@Valid HardAuthAppDto dto);
/**
* app创建第三方免密开门
*/
Long appThirdDoorOpen(@Valid HardAppThirdOpenDoorDto dto);
/**
* 判断当前用户信誉
*/
@@ -1,7 +1,9 @@
package com.bsd.pjcloud.hard.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.bsd.pjcloud.hard.api.dto.HardThirdMiPayDto;
import com.bsd.pjcloud.hard.api.entity.HardThirdMiOrderEntity;
import jakarta.validation.constraints.NotNull;
public interface HardThirdMiOrderService extends IService<HardThirdMiOrderEntity> {
@@ -10,4 +12,13 @@ public interface HardThirdMiOrderService extends IService<HardThirdMiOrderEntity
*/
void refresh(Long id);
/**
* 后台支付
*/
void adminPay(HardThirdMiPayDto dto);
/**
* 根据授权id查询授权订单
*/
HardThirdMiOrderEntity getByAuthId(Long authId);
}
@@ -3,6 +3,7 @@ package com.bsd.pjcloud.hard.service;
import com.alipay.api.response.*;
import com.bsd.pjcloud.common.core.constant.enums.UserTypeEnum;
import com.bsd.pjcloud.hard.api.entity.HardThirdMiOrderEntity;
public interface MiniAlipayService {
@@ -11,6 +12,21 @@ public interface MiniAlipayService {
*/
String getDoorMiniQrCode(String hardDoorId, String cabinetNo);
/**
* 免密授权
*/
String miDynamicSign(Long userId, UserTypeEnum userType, Long authId);
/**
* 查询免密授权
*/
ZhimaCreditPayafteruseCreditagreementQueryResponse miDynamicQueySign(Long authId);
/**
* 免密服务下单
*/
ZhimaCreditPayafteruseCreditbizorderOrderResponse miDynamicOrder(Long authId, Long orderId, Long flowId);
/**
* 创建支付宝免密订单
*/
@@ -24,7 +40,7 @@ public interface MiniAlipayService {
/**
* 支付宝免密扣款
*/
AlipayTradeOrderPayResponse miPay(String authId, String alipayTradeNo, int price);
boolean miPay(HardThirdMiOrderEntity thirdOrder, int totalPrice);
/**
* 支付宝免密(取消/退款)
@@ -17,12 +17,14 @@ import com.bsd.pjcloud.common.core.util.CollectionUtils;
import com.bsd.pjcloud.common.core.util.R;
import com.bsd.pjcloud.common.data.datascope.DataScope;
import com.bsd.pjcloud.hard.api.constant.HardAuthTypeEnum;
import com.bsd.pjcloud.hard.api.constant.HardThirdMiTypeEnum;
import com.bsd.pjcloud.hard.api.constant.flow.HardDoorFlowBizEnum;
import com.bsd.pjcloud.hard.api.constant.HardDoorOpenTypeEnum;
import com.bsd.pjcloud.hard.api.dto.*;
import com.bsd.pjcloud.hard.api.dto.manager.HardManagerDto;
import com.bsd.pjcloud.hard.api.entity.HardAuthEntity;
import com.bsd.pjcloud.hard.api.entity.HardDoorFlowEntity;
import com.bsd.pjcloud.hard.api.entity.HardThirdMiOrderEntity;
import com.bsd.pjcloud.hard.api.entity.manager.HardManagerEntity;
import com.bsd.pjcloud.hard.api.utils.HardUtil;
import com.bsd.pjcloud.hard.api.vo.HardAuthVo;
@@ -55,6 +57,7 @@ public class HardAuthServiceImpl extends ServiceImpl<HardAuthMapper, HardAuthEnt
private final HardDoorFlowService hardDoorFlowService;
private final HardOrderService hardOrderService;
private final MiniAlipayService miniAlipayService;
private final HardThirdMiOrderService hardThirdMiOrderService;
private final HardManagerMapper hardManagerMapper;
@@ -147,6 +150,7 @@ public class HardAuthServiceImpl extends ServiceImpl<HardAuthMapper, HardAuthEnt
HardAppCreateThirdDoorOrderVo res = new HardAppCreateThirdDoorOrderVo();
// AlipayTradeCreateResponse alipayRes = miniAlipayService.miCreateOrder(appUser.getOpenid(), authEntity.getId(), dto.getUserId(), dto.getUserType());
AlipayTradeCreateResponse alipayRes = miniAlipayService.miCreateOrder(appUser.getOpenid(), authEntity.getId(), dto.getUserId(), dto.getUserType());
if (ObjectUtil.isEmpty(alipayRes)) {
throw new RuntimeException("创建支付宝免密订单失败");
@@ -155,6 +159,47 @@ public class HardAuthServiceImpl extends ServiceImpl<HardAuthMapper, HardAuthEnt
return res;
}
/**
* app创建第三方免密开门
*/
@Override
public Long appThirdDoorOpen(HardAppThirdOpenDoorDto dto) {
// 查询授权信息
HardAuthEntity authEntity = baseMapper.selectById(dto.getAuthId());
if (ObjectUtil.isEmpty(authEntity)) throw new RuntimeException("授权信息不存在");
// 查询设备信息
HardDoorManagerVo hardDoorDetail = hardDoorManagerService.getByHardId(authEntity.getHardId());
if (ObjectUtil.isEmpty(hardDoorDetail)) throw new RuntimeException("设备信息不存在");
HardThirdMiOrderEntity thirdMiOrder = hardThirdMiOrderService.getByAuthId(dto.getAuthId());
if (ObjectUtil.isEmpty(thirdMiOrder)) throw new RuntimeException("第三方免密订单不存在");
if (ObjectUtil.equals(dto.getUserType(), UserTypeEnum.TOC.getStatus())) {
// 微信免密支付
if (ObjectUtil.equals(thirdMiOrder.getBizType(), HardThirdMiTypeEnum.MI_WECHAT.getType())) {
}
// 支付宝-芝麻先享
if (ObjectUtil.equals(thirdMiOrder.getBizType(), HardThirdMiTypeEnum.MI_ALIPAY.getType())) {
}
}
HardAuthEntity updateObj = HardAuthEntity.builder().id(dto.getAuthId()).authStatus(YesNoEnum.YES.getCode()).authTime(LocalDateTime.now()).build();
baseMapper.updateById(updateObj);
// 开门
HardDoorFlowOpenDto openDoorDto = new HardDoorFlowOpenDto();
openDoorDto.setHardDoorId(hardDoorDetail.getId());
openDoorDto.setCabinetNo(authEntity.getCabinetNo());
openDoorDto.setFlowType(HardDoorFlowBizEnum.PAY_OPEN);
openDoorDto.setOpenType(HardDoorOpenTypeEnum.RECORD_VIDEO);
openDoorDto.setUserId(dto.getUserId());
openDoorDto.setAuthId(dto.getAuthId());
hardDoorFlowService.openDoorPay(openDoorDto, hardDoorDetail, dto.getUserType());
return updateObj.getId();
}
/**
* 判断当前用户信誉
*/
@@ -5,6 +5,7 @@ import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.extra.spring.SpringUtil;
import cn.hutool.json.JSONUtil;
import com.alipay.api.response.ZhimaCreditPayafteruseCreditbizorderOrderResponse;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -16,6 +17,8 @@ import com.bsd.pjcloud.common.core.constant.enums.YesNoEnum;
import com.bsd.pjcloud.common.core.util.CollectionUtils;
import com.bsd.pjcloud.common.core.util.R;
import com.bsd.pjcloud.common.data.datascope.DataScope;
import com.bsd.pjcloud.hard.api.constant.HardThirdMiStatusEnum;
import com.bsd.pjcloud.hard.api.constant.HardThirdMiTypeEnum;
import com.bsd.pjcloud.hard.api.constant.flow.HardDoorFlowBizEnum;
import com.bsd.pjcloud.hard.api.constant.flow.HardDoorFlowEnum;
import com.bsd.pjcloud.hard.api.dto.HardDoorFlowDto;
@@ -23,6 +26,7 @@ import com.bsd.pjcloud.hard.api.dto.HardDoorFlowOpenDto;
import com.bsd.pjcloud.hard.api.dto.manager.HardManagerDto;
import com.bsd.pjcloud.hard.api.entity.HardAuthEntity;
import com.bsd.pjcloud.hard.api.entity.HardDoorFlowEntity;
import com.bsd.pjcloud.hard.api.entity.HardThirdMiOrderEntity;
import com.bsd.pjcloud.hard.api.entity.manager.HardDoorManagerEntity;
import com.bsd.pjcloud.hard.api.entity.manager.HardManagerEntity;
import com.bsd.pjcloud.hard.api.entity.order.HardOrderEntity;
@@ -34,6 +38,7 @@ import com.bsd.pjcloud.hard.api.vo.spu.HardSpuJoinVo;
import java.time.temporal.ChronoUnit;
import com.bsd.pjcloud.hard.mapper.HardDoorFlowMapper;
import com.bsd.pjcloud.hard.mapper.HardThirdMiOrderMapper;
import com.bsd.pjcloud.hard.mapper.manager.HardManagerMapper;
import com.bsd.pjcloud.hard.service.*;
import com.bsd.pjcloud.thirdparty.api.feign.RemoterThirdDoorApiService;
@@ -74,8 +79,11 @@ public class HardDoorFlowServiceImpl extends ServiceImpl<HardDoorFlowMapper, Har
private final HardOrderService hardOrderService;
@Lazy
private final HardAuthService hardAuthService;
private final HardThirdMiOrderService hardThirdMiOrderService;
private final MiniAlipayService miniAlipayService;
private final HardManagerMapper hardManagerMapper;
private final HardThirdMiOrderMapper hardThirdMiOrderMapper;
private final RemoterThirdDoorApiService thirdDoorApiService;
private final RemoterThirdKsService thirdKsService;
@@ -233,6 +241,7 @@ public class HardDoorFlowServiceImpl extends ServiceImpl<HardDoorFlowMapper, Har
* 处理开门回调
*/
@Override
@Transactional(rollbackFor = Exception.class)
public void disposeLocakCallback(DoorOpenCallbackDto dto) {
if (ObjectUtil.isEmpty(dto.getType()) || ObjectUtil.equals(dto.getResultCode(), "FAIL")) return;
// 查询流程
@@ -249,6 +258,28 @@ public class HardDoorFlowServiceImpl extends ServiceImpl<HardDoorFlowMapper, Har
}
Long orderId = hardOrderService.createHardDoorOrder(flowDetail.getUserId(), userType, flowDetail.getHardId());
updateObj.setOrderId(orderId);
if (ObjectUtil.equals(flowDetail.getUserType(), UserTypeEnum.TOC.getStatus())) {
// 更新`hard_third_mi_order`表
HardThirdMiOrderEntity thirdOrder = hardThirdMiOrderService.getByAuthId(flowDetail.getAuthId());
if (ObjectUtil.isEmpty(thirdOrder)) {
log.error("|{}|disposeLocakCallback创建第三方免密支付错误,原因:未查询到第三方免密支付记录authId|{}|", TAG, flowDetail.getAuthId());
} else {
HardThirdMiOrderEntity updateMiOrderObj = new HardThirdMiOrderEntity();
updateMiOrderObj.setId(thirdOrder.getId());
updateMiOrderObj.setOrderId(orderId);
updateMiOrderObj.setFlowId(flowDetail.getId());
updateMiOrderObj.setOutOrderNo(String.valueOf(orderId));
hardThirdMiOrderMapper.updateById(updateMiOrderObj);
// 微信免密支付
if (ObjectUtil.equals(thirdOrder.getBizType(), HardThirdMiTypeEnum.MI_WECHAT.getType())) {
}
// 支付宝-芝麻先享
if (ObjectUtil.equals(thirdOrder.getBizType(), HardThirdMiTypeEnum.MI_ALIPAY.getType())) {
}
}
}
}
baseMapper.updateById(updateObj);
}
@@ -2,9 +2,11 @@ package com.bsd.pjcloud.hard.service.impl;
import cn.hutool.core.util.ObjectUtil;
import com.alipay.api.response.ZhimaCreditPayafteruseCreditbizorderQueryResponse;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
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.dto.HardThirdMiPayDto;
import com.bsd.pjcloud.hard.api.entity.HardThirdMiOrderEntity;
import com.bsd.pjcloud.hard.mapper.HardThirdMiOrderMapper;
import com.bsd.pjcloud.hard.service.HardThirdMiOrderService;
@@ -41,7 +43,7 @@ public class HardThirdMiOrderServiceImpl extends ServiceImpl<HardThirdMiOrderMap
if (ObjectUtil.equals(order.getBizType(), HardThirdMiTypeEnum.MI_ALIPAY.getType())) {
ZhimaCreditPayafteruseCreditbizorderQueryResponse res = miniAlipayService.miQueryOrder(null, order.getAuthId());
if (ObjectUtil.isEmpty(res)) {
throw new RuntimeException("支付宝-芝麻先享中,未查询到此订单");
throw new RuntimeException("支付宝-芝麻先享,未查询到此订单");
}
HardThirdMiOrderEntity updateObj = new HardThirdMiOrderEntity();
updateObj.setId(order.getId());
@@ -74,4 +76,39 @@ public class HardThirdMiOrderServiceImpl extends ServiceImpl<HardThirdMiOrderMap
}
}
/**
* 后台支付
*/
@Override
public void adminPay(HardThirdMiPayDto dto) {
HardThirdMiOrderEntity order = baseMapper.selectById(dto.getId());
if (ObjectUtil.isEmpty(order)) {
throw new RuntimeException("订单不存在");
}
// 微信免密支付
if (ObjectUtil.equals(order.getBizType(), HardThirdMiTypeEnum.MI_WECHAT.getType())) {
refresh(dto.getId());
return;
}
// 支付宝-芝麻先享
if (ObjectUtil.equals(order.getBizType(), HardThirdMiTypeEnum.MI_ALIPAY.getType())) {
if (ObjectUtil.isEmpty(order.getOrderId())) {
throw new RuntimeException("支付宝-芝麻先享,此订单未创建");
}
miniAlipayService.miPay(order, 10);
refresh(dto.getId());
return;
}
}
/**
* 根据授权id查询授权订单
*/
@Override
public HardThirdMiOrderEntity getByAuthId(Long authId) {
return baseMapper.selectOne(new LambdaQueryWrapper<HardThirdMiOrderEntity>()
.eq(HardThirdMiOrderEntity::getAuthId, authId)
);
}
}
@@ -5,6 +5,7 @@ import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.alipay.api.AlipayClient;
import com.alipay.api.AlipayConfig;
import com.alipay.api.DefaultAlipayClient;
@@ -17,6 +18,7 @@ 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.HardThirdMiOrderService;
import com.bsd.pjcloud.hard.service.MiniAlipayService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -25,6 +27,7 @@ import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime;
import java.util.List;
/**
* 支付宝小程序支付
@@ -86,6 +89,168 @@ public class MiniAlipayServiceImpl implements MiniAlipayService {
}
}
/**
* 免密授权
*/
@Override
public String miDynamicSign(Long userId, UserTypeEnum userType, Long authId) {
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());
ZhimaCreditPayafteruseCreditagreementSignRequest request = new ZhimaCreditPayafteruseCreditagreementSignRequest();
ZhimaCreditPayafteruseCreditagreementSignModel model = new ZhimaCreditPayafteruseCreditagreementSignModel();
// 设置芝麻信用服务ID
model.setZmServiceId(conf.getZmServiceId());
// 设置芝麻外部类目
model.setCategoryId("credit_pay_after_use");
model.setOutAgreementNo(String.valueOf(authId));
request.setBizModel(model);
try {
ZhimaCreditPayafteruseCreditagreementSignResponse response = getClient().sdkExecute(request);
if (!response.isSuccess()) {
log.error("|免密授权|失败,json|{}", response.getBody());
return null;
}
return response.getBody();
} catch (Exception e) {
e.printStackTrace();
log.error("|免密授权|异常", e);
return null;
} finally {
hardThirdMiOrderMapper.insert(thirdOrder);
}
}
/**
* 查询面密授权
*/
@Override
public ZhimaCreditPayafteruseCreditagreementQueryResponse miDynamicQueySign(Long authId) {
HardThirdMiOrderEntity thirdMiOrder = hardThirdMiOrderMapper.getByAuthId(authId);
if (ObjectUtil.isEmpty(thirdMiOrder)) {
log.error("|查询面密授权|订单不存在,authId|{}", authId);
return null;
}
HardThirdMiOrderEntity updateObj = new HardThirdMiOrderEntity();
updateObj.setId(thirdMiOrder.getId());
ZhimaCreditPayafteruseCreditagreementQueryRequest request = new ZhimaCreditPayafteruseCreditagreementQueryRequest();
ZhimaCreditPayafteruseCreditagreementQueryModel model = new ZhimaCreditPayafteruseCreditagreementQueryModel();
model.setOutAgreementNo(String.valueOf(authId));
request.setBizModel(model);
try {
ZhimaCreditPayafteruseCreditagreementQueryResponse response = getClient().execute(request);
if (!response.isSuccess()) {
log.error("|查询面密授权|失败,json|{}", response.getBody());
return null;
}
updateObj.setOrgSignJson(JSONUtil.toJsonStr(response));
return response;
} catch (Exception e) {
e.printStackTrace();
log.error("|查询面密授权|异常", e);
return null;
} finally {
if (ObjectUtil.isNotEmpty(updateObj.getOrgSignJson())) {
hardThirdMiOrderMapper.updateById(updateObj);
}
}
}
/**
* 免密服务下单
*/
@Override
public ZhimaCreditPayafteruseCreditbizorderOrderResponse miDynamicOrder(Long authId, Long orderId, Long flowId) {
HardThirdMiOrderEntity thirdMiOrder = hardThirdMiOrderMapper.getByAuthId(authId);
if (ObjectUtil.isEmpty(thirdMiOrder)) {
log.error("|免密服务下单|订单不存在,authId|{}", authId);
return null;
}
ZhimaCreditPayafteruseCreditagreementQueryResponse signObj = JSONUtil.toBean(thirdMiOrder.getOrgSignJson(), ZhimaCreditPayafteruseCreditagreementQueryResponse.class);
if (ObjectUtil.isEmpty(signObj)) {
log.error("|免密服务下单|signObj为空,授权错误,authId|{}", authId);
return null;
}
HardThirdMiOrderEntity updateObj = new HardThirdMiOrderEntity();
updateObj.setId(thirdMiOrder.getId());
updateObj.setOrderId(orderId);
updateObj.setFlowId(flowId);
updateObj.setOutOrderNo(String.valueOf(orderId));
ZhimaCreditPayafteruseCreditbizorderOrderRequest request = new ZhimaCreditPayafteruseCreditbizorderOrderRequest();
ZhimaCreditPayafteruseCreditbizorderOrderModel model = new ZhimaCreditPayafteruseCreditbizorderOrderModel();
// 设置商户外部订单号
model.setOutOrderNo(String.valueOf(orderId));
// 设置芝麻开通协议号
model.setCreditAgreementId(signObj.getCreditAgreementId());
// 设置芝麻外部类目
model.setCategoryId("credit_pay_after_use");
// 设置芝麻产品代码
model.setProductCode("CREDIT_PAY_AFTER_USE");
// 设置订单标题
model.setSubject("浦江智能柜芝麻先享");
// 设置订单描述
model.setBody("浦江智能柜芝麻先享");
request.setBizModel(model);
try {
ZhimaCreditPayafteruseCreditbizorderOrderResponse response = getClient().execute(request);
if (!response.isSuccess()) {
log.error("|免密服务下单|失败,json|{}", response.getBody());
return null;
}
updateObj.setThirdOrderNo(response.getCreditBizOrderId());
updateObj.setOrgOrderJson(JSONUtil.toJsonStr(response));
// 一般是芝麻信用评估不通过、未开通等
if (List.of("ZHIMA_CHECK_NO_PASS", "ZHIMA_EVALUATE_NO_PASS", "CREDIT_AGREEMENT_INVALID").contains(response.getCode())) {
miDynamicCreate(authId, orderId);
}
response.getCode();
return response;
} catch (Exception e) {
e.printStackTrace();
log.error("|免密服务下单|异常", e);
return null;
} finally {
hardThirdMiOrderMapper.updateById(updateObj);
}
}
/**
* 创建免密服务订单(风险评估)
*/
private ZhimaCreditPayafteruseCreditbizorderCreateResponse miDynamicCreate(Long authId, Long orderId) {
ZhimaCreditPayafteruseCreditbizorderCreateRequest request = new ZhimaCreditPayafteruseCreditbizorderCreateRequest();
ZhimaCreditPayafteruseCreditbizorderCreateModel model = new ZhimaCreditPayafteruseCreditbizorderCreateModel();
// 设置商户外部订单号
model.setOutOrderNo(String.valueOf(orderId));
model.setZmServiceId(conf.getZmServiceId());
model.setAmountType("RISK_AMOUNT");
model.setCategoryId("credit_pay_after_use");
model.setSubject("浦江智能柜芝麻先享");
model.setBody("浦江智能柜芝麻先享");
request.setBizModel(model);
try {
ZhimaCreditPayafteruseCreditbizorderCreateResponse response = getClient().sdkExecute(request);
if (!response.isSuccess()) {
log.error("|创建免密服务订单(风险评估)|失败,json|{}", response.getBody());
return null;
}
return response;
} catch (Exception e) {
e.printStackTrace();
log.error("|创建免密服务订单(风险评估)|异常", e);
return null;
}
}
/**
* 创建支付宝免密订单
*/
@@ -108,7 +273,7 @@ public class MiniAlipayServiceImpl implements MiniAlipayService {
// 设置订单附加信息
bizContent.putOnce("body", "浦江智能柜芝麻先享");
// 设置订单金额
bizContent.putOnce("total_amount", 5);
bizContent.putOnce("total_amount", 0.01);
// 固定
bizContent.putOnce("product_code", "JSAPI_PAY");
// 用户登录id
@@ -173,30 +338,40 @@ public class MiniAlipayServiceImpl implements MiniAlipayService {
* 支付宝免密扣款
*/
@Override
public AlipayTradeOrderPayResponse miPay(String authId, String alipayTradeNo, int price) {
public boolean miPay(HardThirdMiOrderEntity thirdOrder, int totalPrice) {
HardThirdMiOrderEntity updateObj = new HardThirdMiOrderEntity();
updateObj.setId(thirdOrder.getId());
updateObj.setPayOrderTime(LocalDateTime.now());
updateObj.setOrderPrice(totalPrice);
updateObj.setPayPrice(totalPrice);
AlipayTradeOrderPayRequest request = new AlipayTradeOrderPayRequest();
JSONObject bizContent = new JSONObject();
// 商家外部协议号,自定义确保唯一
bizContent.put("out_request_no", authId);
// 支付宝交易号
bizContent.put("trade_no", alipayTradeNo);
// 信用服务订单本次扣款金额,目前只支持全额扣款(传入的是分四舍五入)
bizContent.put("fulfillment_amount", new BigDecimal(price).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP));
// 固定值
bizContent.put("order_pay_mode", "CREDIT_FULFILLMENT_ZM");
AlipayTradeOrderPayModel model = new AlipayTradeOrderPayModel();
model.setOutRequestNo(String.valueOf(thirdOrder.getOrderId()));
model.setTradeNo(thirdOrder.getOutOrderNo());
model.setFulfillmentAmount(new BigDecimal(totalPrice).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP).toString());
model.setOrderPayMode("CREDIT_FULFILLMENT_ZM");
try {
request.setBizContent(bizContent.toString());
request.setBizModel(model);
AlipayTradeOrderPayResponse response = getClient().execute(request);
if (!response.isSuccess()) {
log.error("|支付宝免密扣款|失败,json|{}", response.getBody());
return null;
return false;
}
log.info("|支付宝免密扣款|成功,json|{}", response.getBody());
return response;
if (ObjectUtil.equals(response.getCode(), "10000")) {
updateObj.setOrderStatus(HardThirdMiStatusEnum.PAY.getType());
return true;
}
return false;
} catch (Exception e) {
e.printStackTrace();
log.error("|支付宝免密扣款|异常", e);
return null;
return false;
} finally {
if (ObjectUtil.isNotEmpty(updateObj.getOrderStatus())) {
hardThirdMiOrderMapper.updateById(updateObj);
}
}
}
@@ -1,11 +1,10 @@
package com.bsd.pjcloud.hard.service.impl.order;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.extra.spring.SpringUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON;
import com.alipay.api.response.AlipayTradeOrderPayResponse;
import com.alipay.api.response.AlipayTradePayResponse;
import com.baomidou.lock.annotation.Lock4j;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -19,7 +18,6 @@ import com.bsd.pjcloud.admin.api.feign.RemoteUserService;
import com.bsd.pjcloud.admin.api.utils.DataUtil;
import com.bsd.pjcloud.admin.api.vo.UserVO;
import com.bsd.pjcloud.canteen.api.feign.RemoteOnlineCanteenSpuService;
import com.bsd.pjcloud.canteen.constant.OrderTypeEnum;
import com.bsd.pjcloud.canteen.dto.CanteenSpuUpdateStockReqDTO;
import com.bsd.pjcloud.common.core.constant.CacheConstants;
import com.bsd.pjcloud.common.core.constant.CommonConstants;
@@ -33,6 +31,7 @@ import com.bsd.pjcloud.common.core.util.R;
import com.bsd.pjcloud.common.data.datascope.DataScope;
import com.bsd.pjcloud.common.security.service.PjcloudUser;
import com.bsd.pjcloud.hard.api.constant.HardProductNatureEnum;
import com.bsd.pjcloud.hard.api.constant.HardThirdMiStatusEnum;
import com.bsd.pjcloud.hard.api.constant.HardTypeEnum;
import com.bsd.pjcloud.hard.api.constant.order.HardOrderStatusEnum;
import com.bsd.pjcloud.hard.api.constant.order.HardOrderTypeEnum;
@@ -52,6 +51,7 @@ import com.bsd.pjcloud.hard.api.dto.spu.DeductionSpuStockDto;
import com.bsd.pjcloud.hard.api.dto.wechat.WechantReverseDto;
import com.bsd.pjcloud.hard.api.dto.wechat.WechatMicropayDto;
import com.bsd.pjcloud.hard.api.entity.HardApptEntity;
import com.bsd.pjcloud.hard.api.entity.HardThirdMiOrderEntity;
import com.bsd.pjcloud.hard.api.entity.manager.HardManagerEntity;
import com.bsd.pjcloud.hard.api.entity.order.HardCarEntity;
import com.bsd.pjcloud.hard.api.entity.order.HardOrderEntity;
@@ -62,21 +62,18 @@ import com.bsd.pjcloud.hard.api.vo.HardDoorFlowVo;
import com.bsd.pjcloud.hard.api.vo.manager.HardManagerVo;
import com.bsd.pjcloud.hard.api.vo.order.HardCarVo;
import com.bsd.pjcloud.hard.api.vo.order.HardCreateHardQrCodeScanOrderVo;
import com.bsd.pjcloud.hard.api.vo.order.HardOrderPayTypeVo;
import com.bsd.pjcloud.hard.api.vo.order.HardOrderVo;
import com.bsd.pjcloud.hard.api.vo.wechat.WechatMicropayVo;
import com.bsd.pjcloud.hard.mapper.HardThirdMiOrderMapper;
import com.bsd.pjcloud.hard.mapper.manager.HardManagerMapper;
import com.bsd.pjcloud.hard.mapper.order.HardOrderMapper;
import com.bsd.pjcloud.hard.service.*;
import com.bsd.pjcloud.supermarket.api.feign.RemoteMallProductService;
import com.bsd.pjcloud.supermarket.api.feign.RemoteShopSkuService;
import com.bsd.pjcloud.supermarket.api.feign.RemoteShopSpuService;
import com.bsd.pjcloud.supermarket.api.feign.RemoteSupermarketSpuService;
import com.bsd.pjcloud.supermarket.dto.MallProductStockChangeDTO;
import com.bsd.pjcloud.supermarket.dto.SkuStockChangeDTO;
import com.bsd.pjcloud.supermarket.dto.SupermarketSpuUpdateStockReqDTO;
import com.bsd.pjcloud.supermarket.entity.ShopSkuEntity;
import com.bsd.pjcloud.supermarket.vo.app.ShopSpuDetailAppVo;
import com.bsd.pjcloud.thirdparty.dto.ks.KsRecognitionCallbackDto;
import com.bsd.pjcloud.wallet.api.constant.WalletBizEnum;
import com.bsd.pjcloud.wallet.api.constant.WalletCodeBizEnum;
@@ -89,7 +86,6 @@ import com.bsd.pjcloud.wallet.api.dto.act.ActCancelItemDto;
import com.bsd.pjcloud.wallet.api.entity.WalletCodeUseEntity;
import com.bsd.pjcloud.wallet.api.entity.WalletManageEntity;
import com.bsd.pjcloud.wallet.api.entity.WalletTransactionEntity;
import com.bsd.pjcloud.wallet.api.entity.act.ActCancelItemEntity;
import com.bsd.pjcloud.wallet.api.feign.*;
import com.bsd.pjcloud.wallet.api.utils.WalletDataUtil;
import com.bsd.pjcloud.wallet.api.vo.MchManageVo;
@@ -99,7 +95,6 @@ import com.bsd.pjcloud.wallet.api.vo.act.ActCancelItemVo;
import com.bsd.pjcloud.wallet.api.vo.mch.MchPickUpVo;
import com.bsd.pjcloud.wallet.api.vo.mch.MchRuleJoinDtoVo;
import jakarta.validation.Valid;
import lombok.Locked;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Lazy;
@@ -141,6 +136,7 @@ public class HardOrderServiceImpl extends ServiceImpl<HardOrderMapper, HardOrder
private final HardApptService hardApptService;
private final WechatPayService wechatPayService;
private final AlipayService alipayService;
private final MiniAlipayService miniAlipayService;
private final RemoteMchService remoteMchService;
private final RemoteMchPickUpService remoteMchPickUpService;
@@ -161,6 +157,7 @@ public class HardOrderServiceImpl extends ServiceImpl<HardOrderMapper, HardOrder
private final HardManagerMapper hardManagerMapper;
private final StringRedisTemplate redisTemplate;
private final HardThirdMiOrderMapper hardThirdMiOrderMapper;
@Override
public Page<HardOrderVo> pagejoin(Page page, HardOrderDto dto) {
@@ -889,7 +886,7 @@ public class HardOrderServiceImpl extends ServiceImpl<HardOrderMapper, HardOrder
}
// 查询TOC用户
else {
currentUserId = userId;
}
// 查询设备
HardManagerVo hard = hardManagerService.getByHardId(hardId);
@@ -970,8 +967,30 @@ public class HardOrderServiceImpl extends ServiceImpl<HardOrderMapper, HardOrder
HardOrderEntity orderObj = baseMapper.selectById(updateObj.getId());
// 扣减库存
getSelf().fastenerInventory(orderObj, YesNoEnum.YES);
if (ObjectUtil.equals(dto.getOrderType(), HardOrderTypeEnum.TOC_VISITOR.getType())) {
HardThirdMiOrderEntity thirdOrder = hardThirdMiOrderMapper.getByOrderId(orderObj.getId());
if (ObjectUtil.isEmpty(thirdOrder)) {
log.error("|{}|智能柜订单结算,第三方免密订单不存在orderId|{}|", TAG, orderObj.getId());
} else {
boolean isPay = miniAlipayService.miPay(thirdOrder, totalPrice);
if (isPay) {
// 更新订单状态
getSelf().orderSuccess(dto, false);
// 更新第三方订单
HardThirdMiOrderEntity thirdOrderObj = new HardThirdMiOrderEntity();
thirdOrderObj.setId(thirdOrder.getId());
thirdOrderObj.setOrderPrice(totalPrice);
thirdOrderObj.setPayPrice(totalPrice);
thirdOrderObj.setPayOrderTime(LocalDateTime.now());
thirdOrderObj.setOrderStatus(HardThirdMiStatusEnum.PAY.getType());
hardThirdMiOrderMapper.updateById(thirdOrderObj);
}
}
}
// 钱包扣款
getSelf().fastReduceBalance(orderObj);
else {
getSelf().fastReduceBalance(orderObj);
}
return orderObj.getId();
}