feat:完成付款码支付
This commit is contained in:
1 parent
aeb1c0ca87
commit
84c10d7f4f
11 files changed
+167
-69
No files matched your search
+21
@@ -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;
|
||||
|
||||
}
|
||||
+7
-1
@@ -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
|
||||
|
||||
+6
@@ -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;
|
||||
|
||||
+44
@@ -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();
|
||||
}
|
||||
}
|
||||
+3
@@ -35,6 +35,9 @@ public interface HardOrderService extends IService<HardOrderEntity> {
|
||||
|
||||
HardOrderVo join(Long id);
|
||||
|
||||
/**
|
||||
* 创建订单
|
||||
*/
|
||||
Long createOrder(HardCreateOrderDto dto);
|
||||
|
||||
/**
|
||||
|
||||
+7
-8
@@ -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);
|
||||
|
||||
/**
|
||||
* 申请退款
|
||||
*/
|
||||
|
||||
+23
-3
@@ -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);
|
||||
|
||||
+44
-4
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 申请退款
|
||||
*/
|
||||
|
||||
+1
-1
@@ -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();
|
||||
|
||||
|
||||
+11
-12
@@ -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);
|
||||
-40
@@ -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 ************************************* */
|
||||
|
||||
}
|
||||
Reference in new issue
Block a user