Merge remote-tracking branch 'origin/master'

This commit is contained in:
zjf committed 2025-06-19 21:00:54 +08:00
commit f31a8b16e5
9 files changed
+103 -14

No files matched your search

@@ -35,7 +35,7 @@ public class HardOrderEntity extends Model<HardOrderEntity> {
/**
* 订单编号
*/
@Schema(description = "订单编号 目前正元正在使用")
@Schema(description = "订单编号 目前正元、微信支付、支付宝支付正在使用")
private String orderNo;
/**
@@ -25,6 +25,16 @@ public class AlipayConf {
/**
* 公钥
*/
private String publicKey;
/**
* 支付宝公钥
*/
private String alipayPublicKey;
/**
* 回调地址
*/
private String callbackUrl;
}
@@ -0,0 +1,47 @@
package com.bsd.pjcloud.hard.controller.ali;
import com.bsd.pjcloud.common.security.annotation.Inner;
import com.bsd.pjcloud.hard.service.AlipayService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
@RestController
@RequiredArgsConstructor
@RequestMapping("/hard-ali-pay")
@Tag(description = "hard-ali-pay", name = "支付宝相关")
@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)
@Validated
public class AliPayController {
private final AlipayService aliPayService;
/* ************************************* start callback start ************************************* */
@Inner(value = false)
@PostMapping("/callback")
@Operation(summary = "支付宝回调")
public String refundCallback(HttpServletRequest request) {
Map<String, String[]> parameterMap = request.getParameterMap();
Map<String, String> params = new HashMap<>();
for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) {
params.put(entry.getKey(), entry.getValue()[0]);
}
return aliPayService.refundCallback(params);
}
/* ************************************* end callback end ************************************* */
}
@@ -38,5 +38,5 @@ public interface AlipayService {
/**
* 退款回调
*/
String refundCallback(HttpEntity<String> httpEntity, @RequestHeader Map<String, String> headers);
String refundCallback(Map<String, String> params);
}
@@ -5,6 +5,7 @@ import com.alipay.api.AlipayClient;
import com.alipay.api.AlipayConfig;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.*;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.*;
import com.alipay.api.response.*;
import com.bsd.pjcloud.hard.api.dto.ali.*;
@@ -12,7 +13,6 @@ import com.bsd.pjcloud.hard.config.AlipayConf;
import com.bsd.pjcloud.hard.service.AlipayService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpEntity;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
@@ -71,6 +71,7 @@ public class AlipayServiceImpl implements AlipayService {
// 支付场景
model.setScene("bar_code");
request.setBizModel(model);
request.setNotifyUrl(conf.getCallbackUrl());
try {
AlipayTradePayResponse response = alipayClient.execute(request);
String body = response.getBody();
@@ -148,6 +149,7 @@ public class AlipayServiceImpl implements AlipayService {
// 退款单号
model.setOutRequestNo(String.valueOf(dto.getRefundId()));
request.setBizModel(model);
request.setNotifyUrl(conf.getCallbackUrl());
try {
AlipayTradeRefundResponse response = alipayClient.execute(request);
String body = response.getBody();
@@ -170,6 +172,7 @@ public class AlipayServiceImpl implements AlipayService {
// 退款单号
model.setOutRequestNo(String.valueOf(dto.getRefundId()));
request.setBizModel(model);
request.setNotifyUrl(conf.getCallbackUrl());
try {
AlipayTradeFastpayRefundQueryResponse response = alipayClient.execute(request);
String body = response.getBody();
@@ -185,13 +188,19 @@ public class AlipayServiceImpl implements AlipayService {
* 退款回调
*/
@Override
public String refundCallback(HttpEntity<String> httpEntity, Map<String, String> headers) {
AlipayClient alipayClient = getClient();
public String refundCallback(Map<String, String> params) {
if (ObjectUtil.isEmpty(params)) return "fail";
try {
boolean checkSignature = AlipaySignature.rsaCheckV1(params, conf.getAlipayPublicKey(), "UTF-8", "RSA2");
if (!checkSignature) {
log.error("支付宝回调校验失败");
return "fail";
}
log.debug("支付宝回调参数:{}", params);
return "success";
} catch (Exception e) {
log.error("退款回调", e);
return "fail";
}
return "";
}
}
@@ -3,6 +3,7 @@ package com.bsd.pjcloud.hard.service.impl.order;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.extra.spring.SpringUtil;
import cn.hutool.json.JSONUtil;
import com.alipay.api.response.AlipayTradeRefundResponse;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -26,6 +27,7 @@ import com.bsd.pjcloud.hard.api.constant.refund.HardAfterSaleOperateTypeEnum;
import com.bsd.pjcloud.hard.api.constant.refund.HardRefundStatusEnum;
import com.bsd.pjcloud.hard.api.constant.refund.HardSaleStatusEnum;
import com.bsd.pjcloud.hard.api.constant.refund.HardSaleTypeEnum;
import com.bsd.pjcloud.hard.api.dto.ali.AliRefundDto;
import com.bsd.pjcloud.hard.api.dto.order.HardAdminRefundDto;
import com.bsd.pjcloud.hard.api.dto.order.HardAfterSaleDto;
import com.bsd.pjcloud.hard.api.dto.order.HardDisagreeDto;
@@ -42,6 +44,7 @@ import com.bsd.pjcloud.hard.api.vo.wechat.WechatRefundVo;
import com.bsd.pjcloud.hard.mapper.order.HardAfterSaleLogMapper;
import com.bsd.pjcloud.hard.mapper.order.HardAfterSaleMapper;
import com.bsd.pjcloud.hard.mapper.order.HardOrderMapper;
import com.bsd.pjcloud.hard.service.AlipayService;
import com.bsd.pjcloud.hard.service.HardAfterSaleService;
import com.bsd.pjcloud.hard.service.HardOrderService;
import com.bsd.pjcloud.hard.service.WechatPayService;
@@ -73,6 +76,7 @@ public class HardAfterSaleServiceImpl extends ServiceImpl<HardAfterSaleMapper, H
private final HardAfterSaleLogMapper hardAfterSaleLogMapper;
private final HardOrderService hardOrderService;
private final WechatPayService wechatPayService;
private final AlipayService alipayService;
private final HardOrderMapper hardOrderMapper;
@@ -270,7 +274,21 @@ public class HardAfterSaleServiceImpl extends ServiceImpl<HardAfterSaleMapper, H
throw new RuntimeException(refundVo.getErr_code_des());
}
} else if (isAliPay) {
throw new RuntimeException("支付宝退款暂不支持");
AliRefundDto refundDto = AliRefundDto.builder().orderId(order.getId()).refundId(afterSale.getId()).refundPrice(refundPrice).build();
AlipayTradeRefundResponse refundVo = alipayService.refund(refundDto);
if (ObjectUtil.isEmpty(refundVo) || !refundVo.isSuccess()) {
throw new RuntimeException("支付宝退款错误");
}
// 售后成功
HardOrderEntity updateObj = HardOrderEntity.builder()
.id(order.getId())
.orderStatus(HardOrderStatusEnum.REFUND.getType())
.refundStatus(HardRefundStatusEnum.SUCCESS.getStatus())
.payRefundId(order.getId())
.refundPrice(order.getPayPrice())
.refundTime(LocalDateTime.now())
.build();
hardOrderService.updateById(updateObj);
}
}
@@ -324,14 +324,14 @@ public class HardOrderServiceImpl extends ServiceImpl<HardOrderMapper, HardOrder
}
// 支付宝支付
if (isAliPay) {
AliMicropayDto wechatPayDto = AliMicropayDto.builder().merId(orderObj.getMerchantId()).orderId(orderObj.getId()).price(payPrice).authCode(String.valueOf(dto.getOrderSourceTypeId())).build();
AliMicropayDto wechatPayDto = AliMicropayDto.builder().merId(orderObj.getMerchantId()).orderId(orderObj.getId()).price(payPrice).subject(subject).authCode(String.valueOf(dto.getOrderSourceTypeId())).build();
AlipayTradePayResponse micropay = alipayService.micropay(wechatPayDto);
boolean success = micropay.isSuccess();
if (!success) {
if (ObjectUtil.isEmpty(micropay) || !micropay.isSuccess()) {
// 如果支付宝支付订单返回不明确(不是支付成功)直接撤销支付
alipayService.reverse(AliReverseDto.builder().orderId(orderObj.getId()).build());
throw new RuntimeException(micropay.getSubMsg());
} else {
orderObj.setOrderNo(micropay.getTradeNo());
getSelf().orderSuccess(orderObj, Boolean.TRUE);
}
}
@@ -694,6 +694,9 @@ public class HardOrderServiceImpl extends ServiceImpl<HardOrderMapper, HardOrder
// 订单表订单状态
Integer payPrice = isWalletPay ? order.getTotalPrice() + order.getExtraPrice() : 0;
HardOrderEntity update = HardOrderEntity.builder().id(order.getId()).payTime(LocalDateTime.now()).orderStatus(HardOrderStatusEnum.PAY.getType()).payPrice(payPrice).build();
if (ObjectUtil.isNotEmpty(order.getOrderNo())) {
update.setOrderNo(order.getOrderNo());
}
baseMapper.updateById(update);
// 父购物车订单表订单状态
if (ObjectUtil.isNotEmpty(order.getParentCarId())) {
@@ -36,5 +36,8 @@ spring:
ali-pay:
app-id: 2021005157648588
private-key: MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCJYA4MxEy5rmAJwUw1A7Izxr7EyF0Q1iKZ7mFqzC6skLysXPGNbC2LDE1dPi0580YFjE2E+e9T7FlU4cZH3oAUw8UpQ4Eh/MRVnsW6rTKO+kYB2bvMyehIS9/I/eg3PjBWtjG6a2a9kP1ijcKP4E90Yxc7W6yoCxF7XeWp0Qvw/sxhqglEfJZlms5L/FIpY1uMNuPeQCkTo5/mk13rB9L0R2p36EJkiPNwGpv8yiUoIAfGNYiqLcelccukZVmLhEBNSGBAdVnoz/bYzzRwHJyw63/bGsw7Rz3debm73Izs5dWEWDHGaz7dA3bNaOgMGsq47DGsbbaUNfZ5V+QBqytPAgMBAAECggEANAhc6fsEMKRanfdIHSBsQ+44XaKilXj2HCXNYj06RISB4itGFtHtoigjuXiOes+pKvrMddyRCNGRuHPXvWsKSlMof4uhArWRy/haXm2xo7QqBhNpbZTgVVnfxmpdpWb5ui5CQaDihlS/lK+rDQHiNmw95W7Aw9mFYpvbHGogwsPAzBew33x/3XPm9mAJodEi+Uw5JG3IDlVeNeXL+E6ZkO6iCfURwORPmTZDHLACoO/EM3zOd2IiH0buY/sosw3LYyALFeQi8uzjevIw7cbQnXGHTSmb+zwmlJYVCaJA04JYN8CtAdmpTl00J7lNLNA3QiFN42GTdGTyf3xADTiI4QKBgQDRU7+riJfMXmHuXomBiD9qK9eQZfTqwrT8LLYgGPohLfP42YeFydGUsC2RWhNKAr//fE2dpo+SoUJ6HligkG5vup2/cyLEyROKQhgegp+GzHjVh8hkDjoZSZk8bs/Kv3X7s2heQdEedQHzZTCSfkhMYxAiU3a8Wdsnw01tDh1qPwKBgQCoAVbBnRsC6lEy5zgs0apgDR+oxb7WRvnK6ao8E5jesVY/z58U93iMaQzvtXZLFYJ3U4nIAoIhPffWfYE+CYIOPDqLSi4Teni8VKdES5ubpkeR4wY+a5FGcCAKycW/pztcQ7YjQLcDAOwL69cik1iSgQtytNQMiKro5tWYN2Ba8QKBgAqMxQE5LiVfsGHaI+YCXufT89ZUPSbDz2lSO4+ckqavcTdeh0UH6ecrhfBocMZvIwwWULccWOoT9IzBEMhu3xIEfsTSYbM3SyPRtvN6s92QWpqwcDoSuXzix7VTBGf8hE6+OQlfGdIGJaYFuI/5i11GNN72A+r0QGZdon5XksXzAoGAeT3WHQ1Ck/0DMif4uydnu79czJBAIyS/WXb9OjOuS29Q3eX4WMoqfbHF+ytKPe884t4vfV6KCHFO7MRPw7Ra3ekLGsAitj3Y6ZhxyXCC0HXUCmz6cYtxIJMEHKT2B1QpG3Fl/NTT/d/peMTu0W3iKn/kAhiLOqxaIo+LLzkvWRECgYBtl1uraKNnnS3kuVPNWDyyuDBJHutYSlvZ5n2825Nvjm2yoInAo++YbRIAmIOw7r4OpJdUZdGi1Agm/+c1Dg19Qoi+PxfHY04J5bUb4UNyODsyNGKHYHKoksl14lyUnYAih5i5xa+WO+Ss2f0HaAJ+i6Eja121yGFVIKWK2OmxNg==
alipay-public-key: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAiWAODMRMua5gCcFMNQOyM8a+xMhdENYime5haswurJC8rFzxjWwtiwxNXT4tOfNGBYxNhPnvU+xZVOHGR96AFMPFKUOBIfzEVZ7Fuq0yjvpGAdm7zMnoSEvfyP3oNz4wVrYxumtmvZD9Yo3Cj+BPdGMXO1usqAsRe13lqdEL8P7MYaoJRHyWZZrOS/xSKWNbjDbj3kApE6Of5pNd6wfS9Edqd+hCZIjzcBqb/MolKCAHxjWIqi3HpXHLpGVZi4RATUhgQHVZ6M/22M80cBycsOt/2xrMO0c93Xm5u9yM7OXVhFgxxms+3QN2zWjoDBrKuOwxrG22lDX2eVfkAasrTwIDAQAB
private-key: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDa2GemYsE0HExDX8tEu7kt3cVPkPyJPgZklkyMmpI1uTBsA8qcKBoS88feD/Q+f3s6etGoBxTiln3vBVZBMGGwpL8bcxGu1ILcea8PBOsKfdRFF6wN4DsLtVL+6O2kK9SDOqZkQt/bEVE3tXljxtQ+igU0raZWISQXWCwekyzg4CQLfMBoJj0/JF4Zpiw2dYvBRKgEnR8H7pzCARJuN7B3G4NWrfyRyFn6+i+oDmFcwD2ewwQ8gX9He7mqgn+/ciLRgm/yh0orKKfECFfQUH3tZVW59QU7YAXtyPdpTGCptZkM5prh9bCGVKoOn7S05FRyUJxRD9dEen8pyVMOhSMRAgMBAAECggEAfrHsB7qCaZ28VQD/V9JqGXCbiz2/xeB/qPoOZRQTc0C8FLx5LsBUoAY7/oYz+36oI6n4+JLo92jyjU8EqYbN94rZDJYodZOYEvXrcAGD5TYFjt5ugDYBWPzniKXm9jVduX9Z1w+UM2oqH9tS5H22YGJdMysY8iILl+w21piT0bc+yHPhaKuEVbeTVtf3F7F4MXDgfF1NQ5GEpUpSW0oqkEloVSZ1mpecnJ+AwfUUdogYgW91qxxGVY9+SapEFFoK1TnUwRFMXIC+aBLT8RQZA2t+0oCbvz1r95Vu115bZYWpqWCLs3y/0LeVpC7KeL6evN/s27FA96zPJ/fd4azrdQKBgQD+AC3szrCiq2kYGn5OEbrp6l4K8F7UuY8HCWiYisIZf3524r4sBXkeKSHkaRDXvKiu6CuznSHamZiR9L28KFxQDUFvX5aZ8tmN5UXDmY7BdeLjpFz8mkyndY02fox8A4D4TtTgwJUYjFRG0Mnraoi7adEmwl6xocxJokFLkltDnwKBgQDckWLagUcKYOlNocAkQ4973bxC2+sLWsNPC1FlQEdWfJ+g8bAdaAxHVfae3Mp/gBDDPolJW8yyeockmTQW+eKp9P+x8QETH5zzxO++0ucn/RUxAajOTLZ6MAcUxiTgBzRiPeVSi5qjiBV2v+Z2FDQFgalougCUKDKscFxlNVabTwKBgQD75G+m9b9EQxtBFR0HDRxBV/SVgpV4/uBxyQnapVkickaXXfvcqjzYBVCgNPXIDUd31bVpNb5aDJK6xGzZSWlq1gp7id9Pov/PcX0DIqjpAKDWwqyYseis9a3qSgvF/K+NEJian0H9C0WUyQBGH+ujeKg7eOzx2hQ/PdLlQCqT3wKBgHl3SyQfy3qIshKBgCm4Vv0UuEdtirwfCK2wAuwqgN69FL9yOdWH5jMmwQDtgErEwPZ0qvAOMOUdGu1pvUjl5hBIjsN0gG4Cm9GW45yH0qqv8gqh6k9p6ZfSeSPUlpwU+6Eaiv5xSQDDwWY6+fSO3bMmm5/DxuvQU0+pNQi7Xe17AoGADeD3zYf1/XtlmwsVEdA/UhsXitntvB9fRlOcjE0LYif6liHrwo1AG+8taMZ3wQ7E834/plM92ZBnrgwFWc5yAqr5b9RJ72cTOVcnMpLD5w83C+SuUtU71awfBuZ7KPTGzV1coa/JTGKlIAlgCJEPktC90cGuPFLHq993UDSkzrA=
public-key: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2thnpmLBNBxMQ1/LRLu5Ld3FT5D8iT4GZJZMjJqSNbkwbAPKnCgaEvPH3g/0Pn97OnrRqAcU4pZ97wVWQTBhsKS/G3MRrtSC3HmvDwTrCn3URResDeA7C7VS/ujtpCvUgzqmZELf2xFRN7V5Y8bUPooFNK2mViEkF1gsHpMs4OAkC3zAaCY9PyReGaYsNnWLwUSoBJ0fB+6cwgESbjewdxuDVq38kchZ+vovqA5hXMA9nsMEPIF/R3u5qoJ/v3Ii0YJv8odKKyinxAhX0FB97WVVufUFO2AF7cj3aUxgqbWZDOaa4fWwhlSqDp+0tORUclCcUQ/XRHp/KclTDoUjEQIDAQAB
alipay-public-key: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqnCB+N172m5gxf1Rolfx5LErSiVwQCh0XQdDrVy6aTuVF5EtdqahSHtADyEPsBWudMBhzCfqpoZvfnvH7a+PED6uZ3DoXt7ETh8TmNM5yc+WTnD8pSphQvuHDJ3zMks489KNxiX6sXag71k9H1MXklJGPOUaljHqy/QlRn2ZLT7pFgaFH9LEcVoQBPIOurUn95078h848RFD30jZFW3fakxUGAGVVZaHH62z5OEWOmcA+CwxsEDMa1XMt02RGXgAAq4WOj+BqOGiFmhM8rnrUMchTyvx4umOzGvbF2Y9irN3aBZ5lfg+bzYcJpIOMzlM/V00LnEWzCblJzXNyH4hJQIDAQAB
callback-url: https://rj4jv5rwqs.by.takin.cc/hard/hard-ali-pay/callback
# callback-url: https://stgl.pj.gov.cn/api/hard/hard-ali-pay/callback
@@ -46,7 +46,6 @@
<select id="getSupermarketUnitsWithSpu" resultMap="SupermarketUnitWithSpuVoMap">
SELECT u.id,
s.product_code,
s.barCode,
s.pic_url,
s.product_name,
s.unit,