From 9dd5812338a096d62d41419f0bf1bada294dadb7 Mon Sep 17 00:00:00 2001 From: Joowon Lim Date: Mon, 27 Nov 2023 10:48:07 +0900 Subject: [PATCH 1/2] =?UTF-8?q?Feat:=20SOLAPI=20=EC=95=8C=EB=A6=BC?= =?UTF-8?q?=ED=86=A1=20=EB=B0=9C=EC=86=A1=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 3 + .../src/order/OrderServiceImpl.java | 100 ++++++++++++++++-- .../src/order/config/SolApiConfig.java | 30 ++++++ src/main/resources/application.properties | 8 ++ 4 files changed, 135 insertions(+), 6 deletions(-) create mode 100644 src/main/java/com/readyvery/readyverydemo/src/order/config/SolApiConfig.java diff --git a/build.gradle b/build.gradle index 67f2524..75e2006 100644 --- a/build.gradle +++ b/build.gradle @@ -42,6 +42,9 @@ dependencies { runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.5' runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.5' + //SOLAPI + implementation 'net.nurigo:sdk:4.2.7' + // //Querydsl 추가 // implementation 'com.querydsl:querydsl-core:5.0.0' // implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' diff --git a/src/main/java/com/readyvery/readyverydemo/src/order/OrderServiceImpl.java b/src/main/java/com/readyvery/readyverydemo/src/order/OrderServiceImpl.java index 995c1a3..68d7dc0 100644 --- a/src/main/java/com/readyvery/readyverydemo/src/order/OrderServiceImpl.java +++ b/src/main/java/com/readyvery/readyverydemo/src/order/OrderServiceImpl.java @@ -1,8 +1,10 @@ package com.readyvery.readyverydemo.src.order; import java.nio.charset.StandardCharsets; +import java.time.format.DateTimeFormatter; import java.util.Base64; import java.util.Collections; +import java.util.HashMap; import java.util.List; import java.util.Objects; @@ -13,6 +15,11 @@ import org.springframework.web.client.RestTemplate; import net.minidev.json.JSONObject; +import net.nurigo.sdk.NurigoApp; +import net.nurigo.sdk.message.exception.NurigoMessageNotReceivedException; +import net.nurigo.sdk.message.model.KakaoOption; +import net.nurigo.sdk.message.model.Message; +import net.nurigo.sdk.message.service.DefaultMessageService; import com.readyvery.readyverydemo.domain.CeoInfo; import com.readyvery.readyverydemo.domain.Order; @@ -21,6 +28,7 @@ import com.readyvery.readyverydemo.domain.repository.OrderRepository; import com.readyvery.readyverydemo.global.exception.BusinessLogicException; import com.readyvery.readyverydemo.global.exception.ExceptionCode; +import com.readyvery.readyverydemo.src.order.config.SolApiConfig; import com.readyvery.readyverydemo.src.order.config.TossPaymentConfig; import com.readyvery.readyverydemo.src.order.dto.OrderMapper; import com.readyvery.readyverydemo.src.order.dto.OrderRegisterRes; @@ -35,11 +43,11 @@ @Service @RequiredArgsConstructor public class OrderServiceImpl implements OrderService { - private final OrderRepository orderRepository; private final OrderMapper orderMapper; private final CeoRepository ceoRepository; private final TossPaymentConfig tosspaymentConfig; + private final SolApiConfig solApiConfig; @Override public OrderRegisterRes getOrders(Long id, Progress progress) { @@ -61,16 +69,51 @@ public OrderRegisterRes getOrders(Long id, Progress progress) { public OrderStatusRes completeOrder(Long id, OrderStatusUpdateReq request) { CeoInfo ceoInfo = getCeoInfo(id); Order order = getOrder(request.getOrderId()); - verifyPostOrder(ceoInfo, order); verifyPostProgress(order, request); order.completeOrder(request.getStatus()); orderRepository.save(order); + + sendCompleteMessage(order, request.getStatus()); return OrderStatusRes.builder() .success(true) .build(); } + private void sendCompleteMessage(Order order, Progress status) { + if (status == Progress.MAKE) { + KakaoOption kakaoOption = makeKakaoOption(solApiConfig.getTempleteOrder()); + HashMap variables = makeMakeVariables(order); + sendMessage(kakaoOption, variables, order.getUserInfo().getPhone()); + } + if (status == Progress.COMPLETE) { + KakaoOption kakaoOption = makeKakaoOption(solApiConfig.getTempletePickup()); + HashMap variables2 = makeCompeleteVariables(order); + sendMessage(kakaoOption, variables2, order.getUserInfo().getPhone()); + } + } + + private HashMap makeCompeleteVariables(Order order) { + HashMap variables = new HashMap<>(); + variables.put("#{storeName}", order.getStore().getName()); + variables.put("#{orderName}", order.getOrderName()); + variables.put("#{orderNumber}", order.getOrderId()); + variables.put("#{orderId}", order.getOrderId()); + return variables; + } + + private HashMap makeMakeVariables(Order order) { + HashMap variables = new HashMap<>(); + variables.put("#{userName}", order.getUserInfo().getNickName()); + variables.put("#{orderDate}", order.getCreatedAt().format(DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm"))); + variables.put("#{orderNumber}", order.getOrderNumber()); + variables.put("#{storeName}", order.getStore().getName()); + variables.put("#{orderName}", order.getOrderName()); + variables.put("#{estimatedTime}", order.getEstimatedTime().format(DateTimeFormatter.ofPattern("HH:mm"))); + variables.put("#{orderId}", order.getOrderId()); + return variables; + } + @Override public OrderStatusRes cancelOrder(Long id, OrderStatusUpdateReq request) { CeoInfo ceoInfo = getCeoInfo(id); @@ -80,11 +123,60 @@ public OrderStatusRes cancelOrder(Long id, OrderStatusUpdateReq request) { verifyPostProgress(order, request); //order.cancelOrder(request.getStatus()); orderRepository.save(order); + + // 카카오 알림톡 전송 + KakaoOption kakaoOption = makeKakaoOption(solApiConfig.getTempleteCancel()); + HashMap variables = makeCancelVariables(order, request.getRejectReason()); + String phone = order.getUserInfo().getPhone(); + + sendMessage(kakaoOption, variables, phone); return OrderStatusRes.builder() .success(true) .build(); } + private KakaoOption makeKakaoOption(String templateId) { + KakaoOption kakaoOption = new KakaoOption(); + kakaoOption.setPfId(solApiConfig.getKakaoPfid()); + kakaoOption.setTemplateId(templateId); + kakaoOption.setDisableSms(true); + return kakaoOption; + } + + private HashMap makeCancelVariables(Order order, String rejectReason) { + HashMap variables = new HashMap<>(); + variables.put("#{storeName}", order.getStore().getName()); + variables.put("#{orderName}", order.getOrderName()); + variables.put("#{orderNumber}", order.getOrderId()); + variables.put("#{cancelReason}", rejectReason); + return variables; + } + + private void sendMessage(KakaoOption kakaoOption, HashMap variables, String phone) { + DefaultMessageService messageService = NurigoApp.INSTANCE.initialize( + solApiConfig.getApiKey(), + solApiConfig.getApiSecret(), + SolApiConfig.SOLAPI_URL); + + kakaoOption.setVariables(variables); + + // Message 패키지가 중복될 경우 net.nurigo.sdk.message.model.Message로 치환하여 주세요 + Message message = new Message(); + message.setTo(phone); + message.setKakaoOptions(kakaoOption); + + try { + // send 메소드로 ArrayList 객체를 넣어도 동작합니다! + messageService.send(message); + } catch (NurigoMessageNotReceivedException exception) { + // 발송에 실패한 메시지 목록을 확인할 수 있습니다! + System.out.println(exception.getFailedMessageList()); + System.out.println(exception.getMessage()); + } catch (Exception exception) { + System.out.println(exception.getMessage()); + } + } + @Override public void cancelTossPayment(Order order, OrderStatusUpdateReq request) { @@ -100,17 +192,13 @@ private void verifyPostProgress(Order order, OrderStatusUpdateReq request) { throw new BusinessLogicException(ExceptionCode.NOT_FOUND_TIME); } order.orderTime(request.getTime()); - return; } else if (order.getProgress() == Progress.ORDER && request.getStatus() == Progress.CANCEL) { if (request.getRejectReason() == null) { throw new BusinessLogicException(ExceptionCode.NOT_FOUND_REJECT_REASON); } cancelTossPayment(order, request); - return; } else if (order.getProgress() == Progress.MAKE && request.getStatus() == Progress.COMPLETE) { // 제조 -> 완료 - return; } else if (order.getProgress() == Progress.COMPLETE && request.getStatus() == Progress.PICKUP) { // 완료 -> 픽업 - return; } else { throw new BusinessLogicException(ExceptionCode.NOT_CHANGE_ORDER); } diff --git a/src/main/java/com/readyvery/readyverydemo/src/order/config/SolApiConfig.java b/src/main/java/com/readyvery/readyverydemo/src/order/config/SolApiConfig.java new file mode 100644 index 0000000..93e4afd --- /dev/null +++ b/src/main/java/com/readyvery/readyverydemo/src/order/config/SolApiConfig.java @@ -0,0 +1,30 @@ +package com.readyvery.readyverydemo.src.order.config; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; + +import lombok.Getter; + +@Getter +@Configuration +public class SolApiConfig { + public static final String SOLAPI_URL = "https://api.solapi.com"; + + @Value("${solapi.api_key}") + private String apiKey; + + @Value("${solapi.secret_key}") + private String apiSecret; + + @Value("${solapi.templete.cancel}") + private String templeteCancel; + + @Value("${solapi.templete.pickup}") + private String templetePickup; + + @Value("${solapi.templete.order}") + private String templeteOrder; + + @Value("${solapi.kakao.pfid}") + private String kakaoPfid; +} \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 00ad665..a37c671 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -32,3 +32,11 @@ payment.toss.client_key=test_ck_pP2YxJ4K87By0b4RZeo0rRGZwXLO payment.toss.secret_key=test_sk_pP2YxJ4K87BbBaQPDwEJrRGZwXLO payment.toss.success_url=http://localhost:8080/api/v1/payment/toss/success payment.toss.fail_url=http://localhost:8080/api/v1/payment/toss/fail +#message +##SOLAPI +solapi.api_key=NCSBWCGZVFUHXQOV +solapi.secret_key=28VQPDZC3RJ2VTPPOQCJ0XVHELUT3QV1 +solapi.templete.cancel=KA01TP231123121849958z9vWwh6soub +solapi.templete.pickup=KA01TP231123121230032ffHPyaIPpwY +solapi.templete.order=KA01TP2311231155087363DzslnIuZOn +solapi.kakao.pfid=KA01PF231122061327112gdLStwBJiVr \ No newline at end of file From d96fbf40522315d388327a13394054c6abd26735 Mon Sep 17 00:00:00 2001 From: Joowon Lim Date: Mon, 27 Nov 2023 10:51:55 +0900 Subject: [PATCH 2/2] =?UTF-8?q?Fix:=20build=20=EC=98=A4=EB=A5=98=20?= =?UTF-8?q?=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../readyvery/readyverydemo/src/order/config/SolApiConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/readyvery/readyverydemo/src/order/config/SolApiConfig.java b/src/main/java/com/readyvery/readyverydemo/src/order/config/SolApiConfig.java index 93e4afd..564a4dd 100644 --- a/src/main/java/com/readyvery/readyverydemo/src/order/config/SolApiConfig.java +++ b/src/main/java/com/readyvery/readyverydemo/src/order/config/SolApiConfig.java @@ -27,4 +27,4 @@ public class SolApiConfig { @Value("${solapi.kakao.pfid}") private String kakaoPfid; -} \ No newline at end of file +}