feat:完成付款码支付

This commit is contained in:
dzc committed 2025-06-06 15:43:31 +08:00
1 parent aeb1c0ca87
commit 84c10d7f4f
11 files changed
+167 -69

No files matched your search

@@ -0,0 +1,21 @@
package com.bsd.pjcloud.hard.api.dto.wechat;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 撤销订单入参
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class WechantReverseDto {
private Long orderId;
private String wechantOrderId;
}
@@ -1,8 +1,14 @@
package com.bsd.pjcloud.hard.api.dto.wechat;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class WechatMicropayDto {
/**
@@ -18,7 +24,7 @@ public class WechatMicropayDto {
/**
* 支付金额(分)
*/
private Long price;
private Integer price;
/**
* 微信付款码code
@@ -1,11 +1,17 @@
package com.bsd.pjcloud.hard.api.dto.wechat;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 退款入参
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class WechatRefundDto {
private String orderId;
@@ -0,0 +1,44 @@
package com.bsd.pjcloud.hard.api.vo.wechat;
import cn.hutool.core.util.ObjectUtil;
import lombok.Data;
/**
* 撤销订单返回
*/
@Data
public class WechantReverseVo {
public static final String SUCCESS = "SUCCESS";
private String return_code;
private String return_msg;
private String appid;
private String mch_id;
private String nonce_str;
private String sign;
private String result_code;
private String err_code;
private String err_code_des;
private String recall;
public boolean isHttpSucess() {
return ObjectUtil.equals(WechatMicropayVo.SUCCESS, return_code);
}
public boolean isPaySucess() {
return ObjectUtil.equals(WechatMicropayVo.SUCCESS, result_code);
}
public boolean isAllSuccess() {
return isHttpSucess() && isPaySucess();
}
}
@@ -35,6 +35,9 @@ public interface HardOrderService extends IService<HardOrderEntity> {
HardOrderVo join(Long id);
/**
* 创建订单
*/
Long createOrder(HardCreateOrderDto dto);
/**
@@ -1,14 +1,8 @@
package com.bsd.pjcloud.hard.service;
import com.bsd.pjcloud.hard.api.dto.wechat.WechatMicropayDto;
import com.bsd.pjcloud.hard.api.dto.wechat.WechatQueryDto;
import com.bsd.pjcloud.hard.api.dto.wechat.WechatRefundDto;
import com.bsd.pjcloud.hard.api.dto.wechat.WechatRefundQueryDto;
import com.bsd.pjcloud.hard.api.vo.wechat.WechatMicropayVo;
import com.bsd.pjcloud.hard.api.vo.wechat.WechatQueryVo;
import com.bsd.pjcloud.hard.api.vo.wechat.WechatRefundQueryVo;
import com.bsd.pjcloud.hard.api.vo.wechat.WechatRefundVo;
import com.bsd.pjcloud.hard.api.dto.wechat.*;
import com.bsd.pjcloud.hard.api.vo.wechat.*;
import org.springframework.http.HttpEntity;
import org.springframework.web.bind.annotation.RequestHeader;
@@ -29,6 +23,11 @@ public interface WechatPayService {
*/
WechatQueryVo query(WechatQueryDto dto);
/**
* 撤销订单
*/
WechantReverseVo reverse(WechantReverseDto dto);
/**
* 申请退款
*/
@@ -34,6 +34,9 @@ import com.bsd.pjcloud.hard.api.dto.order.HardCreateCarDto;
import com.bsd.pjcloud.hard.api.dto.order.HardOrderDto;
import com.bsd.pjcloud.hard.api.dto.order.app.HardAppCreateOrderDto;
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.dto.wechat.WechatRefundDto;
import com.bsd.pjcloud.hard.api.entity.HardApptEntity;
import com.bsd.pjcloud.hard.api.entity.manager.HardManagerEntity;
import com.bsd.pjcloud.hard.api.entity.order.HardCarEntity;
@@ -45,6 +48,9 @@ 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.HardOrderVo;
import com.bsd.pjcloud.hard.api.vo.wechat.WechantReverseVo;
import com.bsd.pjcloud.hard.api.vo.wechat.WechatMicropayVo;
import com.bsd.pjcloud.hard.api.vo.wechat.WechatRefundVo;
import com.bsd.pjcloud.hard.mapper.manager.HardManagerMapper;
import com.bsd.pjcloud.hard.mapper.order.HardOrderMapper;
import com.bsd.pjcloud.hard.service.*;
@@ -105,6 +111,7 @@ public class HardOrderServiceImpl extends ServiceImpl<HardOrderMapper, HardOrder
private final HardBroadcastService hardBroadcastService;
private final HardSpuService hardSpuService;
private final HardApptService hardApptService;
private final WechatPayService wechatPayService;
private final RemoteMchService remoteMchService;
private final RemoteCodeUseService remoteCodeUseService;
@@ -283,7 +290,7 @@ public class HardOrderServiceImpl extends ServiceImpl<HardOrderMapper, HardOrder
}
baseMapper.insert(orderObj);
// 扣减库存
getSelf().fastenerInventory(orderObj, YesNoEnum.YES);
// getSelf().fastenerInventory(orderObj, YesNoEnum.YES);
// 钱包支付或者核销
if (isVerify || isWalletPay) {
// 钱包扣款
@@ -293,11 +300,24 @@ public class HardOrderServiceImpl extends ServiceImpl<HardOrderMapper, HardOrder
}
// 微信支付
if (isWeChatPay) {
WechatMicropayDto wechatPayDto = WechatMicropayDto.builder().merId(orderObj.getMerchantId()).orderId(orderObj.getId()).price(payPrice).wechatQrCode(String.valueOf(dto.getOrderSourceTypeId())).build();
wechatPayDto.setPrice(1);
WechatMicropayVo wechatPayVo = wechatPayService.micropay(wechatPayDto);
if (ObjectUtil.isEmpty(wechatPayVo)) {
throw new RuntimeException("微信支付失败");
}
boolean wehcantPaySuccess = wechatPayVo.isAllSuccess();
if (!wehcantPaySuccess) {
// 如果微信支付订单返回不明确(不是支付成功)直接撤销支付
wechatPayService.reverse(WechantReverseDto.builder().orderId(orderObj.getId()).build());
throw new RuntimeException(wechatPayVo.getErr_code_des());
} else {
getSelf().orderSuccess(orderObj, isWalletPay);
}
}
// 支付宝支付
if (isAliPay) {
throw new RuntimeException("支付宝支付失败");
}
// 发送mq消息
getSelf().createOrderAfterSendMqMsg(orderObj.getId(), userDetail);
@@ -6,10 +6,7 @@ import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.XmlUtil;
import cn.hutool.json.JSONUtil;
import com.bsd.pjcloud.hard.api.dto.wechat.WechatMicropayDto;
import com.bsd.pjcloud.hard.api.dto.wechat.WechatQueryDto;
import com.bsd.pjcloud.hard.api.dto.wechat.WechatRefundDto;
import com.bsd.pjcloud.hard.api.dto.wechat.WechatRefundQueryDto;
import com.bsd.pjcloud.hard.api.dto.wechat.*;
import com.bsd.pjcloud.hard.api.vo.wechat.*;
import com.bsd.pjcloud.hard.config.WechatPay;
import com.bsd.pjcloud.hard.service.WechatPayService;
@@ -224,6 +221,49 @@ public class WechatPayServiceImpl implements WechatPayService {
}
}
/**
* 撤销订单
*/
@Override
public WechantReverseVo reverse(WechantReverseDto dto) {
try {
Map<String, Object> params = new HashMap<>();
// 公众账号ID
params.put("appid", wechatPay.getAppId());
// 商户号
params.put("mch_id", wechatPay.getMerchantId());
// 微信订单号
params.put("transaction_id", dto.getWechantOrderId());
// 商户订单号
params.put("out_trade_no", dto.getOrderId());
// 随机字符串
params.put("nonce_str", getNonceStr());
// 签名
params.put("sign", "");
// 签名类型
params.put("sign_type", "MD5");
// 生成签名
params.put("sign", generateSign(params));
WechantPayConstant.Api api = initApi(WechantPayConstant.REVERSE);
api.setSslSocketFactory(createSSLSocketFactory());
String res = api.getHttpRequest().body(XmlUtil.mapToXmlStr(params)).execute().body();
log.debug("撤销订单,json,xml|{}", res);
if (ObjectUtil.isEmpty(res)) {
log.error("撤销订单,res为空");
return null;
}
WechantReverseVo vo = JSONUtil.toBean(JSONUtil.toJsonStr(XmlUtil.xmlToMap(res)), WechantReverseVo.class);
log.debug("撤销订单,json,res|{}", JSONUtil.toJsonStr(vo));
if (!vo.isHttpSucess()) {
return null;
}
return vo;
} catch (Exception e) {
log.error("撤销订单,异常", e);
return null;
}
}
/**
* 申请退款
*/
@@ -19,7 +19,7 @@ public class WechantPayConstant {
public static final Api QUERY = Api.builder().summary("查询订单").url("/pay/orderquery").method(HttpMethod.POST).isNeedCertificate(false).build();
public static final Api REVERSE = Api.builder().summary("撤销订单").url("/pay/reverse").method(HttpMethod.POST).isNeedCertificate(false).build();
public static final Api REVERSE = Api.builder().summary("撤销订单").url("/secapi/pay/reverse").method(HttpMethod.POST).isNeedCertificate(true).build();
public static final Api REFUND = Api.builder().summary("申请退款").url("/secapi/pay/refund").method(HttpMethod.POST).isNeedCertificate(true).build();
@@ -1,15 +1,14 @@
package com.bsd.pjcloud.wallet;
package hard.com.bsd.pjcloud.hard;
import cn.hutool.json.JSONUtil;
import com.bsd.pjcloud.thirdparty.dto.lb.LbH5LoginDto;
import com.bsd.pjcloud.thirdparty.vo.lb.LbH5LoginVo;
import com.bsd.pjcloud.wallet.api.dto.wechat.WechatMicropayDto;
import com.bsd.pjcloud.wallet.api.dto.wechat.WechatQueryDto;
import com.bsd.pjcloud.wallet.api.dto.wechat.WechatRefundDto;
import com.bsd.pjcloud.wallet.api.vo.wechat.WechatMicropayVo;
import com.bsd.pjcloud.wallet.api.vo.wechat.WechatQueryVo;
import com.bsd.pjcloud.wallet.api.vo.wechat.WechatRefundVo;
import com.bsd.pjcloud.wallet.service.WechatPayService;
import com.bsd.pjcloud.hard.HardApp;
import com.bsd.pjcloud.hard.api.dto.wechat.WechatMicropayDto;
import com.bsd.pjcloud.hard.api.dto.wechat.WechatQueryDto;
import com.bsd.pjcloud.hard.api.dto.wechat.WechatRefundDto;
import com.bsd.pjcloud.hard.api.vo.wechat.WechatMicropayVo;
import com.bsd.pjcloud.hard.api.vo.wechat.WechatQueryVo;
import com.bsd.pjcloud.hard.api.vo.wechat.WechatRefundVo;
import com.bsd.pjcloud.hard.service.WechatPayService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
@@ -19,7 +18,7 @@ import org.springframework.boot.test.context.SpringBootTest;
* 微信支付配置
*/
@Slf4j
@SpringBootTest(classes = WalletApp.class)
@SpringBootTest(classes = HardApp.class)
public class WechatPayTest {
@Resource
@@ -32,7 +31,7 @@ public class WechatPayTest {
WechatMicropayDto dto = new WechatMicropayDto();
dto.setMerId(currentTimeMillis);
dto.setOrderId(currentTimeMillis);
dto.setPrice(1L);
dto.setPrice(1);
dto.setWechatQrCode("132796932599913148");
WechatMicropayVo micropay = wechatPayService.micropay(dto);
@@ -1,40 +0,0 @@
package com.bsd.pjcloud.wallet.controller.wechant;
import com.bsd.pjcloud.common.core.util.R;
import com.bsd.pjcloud.common.security.annotation.Inner;
import com.bsd.pjcloud.wallet.api.dto.WalletActiveDto;
import com.bsd.pjcloud.wallet.service.WechatPayService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springdoc.core.annotations.ParameterObject;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
@RestController
@RequiredArgsConstructor
@RequestMapping("/wallet-wechant-pay")
@Tag(description = "wallet-wechant", name = "微信相关")
@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)
@Validated
public class WechantPayController {
private final WechatPayService wechatPayService;
/* ************************************* start callback start ************************************* */
@Inner(value = false)
@PostMapping("/callback/refund")
@Operation(summary = "微信退款回调")
public String refundCallback(HttpEntity<String> httpEntity, @RequestHeader Map<String, String> headers) {
return wechatPayService.refundCallback(httpEntity, headers);
}
/* ************************************* end callback end ************************************* */
}