package com.ai.da.controller; import com.ai.da.common.response.Response; import com.ai.da.common.utils.DateUtil; import com.ai.da.common.utils.RedisUtil; import com.ai.da.common.utils.SendEmailUtil; import com.ai.da.mapper.primary.entity.ProductCoupons; import com.ai.da.model.dto.CreateCouponDTO; import com.ai.da.model.dto.ProductPurchaseDTO; import com.ai.da.model.dto.QueryCouponsPageDTO; import com.ai.da.model.vo.CheckCouponsVO; import com.ai.da.service.StripeService; import com.baomidou.mybatisplus.core.metadata.IPage; import com.paypal.http.HttpResponse; import com.paypal.payments.Refund; import com.stripe.exception.StripeException; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.*; import jakarta.annotation.Resource; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.Valid; import java.io.IOException; import java.util.Date; import java.util.List; @Tag(name = "Stripe模块") @Slf4j @RestController @RequestMapping("/api/stripe") //@ApiIgnore public class StripeController { @Resource private StripeService stripeService; @Resource private RedisUtil redisUtil; @Operation(summary = "创建支付链接") @PostMapping("/createOrder") public Response pay(@Valid @RequestBody ProductPurchaseDTO productPurchaseDTO, HttpServletRequest request) { return Response.success(stripeService.pay(productPurchaseDTO, request)); } @Value("${stripe.webhook.fail.reminder}") private String webhookReminderFlag; @Operation(summary = "支付通知") @PostMapping("/trade/notify") public void callback(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try{ Boolean result = stripeService.notify(request); if (result){ response.setStatus(HttpServletResponse.SC_OK); }else { response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); } }catch (Exception e){ log.error("Stripe Controller层异常捕捉, {}", e.getMessage()); e.printStackTrace(); String key_1 = RedisUtil.STRIPE_EXCEPTION_LOG + DateUtil.dateToStr(new Date(), DateUtil.YYYY_MM_DD_HH); String key_2 = key_1 + ":" + DateUtil.dateToStr(new Date(), DateUtil.YYYY_MM_DD_hh_mm_ss); String stackTrace = stripeService.getStackTrace(e, 10); redisUtil.addToString(key_2, stackTrace); Long size = redisUtil.getSize(key_1); // 给我发送邮件 if (webhookReminderFlag.equals("1") && size == 3){ SendEmailUtil.commonExceptionReminder("Stripe Webhook 回调处理出现异常", new String[]{"xupei3360@163.com"}); } response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); } } @Operation(summary = "申请退款") @GetMapping("/trade/refund/{orderNo}/{reason}") public Response> refund(@PathVariable String orderNo, @PathVariable String reason) throws IOException { String response = stripeService.refund(null,orderNo,reason); if (response.equals("退款成功")){ return Response.success(); }else { return Response.fail("Request for refund failed."); } } @Operation(summary = "获取订阅") @GetMapping("/getSubscription") public Response> getSubscription(@RequestParam String name, @RequestParam String email) { try { return Response.success(stripeService.getSubscriptionIds(name, email)); } catch (StripeException e) { throw new RuntimeException(e); } } @Operation(summary = "取消订阅") @GetMapping("/cancelSubscription") public Response cancelSubscription(@RequestParam String subscriptionId, @RequestParam(required = false) String reason) { stripeService.cancelSubscription(subscriptionId, reason); return Response.success("success"); } @Operation(summary = "创建推广码") @PostMapping("/createCoupon") public Response createCoupon(@Valid @RequestBody CreateCouponDTO createCouponDTO){ return Response.success(stripeService.createCoupon(createCouponDTO)); } @Operation(summary = "检查推广码") @GetMapping("/checkCoupon") public Response checkCoupon(@RequestParam String promotionCode, @RequestParam Long price){ return Response.success(stripeService.checkProductCoupon(promotionCode, price)); } @Operation(summary = "获取所有推广码") @PostMapping("/getAllCoupons") public Response> getAllCoupons(@RequestBody QueryCouponsPageDTO queryCouponsPageDTO){ return Response.success(stripeService.getAllCoupons(queryCouponsPageDTO)); } @Operation(summary = "检索优惠券") @GetMapping("/retrieveCoupon") public Response retrieveCoupon(@RequestParam String couponId){ return Response.success(stripeService.retrieveCoupon(couponId)); } @Operation(summary = "检索推广码") @GetMapping("/retrievePromotionCode") public Response retrievePromotionCode(@RequestParam String retrievePromotionCode){ return Response.success(stripeService.retrievePromotionCode(retrievePromotionCode)); } @Operation(summary = "更新推广码信息") @GetMapping("/updatePromCodeInfo") public Response updateCouponsInfo(@RequestParam Long id, @RequestParam(required = false) String paidCommission, @RequestParam(required = false) String cooperator, @RequestParam(required = false) String remark, @RequestParam(required = false) Long startTime){ return Response.success(stripeService.updateCouponsInfo(id, paidCommission, cooperator, remark, startTime)); } @Operation(summary = "删除推广码") @GetMapping("/deletePromCode") public Response deleteCoupon(@RequestParam Long id){ stripeService.deleteCoupon(id); return Response.success("success"); } /*@ApiOperation("临时 取消订阅") @GetMapping("/cancelSubscriptionTemp") public Response cancelSubscriptionTemp(@RequestParam String subscriptionId) { stripeService.cancelSubscriptionTemp(subscriptionId); return Response.success("success"); } @Operation(summary = "创建订阅 临时") @GetMapping("/createSubscriptionTemp") public Response createSubscriptionTemp(@RequestParam String name, @RequestParam String email) { return Response.success(stripeService.createSubscriptionTemp(name, email)); } @Operation(summary = "修改用户默认支付方式 临时") @GetMapping("/changeCustomerPayment") public Response changeCustomerPayment(@RequestParam String name, @RequestParam String email) { return Response.success(stripeService.changeCustomerPayment(name, email)); } @Operation(summary = "临时 发送续订失败邮件") @GetMapping("/sendRenewalFailEmail") public Response sendRenewalFailEmail(@RequestParam String invoiceId, @RequestParam String subscriptionId, @RequestParam String orderNo) { return Response.success(stripeService.sendRenewalFailEmail(invoiceId, subscriptionId,orderNo)); } @Operation(summary = "临时 查询指定用户绑定的付款方式") @GetMapping("/getCustomerPaymentMethod") public Response>> getCustomerPaymentMethod(@RequestParam String name, @RequestParam String email) { return Response.success(stripeService.getCustomerPaymentMethod(name, email)); } @Operation(summary = "临时 解绑指定用户绑定的所有付款方式") @GetMapping("/detachCustomerAllPaymentMethod") public Response detachCustomerAllPaymentMethod(@RequestParam String name, @RequestParam String email) { return Response.success(stripeService.detachCustomerAllPaymentMethod(name, email)); }*/ }