Naver Cloud Platform의 SENS 서비스를 이용해서 SMS를 보내려고 합니다.
일단,
Naver Cloud Platform에
회원가입, 로그인 후 콘솔에서 프로젝트를 생성하고
설명서를 참고해서 발신번호 등록과 API 인증키를 생성하는 등의 과정을 진행해야 합니다.
저의 경우, 다음과 같이 회원가입 페이지에서 인증번호를 보내주는 기능을 구현했습니다.
class AuthSms(models.Model):
phone_number = models.CharField(max_length=11, primary_key=True)
auth_number = models.IntegerField()
class Meta:
db_table = 'auth_numbers'
휴대폰 번호와 인증번호를 저장하는 일반적인 테이블입니다.
class AuthSmsSendView(View):
#실제 문자를 보내주는 메서드
def send_sms(self, phone_number, auth_number):
headers = {
'Content-Type': 'application/json; charset=utf-8',
'x-ncp-auth-key': f'{SMS_ACCESS_KEY_ID}',
'x-ncp-service-secret':f'{SMS_SERVICE_SECRET}',
}
data = {
'type':'SMS',
'contentType':'COMM',
'countryCode':'82',
'from':f'{SMS_SEND_PHONE_NUMBER}',
'to':[
f'{phone_number}',
],
'content':f'인증번호 [{auth_number}]'
}
requests.post(SMS_URL, headers=headers, json=data)
def post(self, request):
try:
input_data = json.loads(request.body)
input_phone_number = input_data['phone_number']
created_auth_number = randint(1000, 10000)
exist_phone_number = AuthSms.objects.get(phone_number=input_phone_number)
exist_phone_number.auth_number = created_auth_number
exist_phone_number.save()
self.send_sms(phone_number = input_phone_number, auth_number = created_auth_number)
return JsonResponse({'message':'SUCCESS'}, status=200)
except AuthSms.DoesNotExist:
AuthSms.objects.create(
phone_number = input_phone_number,
auth_number = created_auth_number
).save()
self.send_sms(phone_number = input_phone_number, auth_number = created_auth_number)
return JsonResponse({'message':'SUCCESS'}, status=200)
send_sms()
메서드는
네이버 클라우드 플랫폼의 설명서에 따라
request의 header, body 들을 위와 같이 넣어주고
API의 URL로 request를 보냅니다.
SMS_ACCESS_KEY_ID는 계정관리 > 마이페이지 > 인증키 관리에서 생성해주면 됩니다.
SMS_SERVICE_SECRET는 프로젝트의 시크릿 키입니다.
SMS_SEND_PHONE_NUMBER는 프로젝트에서 설정한 발신번호입니다.
SMS_URL은 API의 URL입니다.
그리고 post메서드를 사용해서
DB에 있는 phone_number라면(인증번호를 받은 여력이 있는 경우)
난수를 새로 생성해서 DB의 auth_number를 update해준 뒤,
update해준 난수를 sms로 보내주었습니다.
또한, DB에 없는 phone_number라면(인증번호를 처음 받은 경우)
새로운 record를 생성해서(DB에 정보를 저장)
sms를 보내주었습니다.
validation check와 DB 호출 최소화를 고려하지 않은 비효율적인 코드입니다.
많은 도움 되었습니다! 감사합니다. 북마크해놓고 앞으로도 종종 들리겠습니다 ㅎㅎㅎ