카카오 푸시 API 예제 - kakao pusi API yeje

[Delphi] 팝빌 카카오톡 SDK 튜토리얼

Delphi 개발환경에서 팝빌 Delphi SDK를 적용하여 알림톡 전송(SendATS) 함수를 구현하는 예시입니다.

1. Popbill SDK 추가

① 팝빌 연동자료실에서 Delphi SDK 예제코드 다운로드 후 압축을 해제합니다.

  • 팝빌 연동자료실 - Delphi SDK Example

② 압축해제한 SDK 예제코드에서 Linkhub/ Popbill/ PopbillKakao/ 각 폴더의 pas파일 3개를 프로젝트 유닛으로 추가합니다.

③ 아래 코드를 참조하여 Form 파일을 수정합니다.
1) use 참조유닛 추가
2) 인증정보 변수와 서비스 클래스를 선언
3) FormCreate 프로시저에 카카오톡 서비스 클래스 인스턴스 생성 및 초기화

연동신청시 발급받은 인증정보로 링크아이디(LinkID)와 비밀키(SecretKey) 값을 변경하시기 바랍니다.


unit Example;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, TypInfo, shellapi, ExtCtrls,
  Popbill, PopbillKakao;

const
  // 링크아이디, 연동신청시 발급받은 정보로 변경
  LinkID = 'TESTER';

  // 비밀키, 연동신청시 발급받은 정보로 변경
  SecretKey = 'SwWxqU+0TErBXy/9TVjIPEnI0VTUMMSQZtJf3Ed8q3I=';
// 생략
// ...
// ...

var
  // 클래스 선언 추가
  kakaoService : TKakaoService;
// 생략
// ...
// ...

procedure TfrmExample.FormCreate(Sender: TObject);
begin
  // 카카오톡 서비스 클래스 인스턴스 생성
  kakaoService := TKakaoService.Create(LinkID,SecretKey);

  // true - 개발용(테스트베드), false - 상업용(실서비스)
  kakaoService.IsTest := true;

  // API 오류 Exception 처리여부
  kakaoService.IsThrowException := true;

  // 인증토큰 IP제한기능 사용여부, true(권장)
  kakaoService.IPRestrictOnOff := true;

  //로컬시스템 시간 사용여부, true(사용), false(미사용) - 기본값
  kakaoService.UseLocalTimeYN := false;
end;
                

2. 알림톡 전송(SendATS) 함수 구현

① Form에 버튼을 생성하고 버튼의 Click Event 코드에 알림톡 전송 함수(SendATS)를 추가합니다.

procedure TfrmExample.btnSendATS_oneClick(Sender: TObject);
var
    receiptNum, templateCode, senderNum, altSendType, receiverNum,
    receiverName, content, altContent, requestNum : String;
    Buttons : TSendKakaoButtonList;
    reserveDT : String;
    corpNum : String;
    userID : String;
