PlayCamp SDK API 게임사 연동 가이드
이 문서는 게임사가 PlayCamp SDK API를 연동하여 크리에이터 캠페인 기능을 구현하는 방법을 설명합니다.목차
1. 아키텍처 개요
PlayCamp SDK API는 게임 서버를 통해 연동됩니다.역할 분담
| 구성 요소 | 역할 |
|---|---|
| 게임 클라이언트 | 유저 인터페이스 (크리에이터 선택 UI, 쿠폰 입력 화면 등) |
| 게임 서버 | API 호출, 비즈니스 로직 처리, Server Key 보관 |
| PlayCamp SDK API | 데이터 저장, 정산 계산, 통계 집계, 웹훅 발송 |
데이터 흐름 예시
- 유저가 게임에서 크리에이터를 선택
- 게임 서버가
POST /v1/server/sponsors호출 - 유저가 인게임 결제 진행
- 게임 서버가
POST /v1/server/payments호출 - SDK API가 해당 결제를 크리에이터에게 자동 귀속
- 월말 정산 시 크리에이터별 수익 계산
2. 시작하기
2.1 API 키 발급
PlayCamp 플랫폼에서 프로젝트 생성 후 API 키를 발급받습니다.| 키 타입 | 용도 | 보관 위치 |
|---|---|---|
| Server Key | 모든 API 호출 (읽기/쓰기) | 게임 서버 (안전하게 보관) |
| Client Key | 조회 API만 (읽기 전용) | 게임 클라이언트 (선택적 사용) |
주의: Server Key는 절대 클라이언트에 노출하지 마세요.
2.2 인증 방식
모든 API 요청에 Bearer Token 인증을 사용합니다.2.3 서버 환경
| 환경 | URL | 용도 |
|---|---|---|
| Sandbox | https://sandbox-sdk-api.playcamp.io | 개발/테스트 |
| Live | https://sdk-api.playcamp.io | 실제 서비스 |
2.4 기본 설정 예시
3. 크리에이터 후원 (Sponsor)
유저가 응원하는 크리에이터를 설정합니다. 후원 설정 후 해당 유저의 결제는 자동으로 크리에이터에게 귀속됩니다.3.1 흐름
3.2 후원 등록
요청
참고: campaignId를 지정하지 않으면 현재 활성화된 캠페인으로 자동 귀속됩니다.
3.3 후원 변경
이미 후원 중인 유저가 다른 크리에이터로 변경할 때 사용합니다. 요청3.4 후원 해제
요청3.5 에러 처리
| HTTP | 코드 | 설명 | 대응 |
|---|---|---|---|
| 400 | BAD_REQUEST | 활성 캠페인 없음 | 캠페인 상태 확인 |
| 404 | NOT_FOUND | 크리에이터 없음 | creatorKey 확인 |
| 409 | CONFLICT | 이미 후원 중 | PUT으로 변경 요청 |
4. 결제 등록 (Payment)
인게임 결제 내역을 등록합니다. 등록된 결제는 유저의 후원 크리에이터에게 자동 귀속됩니다.4.1 흐름
4.2 결제 등록
요청4.3 필수 파라미터
| 필드 | 타입 | 설명 |
|---|---|---|
userId | string | 게임 내 유저 식별자 |
transactionId | string | 플랫폼별 고유 거래 ID (중복 방지용) |
productId | string | 상품 ID |
amount | number | 결제 금액 |
currency | string | 통화 코드 (ISO 4217: USD, KRW 권장) |
platform | string | 플랫폼 (iOS, Android, Web, Roblox, Other) |
purchasedAt | string | 실제 결제 발생 시각 (ISO 8601) |
4.4 선택적 파라미터
| 필드 | 타입 | 설명 |
|---|---|---|
productName | string | 상품명 (표시용) |
distributionType | string | 유통 타입 (아래 표 참조) |
4.5 유통 타입 (distributionType)
| 값 | 설명 | 기본 적용 플랫폼 |
|---|---|---|
MOBILE_STORE | 모바일 앱스토어 | iOS, Android |
PC_SELF_STORE | PC 자체 스토어 | Web |
PC_STORE | PC 스토어 (스팀 등) | Roblox, Other |
참고:distributionType을 지정하지 않으면platform값에 따라 자동으로 설정됩니다.
4.6 환율 변환
USD가 아닌 통화로 결제 시 자동으로 USD로 환산됩니다 (amountUsd 필드).
4.7 결제 환불
요청4.8 에러 처리
| HTTP | 코드 | 설명 |
|---|---|---|
| 400 | VALIDATION_ERROR | 필수 파라미터 누락 |
| 409 | CONFLICT | 중복된 transactionId |
5. 쿠폰 사용 (Coupon)
크리에이터가 배포한 쿠폰 코드를 사용합니다.5.1 흐름
5.2 쿠폰 검증
사용 전에 쿠폰이 유효한지 확인합니다. 요청5.3 쿠폰 사용
검증 후 실제로 쿠폰을 사용합니다. 요청5.4 에러 코드
| 코드 | 설명 |
|---|---|
COUPON_NOT_FOUND | 존재하지 않는 쿠폰 코드 |
COUPON_INACTIVE | 비활성화된 쿠폰 |
COUPON_NOT_YET_VALID | 사용 기간 전 |
COUPON_EXPIRED | 만료된 쿠폰 |
USER_CODE_LIMIT | 유저별 코드 사용 한도 초과 |
USER_PACKAGE_LIMIT | 유저별 패키지 사용 한도 초과 |
TOTAL_USAGE_LIMIT | 전체 사용 한도 초과 |
5.5 전체 흐름 예시 (Node.js)
6. 조회 API
캠페인, 크리에이터, 후원 상태 등을 조회합니다.6.1 기본 조회 (Server API)
Server Key로 모든 조회가 가능합니다.6.2 Client API (선택)
게임 클라이언트에서 직접 API를 호출하고 싶다면 Client Key를 사용할 수 있습니다.- Client Key는 읽기 전용이라 노출되어도 안전합니다
- 게임 서버를 거치지 않아 응답이 빠릅니다
- 서버 부하를 줄이고 싶을 때 고려하세요
7. 웹훅 수신
SDK API에서 이벤트 발생 시 게임 서버로 알림을 보냅니다.7.1 이벤트 종류
| 이벤트 | 설명 |
|---|---|
coupon.redeemed | 쿠폰 사용됨 |
payment.created | 결제 등록됨 |
payment.refunded | 결제 환불됨 |
sponsor.created | 후원 등록됨 |
sponsor.changed | 후원 변경됨 |
7.2 웹훅 형식
여러 이벤트가 배치로 전송됩니다. 헤더7.3 서명 검증
웹훅 요청이 PlayCamp에서 온 것인지 확인하기 위해 서명을 검증해야 합니다. 서명 생성 방식- 알고리즘: HMAC-SHA256
- 키: 웹훅 등록 시 발급된
secret - 데이터: 요청 body (raw string)
- 결과: hex 문자열
7.4 수신 예시 (Node.js/Express)
중요:express.json()대신express.raw({ type: 'application/json' })를 사용해야 원본 body로 서명 검증이 가능합니다.
8. 테스트 모드
실제 데이터를 생성하지 않고 API 연동을 테스트할 수 있습니다.8.1 사용 방법
요청 body에isTest: true를 추가합니다.
8.2 동작
- 요청 파라미터 검증은 실제와 동일하게 수행
- 데이터는 DB에 저장되지 않음
- 모의 응답 반환
8.3 지원 API
| API | isTest 지원 |
|---|---|
| POST /sponsors | ✅ |
| PUT /sponsors/user/:userId | ✅ |
| DELETE /sponsors/user/:userId | ✅ |
| POST /payments | ✅ |
| POST /payments/:id/refund | ✅ |
| POST /coupons/validate | ✅ |
| POST /coupons/redeem | ✅ |
9. 에러 처리
9.1 에러 응답 형식
9.2 Validation 에러
필수 파라미터 누락이나 형식 오류 시:9.3 공통 에러 코드
| HTTP | 코드 | 설명 |
|---|---|---|
| 400 | VALIDATION_ERROR | 요청 파라미터 검증 실패 |
| 400 | BAD_REQUEST | 잘못된 요청 |
| 401 | UNAUTHORIZED | 인증 실패 (API 키 오류) |
| 403 | FORBIDDEN | 권한 없음 |
| 404 | NOT_FOUND | 리소스를 찾을 수 없음 |
| 409 | CONFLICT | 중복 리소스 |
| 500 | INTERNAL_ERROR | 서버 내부 오류 |
10. 빠른 참조
10.1 Server API 엔드포인트
| 기능 | Method | Endpoint |
|---|---|---|
| 후원 | ||
| 후원 등록 | POST | /v1/server/sponsors |
| 후원 상태 조회 | GET | /v1/server/sponsors/user/:userId |
| 후원 변경 | PUT | /v1/server/sponsors/user/:userId |
| 후원 해제 | DELETE | /v1/server/sponsors/user/:userId |
| 결제 | ||
| 결제 등록 | POST | /v1/server/payments |
| 결제 조회 | GET | /v1/server/payments/:transactionId |
| 유저 결제 내역 | GET | /v1/server/payments/user/:userId |
| 결제 환불 | POST | /v1/server/payments/:transactionId/refund |
| 쿠폰 | ||
| 쿠폰 검증 | POST | /v1/server/coupons/validate |
| 쿠폰 사용 | POST | /v1/server/coupons/redeem |
| 유저 쿠폰 내역 | GET | /v1/server/coupons/user/:userId |
| 조회 | ||
| 캠페인 목록 | GET | /v1/server/campaigns |
| 캠페인 상세 | GET | /v1/server/campaigns/:id |
| 크리에이터 검색 | GET | /v1/server/creators/search |
| 크리에이터 상세 | GET | /v1/server/creators/:creatorKey |
10.2 쿠폰 에러 코드
| 코드 | 설명 |
|---|---|
COUPON_NOT_FOUND | 존재하지 않는 쿠폰 |
COUPON_INACTIVE | 비활성화된 쿠폰 |
COUPON_NOT_YET_VALID | 사용 기간 전 |
COUPON_EXPIRED | 만료됨 |
USER_CODE_LIMIT | 유저별 코드 한도 초과 |
USER_PACKAGE_LIMIT | 유저별 패키지 한도 초과 |
TOTAL_USAGE_LIMIT | 전체 한도 초과 |
10.3 결제 플랫폼
| 값 | 설명 |
|---|---|
iOS | Apple App Store |
Android | Google Play Store |
Web | 웹 결제 |
Roblox | Roblox 플랫폼 |
Other | 기타 |
추가 자료
- OpenAPI 스펙 - Swagger UI에서 확인 가능
- Postman 컬렉션 - 직접 테스트 가능
- API 상세 문서 - 전체 API 레퍼런스