hyeonga_code
reProject_49_JAVA/SPRING SMS 문자 보내기 기능 구현 본문
2024.02.21
문자 보내기 기능 구현하기
-- 회원 가입 후 이용해도 되지만 연결이 어려울 수도 있기에 무료체험 버전으로 연결해본 후 구현이 되는 경우 회원가입을 진행하려고 하였으나 발신번호를 등록할 수 없어 회원가입 후 진행해야 한다.
-- https://coolsms.co.kr/ 접속 > 회원가입 > 로그인
세상에서 가장 안정적이고 빠른 메시지 발송 플랫폼 - 쿨에스엠에스
손쉬운 결제 전용계좌, 신용카드, 계좌이체 등 국내 결제 뿐만 아니라 해용신용카드로 한번의 카드번호 등록으로 자동충전까지 지원합니다. 전용계좌, 신용카드, 계좌이체 등 다양한 결제 방식
coolsms.co.kr
https://developers.coolsms.co.kr/sdk-list/Java/send-message 참고하여 작업
메시지 발송 예제 | Documents for COOLSMS Developers
해당 페이지에서는 COOLSMS Java/Kotlin SDK를 이용하여 메시지를 발송하는 방법에 대해 가이드하고 있습니다.
developers.coolsms.co.kr
https://github.com/coolsms/coolsms-java-examples 참고하여 작업
GitHub - coolsms/coolsms-java-examples: CoolSMS Java/Kotlin SDK 예제 목록
CoolSMS Java/Kotlin SDK 예제 목록. Contribute to coolsms/coolsms-java-examples development by creating an account on GitHub.
github.com
>>> 최종적으로 다른 방법을 사용
-- 주의사항
---- 발송 요청시, 발신번호, 수신번호에는 기호가 포함되지 않아야 합니다.
-- 로그인 >> 개발/연동 >> API KEY 관리
-- 새 API 키 생성 시 예제를 확인할 수 있다.
- pom.xml 라이브러리 추가
<!-- 문자보내기 -->
<dependency>
<groupId>net.nurigo</groupId>
<artifactId>sdk</artifactId>
<version>4.2.7</version>
</dependency>
<!-- json 사용을 위한 추가 -->
<dependency>
<groupId>net.nurigo</groupId>
<artifactId>javasdk</artifactId>
<version>2.2</version>
</dependency>
- properties 추가
#coolsms
api.key= [ API 키 값 ]
api.secretKey= [ APISecret 키 값 ]
sms.phoneNumber= [ 등록한 발신 번호 ]
1차 시도
-- 깃 허브에 나와있는 예제를 보며 열심히 작성하였으나, 오류 발생
SEVERE: 경로 [/w2]의 컨텍스트 내의 서블릿 [client]을(를) 위한 Servlet.service() 호출이,
근본 원인(root cause)과 함께, 예외 [Handler dispatch failed; nested exception is
java.lang.NoSuchFieldError: Companion]을(를) 발생시켰습니다.
java.lang.NoSuchFieldError: Companion
at net.nurigo.sdk.message.service.DefaultMessageService.<init>(DefaultMessageService.kt:39)
at net.nurigo.sdk.NurigoApp.initialize(NurigoApp.kt:8)
...
@Value("${sms.phoneNumber}")
private String FROM_NUMBER;
@Value("${api.key}")
private String APIKEY;
@Value("${api.secretKey}")
private String SECRETKEY;
private DefaultMessageService messageService;
/** 단일 메세지 발송 예제 */
public SingleMessageSentResponse sentOneMessage() {
System.err.println("FROM_NUMBER : " + FROM_NUMBER);
System.err.println("APIKEY : " + APIKEY);
System.err.println("SECRETKEY : " + SECRETKEY);
this.messageService = NurigoApp.INSTANCE.initialize(APIKEY, SECRETKEY, "https://api.coolsms.co.kr");
// Message 패키지가 중복되는 경우 > net.nurifo.sdk.message.model.Message로 치환
Message message = new Message();
message.setFrom(FROM_NUMBER); //발신번호
message.setTo(FROM_NUMBER); // 수신번호
message.setText("한건발송예제 : SMS/한글:45자,영문:90자, 그 이상인 경우 LMS로 변환");
// message.setSubject("문자제목"); > 파라미터 추가 시 자동으로 LMS로 변환됩니다.
SingleMessageSentResponse response = messageService.sendOne(new SingleMessageSendingRequest(message));
System.err.println("response : " + response);
Coolsms coolsms = new Coolsms(APIKEY, SECRETKEY);
return response;
}
/** 여러건 메세지 발송 예제 */
@RequestMapping("testMultiMessage.do")
public MultipleDetailMessageSentResponse sentMultiMessage() {
DefaultMessageService messageService = NurigoApp.INSTANCE.initialize(APIKEY, SECRETKEY, "https://api.coolsms.co.kr");
ArrayList<Message> messageList = new ArrayList<>();
ArrayList<String> phoneNumber = new ArrayList<String>(){{
add(FROM_NUMBER);
add(FROM_NUMBER);
add(FROM_NUMBER);
}};
for(int i=0; i<phoneNumber.size(); i++) {
Message message = new Message();
message.setFrom(FROM_NUMBER);
message.setTo(phoneNumber.get(i));
message.setText("다건발송예제 : SMS/한글:45자,영문:90자, 그 이상인 경우 LMS로 변환");
// 메세지마다 커스텀하고 싶은 경우 map 형태로 기입후 전송
HashMap<String, String> map = new HashMap<>();
map.put("key", "value");
message.setCustomFields(map);
messageList.add(message);
}
try {
/**
* send 메소드로 단일 Message 객체 넣어도 동작
* 세 번째 파라미터인 showMessageList 값을 true로 설정하는 경우
* > MultipleDetailMessageSentResponse에서 MessageList반환
*/
MultipleDetailMessageSentResponse response = messageService.send(messageList, false, true);
// 중복 수신번호 허용 > this.messageService.send(messageList, true);
System.err.println("response : " + response);
} catch(NurigoMessageNotReceivedException e) {
System.err.println(e.getFailedMessageList());
System.err.println(e.getMessage());
e.printStackTrace();
} catch(Exception e) {
e.printStackTrace();
}
return null;
}
2차 시도
>> 다른 방법 시도
- java-sdk-2.1.zip 다운받기
---- java-sdk-2.1 > src
------ Coolsms.java
------ Https.java
- 두 파일 원하는 패키지에 복사
---- 각각 package 정보를 변경해주어야 한다.
- lib 폴더의 json-simple-1.1.1.jar 파일을 프로젝트의 라이브러리에 추가
ContactController.java 작성
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
package com.w2.admin.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.w2.util.SmsUtil;
@Controller
public class ContactController {
@Autowired
private SmsUtil smsUtilService;
/** 단일 메세지 발송 예제 */
@RequestMapping("testOneMessage.do")
public String sentOneMessage() {
return smsUtilService.sentOneMessage();
}
}
|
SmsUtil.java 작성
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
package com.w2.util;
import java.util.HashMap;
import org.json.simple.JSONObject;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
import net.nurigo.sdk.message.model.Message;
@Component
@PropertySource("classpath:config/webserverdb.properties")
public class SmsUtil {
@Value("${sms.phoneNumber}")
private String FROM_NUMBER;
@Value("${api.key}")
private String APIKEY;
@Value("${api.secretKey}")
private String SECRETKEY;
/** 단일 메세지 발송 예제 */
public String sentOneMessage() {
Coolsms coolsms = new Coolsms(APIKEY, SECRETKEY);
HashMap<String, String> set = new HashMap<String, String>();
// Message 패키지가 중복되는 경우 > net.nurifo.sdk.message.model.Message로 치환
Message message = new Message();
set.put("from", FROM_NUMBER); //발신번호
set.put("to", FROM_NUMBER); // 수신번호
set.put("text", "한건발송예제 : SMS/한글:45자,영문:90자, 그 이상인 경우 LMS로 변환");
set.put("type", "sms");
// 전송 결과 확인
JSONObject result = coolsms.send(set);
if((boolean)result.get("status") == true) {
System.err.println("성공 =====");
/**
result.get("")
- group_id : 그룹아이디
- result_code : 결과코드
- result_message : 결과메세지
- success_count : 메세지아이디
- error_count : 다건 전송시 오류 수
*/
} else {
System.err.println("실패 =====");
/**
result.get("")
- code : REST API 에러코드
- message : 에러메세지
*/
}
return "redirect:test.do";
}
}
|
>>> 실행(http://localhost:8080/w2/testOneMessage.do)
한 건인 경우 문자가 잘 온다.
프로젝트에 적용할 때에는 다건을 넘길 수도 있어 이를 어떻게 처리할까 고민했다.
문자를 보낼 때 필요한 데이터는
-- text : 메세지 내용
-- to : 수신인 전화번호
-- type : sms / lms
다건 발송 시 사용자별로 커스텀 메세지를 보내는 경우가 있으므로 text도 같이 설정하도록 한다.
ex) 000 님 할인쿠폰이 발행되었습니다.
HashMap<HashMap<String, String>>과 List<HashMap<String, String>> 중 List로 작업했다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
|
package com.w2.util;
import java.util.HashMap;
import java.util.List;
import org.json.simple.JSONObject;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
@Component
@PropertySource("classpath:config/webserverdb.properties")
public class SmsUtil {
@Value("${sms.phoneNumber}")
private String FROM_NUMBER;
@Value("${api.key}")
private String APIKEY;
@Value("${api.secretKey}")
private String SECRETKEY;
// user(name_이름, text_문자, to_전화번호)
public HashMap<String, JSONObject> sentMessage(List<HashMap<String, String>> toList) {
Coolsms coolsms = new Coolsms(APIKEY, SECRETKEY);
HashMap<String, String> setMessage = new HashMap<String, String>();
HashMap<String, JSONObject> resultMap = new HashMap<String, JSONObject>();
setMessage.put("from", FROM_NUMBER);
for(HashMap<String, String> user : toList) {
setMessage.put("text", (String)user.get("text"));
setMessage.put("to", (String)user.get("to").replace("-","").replace("/", ""));
if(((String)user.get("text")).length() < 45) {
setMessage.put("type", "sms");
} else {
setMessage.put("type", "lms");
}
// 전송 결과 확인
JSONObject result = coolsms.send(setMessage);
//이름_전화번호 : result
resultMap.put((String)user.get("name") + "_" + (String)user.get("to"), result);
if((boolean)result.get("status") == true) {
System.err.println("성공 =====");
/**
result.get("")
- group_id : 그룹아이디
- result_code : 결과코드
- result_message : 결과메세지
- success_count : 메세지아이디
- error_count : 다건 전송시 오류 수
*/
} else {
System.err.println("실패 =====");
/**
result.get("")
- code : REST API 에러코드
- message : 에러메세지
*/
}
}
return null;
}
/** 단일 메세지 발송 예제 */
public String sentOneMessage() {
Coolsms coolsms = new Coolsms(APIKEY, SECRETKEY);
HashMap<String, String> set = new HashMap<String, String>();
set.put("from", FROM_NUMBER); //발신번호
set.put("to", FROM_NUMBER); // 수신번호
set.put("text", "한건발송예제 : SMS/한글:45자,영문:90자, 그 이상인 경우 LMS로 변환");
set.put("type", "sms");
// 전송 결과 확인
JSONObject result = coolsms.send(set);
if((boolean)result.get("status") == true) {
System.err.println("성공 =====");
/**
result.get("")
- group_id : 그룹아이디
- result_code : 결과코드
- result_message : 결과메세지
- success_count : 메세지아이디
- error_count : 다건 전송시 오류 수
*/
} else {
System.err.println("실패 =====");
/**
result.get("")
- code : REST API 에러코드
- message : 에러메세지
*/
}
return "redirect:test.do";
}
}
|
'Project_WEATHERWEAR' 카테고리의 다른 글
reProject_51_Chart.js 활용하여 통계 구현하기_1 (0) | 2024.02.26 |
---|---|
reProject_50_상품 주문 완료 시, 주문 내역 이메일 보내기 구현 (0) | 2024.02.22 |
reProject_48_관리자 주문 페이지, 교환/환불 요청 확인, 교환/환불 처리, 아임포트 환불 처리(부분 취소/전액 취소) (0) | 2024.02.21 |
reProject_47_리뷰 작성, 리뷰 삭제, 별점, 리뷰 상세 보기 기능 구현 (0) | 2024.02.20 |
reProject_46_결제하기(아임포트 결제 검증 적용) (0) | 2024.02.16 |