2019년 6월 26일 수요일

python에서 ncloud SENS API 로 SMS 보내기

php로 하고나니, 여기 저기서 SMS 를 보내달라는 요청이 있어서,

걍 python 으로 만들어서 google cloud function에 올려놓고 보내기로.

SMS 가 건당 비용이 발생해서 그런지, header와 hash 만드는게 살짝 복잡하여,
또 약간 삽질 해서 만든 python 샘플 입니다.

필요하신 분 참고하세요.




import hmac, hashlib, base64
import time, requests, json
sid = "ncp:sms:kr:xxxxxxxxxxxx:project_name"

sms_uri = "/sms/v2/services/{}/messages".format(sid)
sms_url = "https://sens.apigw.ntruss.com{}".format(sms_uri)
sec_key = "{서비스 ID Secret Key}"
    
acc_key_id  = "{인증키 key id}"
acc_sec_key = b'{인증키 secret key}'
    
stime = int(float(time.time()) * 1000)
    
hash_str = "POST {}\n{}\n{}".format(sms_uri, stime, acc_key_id)
    
digest = hmac.new(acc_sec_key, msg=hash_str.encode('utf-8'), digestmod=hashlib.sha256).digest()
d_hash = base64.b64encode(digest).decode()

from_no = "01012341234"
to_no   = "01056785678"
message = "메세지 테스트"

msg_data = {
    'type': 'SMS',
    'countryCode': '82',
    'from': "{}".format(from_no),
    'contentType': 'COMM',
    'content': "{}".format(message),
    'messages': [{'to': "{}".format(to_no)}]
}
    
response = requests.post(
    sms_url, data=json.dumps(msg_data),
    headers={"Content-Type": "application/json; charset=utf-8",
            "x-ncp-apigw-timestamp": str(stime),
            "x-ncp-iam-access-key": acc_key_id,
            "x-ncp-apigw-signature-v2": d_hash
            }
)


print(response.text)





- key 의 종류 확인. 서비스 ID & 인증키




1. ncloud SENS 에서 프로젝트 생성 후, 서비스 ID, secret key 복사






2. ncloud 마이페이지 > 인증키 관리 에서 인증키 생성 후, 인증키 key id, secret key 복사




3. ncloud SENS > SMS > Calling Number 에서 발신번호 등록




4. 문자발송 TEST

위 코드 참고하여 발송 테스트







2019년 6월 25일 화요일

PHP codeigniter에서 ncloud SENS API 로 SMS 보내기

웹호스팅 이용해서 간단한 홈페이지 만들기엔 역시 php가 편하네요.
간단한 페이지 만들 때는 아직 codeigniter 3.x 버전을 사용합니다.

홈페이지에서 새 글이 올라오면 문자를 보내달라는 고객 요청이 있어서,
rest API 형태로 SMS 를 보낼 수 있는 서비스를 검색한후,
네이버 ncloud 의 SENS API 를 사용하기로 결정

API문서는 잘 되어 있는데, PHP 예제를 찾기가 어려워,
약간의 삽질을 통해 만든 PHP 샘플 공유합니다.


// sms 보내기 추가 
$sID = "ncp:sms:kr:xxxxxxxxxxxx:project_name"; // 서비스 ID
$smsURL = "https://sens.apigw.ntruss.com/sms/v2/services/".$sID."/messages";
$smsUri = "/sms/v2/services/".$sID."/messages";
$sKey = "{서비스 ID Secret Key}";

$accKeyId = "{인증키 key id}";
$accSecKey = "{인증키 secret key}";

$sTime = floor(microtime(true) * 1000);

// The data to send to the API
$postData = array(
    'type' => 'SMS',
    'countryCode' => '82',
    'from' => '01012341234', // 발신번호 (등록되어있어야함)
    'contentType' => 'COMM',
    'content' => "메세지 내용",
    'messages' => array(array('content' => "메세지 내용", 'to' => '01056785678'))
);

$postFields = json_encode($postData) ;

$hashString = "POST {$smsUri}\n{$sTime}\n{$accKeyId}";
$dHash = base64_encode( hash_hmac('sha256', $hashString, $accSecKey, true) );

$header = array(
        // "accept: application/json",
        'Content-Type: application/json; charset=utf-8',
        'x-ncp-apigw-timestamp: '.$sTime,
        "x-ncp-iam-access-key: ".$accKeyId,
        "x-ncp-apigw-signature-v2: ".$dHash
    );

// Setup cURL
$ch = curl_init($smsURL);
curl_setopt_array($ch, array(
    CURLOPT_POST => TRUE,
    CURLOPT_RETURNTRANSFER => TRUE,
    CURLOPT_HTTPHEADER => $header,
    CURLOPT_POSTFIELDS => $postFields
));

$response = curl_exec($ch);





- key 의 종류 확인. 서비스 ID & 인증키
- 웹호스팅의 보안 설정 문제로 curl 을 사용




1. ncloud SENS 에서 프로젝트 생성 후, 서비스 ID, secret key 복사






2. ncloud 마이페이지 > 인증키 관리 에서 인증키 생성 후, 인증키 key id, secret key 복사




3. ncloud SENS > SMS > Calling Number 에서 발신번호 등록




4. 문자발송 TEST

위 코드 참고하여 발송 테스트