프로그래밍/C#

[C#] 네이버센스 SMS문자보내기

ss-pro 2023. 2. 14. 22:22
반응형

SMS문자서비스를 보내는 방법중에 네이버 클라우드를 이용해서 보내는 방법에 대해 알아 보겠습니다. 네이버 클라우드를 이용하는 고객의 경우 네이버 센스 서비스를 이용하면 편리하게 SMS문자 보내는 부분을 작업 할 수 있습니다. 아래순서대로 진행하면됩니다.
1. 네이버 클라우드가입
https://www.ncloud.com/product 에 접속하여 문의하기 메뉴에서 클라우드 서비스관련 서비스 가입을 진행합니다.

2. 네이버 센스 서비스 신청
sms서비스를 사용하기 위해서는 네이버 센스 서비스를 신청해야합니다. 아래 링크에서 이용신청을 진행합니다.
https://www.ncloud.com/product/applicationService/sens
3. 네이버 Simple & Easy Notification Service 선택
클라우드서버 로그인 -> 콘솔-> 서비스 -> Simple & Easy Notification Service를 선택합니다.

4. 프로젝트 생성하기
프로젝트 생성하기버튼 클릭 -> 서비스Type을 SMS으로 선택하고 프로젝트 이름을 입력합니다. 알림톡을 전송하기위해서는 PUSH서비스도 선택하면됩니다.

4. 발신번호등록
SMS전송을 위해서는 발신번호가 필수로 등록이 되어있어야 합니다. SMS항목 -> Calling Number메뉴를 선택하면 발신번호 메뉴가 나타나며 발신번호 등록 탭을 클릭하면 필요서류에 대한 부분을 알려줍니다. 서류인증 버튼을 클릭하여 필요한 서류를 제출합니다.

서류 제출후 정상처리가 되면 처리상태가 등록완료로 변경되며 이제 해당발신번호로 SMS발송이 가능합니다.

5. API키관련확인
SMS서비스를 보내기 위해서는 accessKey, secret Key, serviceid 3가지 항목이 필요합니다.
accessKey, secret Key정보는 계정관리->인증키관리->API인증키관리메뉴에서 신규API인증키를 생성하면 아래와 같이 Access Key ID와 Secret Key를 확인 할 수 있습니다.

serviceid의 경우는 프로젝트 생성메뉴에서 생성된 서비스ID값을클릭하면 PUSH,SMS관련 serviceid값을 확인 할 수 있습니다.

6. Swagger UI 테스트
네이버센스 API는 아래 링크에서 자세한 설명이 되어있어서 해당부분을 확인해서 프로그램 작업하면됩니다. 프로그램 개발전에 정상적으로 나가는 Swagger UI로 확인이 가능합니다.
https://api.ncloud-docs.com/docs/ko/ai-application-service-sens-smsv2


7. 네이버 API연계 개발 (전체소스)
API사이트에 C#은 샘플소스가 없어서 제공되는 다른언어의 샘플을 보고 작성하면되고 makeSignature부분에서 HMACSHA256클래스를 이용해서 암호화 하면됩니다. 발신번호는 4번항목에서 등록신청한 해당 발신번호 값으로 전송이 가능합니다.

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.IO;
using System.Security.Cryptography;
 
namespace NaverSensTester
{
    class Program
    {
        static string mSmsAccessKey = "발급받은AccessKey";
        static string mSmsSecretKey = "발급받은SecretKey";
        static string mSmsServiceID = "프로젝트서비스ID값";
        static string mTimeStamp = string.Empty;
 
        static void Main(string[] args)
        {
            Console.WriteLine("SMS문자테스트");
            string url = new StringBuilder()
                            .Append("https://sens.apigw.ntruss.com/sms/v2/services/")
                            .Append(mSmsServiceID)
                            .Append("/messages").ToString();
 
            mTimeStamp = DateTimeOffset.Now.ToUnixTimeMilliseconds().ToString();
            string signature = makeSignature();
 
            var request = (HttpWebRequest)WebRequest.Create(url);
            request.Method = "POST";
            request.ContentType = "application/json; charset=utf-8";
            request.Headers.Add("x-ncp-apigw-timestamp", mTimeStamp);
            request.Headers.Add("x-ncp-iam-access-key", mSmsAccessKey);
            request.Headers.Add("x-ncp-apigw-signature-v2", signature);
 
            string postData = 
                @"{
                    ""type"":""MMS"",
                    ""contentType"" : ""COMM"",
                    ""countryCode"" : ""82"",
                    ""from"":""발신자번호입력필요"",
                    ""content"":""문자테스트"",
                    ""messages"":[
                        {
                            ""to"":""수신자번호입력필요""
                        }
                    ]
                }";
 
            var data = Encoding.UTF8.GetBytes(postData);
            using (var stream = request.GetRequestStream())
            {
                stream.Write(data, 0, data.Length);
            }
            string responseText = string.Empty;
            using (HttpWebResponse resp = (HttpWebResponse)request.GetResponse())
            {
                HttpStatusCode status = resp.StatusCode;
                Console.WriteLine(status);  // 정상 "Accept"
 
                Stream respStream = resp.GetResponseStream();
                using (StreamReader sr = new StreamReader(respStream))
                {
                    responseText = sr.ReadToEnd();
                }
            }
            Console.WriteLine(responseText);
        }
 
        public static string makeSignature()
        {
            string space = " ";                                          // one space
            string newLine = "\n";                                       // new line
            string method = "POST";                                      // method
            string url = $"/sms/v2/services/{mSmsServiceID}/messages";   // url (include query string)
 
            string message = new StringBuilder()
                .Append(method)
                .Append(space) 
                .Append(url)
                .Append(newLine)
                .Append(mTimeStamp)
                .Append(newLine)
                .Append(mSmsAccessKey)
                .ToString();
 
            string encodeBase64String = string.Empty;
            byte[] secretKey = Encoding.UTF8.GetBytes(mSmsSecretKey);
            using (HMACSHA256 hmac = new HMACSHA256(secretKey))
            {
                hmac.Initialize();
                byte[] bytes = Encoding.UTF8.GetBytes(message);
                byte[] rawHmac = hmac.ComputeHash(bytes);
                encodeBase64String = Convert.ToBase64String(rawHmac);
            }
            return encodeBase64String;
        }
    }
}

SMS테스트 결과 정상처리시




반응형