WebView OTT 생성
curl --request POST \
--url https://sdk-api.playcamp.io/v1/server/webview/ott \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"userId": "<string>",
"campaignId": "<string>",
"codeChallenge": "<string>",
"callbackId": "<string>",
"metadata": {},
"showCampaignDetail": false,
"isTest": false
}
'import requests
url = "https://sdk-api.playcamp.io/v1/server/webview/ott"
payload = {
"userId": "<string>",
"campaignId": "<string>",
"codeChallenge": "<string>",
"callbackId": "<string>",
"metadata": {},
"showCampaignDetail": False,
"isTest": False
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
userId: '<string>',
campaignId: '<string>',
codeChallenge: '<string>',
callbackId: '<string>',
metadata: {},
showCampaignDetail: false,
isTest: false
})
};
fetch('https://sdk-api.playcamp.io/v1/server/webview/ott', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://sdk-api.playcamp.io/v1/server/webview/ott",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'userId' => '<string>',
'campaignId' => '<string>',
'codeChallenge' => '<string>',
'callbackId' => '<string>',
'metadata' => [
],
'showCampaignDetail' => false,
'isTest' => false
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://sdk-api.playcamp.io/v1/server/webview/ott"
payload := strings.NewReader("{\n \"userId\": \"<string>\",\n \"campaignId\": \"<string>\",\n \"codeChallenge\": \"<string>\",\n \"callbackId\": \"<string>\",\n \"metadata\": {},\n \"showCampaignDetail\": false,\n \"isTest\": false\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://sdk-api.playcamp.io/v1/server/webview/ott")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"userId\": \"<string>\",\n \"campaignId\": \"<string>\",\n \"codeChallenge\": \"<string>\",\n \"callbackId\": \"<string>\",\n \"metadata\": {},\n \"showCampaignDetail\": false,\n \"isTest\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sdk-api.playcamp.io/v1/server/webview/ott")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"userId\": \"<string>\",\n \"campaignId\": \"<string>\",\n \"codeChallenge\": \"<string>\",\n \"callbackId\": \"<string>\",\n \"metadata\": {},\n \"showCampaignDetail\": false,\n \"isTest\": false\n}"
response = http.request(request)
puts response.read_body{
"data": {
"ott": "<string>",
"expiresIn": 123
}
}{
"status": 400,
"error": "Bad Request",
"message": "Validation failed",
"code": "VALIDATION_ERROR",
"details": [
{
"path": "userId",
"message": "Required"
},
{
"path": "amount",
"message": "Expected number, received string"
}
]
}{
"status": 401,
"error": "Unauthorized",
"message": "Invalid API key",
"code": "UNAUTHORIZED"
}{
"status": 404,
"error": "Not Found",
"message": "Payment not found: txn-12345",
"code": "NOT_FOUND"
}WebView
WebView OTT 생성
WebView 인증을 위한 일회용 토큰(OTT)을 생성합니다.
- OTT는 1회성이며 60초 후 만료됩니다
- 게임 서버에서만 발급 가능합니다 (Server API Key 필요)
- 같은 유저에 대해 새 세션이 생성되면 기존 세션이 자동 무효화됩니다
POST
/
v1
/
server
/
webview
/
ott
WebView OTT 생성
curl --request POST \
--url https://sdk-api.playcamp.io/v1/server/webview/ott \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"userId": "<string>",
"campaignId": "<string>",
"codeChallenge": "<string>",
"callbackId": "<string>",
"metadata": {},
"showCampaignDetail": false,
"isTest": false
}
'import requests
url = "https://sdk-api.playcamp.io/v1/server/webview/ott"
payload = {
"userId": "<string>",
"campaignId": "<string>",
"codeChallenge": "<string>",
"callbackId": "<string>",
"metadata": {},
"showCampaignDetail": False,
"isTest": False
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
userId: '<string>',
campaignId: '<string>',
codeChallenge: '<string>',
callbackId: '<string>',
metadata: {},
showCampaignDetail: false,
isTest: false
})
};
fetch('https://sdk-api.playcamp.io/v1/server/webview/ott', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://sdk-api.playcamp.io/v1/server/webview/ott",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'userId' => '<string>',
'campaignId' => '<string>',
'codeChallenge' => '<string>',
'callbackId' => '<string>',
'metadata' => [
],
'showCampaignDetail' => false,
'isTest' => false
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://sdk-api.playcamp.io/v1/server/webview/ott"
payload := strings.NewReader("{\n \"userId\": \"<string>\",\n \"campaignId\": \"<string>\",\n \"codeChallenge\": \"<string>\",\n \"callbackId\": \"<string>\",\n \"metadata\": {},\n \"showCampaignDetail\": false,\n \"isTest\": false\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://sdk-api.playcamp.io/v1/server/webview/ott")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"userId\": \"<string>\",\n \"campaignId\": \"<string>\",\n \"codeChallenge\": \"<string>\",\n \"callbackId\": \"<string>\",\n \"metadata\": {},\n \"showCampaignDetail\": false,\n \"isTest\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sdk-api.playcamp.io/v1/server/webview/ott")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"userId\": \"<string>\",\n \"campaignId\": \"<string>\",\n \"codeChallenge\": \"<string>\",\n \"callbackId\": \"<string>\",\n \"metadata\": {},\n \"showCampaignDetail\": false,\n \"isTest\": false\n}"
response = http.request(request)
puts response.read_body{
"data": {
"ott": "<string>",
"expiresIn": 123
}
}{
"status": 400,
"error": "Bad Request",
"message": "Validation failed",
"code": "VALIDATION_ERROR",
"details": [
{
"path": "userId",
"message": "Required"
},
{
"path": "amount",
"message": "Expected number, received string"
}
]
}{
"status": 401,
"error": "Unauthorized",
"message": "Invalid API key",
"code": "UNAUTHORIZED"
}{
"status": 404,
"error": "Not Found",
"message": "Payment not found: txn-12345",
"code": "NOT_FOUND"
}인증
Server API Key (format: {keyId}:{secret})
본문
application/json
게임 내 유저 식별자
특정 캠페인으로 WebView 범위 제한
PKCE S256 challenge (Base64URL 인코딩된 SHA256)
Required string length:
43 - 128웹훅 추적용 ID (이 세션에서 발생하는 웹훅 이벤트에 포함됨)
추가 메타데이터 (세션에 저장)
웹뷰 부스트 화면에 캠페인 상세 버튼 표시
테스트 모드 (샘플 데이터 기반 세션 발급)
응답
성공
Show child attributes
Show child attributes
⌘I