feat:免密支付

This commit is contained in:
dzc committed 2025-12-25 13:27:25 +08:00
1 parent bbeef4536a
commit 0a2ec15518
9 files changed
+329 -184

No files matched your search

@@ -1,8 +1,7 @@
package com.bsd.pjcloud.hard.service;
import com.alipay.api.response.AlipayFundAuthOrderAppFreezeResponse;
import com.alipay.api.response.ZhimaCreditPayafteruseCreditagreementSignResponse;
import com.alipay.api.response.*;
public interface MiniAlipayService {
@@ -12,12 +11,23 @@ public interface MiniAlipayService {
String getDoorMiniQrCode(String hardDoorId, String cabinetNo);
/**
* 支付宝冻结金额
* 创建支付宝免密订单
*/
AlipayFundAuthOrderAppFreezeResponse freezeAmount(Long authId);
AlipayTradeCreateResponse miCreateOrder(String openId, Long authId);
/**
* 支付宝签约
* 查询支付宝免密订单
*/
ZhimaCreditPayafteruseCreditagreementSignResponse creditagreementSign(Long authId);
ZhimaCreditPayafteruseCreditbizorderQueryResponse miQueryOrder(String alipayOrderNo, String authId);
/**
* 支付宝免密扣款
*/
AlipayTradeOrderPayResponse miQueryPay(String authId, String alipayTradeNo, int price);
/**
* 支付宝免密(取消/退款)
*/
AlipayTradeRefundResponse miCancelOrRefund(String authId, String refundId, int price);
}
@@ -1,14 +1,16 @@
package com.bsd.pjcloud.hard.service.impl;
import cn.hutool.core.util.ObjectUtil;
import com.alipay.api.response.AlipayFundAuthOrderAppFreezeResponse;
import com.alipay.api.response.ZhimaCreditPayafteruseCreditagreementSignResponse;
import com.alipay.api.response.AlipayTradeCreateResponse;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
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.app.api.dto.AppUserInfo;
import com.bsd.pjcloud.app.api.entity.AppUser;
import com.bsd.pjcloud.app.api.feign.RemoteAppUserService;
import com.bsd.pjcloud.common.core.constant.enums.UserTypeEnum;
import com.bsd.pjcloud.common.core.constant.enums.YesNoEnum;
import com.bsd.pjcloud.common.core.util.CollectionUtils;
@@ -30,7 +32,6 @@ import com.bsd.pjcloud.hard.api.vo.order.HardAppCreateThirdDoorOrderVo;
import com.bsd.pjcloud.hard.mapper.HardAuthMapper;
import com.bsd.pjcloud.hard.mapper.manager.HardManagerMapper;
import com.bsd.pjcloud.hard.service.*;
import com.bsd.pjcloud.hard.service.impl.ali.MiniAlipayServiceImpl;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@@ -58,6 +59,7 @@ public class HardAuthServiceImpl extends ServiceImpl<HardAuthMapper, HardAuthEnt
private final HardManagerMapper hardManagerMapper;
private final RemoteUserService remoteUserService;
private final RemoteAppUserService remoteAppUserService;
@Override
public Page<HardAuthVo> scopePageJoin(Page page, HardAuthDto dto, DataScope dataScope) {
@@ -134,6 +136,10 @@ public class HardAuthServiceImpl extends ServiceImpl<HardAuthMapper, HardAuthEnt
// 查询设备信息
HardDoorManagerVo hardDoorDetail = hardDoorManagerService.getByHardId(authEntity.getHardId());
if (ObjectUtil.isEmpty(hardDoorDetail)) throw new RuntimeException("设备信息不存在");
// 查询第三方用户信息
AppUserInfo appUserInfo = remoteAppUserService.infoByUserId(dto.getUserId()).getData();
if (ObjectUtil.isEmpty(appUserInfo)) throw new RuntimeException("第三方用户信息不存在");
AppUser appUser = appUserInfo.getAppUser();
if (ObjectUtil.equals(dto.getAuthStatus(), YesNoEnum.NO.getCode())) {
throw new RuntimeException("请先授权");
@@ -141,11 +147,11 @@ public class HardAuthServiceImpl extends ServiceImpl<HardAuthMapper, HardAuthEnt
HardAppCreateThirdDoorOrderVo res = new HardAppCreateThirdDoorOrderVo();
ZhimaCreditPayafteruseCreditagreementSignResponse alipayRes = miniAlipayService.creditagreementSign(authEntity.getId());
AlipayTradeCreateResponse alipayRes = miniAlipayService.miCreateOrder(appUser.getOpenid(), authEntity.getId());
if (ObjectUtil.isEmpty(alipayRes)) {
throw new RuntimeException("创建支付宝免密订单失败");
}
res.setAlipayOrderStr(alipayRes.getBody());
res.setAlipayOrderStr(alipayRes.getTradeNo());
return res;
}
@@ -1,24 +1,26 @@
package com.bsd.pjcloud.hard.service.impl.ali;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import com.alipay.api.AlipayClient;
import com.alipay.api.AlipayConfig;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayFundAuthOrderAppFreezeModel;
import com.alipay.api.domain.AlipayOpenAppQrcodeCreateModel;
import com.alipay.api.domain.ZhimaCreditPayafteruseCreditagreementSignModel;
import com.alipay.api.request.AlipayFundAuthOrderAppFreezeRequest;
import com.alipay.api.request.AlipayOpenAppQrcodeCreateRequest;
import com.alipay.api.request.ZhimaCreditPayafteruseCreditagreementSignRequest;
import com.alipay.api.response.AlipayFundAuthOrderAppFreezeResponse;
import com.alipay.api.response.AlipayOpenAppQrcodeCreateResponse;
import com.alipay.api.response.ZhimaCreditPayafteruseCreditagreementSignResponse;
import com.alipay.api.domain.*;
import com.alipay.api.request.*;
import com.alipay.api.response.*;
import com.bsd.pjcloud.hard.config.MiniAlipayConf;
import com.bsd.pjcloud.hard.service.MiniAlipayService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime;
/**
* 支付宝小程序支付
*/
@@ -78,65 +80,137 @@ public class MiniAlipayServiceImpl implements MiniAlipayService {
}
/**
* 支付宝冻结金额
* 创建支付宝免密订单
*/
@Override
public AlipayFundAuthOrderAppFreezeResponse freezeAmount(Long authId) {
AlipayFundAuthOrderAppFreezeRequest request = new AlipayFundAuthOrderAppFreezeRequest();
AlipayFundAuthOrderAppFreezeModel model = new AlipayFundAuthOrderAppFreezeModel();
// 商户授权资金订单号(订单id)
model.setOutOrderNo(String.valueOf(authId));
// 商户本次资金操作的请求流水号,用于标示请求流水的唯一性(流程id)
model.setOutRequestNo(String.valueOf(authId));
// 订单标题
model.setOrderTitle("浦江智能柜押金");
// 设置需要冻结的金额(元)
model.setAmount(conf.getFreezeAmount());
// 设置销售产品码,商家和支付宝签约的产品码(固定)
model.setProductCode("PREAUTH_PAY");
// 设置收款账户的支付宝用户号
model.setPayeeUserId(conf.getMerchantId());
// 设置收款账户的支付宝登录号(email或手机号)
model.setPayeeLogonId(conf.getMerchantAccount());
// 设置预授权订单相对超时时间
model.setTimeoutExpress("2d");
request.setBizModel(model);
public AlipayTradeCreateResponse miCreateOrder(String openId, Long authId) {
AlipayTradeCreateRequest request = new AlipayTradeCreateRequest();
try {
AlipayFundAuthOrderAppFreezeResponse response = getClient().sdkExecute(request);
JSONObject bizContent = new JSONObject();
// 设置商户订单号
bizContent.putOnce("out_trade_no", String.valueOf(authId));
// 设置订单标题
bizContent.putOnce("subject", "浦江智能柜芝麻先享");
// 设置订单附加信息
bizContent.putOnce("body", "浦江智能柜芝麻先享");
// 设置订单金额
bizContent.putOnce("total_amount", 5);
// 固定
bizContent.putOnce("product_code", "JSAPI_PAY");
// 用户登录id
bizContent.putOnce("buyer_open_id", openId);
bizContent.putOnce("op_buyer_open_id", openId);
bizContent.putOnce("op_app_id", conf.getAppId());
// 订单超时时间(1天)
bizContent.putOnce("time_expire", LocalDateTimeUtil.format(LocalDateTime.now().plusDays(1), DatePattern.NORM_DATETIME_FORMATTER));
JSONObject extraParam = new JSONObject();
extraParam.putOnce("zmServiceId", conf.getZmServiceId());
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());
log.error("|创建支付宝订单|失败,json|{}", response.getBody());
return null;
}
log.info("|支付宝冻结金额|成功,json|{}", response.getBody());
log.info("|创建支付宝订单|成功,json|{}", response.getBody());
return response;
} catch (Exception e) {
e.printStackTrace();
log.error("|支付宝冻结金额|意外的错误", e);
log.error("|创建支付宝订单|意外的错误", e);
return null;
}
}
/**
* 支付宝签约
* 查询支付宝免密订单
*/
public ZhimaCreditPayafteruseCreditagreementSignResponse creditagreementSign(Long authId) {
ZhimaCreditPayafteruseCreditagreementSignRequest request = new ZhimaCreditPayafteruseCreditagreementSignRequest();
ZhimaCreditPayafteruseCreditagreementSignModel model = new ZhimaCreditPayafteruseCreditagreementSignModel();
// 设置芝麻信用服务ID
model.setZmServiceId(conf.getZmServiceId());
model.setOutAgreementNo(String.valueOf(authId));
request.setBizModel(model);
@Override
public ZhimaCreditPayafteruseCreditbizorderQueryResponse miQueryOrder(String alipayOrderNo, String authId) {
ZhimaCreditPayafteruseCreditbizorderQueryRequest request = new ZhimaCreditPayafteruseCreditbizorderQueryRequest();
ZhimaCreditPayafteruseCreditbizorderQueryModel model = new ZhimaCreditPayafteruseCreditbizorderQueryModel();
if (ObjectUtil.isNotEmpty(alipayOrderNo)) {
model.setCreditBizOrderId(alipayOrderNo);
}
if (ObjectUtil.isNotEmpty(authId)) {
model.setOutOrderNo(authId);
}
try {
ZhimaCreditPayafteruseCreditagreementSignResponse response = getClient().sdkExecute(request);
ZhimaCreditPayafteruseCreditbizorderQueryResponse response = getClient().execute(request);
if (!response.isSuccess()) {
log.error("|支付宝签约|失败,json|{}", response.getBody());
log.error("|查询支付宝免密订单|失败,json|{}", response.getBody());
return null;
}
log.info("|支付宝签约|成功,json|{}", response.getBody());
log.info("|查询支付宝免密订单|成功,json|{}", response.getBody());
return response;
} catch (Exception e) {
e.printStackTrace();
log.error("|支付宝签约|意外的错误", e);
log.error("|查询支付宝免密订单|意外的错误", e);
}
return null;
}
/**
* 支付宝免密扣款
*/
@Override
public AlipayTradeOrderPayResponse miQueryPay(String authId, String alipayTradeNo, int price) {
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");
try {
request.setBizContent(bizContent.toString());
AlipayTradeOrderPayResponse response = getClient().execute(request);
if (!response.isSuccess()) {
log.error("|支付宝免密扣款|失败,json|{}", response.getBody());
return null;
}
log.info("|支付宝免密扣款|成功,json|{}", response.getBody());
return response;
} catch (Exception e) {
e.printStackTrace();
log.error("|支付宝免密扣款|异常", e);
return null;
}
}
/**
* 支付宝免密(取消/退款)
*/
@Override
public AlipayTradeRefundResponse miCancelOrRefund(String authId, String refundId, int price) {
AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
JSONObject bizContent = new JSONObject();
// 订单总金额
bizContent.putOnce("refund_amount", new BigDecimal(price).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP));
// 商家订单唯一号
bizContent.putOnce("out_trade_no", authId);
bizContent.putOnce("out_request_no", refundId);
//扩展参数
JSONObject extendParam = new JSONObject();
extendParam.putOnce("is_fulfilled", "true");
bizContent.putOnce("extend_params", extendParam);
try {
request.setBizContent(bizContent.toString());
AlipayTradeRefundResponse response = getClient().execute(request);
if (!response.isSuccess()) {
log.error("|支付宝免密(取消/退款)|失败,json|{}", response.getBody());
return null;
}
log.info("|支付宝免密(取消/退款)|成功,json|{}", response.getBody());
return response;
} catch (Exception e) {
e.printStackTrace();
log.error("|支付宝免密(取消/退款)|异常", e);
return null;
}
}