diff --git a/src/main/java/com/ai/da/common/utils/SendEmailUtil.java b/src/main/java/com/ai/da/common/utils/SendEmailUtil.java index 908e9a17..783c03a1 100644 --- a/src/main/java/com/ai/da/common/utils/SendEmailUtil.java +++ b/src/main/java/com/ai/da/common/utils/SendEmailUtil.java @@ -1036,4 +1036,41 @@ public class SendEmailUtil { } } + public static void commonExceptionReminder(String functionName, String[] destination) { + try { + // 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密 + // 代码泄露可能会导致 SecretId 和 SecretKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议采用更安全的方式来使用密钥,请参见:https://cloud.tencent.com/document/product/1278/85305 + // 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取 + Credential cred = new Credential(SECRET_ID, SECRET_KEy); + // 实例化一个http选项,可选的,没有特殊需求可以跳过 + HttpProfile httpProfile = new HttpProfile(); + httpProfile.setEndpoint("ses.tencentcloudapi.com"); + // 实例化一个client选项,可选的,没有特殊需求可以跳过 + ClientProfile clientProfile = new ClientProfile(); + clientProfile.setHttpProfile(httpProfile); + // 实例化要请求产品的client对象,clientProfile是可选的 + SesClient client = new SesClient(cred, "ap-hongkong", clientProfile); + // 实例化一个请求对象,每个接口都会对应一个request对象 + SendEmailRequest req = new SendEmailRequest(); + req.setFromEmailAddress(SEND_ADDRESS); + req.setDestination(destination); + Template template = new Template(); + req.setSubject("AiDA发生异常,请及时处理"); + template.setTemplateID(UPLOAD_TIMEOUT_REMINDER); + JSONObject param = new JSONObject(); + param.put("function", functionName); + + // 邮件内容 {{function}}处理异常,请及时查看 + template.setTemplateData(param.toJSONString()); + req.setTemplate(template); + + // 返回的resp是一个SendEmailResponse的实例,与请求对象对应 + SendEmailResponse resp = client.SendEmail(req); + log.info("邮件发送结果res###{}", SendEmailResponse.toJsonString(resp)); + } catch (TencentCloudSDKException e) { + log.info("邮件发送失败###{}", e.toString()); + throw new BusinessException("failed.to.send.mail"); + } + } + } diff --git a/src/main/java/com/ai/da/controller/StripeController.java b/src/main/java/com/ai/da/controller/StripeController.java index 2cbbbf1f..7d24e2d2 100644 --- a/src/main/java/com/ai/da/controller/StripeController.java +++ b/src/main/java/com/ai/da/controller/StripeController.java @@ -1,6 +1,7 @@ package com.ai.da.controller; import com.ai.da.common.response.Response; +import com.ai.da.common.utils.SendEmailUtil; import com.ai.da.model.dto.ProductPurchaseDTO; import com.ai.da.service.StripeService; import com.paypal.http.HttpResponse; @@ -9,6 +10,7 @@ import com.stripe.exception.StripeException; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.*; import springfox.documentation.annotations.ApiIgnore; @@ -19,7 +21,6 @@ import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import java.io.IOException; import java.util.List; -import java.util.Map; @Api(tags = "Stripe模块") @Slf4j @@ -37,14 +38,27 @@ public class StripeController { return Response.success(stripeService.pay(productPurchaseDTO, request)); } + @Value("${stripe.webhook.fail.reminder}") + private String webhookReminderFlag; + @ApiOperation("支付通知") @PostMapping("/trade/notify") public void callback(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - Boolean result = stripeService.notify(request); - if (result){ - response.setStatus(HttpServletResponse.SC_OK); - }else { + 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(); response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + // 给我发送邮件 + if (webhookReminderFlag.equals("1")){ + SendEmailUtil.commonExceptionReminder("Stripe Webhook 回调", new String[]{"xupei3360@163.com"}); + } } } diff --git a/src/main/java/com/ai/da/service/impl/StripeServiceImpl.java b/src/main/java/com/ai/da/service/impl/StripeServiceImpl.java index 233e802d..2fcbb1d5 100644 --- a/src/main/java/com/ai/da/service/impl/StripeServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/StripeServiceImpl.java @@ -982,7 +982,7 @@ public class StripeServiceImpl implements StripeService { } if (!type.equals("reminder") && !type.equals("cancel") && paymentInfo.getNotified() == 1){ // 已经邮件通知过,直接返回 - log.info("不发送邮件,原因:【type为:{},order_no为:{},且已经已经进行邮件通知】", type, orderNo); + log.info("不发送邮件,原因:【type为:{},order_no为:{},已经进行邮件通知】", type, orderNo); return true; } diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index 5daaa774..e1c6469c 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -106,4 +106,7 @@ rabbitmq.queues.toProductImageResult=ToProductImage-dev rabbitmq.queues.relightResult=Relight-dev rabbitmq.exchange.generate=generate-exchange -orderList.link=https://develop.aida.com.hk/home/homePage?order= \ No newline at end of file +orderList.link=https://develop.aida.com.hk/home/homePage?order= + +# 0 不发送邮件通知 1 发送邮件通知 +stripe.webhook.fail.reminder=0 \ No newline at end of file diff --git a/src/main/resources/application-prod.properties b/src/main/resources/application-prod.properties index 27c8d42a..5e51284d 100644 --- a/src/main/resources/application-prod.properties +++ b/src/main/resources/application-prod.properties @@ -108,4 +108,7 @@ rabbitmq.queues.toProductImageResult=ToProductImage-prod rabbitmq.queues.relightResult=Relight-prod rabbitmq.exchange.generate=generate-exchange -orderList.link=https://aida.com.hk/home/homePage?order= \ No newline at end of file +orderList.link=https://aida.com.hk/home/homePage?order= + +# 0 不发送邮件通知 1 发送邮件通知 +stripe.webhook.fail.reminder=1 \ No newline at end of file