Skip to content

Commit

Permalink
Merge pull request #14 from marinesnow34/test
Browse files Browse the repository at this point in the history
Feat: SOLAPI 알림톡 발송 연결
  • Loading branch information
marinesnow34 authored Nov 27, 2023
2 parents d5cf3ca + d96fbf4 commit b32d5a0
Show file tree
Hide file tree
Showing 4 changed files with 135 additions and 6 deletions.
3 changes: 3 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand Down
Original file line number Diff line number Diff line change
@@ -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;

Expand All @@ -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;
Expand All @@ -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;
Expand All @@ -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) {
Expand All @@ -63,16 +71,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<String, String> variables = makeMakeVariables(order);
sendMessage(kakaoOption, variables, order.getUserInfo().getPhone());
}
if (status == Progress.COMPLETE) {
KakaoOption kakaoOption = makeKakaoOption(solApiConfig.getTempletePickup());
HashMap<String, String> variables2 = makeCompeleteVariables(order);
sendMessage(kakaoOption, variables2, order.getUserInfo().getPhone());
}
}

private HashMap<String, String> makeCompeleteVariables(Order order) {
HashMap<String, String> 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<String, String> makeMakeVariables(Order order) {
HashMap<String, String> 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);
Expand All @@ -82,11 +125,60 @@ public OrderStatusRes cancelOrder(Long id, OrderStatusUpdateReq request) {
verifyPostProgress(order, request);
//order.cancelOrder(request.getStatus());
orderRepository.save(order);

// 카카오 알림톡 전송
KakaoOption kakaoOption = makeKakaoOption(solApiConfig.getTempleteCancel());
HashMap<String, String> 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<String, String> makeCancelVariables(Order order, String rejectReason) {
HashMap<String, String> 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<String, String> 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<Message> 객체를 넣어도 동작합니다!
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) {

Expand All @@ -102,17 +194,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);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
}
8 changes: 8 additions & 0 deletions src/main/resources/application.properties
Original file line number Diff line number Diff line change
Expand Up @@ -35,3 +35,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

0 comments on commit b32d5a0

Please sign in to comment.