diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/ali/AliMicropayDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/ali/AliMicropayDto.java new file mode 100644 index 000000000..ffb329347 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/ali/AliMicropayDto.java @@ -0,0 +1,42 @@ +package com.bsd.pjcloud.hard.api.dto.ali; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 付款码支付入参 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class AliMicropayDto { + + /** + * 商户id + */ + private Long merId; + + /** + * 订单id + */ + private Long orderId; + + /** + * 订单支付金额(分) + */ + private Integer price; + + /** + * 订单标题 + */ + private String subject; + + /** + * 支付授权码 + */ + private String authCode; + +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/ali/AliQueryDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/ali/AliQueryDto.java new file mode 100644 index 000000000..89ce8e49a --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/ali/AliQueryDto.java @@ -0,0 +1,24 @@ +package com.bsd.pjcloud.hard.api.dto.ali; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class AliQueryDto { + + /** + * 订单id + */ + private String orderId; + + /** + * 阿里订单id + */ + private String aliOrderId; + +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/ali/AliRefundDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/ali/AliRefundDto.java new file mode 100644 index 000000000..5b1e35497 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/ali/AliRefundDto.java @@ -0,0 +1,37 @@ +package com.bsd.pjcloud.hard.api.dto.ali; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 支付宝退款入参 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class AliRefundDto { + + /** + * 退款金额(分) + */ + private Integer refundPrice; + + /** + * 订单id + */ + private Long orderId; + + /** + * 支付宝订单id + */ + private String aliOrderId; + + /** + * 退款id + */ + private Long refundId; + +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/ali/AliRefundQueryDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/ali/AliRefundQueryDto.java new file mode 100644 index 000000000..c3c04de84 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/ali/AliRefundQueryDto.java @@ -0,0 +1,22 @@ +package com.bsd.pjcloud.hard.api.dto.ali; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 支付宝退款查询入参 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class AliRefundQueryDto { + + /** + * 退款单号 + */ + private Long refundId; + +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/ali/AliReverseDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/ali/AliReverseDto.java new file mode 100644 index 000000000..ccd23a257 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/ali/AliReverseDto.java @@ -0,0 +1,25 @@ +package com.bsd.pjcloud.hard.api.dto.ali; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 支付宝订单撤销入参 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class AliReverseDto { + /** + * 订单id + */ + private Long orderId; + + /** + * 阿里订单id + */ + private String aliOrderId; +} diff --git a/pjcloud-hardware/pjcloud-hardware-biz/pom.xml b/pjcloud-hardware/pjcloud-hardware-biz/pom.xml index 240860ee9..e704d33a7 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/pom.xml +++ b/pjcloud-hardware/pjcloud-hardware-biz/pom.xml @@ -160,6 +160,11 @@ 2.12.7 compile + + com.alipay.sdk + alipay-sdk-java + 4.40.251.ALL + diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/config/AlipayConf.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/config/AlipayConf.java new file mode 100644 index 000000000..c0d7c82ed --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/config/AlipayConf.java @@ -0,0 +1,30 @@ +package com.bsd.pjcloud.hard.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * 支付宝支付配置 + */ +@Component +@ConfigurationProperties(prefix = "ali-pay") +@Data +public class AlipayConf { + + /** + * 应用ID + */ + private String appId; + + /** + * 私钥 + */ + private String privateKey; + + /** + * 公钥 + */ + private String alipayPublicKey; + +} diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/AlipayService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/AlipayService.java new file mode 100644 index 000000000..1490154e5 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/AlipayService.java @@ -0,0 +1,42 @@ +package com.bsd.pjcloud.hard.service; + + +import com.alipay.api.response.*; +import com.bsd.pjcloud.hard.api.dto.ali.*; +import org.springframework.http.HttpEntity; +import org.springframework.web.bind.annotation.RequestHeader; + +import java.util.Map; + +public interface AlipayService { + + /** + * 付款码支付 + */ + AlipayTradePayResponse micropay(AliMicropayDto dto); + + /** + * 查询订单 + */ + AlipayTradeQueryResponse query(AliQueryDto dto); + + /** + * 撤销订单 + */ + AlipayTradeCancelResponse reverse(AliReverseDto dto); + + /** + * 申请退款 + */ + AlipayTradeRefundResponse refund(AliRefundDto dto); + + /** + * 查询退款 + */ + AlipayTradeFastpayRefundQueryResponse refundQuery(AliRefundQueryDto dto); + + /** + * 退款回调 + */ + String refundCallback(HttpEntity httpEntity, @RequestHeader Map headers); +} diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/ali/AlipayServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/ali/AlipayServiceImpl.java new file mode 100644 index 000000000..b25b64275 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/ali/AlipayServiceImpl.java @@ -0,0 +1,197 @@ +package com.bsd.pjcloud.hard.service.impl.ali; + +import cn.hutool.core.util.ObjectUtil; +import com.alipay.api.AlipayClient; +import com.alipay.api.AlipayConfig; +import com.alipay.api.DefaultAlipayClient; +import com.alipay.api.domain.*; +import com.alipay.api.request.*; +import com.alipay.api.response.*; +import com.bsd.pjcloud.hard.api.dto.ali.*; +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; +import java.math.RoundingMode; +import java.util.Map; + +/** + * 支付宝支付 + */ +@Service +@AllArgsConstructor +@Slf4j +public class AlipayServiceImpl implements AlipayService { + + private final AlipayConf conf; + + static private AlipayClient client = null; + + private void initClient() { + AlipayConfig alipayConfig = new AlipayConfig(); + alipayConfig.setServerUrl("https://openapi.alipay.com/gateway.do"); + alipayConfig.setAppId(conf.getAppId()); + alipayConfig.setPrivateKey(conf.getPrivateKey()); + alipayConfig.setFormat("json"); + alipayConfig.setCharset("UTF-8"); + alipayConfig.setAlipayPublicKey(conf.getAlipayPublicKey()); + alipayConfig.setSignType("RSA2"); + try { + AlipayServiceImpl.client = new DefaultAlipayClient(alipayConfig); + } catch (Exception e) { + log.error("初始化支付宝客户端异常", e); + } + } + + private AlipayClient getClient() { + if (ObjectUtil.isEmpty(AlipayServiceImpl.client)) initClient(); + return AlipayServiceImpl.client; + } + + /** + * 付款码支付 + */ + public AlipayTradePayResponse micropay(AliMicropayDto dto) { + AlipayClient alipayClient = getClient(); + AlipayTradePayRequest request = new AlipayTradePayRequest(); + AlipayTradePayModel model = new AlipayTradePayModel(); + BigDecimal payPrice = BigDecimal.valueOf(dto.getPrice()).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP); + // 订单号 + model.setOutTradeNo(String.valueOf(dto.getOrderId())); + // 支付金额单位元 + model.setTotalAmount(payPrice.toString()); + // 订单标题 + model.setSubject(dto.getSubject()); + // 支付授权码 + model.setAuthCode(dto.getAuthCode()); + // 支付场景 + model.setScene("bar_code"); + request.setBizModel(model); + try { + AlipayTradePayResponse response = alipayClient.execute(request); + String body = response.getBody(); + log.debug("申请退款,json|{}", body); + return response; + } catch (Exception e) { + log.error("支付宝支付异常", e); + return null; + } + } + + /** + * 查询订单 + */ + @Override + public AlipayTradeQueryResponse query(AliQueryDto dto) { + AlipayClient alipayClient = getClient(); + AlipayTradeQueryRequest request = new AlipayTradeQueryRequest(); + AlipayTradeQueryModel model = new AlipayTradeQueryModel(); + // 订单号 + model.setOutTradeNo(dto.getOrderId()); + // 支付宝订单号 + model.setTradeNo(dto.getAliOrderId()); + request.setBizModel(model); + try { + AlipayTradeQueryResponse response = alipayClient.execute(request); + String body = response.getBody(); + log.debug("查询订单,json|{}", body); + return response; + } catch (Exception e) { + log.error("查询订单异常", e); + } + return null; + } + + /** + * 撤销订单 + */ + @Override + public AlipayTradeCancelResponse reverse(AliReverseDto dto) { + AlipayClient alipayClient = getClient(); + AlipayTradeCancelRequest request = new AlipayTradeCancelRequest(); + AlipayTradeCancelModel model = new AlipayTradeCancelModel(); + // 订单号 + model.setOutTradeNo(String.valueOf(dto.getOrderId())); + // 支付宝订单号 + model.setTradeNo(dto.getAliOrderId()); + request.setBizModel(model); + try { + AlipayTradeCancelResponse response = alipayClient.execute(request); + String body = response.getBody(); + log.debug("撤销订单,json|{}", body); + return response; + } catch (Exception e) { + log.error("撤销订单", e); + } + return null; + } + + /** + * 申请退款 + */ + @Override + public AlipayTradeRefundResponse refund(AliRefundDto dto) { + AlipayClient alipayClient = getClient(); + AlipayTradeRefundRequest request = new AlipayTradeRefundRequest(); + AlipayTradeRefundModel model = new AlipayTradeRefundModel(); + BigDecimal refundPrice = BigDecimal.valueOf(dto.getRefundPrice()).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP); + // 退款金额(元) + model.setRefundAmount(String.valueOf(refundPrice)); + // 订单号 + model.setOutTradeNo(String.valueOf(dto.getOrderId())); + // 支付宝订单id + model.setTradeNo(dto.getAliOrderId()); + // 退款单号 + model.setOutRequestNo(String.valueOf(dto.getRefundId())); + request.setBizModel(model); + try { + AlipayTradeRefundResponse response = alipayClient.execute(request); + String body = response.getBody(); + log.debug("申请退款,json|{}", body); + return response; + } catch (Exception e) { + log.error("申请退款", e); + } + return null; + } + + /** + * 查询退款 + */ + @Override + public AlipayTradeFastpayRefundQueryResponse refundQuery(AliRefundQueryDto dto) { + AlipayClient alipayClient = getClient(); + AlipayTradeFastpayRefundQueryRequest request = new AlipayTradeFastpayRefundQueryRequest(); + AlipayTradeFastpayRefundQueryModel model = new AlipayTradeFastpayRefundQueryModel(); + // 退款单号 + model.setOutRequestNo(String.valueOf(dto.getRefundId())); + request.setBizModel(model); + try { + AlipayTradeFastpayRefundQueryResponse response = alipayClient.execute(request); + String body = response.getBody(); + log.debug("查询退款,json|{}", body); + return response; + } catch (Exception e) { + log.error("查询退款", e); + } + return null; + } + + /** + * 退款回调 + */ + @Override + public String refundCallback(HttpEntity httpEntity, Map headers) { + AlipayClient alipayClient = getClient(); + try { + + } catch (Exception e) { + log.error("退款回调", e); + } + return ""; + } +} diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderServiceImpl.java index 9d73f71cf..a297f7cc4 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderServiceImpl.java @@ -4,6 +4,7 @@ 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.AlipayTradePayResponse; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -27,6 +28,8 @@ 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; import com.bsd.pjcloud.hard.api.constant.order.HardPayTypeEnum; +import com.bsd.pjcloud.hard.api.dto.ali.AliMicropayDto; +import com.bsd.pjcloud.hard.api.dto.ali.AliReverseDto; import com.bsd.pjcloud.hard.api.dto.manager.HardManagerDto; import com.bsd.pjcloud.hard.api.dto.hard.HandCancelCodeDto; import com.bsd.pjcloud.hard.api.dto.hard.HardCreateOrderDto; @@ -36,7 +39,6 @@ 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; @@ -48,9 +50,7 @@ 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.*; @@ -112,6 +112,7 @@ public class HardOrderServiceImpl extends ServiceImpl