|
@@ -0,0 +1,122 @@
|
|
|
+package cn.sikey.pay.service.razorpay;
|
|
|
+
|
|
|
+import cn.hutool.core.util.StrUtil;
|
|
|
+import cn.sikey.framework.common.exception.ServiceException;
|
|
|
+import cn.sikey.framework.common.pojo.CommonResult;
|
|
|
+import cn.sikey.hmd.api.hmd.vo.payments.PaymentsRespVO;
|
|
|
+import cn.sikey.hmd.api.hmd.vo.plans.PlansRespVO;
|
|
|
+import cn.sikey.order.api.order.OrderApi;
|
|
|
+import cn.sikey.order.api.order.vo.GenerateOrderReqVO;
|
|
|
+import cn.sikey.pay.config.RazorpayConfig;
|
|
|
+import cn.sikey.pay.enums.PayStatusEnum;
|
|
|
+import cn.sikey.pay.service.AbstractPaymentService;
|
|
|
+import cn.sikey.pay.util.MapUtil;
|
|
|
+import cn.sikey.pay.util.VerifySignatureUtil;
|
|
|
+import jakarta.annotation.Resource;
|
|
|
+import jakarta.servlet.http.HttpServletRequest;
|
|
|
+import jakarta.servlet.http.HttpServletResponse;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.apache.http.HttpStatus;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.beans.factory.annotation.Qualifier;
|
|
|
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import java.util.Map;
|
|
|
+import java.util.Objects;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @Author: nelson
|
|
|
+ * @Date: 2025/3/31
|
|
|
+ * @Description: razorpay
|
|
|
+ */
|
|
|
+@Service("razorpayPaymentService")
|
|
|
+@Slf4j
|
|
|
+public class RazorpayPaymentServiceImpl extends AbstractPaymentService implements RazorpayPaymentService {
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private OrderApi orderApi;
|
|
|
+
|
|
|
+ @Qualifier("myTaskExecutor")
|
|
|
+ @Autowired
|
|
|
+ private ThreadPoolTaskExecutor myTaskExecutor;
|
|
|
+
|
|
|
+ private static final String PAY_TYPE = "razorpay";
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private RazorpayConfig razorpayConfig;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 手机网站支付razorpay,回调
|
|
|
+ *
|
|
|
+ * @param request 参数
|
|
|
+ * @param response 参数
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public String tradeWapPayGateway(HttpServletRequest request, HttpServletResponse response) {
|
|
|
+ // 根据 商户唯一标识-项目名-应用类型 调用对应服务
|
|
|
+ Map<String, String> paramsMap = MapUtil.convertRequestToMap(request);
|
|
|
+ log.info("[手机网站支付-razorpay,回调]处理支付成功,支付信息:{}", paramsMap);
|
|
|
+ String razorpayPaymentId = paramsMap.get("razorpay_payment_id");
|
|
|
+ String razorpayOrderId = paramsMap.get("razorpay_order_id");
|
|
|
+ String razorpaySignature = paramsMap.get("razorpay_signature");
|
|
|
+ if (StrUtil.isBlank(razorpayPaymentId) || StrUtil.isBlank(razorpayOrderId) || StrUtil.isBlank(razorpaySignature)) {
|
|
|
+ log.warn("[手机网站支付-razorpay,回调] 回调参数是空");
|
|
|
+ throw new ServiceException(HttpStatus.SC_INTERNAL_SERVER_ERROR, "回调参数是空");
|
|
|
+ }
|
|
|
+
|
|
|
+ CommonResult<GenerateOrderReqVO> queryOrder = orderApi.queryOrder(razorpayOrderId);
|
|
|
+ if (!queryOrder.getCode().equals(HttpStatus.SC_OK)) {
|
|
|
+ log.warn("[手机网站支付-razorpay,回调]调用订单服务失败");
|
|
|
+ throw new ServiceException(HttpStatus.SC_INTERNAL_SERVER_ERROR, "调用订单服务失败");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 校验订单是否存在
|
|
|
+ GenerateOrderReqVO generateOrderReqVO = queryOrder.getData();
|
|
|
+ if (Objects.isNull(generateOrderReqVO)) {
|
|
|
+ log.warn("[手机网站支付-razorpay,回调]不存在该订单,订单号:{}", razorpayOrderId);
|
|
|
+ throw new ServiceException(HttpStatus.SC_INTERNAL_SERVER_ERROR, "不存在该订单");
|
|
|
+ }
|
|
|
+
|
|
|
+ Long orderId = generateOrderReqVO.getId();
|
|
|
+
|
|
|
+ CommonResult<PaymentsRespVO> respVOCommonResult = paymentApi.queryPayments(orderId);
|
|
|
+ if (!respVOCommonResult.getCode().equals(HttpStatus.SC_OK)) {
|
|
|
+ log.warn("[手机网站支付-razorpay,回调]调用hmd付款交易服务查询失败,订单id:{}", orderId);
|
|
|
+ throw new ServiceException(HttpStatus.SC_INTERNAL_SERVER_ERROR, "调用hmd付款交易服务查询失败");
|
|
|
+ }
|
|
|
+ PaymentsRespVO paymentsRespVO = respVOCommonResult.getData();
|
|
|
+
|
|
|
+ // 幂等处理
|
|
|
+ if (Objects.nonNull(paymentsRespVO) && Objects.nonNull(paymentsRespVO.getStatus())) {
|
|
|
+ if (paymentsRespVO.getStatus().equals(PayStatusEnum.SUCCESS.getValue())) {
|
|
|
+ log.warn("[手机网站支付-razorpay,回调]重复回调,订单号:{}", razorpayOrderId);
|
|
|
+ return "success";
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ boolean verifySignature = VerifySignatureUtil.verifySignature(razorpayOrderId, razorpayPaymentId, razorpaySignature, razorpayConfig.getSecret());
|
|
|
+ if (verifySignature) {
|
|
|
+ handlePaymentSuccess(generateOrderReqVO);
|
|
|
+ return "success";
|
|
|
+ }
|
|
|
+
|
|
|
+ return "failure";
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理支付成功
|
|
|
+ *
|
|
|
+ * @param generateOrderReqVO 订单
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private void handlePaymentSuccess(GenerateOrderReqVO generateOrderReqVO) {
|
|
|
+ String deviceId = generateOrderReqVO.getDeviceId();
|
|
|
+ PlansRespVO plansRespVO = super.queryPlans(generateOrderReqVO.getPlansId(), PAY_TYPE);
|
|
|
+ super.updateRemainingTimesExpireTime(plansRespVO.getValidity(), deviceId, PAY_TYPE);
|
|
|
+
|
|
|
+ log.info("[手机网站支付-razorpay,回调]处理支付成功");
|
|
|
+ }
|
|
|
+
|
|
|
+}
|