Affiliate Point Integration API Specification
제휴포인트 연동이란 럭키박스 내에서 매체사 앱의 포인트 시스템을 사용하여 럭키박스 구매를 지원하기 위한 API 연동 작업입니다. 제휴 포인트 연동을 위해 ① 제휴포인트 조회 API와 ② 포인트 사용 API를 매체사에서 구현해 주셔야 하며, 최종적으로 매체사 관리자 사이트의 앱설정에서 각 API 주소 설정 및 제휴포인트 지원 여부를 설정해 주셔야 합니다.
| 파라미터명 | 데이터 타입 | 필수 | 설명 | 비고 |
|---|---|---|---|---|
| userId | string | 럭키박스 접속 시 매체사에서 제공한 매체사 이용자의 ID입니다. | ||
| requestDateTime | string | YYYYMMDDhhmm 형식의 조회 요청일자(년월일시분) 예) 202604021000 |
KST 기준 | |
| hash | string | 요청 유효성 검사를 위한 해시값 userId + requestDateTime를 단순 문자열 합치기 후 매체사 비밀키로 HMAC-SHA256 해싱 (해시 생성 방식은 럭키박스 사이트 접속 시 생성하는 방식과 동일) |
아래 예제 참조 |
| 필드명 | 데이터 타입 | 설명 |
|---|---|---|
| result | string |
success
invalidUser
invalidHash
invalidRequest
failed
timeOut
success성공
invalidUser이용자 ID 오류
invalidHash해시값 오류
invalidRequest요청 파라미터 오류
failed조회 실패
timeOut요청 시간 초과 (requestDateTime 기준 3분 초과 시)
※ 럭키박스 서버와 매체사 서버의 시간 차이를 감안하여 처리 요망
|
| point | number (int) | 이용자의 보유 포인트 success 시에만 포함 |
| cashToPoint | number (double) | 현금을 포인트로 변환할 때 참조하는 비율 예) 현금 1000원 → Math.floor(1000 × cashToPoint) 포인트 success 시에만 포함 |
| pointName | string | 제휴사 포인트 이름 success 시에만 포함 |
{ "result": "success", "point": 5000, "cashToPoint": 2.0, "pointName": "럭키포인트" }
const Crypto = require('crypto'); const appSecret = '매체사에할당된앱시크릿'; const userId = '이용자식별자'; const requestDateTime = '202604031030'; const getHash = (key, value) => { return Crypto.createHmac('sha256', key) .update(value, 'utf8').digest('hex'); }; // hash = HMAC-SHA256(appSecret, userId + requestDateTime) const hash = getHash(appSecret, `${userId}${requestDateTime}`);
| 파라미터명 | 데이터 타입 | 필수 | 설명 | 비고 |
|---|---|---|---|---|
| userId | string | 럭키박스 접속 시 매체사에서 제공한 매체사 이용자의 ID | ||
| requestDateTime | string | YYYYMMDDhhmm 형식의 요청일자(년월일시분) 예) 202604021000 |
KST 기준 | |
| hash | string | 요청 유효성 검사 해시값 userId + requestDateTime + amount + orderId 순으로 합치기 후 매체사 비밀키로 HMAC-SHA256 해싱 |
아래 예제 참조 | |
| amount | string (max 7) | 현금 기준 결제 금액 (단위: 원) 매체사별 현금↔포인트 비율이 다르므로 현금 기준으로 요청하며, 매체사에서 포인트로 변환 후 차감합니다. 포인트 계산 시 발생하는 소숫점 처리는 매체사 정책에 맞게 처리 부탁드리며, 럭키박스 UI 내에서는 필요 포인트 계산 시 소숫점 절사 후 표시합니다. |
||
| orderId | string (max 15) | 럭키박스 주문 고유번호 | 중복 요청 방지 키 | |
| orderName | string (max 20) | 주문 내용 예) 럭키박스 1개 구매 |
| 필드명 | 데이터 타입 | 설명 |
|---|---|---|
| result | string |
success
invalidUser
invalidHash
invalidRequest
insufficientPoint
failed
timeOut
success성공
invalidUser이용자 ID 오류
invalidHash해시값 오류
invalidRequest요청 파라미터 오류
insufficientPoint포인트 잔액 부족
failed포인트 사용 실패
timeOut요청 시간 초과 (requestDateTime 기준 3분 초과 시)
|
| trId | string | 매체사 자체 제휴포인트 사용 이력의 고유번호 ※ 단순 참고용이며, 럭키박스 주문 정보에 함께 기록됩니다. |
| pointName | string | 사용된 포인트의 이름 |
| point | number | 실제 사용된 포인트의 양 |
{ "result": "success", "trId": "매체사_이력_고유번호", "point": 2000, "pointName": "포인트" }
orderId 기준으로 중복 처리 여부를 반드시 체크해야 합니다.success를 리턴해야 합니다.
requestDateTime의 YYYYMM(년월) 기준으로 집계하세요. 요청 수신 시점 기준으로 집계 시 날짜 변동으로 인해 럭키박스 월 집계 정보와 달라질 수 있습니다.
const Crypto = require('crypto'); const appSecret = '매체사에할당된앱시크릿'; const userId = '이용자식별자'; const requestDateTime = '202604031030'; const amount = '1000'; const orderId = '100'; const getHash = (key, value) => { return Crypto.createHmac('sha256', key) .update(value, 'utf8').digest('hex'); }; // hash = HMAC-SHA256(appSecret, userId + requestDateTime + amount + orderId) const hash = getHash(appSecret, `${userId}${requestDateTime}${amount}${orderId}`);
orderId에 해당하는 포인트 사용 이력이 DB에 있는지 확인합니다.orderId 이력이 있으면 중복 요청이므로, 포인트 차감 없이 즉시 success 리턴 후 종료
requestDateTime 사이의 경과 시간을 확인합니다.timeOut을 리턴합니다.
userId의 포인트 잔액(userPoint) 조회amountPoint = Math.floor(amount × 현금대포인트비율)userPoint >= amountPoint 검사 후, 잔액 부족 시 insufficientPoint 리턴
amountPoint를 이용자 포인트 잔액에서 차감하고, 이용자에게 표시할 포인트 사용 이력을 기록합니다.
orderId, orderName, userId, amount, amountPoint, requestDateTimetrId로 하여 success 리턴
failed를 리턴합니다.invalidUser, invalidRequest, invalidHash 등)
럭키박스 서버에서 매체사 API를 호출할 때 사용하는 고정 IP입니다. 매체사 서버의 방화벽 또는 보안 그룹에서 아래 IP를 인바운드 허용(Whitelist) 처리해 주세요.
| IP 주소 | 환경 | 비고 |
|---|---|---|
| 52.78.196.162 | Production | |
| 16.184.19.23 | Production | |
| 119.198.9.10 | Test |