begin

    // 팝빌회원 사업자번호
    corpNum := '1234567890';

    // 팝빌회원 아이디
    userID := 'testkorea';

    // 알림톡 템플릿코드, ListATSTemplate 함수 반환항목중 templateCode로 확인
    // GetATSTemplateMgtURL(알림톡 템플릿 관리 팝업) 함수를 통해서 확인
    templateCode := '018110000047';

    // 팝빌에 사전 등록된 발신번호
    senderNum := '070-4304-2991';

    // 수신번호
    receiverNum := '010111222';

    // 수신자명
    receiverName := '수신자명';

    // 알림톡 메시지 내용 (최대 1000자)
    // 템플릿의 내용과 일치하지 않은 경우 전송실패
    content := '테스트 알림톡';

    // 대체문자 내용  (최대 2000byte)
    altContent := '대체문자 내용';

    // 대체문자 전송유형, 공백-미전송, C-알림톡전송, A-대체문자 전송
    altSendType := 'A';

    // 알림톡 버튼정보를 템플릿 신청시 기재한 버튼정보와 동일하게 전송하는경우 길이를 0으로 처리
    SetLength(Buttons, 0);

    // 알림톡 버튼 URL에 #{템플릿변수}를 기재한 경우 버튼정보추가 - 템플릿 변수만 변경하여 구성
    //SetLength(Buttons, 1);
    //Buttons[0] := TSendKakaoButton.Create;
    //Buttons[0].buttonName := '버튼명'; // 버튼명
    //Buttons[0].buttonType := 'WL';     // 버튼 DS-배송조회 WL-웹링크 AL-앱링크 MD-메시지전달 BK-봇키워드
    //Buttons[0].buttonURL1 := 'http://www.weblink1.com'; // 버튼링크1  [앱링크] Android / [웹링크] Mobile
    //Buttons[0].buttonURL2 := 'http://www.weblink2.com'; // 버튼링크2  [앱링크] IOS / [웹링크] PC URL

    // 전송요청번호
    // 파트너가 전송 건에 대해 관리번호를 구성하여 관리하는 경우 사용.
    // 1~36자리로 구성. 영문, 숫자, 하이픈(-), 언더바(_)를 조합하여 팝빌 회원별로 중복되지 않도록 할당.
    requestNum := '';

    // 예약전송일시
    reserveDT := '';

    try
            receiptNum := kakaoService.SendATS(corpNum, templateCode, senderNum, altSendType,
                                                reserveDT, receiverNum, receiverName, content,
                                                altContent, Buttons, userID, requestNum);
    except
            on le : EPopbillException do begin
                    ShowMessage('응답코드 : ' + IntToStr(le.code) + #10#13 +'응답메시지 : '+ le.Message);
                    Exit;
            end;
    end;

    if kakaoService.LastErrCode <> 0 then
    begin
            ShowMessage('응답코드 : ' + IntToStr(kakaoService.LastErrCode) + #10#13 +'응답메시지 : '+ kakaoService.LastErrMessage);
    end
    else
    begin
            txtReceiptNum.Text := receiptNum;
            ShowMessage('접수번호 (receiptNum) : ' + receiptNum);
    end;
end;

② 버튼 클릭으로 함수호출 결과를 확인합니다.

카카오 푸시 API 예제 - kakao pusi API yeje

KakaoPush

카카오 플랫폼 API에서 제공하는 푸시알림을 호출하는 젬입니다. iOS, 안드로이드 사용자에게 푸시를 보낼때 유용한 카카오 푸시알림은 REST API로만 제공되고 있기에 이를 젬으로 만들어 봤습니다.

당근마켓(아이폰, 안드로이드)에서 사용하던 코드를 젬으로 만들었습니다.

주의: 이 젬은 카카오에서 공식적으로 제공하는 젬이 아닙니다. 이점 유의 하시기 바랍니다.

설치

Gemfile 파일에 다음과 같이 추가하고:

gem 'kakao_push', '~> 0.1.2'

아래 명령어를 실행합니다:

혹은 젬을 직접 설치할 수 있습니다:

사용법

클라이언트 객체 생성

키를 직접 넘기거나, 기본값으로 env값을 참조할 수 있습니다:

client = KakaoPush::Client.new(rest_api_key: 'kakao_admin_key')

# 아니면
# KAKAO_PUSH_CLIENT_ID=kakao_admin_key

client = KakaoPush::Client.new

토큰 등록

파라미터 및 응답에 관한 자세한 정보는 카카오 REST API 개발가이드 - 푸시알림 참고

res = client.register(uuid: 1, push_type: 'apns', device_id: 'device_id', push_token: 'push_token')

res.success? # 등록에 성공한 경우 true
res.fail? # 등록에 실패한 경우 true
res.data # 등록에 성공한 경우 숫자 30 반환. 30일 후에 해당 토큰이 만료됨을 의미
=> 30

토큰 조회

파라미터 및 응답에 관한 자세한 정보는 카카오 REST API 개발가이드 - 푸시알림 참고

res = client.tokens(uuid: 1)

res.success? # 조희에 성공한 경우 true
res.fail? # 조회에 실패한 경우 true
res.data # 조회에 성공한 경우 데이터 반환. 배열로 반환되지만 배열 객체는 1개 뿐이므로 유의
=> [{"user_id":"1","device_id":"a","push_type":"apns","push_token":"aaa","created_at":"2015-12-11T11:34:17Z","updated_at":"2015-12-11T11:34:17Z"}]

토큰 삭제

파라미터 및 응답에 관한 자세한 정보는 카카오 REST API 개발가이드 - 푸시알림 참고

res = client.deregister(uuid: 1, push_type: 'apns', device_id: 'device_id')
res.success? # 삭제에 성공한 경우 true
res.fail? # 삭제에 실패한 경우 true

푸시 전송

파라미터 및 응답에 관한 자세한 정보는 카카오 REST API 개발가이드 - 푸시알림 참고

apns = KakaoPush::Apns.new(badge: nil, sound: 'default', push_alert: true, message: nil, custom_field: nil, push_token: nil, apns_env: 'sandbox')
gcm = KakaoPush::Gcm.new(collapse: nil, delay_while_idle: nil, time_to_live: nil, dry_run: nil, priority: nil, return_url: nil, custom_field: 'data', push_token: nil)
res = client.send(uuids: [1], apns: apns, gcm: gcm, bypass: false)

res.success? # 전송에 성공한 경우 true
res.fail? # 전송에 실패한 경우 true

success? 결과가 true이더라도 실제 사용자에 디바이스에 전송되었음을 보장하지 않음. 메시지 포맷이 다르거나 맞지 않아도 success? 값이 true로 반환되기도 하므로 실제 전송 유무는 디바이스에서 테스트가 필요합니다.

apns_env 값은 production 인 경우 nil로 전송

서버에 저장할 값

디바이스로부터 받은 토큰, 푸쉬 타입(apns, gcm)은 서버에 저장하는것이 좋다. 토큰 삭제를 안할거라면 푸쉬 타입은 굳이 저장할 필요 없습니다. 푸쉬 토큰은 30일이 지나면 토큰 조회 API를 통해서도 조회 할 수 없으므로 될수 있으면 저장하는 편이 좋다고 생각합니다.

예를 들어보자면 디바이스로부터 받은 토큰과 카카오 푸쉬 만료 예정일을 서버에 저장하고 푸쉬 만료 예정일이 되기 전에 다시 토큰 등록 API를 호출하는 사례도 있습니다.

에러 상황

정상적인 파라미터를 제공 했음에도 아래와 같은 오류가 발생 한다면 Kakao Developers 사이트에서 앱 설정의 '푸시 알림'을 활성화 하고 gcm, apns 설정을 잘 했는지 확인해야 합니다. 설정하지 않은 경우 아래와 같이 파라미터가 잘못됬다고 에러 메시지가 반환됩니다.

{"code":-2,"msg":"[appName] Invalid Kpusher Param. ( appName=1111, uid=1234, did=dlskjflsk3ksdjfl, pushType=apns, pushToken=lqO_NIwaoAcI0MssA )"}%

도움 주신 분들

  • @marocchino : 테스트 코드에서 막혀 있을때 도움 주셨습니다.
  • @shia : 응답 및 푸시 메시지 구조를 잡는데 도움 주셨습니다.
  • qiita-rb : faraday 사용법등 젬을 만드는데 많은 부분 도움 받았습니다.

Contributing

버그 레포팅과 풀리퀘스트는 GitHub에 남겨주세요. https://github.com/n42corp/kakao_push