openapi: 3.1.0
info:
  description: "# 개요\n\n웹훅은 시스템에서 발생하는 이벤트에 대한 참고입니다. 특정 이벤트가 발생하면 엑솔라는 이벤트 데이터가 송신되는 HTTP 요청을 애플리케이션에 \n보냅니다. 이는 일반적으로 JSON 형식의 POST 요청입니다.\n\n<strong>이벤트 예시:</strong>\n- 아이템 카탈로그와 사용자 상호 작용\n- 주문 결제 또는 취소\n\n설정한 이벤트가 발생하면 엑솔라는 웹훅을 통해 시스템에 해당 이벤트를 알립니다. 그 결과로 다음과 같은 작업을 수행할 수 있습니다.\n- 사용자의 잔액 충전\n- 결제 대금 환불\n- 사용자 계정에서 새 아이템 추가 또는 제거\n- 정기 결제 서비스 제공 시작\n- 부정 결제가 의심되는 경우 사용자 차단\n\n<b>결제 처리 웹훅 워크플로의 예시:</b>\n\n![결제 처리 웹훅](https://cdn.xsolla.net/developers/current/images/api_docs/webhooks-general.svg)\n\n<div class=\"note\">\n<p><strong>메모</strong></p><p> 사용된 솔루션과 통합 유형에 따라 웹훅 세트와 상호작용 순서가 제공된 예시와 다를 수 있습니다.</p>\n</div>\n\n<b>엑솔라 웹훅 통합을 위한 동영상 가이드:</b>\n\n<div style=\"position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; border-radius: 15px; overflow: hidden;\">\n  <iframe src=\"https://player.vimeo.com/video/1034591338\" style=\"position: absolute; top:0; left: 0; width: 100%; height: 100%; border:0; border-radius: 15px;\" allowfullscreen></iframe>\n</div>\n\n\n<b>엑솔라 상품 및 솔루션으로 작업 시 웹훅 설정:</b>\n\n<table>\n<thead>\n    <tr>\n        <th>상품/솔루션</th>\n        <th>필수/선택</th>\n        <th>웹훅 사용처</th>\n    </tr>\n</thead>\n<tbody>\n    <tr>\n        <td>결제</td>\n        <td>필수</td>\n        <td>\n          <ul>\n            <li>사용자 유효성 검사.</li>\n            <li>결제 성공 또는 결제 환불 시 트랜잭션 세부 정보에 대한 정보 수신.</li>\n            <li>구매한 아이템을 사용자에게 추가하고 주문 취소 시 아이템을 제거.</li>\n          </ul>\n        </td>\n    </tr>\n    <tr>\n        <td>인게임 스토어</td>\n        <td>필수</td>\n        <td>\n          <ul>\n            <li>사용자 유효성 검사.</li>\n            <li>결제 성공 또는 결제 환불 시 트랜잭션 세부 정보에 대한 정보 수신.</li>\n            <li>구매한 아이템을 사용자에게 추가하고 주문 취소 시 아이템을 제거.</li>\n          </ul>\n        </td>\n    </tr>\n    <tr>\n        <td>게임 판매</td>\n        <td>선택 사항</td>\n        <td>게임 키 판매의 경우 사용자 유효성 검사 및 아이템 추가가 필요하지 않습니다. 결제나 주문 취소 등 이벤트 관련 정보를 수신하기 위해 웹훅을 연결할 수 있습니다.<br />웹훅을 연결하는 경우 들어오는 모든 <a href=\"/ko/webhooks/overview/#section/List-of-required-webhooks\">필수 웹훅</a>을 처리해야 합니다.\n</td>\n    </tr>\n    <tr>\n        <td>정기 결제</td>\n        <td>선택 사항</td>\n        <td>정기 결제 생성, 업데이트 또는 취소에 대한 정보를 받습니다. 또는 <a href=\"/doc/subscriptions/integration-guide/get-subscription-information/#guides_subscriptions_get_subscription_information_set_up_via_api\">API를 통해 정보를 요청</a>할 수 있습니다.\n</td>\n    </tr>\n    <tr>\n        <td>웹샵</td>\n        <td>필수</td>\n        <td>\n          <ul>\n            <li>사용자 유효성 검사.</li>\n            <li>결제 성공 또는 결제 환불 시 트랜잭션 세부 정보에 대한 정보 수신.</li>\n            <li>구매한 아이템을 사용자에게 추가하고 주문 취소 시 아이템을 제거.</li>\n            <li>사용자 ID를 통한 인증을 사용하는 경우 사용자 인증을 사용합니다. 또는 <a href=\"/solutions/web-shop/authentication-and-analytics/set-up-authentication/#web_shop_guide_shop_with_auth_set_up_auth_xsolla_login_how_to_get_it\">엑솔라 로그인을 통한 사용자 인증</a>을 사용할 수 있습니다.</li>\n          </ul>\n        </td>\n    </tr>\n    <tr>\n        <td>디지털 배포 솔루션</td>\n        <td>필수</td>\n        <td>\n          <ul>\n            <li>사용자 유효성 검사.</li>\n            <li>엑솔라 측의 트랜잭션 ID와 시스템의 트랜잭션 ID를 연결.</li>\n            <li>주문에서 추가 트랜잭션 매개 변수를 전송.</li>\n            <li>구매한 아이템을 사용자에게 추가하고 주문 취소 시 아이템을 제거.</li>\n          </ul>\n          <p>디지털 배포 솔루션에 대한 웹훅 설정에 대한 자세한 내용은 <a href=\"/solutions/ddh/#integration_guide_ddh_webhook\">문서</a>를 참조하세요.</p>\n        </td>\n    </tr>\n    <tr>\n        <td>로그인</td>\n        <td>선택 사항</td>\n        <td>\n          <p>이벤트 정보 수신:</p>\n          <ul>\n            <li>사용자 등록/권한 부여</li>\n            <li>사용자 이메일 주소 확인</li>\n            <li>사용자의 소셜 미디어 계정 연결</li>\n          </ul>\n          <p>웹훅 설정 방법에 대한 자세한 정보는 <a href=\"/api/login/operation/add-webhook-for-event/\">로그인 문서</a>를 참조하십시오.</p>\n        </td>\n    </tr>\n</tbody>\n</table>\n\n# 필수 웹훅 목록\n웹훅 작업이 필요한 상품 및 솔루션을 사용하는 경우 <a href=\"/webhooks/overview/#section/Set-up-\nwebhooks-in-Publisher-Account\">관리자 페이지에서 웹훅을 활성화 및 테스트</a>하고 <a \nhref=\"/webhooks/overview/#section/Webhook-listener\">처리를 설정</a>합니다. 특정 이벤트가 발생하면 \n웹훅이 순차적으로 전송됩니다. 따라서 웹훅 중 하나를 처리하지 않으면 후속 웹훅이 전송되지 않습니다. 필수 웹훅 목록은 아래에 제시되어 \n있습니다.\n\n## 인게임 스토어 및 결제\n사이트에서 아이템을 구매하고 반품할 때 엑솔라 측에서 2개의 웹훅 전송 옵션이 설정되었습니다. 결제 및 트랜잭션 데이터가 포함된 정보와 구매한 \n아이템에 대한 정보는 별도로 제공되거나 하나의 웹훅으로 결합될 수 있습니다.\n\n<b>결합된 웹훅에서 정보 수신:</b>\n\n2025년 1월 22일 이후 <a href=\"https://publisher.xsolla.com/\">관리자 페이지</a>에 등록한 경우, <a \nhref=\"/webhooks/operation/successful-order-payment\">주문 결제 성공</a>(`order_paid`) \n및 <a href=\"/webhooks/operation/order-cancellation\">주문 취소</a>(`order_canceled`) \n웹훅의 모든 정보를 수신하게 됩니다. 이 경우, <a \nhref=\"/webhooks/operation/payment\">결제</a>(`payment`) 및 <a \nhref=\"/webhooks/operation/refund\">환불</a>(`refund`) 웹훅을 처리하지 않아도 됩니다.\n\n<b>개별 웹훅에서 정보 수신:</b>\n\n2025년 1월 22일 이후 <a href=\"https://publisher.xsolla.com/\">관리자 페이지</a>에 등록한 경우, 다음 \n웹훅을 받게 됩니다.\n- 결제 데이터 및 트랜잭션 세부 정보가 포함된 <a \n  href=\"/webhooks/operation/payment\">결제</a>(`payment`) 및 <a \n  href=\"/webhooks/operation/refund\">환불</a>(`refund`).\n- 구매한 아이템에 대한 정보가 포함된 <a href=\"/webhooks/operation/successful-order-payment-\n  separate\">주문 결제 성공</a>(`order_paid`) 및 <a href=\"/webhooks/operation/order-\n  cancellation-separate\">주문 취소</a>(`order_canceled`).\n\n유입되는 모든 웹훅을 처리해야 합니다. 결합된 웹훅을 수신하는 새로운 옵션으로 전환하려면 고객 성공 관리자에게 문의하거나 <a \nhref=\"mailto:csm@xsolla.com\">csm@xsolla.com</a>으로 이메일을 보내십시오.\n\n인게임 스토어와 결제 관리를 완벽하게 운영하려면 주요 웹훅을 처리해야 합니다.\n\n<b>결합된 웹훅을 수신하는 경우</b>:\n\n<table>\n<thead>\n    <tr>\n        <th>웹훅 이름 및 유형</th>\n        <th>설명</th>\n    </tr>\n</thead>\n<tbody>\n    <tr>\n        <td>사용자 유효성 검사 &gt; <a href=\"/webhooks/operation/user-validation/\">사용자 유효성 검사</a>(<code>user_validation</code>)</td>\n        <td>사용자가 게임에 등록되었는지 확인하기 위해 결제 과정의 여러 단계에서 전송됩니다.</td>\n    </tr>\n    <tr>\n        <td>게임 서비스&gt; 결합된 웹훅 &gt; <a href=\"/webhooks/operation/successful-order-payment\">주문 결제 성공</a>(<code>order_paid</code>)</td>\n        <td>여기에는 결제 데이터, 트랜잭션 세부 정보 및 구매한 아이템에 대한 정보가 포함됩니다. 웹훅의 데이터를 사용하여 사용자에게 아이템을 추가합니다.</td>\n    </tr>\n    <tr>\n        <td>게임 서비스 &gt; 결합된 웹훅 &gt; <a href=\"/webhooks/operation/order-cancellation\">주문 취소</a>(<code>order_canceled</code>)</td>\n        <td>취소된 결제, 트랜잭션 세부 정보, 구매한 아이템에 대한 정보가 포함되어 있습니다. 웹훅의 데이터를 사용하여 구매한 아이템을 제거합니다.</td>\n    </tr>\n</tbody>\n</table>\n\n\n<b>개별 웹훅을 수신하는 경우</b>:\n\n<table>\n<thead>\n    <tr>\n        <th>웹훅 이름 및 유형</th>\n        <th>설명</th>\n    </tr>\n</thead>\n<tbody>\n    <tr>\n        <td>사용자 유효성 검사 &gt; <a href=\"/webhooks/operation/user-validation/\">사용자 유효성 검사</a>(<code>user_validation</code>)</td>\n        <td>사용자가 게임에 등록되었는지 확인하기 위해 결제 과정의 여러 단계에서 전송됩니다.</td>\n    </tr>\n    <tr>\n        <td>결제 &gt; <a href=\"/webhooks/operation/payment\">지불</a>(<code>payment</code>)</td>\n        <td>여기에는 결제 데이터와 트랜잭션 세부 정보가 포함되어 있습니다.</td>\n    </tr>\n    <tr>\n        <td>게임 서비스&gt; 개별 웹훅 &gt; <a href=\"/webhooks/operation/successful-order-payment-separate\">주문 결제 성공</a>(<code>order_paid</code>)</td>\n        <td>여기에는 구매한 아이템에 대한 정보가 포함되어 있습니다. 웹훅의 데이터를 사용하여 사용자에게 아이템을 추가합니다.</td>\n    </tr>\n    <tr>\n        <td>결제 &gt; <a href=\"/webhooks/operation/refund\">환불</a>(<code>refund</code>)</td>\n        <td>여기에는 결제 데이터와 트랜잭션 세부 정보가 포함되어 있습니다.</td>\n    </tr>\n    <tr>\n        <td>게임 서비스 &gt; 개별 웹훅 &gt; <a href=\"/webhooks/operation/order-cancellation-separate\">주문 취소</a>(<code>order_canceled</code>)</td>\n        <td>여기에는 구매한 아이템에 대한 정보와 취소된 트랜잭션 ID가 포함되어 있습니다. 웹훅의 데이터를 사용하여 구매한 아이템을 제거합니다.</td>\n    </tr>\n</tbody>\n</table>\n\n애플리케이션 측에 아이템 카탈로그 <a href=\"/doc/in-game-store/features/personalization\">개인 \n설정</a>이 구현된 경우 <a href=\"/webhooks/operation/personalized-partner-catalog\">파트너 \n측에서 카탈로그 개인화</a> 웹훅을 처리하도록 설정합니다.\n\n<div class=\"note\">\n<p><strong>참고</strong></p>\n<p>실제 결제를 받으려면 <a href=\"/doc/in-game-store/integration-guide/sign-licensing-agreement/\">라이센스 계약을 체결</a>하고 웹훅을 처리하기만 하면 됩니다.</p>\n<p><ul><li>개별 웹훅을 수신하는 경우, <a href=\"/webhooks/operation/payment\">결제</a>, <a href=\"/webhooks/operation/successful-order-payment-separate\">주문 결제 성공</a> 및 <a href=\"/webhooks/operation/user-validation/\">사용자 유효성 검사</a></li><li>결합된 웹훅을 수신하는 경우, <a href=\"/webhooks/operation/successful-order-payment\">주문 결제 성공</a> 및 <a href=\"/webhooks/operation/user-validation/\">사용자 유효성 검사</a> </li></ul></p>\n</div>\n\n## 정기 결제\n정기 결제 플랜을 자동으로 관리하려면 기본 웹훅 처리를 구현해야 합니다.\n- <a href=\"/webhooks/operation/user-validation/\">사용자 유효성 \n  검사</a>(`user_validation`) - 사용자가 게임에 등록되었는지 확인하기 위해 결제 과정의 여러 단계에서 전송됩니다.\n- <a href=\"/webhooks/operation/payment\">결제</a>(`payment`) - 주문이 결제될 때 전송되며 결제 \n  데이터와 트랜잭션 세부 정보가 포함되어 있습니다.\n- <a href=\"/webhooks/operation/created-subscription/\">생성된 정기 \n  결제</a>(`create_subscription`) - <a href=\"/webhooks/operation/payment\">결제</a> \n  웹훅이 성공적으로 처리되었거나 사용자가 평가판 사용 기간이 있는 정기 결제 구매했을 때 전송됩니다. 여기에는 구매한 정기 결제의 세부 정보 및 \n  사용자 데이터가 포함되어 있습니다. 웹훅 데이터를 사용하여 사용자에게 정기 결제를 추가할 수 있습니다.\n- <a href=\"/webhooks/operation/updated-subscription/\">업데이트된 정기 \n  결제</a>(`update_subscription`) - 정기 결제가 갱신되거나 변경될 때, <a \n  href=\"https://developers.xsolla.com/ko/webhooks/operation/payment\">결제</a> 웹훅이 \n  성공적으로 처리되었을 때 전송됩니다. 여기에는 구매한 정기 결제의 세부 정보와 사용자 데이터가 포함되어 있습니다. 웹훅 데이터를 사용하여 \n  사용자의 정기 결제를 연장하거나 정기 결제 매개 변수를 변경할 수 있습니다.\n- <a href=\"/webhooks/operation/refund\">환불</a>(`refund`) - 주문이 취소될 때 전송되며 취소된 결제 \n  데이터와 트랜잭션 세부 정보가 포함되어 있습니다.\n- <a href=\"/webhooks/operation/canceled-subscription/\">취소된 정기 \n  결제</a>(`cancel_subscription`) - <a href=\"/webhooks/operation/refund\">환불</a> 웹훅이 \n  성공적으로 처리되었거나 다른 사유로 정기 결제가 취소된 경우 전송됩니다. 여기에는 정기 결제 및 사용자 데이터에 대한 정보가 포함되어 \n  있습니다. 웹훅 데이터를 사용하여 구매한 정기 결제를 사용자로부터 제거합니다.\n\n# 관리자 페이지에서 웹훅 설정하기\n\n## 일반 설정\n\n웹훅 수신을 활성화하는 방법:\n1. 관리자 페이지의 프로젝트에서 <a \n   href=\"https://publisher.xsolla.com/0/projects/0/edit/webhooks/\"> 프로젝트 설정&gt; \n   웹훅</a> 섹션으로 이동하세요.\n2. <b>웹훅 서버</b> 필드에서 웹훅을 수신할 서버의 URL을 `https://example.com` 형식으로 지정합니다. 웹훅 테스트용 \n   도구에서 찾은 URL을 지정할 수도 있습니다.\n\n<div class=\"notice\">\n<p><strong>주의</strong></p>\n<p>데이터 전송에는 HTTPS 프로토콜이 사용되며 HTTP 프로토콜은 지원되지 않습니다.</p>\n</div>\n\n<p></p>\n\n3. 프로젝트 웹훅에 서명하기 위한 비밀 키는 기본적으로 생성됩니다. 새 비밀 키를 생성하려면 새로 고침 아이콘을 클릭합니다.\n4. <b>웹훅 활성화</b>를 클릭합니다.\n\n![Enable \nwebhooks](https://cdn.xsolla.net/developers/current/images/api_docs/enable.png)\n\n<div class=\"note\">\n<p><strong>참고</strong></p>\n<p>웹훅을 테스트하려면 <a href=\"https://webhook.site/#!/\">webhook.site</a>와 같은 전용 웹사이트 또는 <a href=\"https://ngrok.com/\">ngrok</a>과 같은 플랫폼을 선택할 수 있습니다.</p>\n</div>\n\n<p></p>\n\n<div class=\"notice\">\n    <p><strong>참고</strong></p>\n    <p>웹훅을 동시에 다른 URL로 보낼 수 없습니다. 관리자 페이지에서 할 수 있는 작업은 먼저 테스트용 URL을 지정한 다음 실제 URL로 바꾸는 것입니다.</p>\n</div>\n\n웹훅 수신을 비활성화하는 방법:\n1. 관리자 페이지의 프로젝트에서 <a \n   href=\"https://publisher.xsolla.com/0/projects/0/edit/webhooks/\"> 프로젝트 설정&gt; \n   웹훅</a> 섹션으로 이동하세요.\n2. <b>웹훅 비활성화</b>를 클릭합니다.\n\n## 고급 설정\n\n웹훅의 경우 <a href=\"/webhooks/overview/#section/Test-webhooks-in-Publisher-\nAccount/Store\">결제 및 스토어</a> 섹션에서 고급 설정을 사용할 수 있습니다. 이러한 설정은 자동으로 <b>웹훅 수신</b> \n버튼을 클릭한 후 <a href=\"/webhooks/overview/#section/Set-up-webhooks-in-Publisher-\nAccount/General-settings\">일반 설정</a> 블록 아래에 나타납니다.\n\n<div class=\"note\">\n<p><strong>참고</strong></p>\n<p>고급 설정이 표시되지 않으면 일반 설정에서 웹훅 수신이 연결되어 있는지 확인하고 <b>테스트 &gt; 결제 및 스토어</b> 탭에 있어야 합니다.</p>\n</div>\n\n이 섹션에서는 웹훅에서 추가 정보 수신을 설정할 수 있습니다. 이를 위해 해당 스위치를 활성 위치로 설정합니다. 각 권한의 줄은 설정을 \n변경하면 영향을 받는 웹훅을 나타냅니다.\n\n<table>\n<thead>\n    <tr>\n        <th>토글</th>\n        <th>설명</th>\n    </tr>\n</thead>\n<tbody>\n    <tr>\n        <td>저장된 결제 계정에 대한 정보 표시</td>\n        <td>저장된 결제 방식에 대한 정보는 <code>payment_account</code> 사용자 정의 개체에서 전달됩니다.</td>\n    </tr>\n    <tr>\n        <td>저장된 결제 방식을 사용한 트랜잭션에 대한 정보 표시</td>\n        <td><p>정보는 웹훅의 다음 사용자 정의 매개 변수에서 전달됩니다.</p><ul><li><code>saved_payment_method</code>:<ul><li><code>0</code> - 저장된 결제 방식이 사용되지 않음</li><li><code>1</code> - 현재 결제를 진행할 때 결제 방식이 저장됨</li><li><code>2</code> - 이전에 저장한 결제 방식이 사용됨</li></ul></li><li><code>payment_type</code>:<ul><li><code>1</code> - 일회성 결제</li><li><code>2</code> - 반복 결제</li></ul></li></ul></td>\n    </tr>\n    <tr>\n        <td>주문 개체를 웹훅에 추가</td>\n        <td>주문 관련 정보는 <a href=\"/webhooks/operation/payment/\">결제</a> 웹훅의 <code>order</code> 개체에서 전달됩니다.</td>\n    </tr>\n    <tr>\n        <td>민감한 데이터 없이 필수 사용자 매개 변수만 전송</td>\n        <td><p>사용자에 대한 다음 정보만 웹훅에서 전달됩니다.</p><ul><li>ID</li><li>국가</li></ul></td>\n    </tr>\n    <tr>\n        <td>사용자 정의 매개 변수 전송</td>\n        <td><a href=\"/api/pay-station/operation/create-token/\">사용자 정의 토큰 매개 변수</a> 관련 정보가 웹훅에서 전달됩니다.</td>\n    </tr>\n    <tr>\n        <td>카드 BIN 및 접미사 표시</td>\n        <td><p>은행 카드 번호에 대한 다음 정보가 웹훅에서 전달됩니다.</p><ul><li><code>card_bin</code> 매개 변수의 처음 6자리</li><li><code>card_suffix</code>의 마지막 4자리</li></ul></td>\n    </tr>\n    <tr>\n        <td>카드 브랜드 표시</td>\n        <td>결제에 사용된 카드의 브랜드. 예: Mastercard 또는 Visa.</td>\n    </tr>\n</tbody>\n</table>\n\n![고급 설정](https://cdn.xsolla.net/developers/current/images/api_docs/advanced-settings-upd.png)\n\n# 관리자 페이지에서 웹훅 테스트하기\n\n웹훅을 테스트하면 사용자 측과 엑솔라 측 모두에서 프로젝트를 올바르게 설정하는 데 도움이 돕니다.\n\n웹훅을 성공적으로 <a href=\"/webhooks/overview/#section/Set-up-webhooks-in-Publisher-\nAccount\">설정</a>하면 웹훅 설정 섹션 아래에 웹훅 테스트 섹션이 표시됩니다.\n\n![웹훅 테스트 \n섹션](https://cdn.xsolla.net/developers/current/images/api_docs/testing.png)\n\n관리자 페이지의 테스트 섹션은 웹훅 수신 옵션에 따라 다릅니다.\n\n<b>결합된 웹훅을 수신하는 경우</b>:\n\n<table>\n<thead>\n    <tr>\n        <th>웹훅 테스트를 위한 탭 이름</th>\n        <th>웹훅 이름 및 유형</th>\n    </tr>\n</thead>\n<tbody>\n    <tr>\n        <td><b>결제 및 스토어</b></td>\n        <td>사용자 유효성 검사 &gt; <a href=\"/webhooks/operation/user-validation/\">사용자 유효성 검사</a>(<code>user_validation</code>)</td>\n    </tr>\n    <tr>\n        <td></td>\n        <td>게임 서비스&gt; 결합된 웹훅 &gt; <a href=\"/webhooks/operation/successful-order-payment\">주문 결제 성공</a>(<code>order_paid</code>)</td>\n    </tr>\n    <tr>\n        <td></td>\n        <td>게임 서비스 &gt; 결합된 웹훅 &gt; <a href=\"/webhooks/operation/order-cancellation\">주문 취소</a>(<code>order_canceled</code>)</td>\n    </tr>\n    <tr>\n        <td><b>정기 결제</b></td>\n        <td>사용자 유효성 검사 &gt; <a href=\"/webhooks/operation/user-validation/\">사용자 유효성 검사</a>(<code>user_validation</code>)</td>\n    </tr>\n    <tr>\n        <td></td>\n        <td>결제 &gt; <a href=\"/webhooks/operation/payment\">지불</a>(<code>payment</code>)</td>\n    </tr>\n</tbody>\n</table>\n\n\n<b>개별 웹훅을 수신하는 경우</b>:\n\n<table>\n<thead>\n    <tr>\n        <th>웹훅 테스트를 위한 탭 이름</th>\n        <th>웹훅 이름 및 유형</th>\n    </tr>\n</thead>\n<tbody>\n    <tr>\n        <td><b>스토어</b></td>\n        <td>게임 서비스&gt; 개별 웹훅 &gt; <a href=\"/webhooks/operation/successful-order-payment-separate\">주문 결제 성공</a>(<code>order_paid</code>)</td>\n    </tr>\n    <tr>\n        <td></td>\n        <td>게임 서비스 &gt; 개별 웹훅 &gt; <a href=\"/webhooks/operation/order-cancellation-separate\">주문 취소</a>(<code>order_canceled</code>)</td>\n    </tr>\n    <tr>\n        <td><b>결제</b></td>\n        <td>사용자 유효성 검사 &gt; <a href=\"/webhooks/operation/user-validation/\">사용자 유효성 검사</a>(<code>user_validation</code>)</td>\n    </tr>\n    <tr>\n        <td></td>\n        <td>결제 &gt; <a href=\"/webhooks/operation/payment\">지불</a>(<code>payment</code>)</td>\n    </tr>\n    <tr>\n        <td><b>정기 결제</b></td>\n        <td>사용자 유효성 검사 &gt; <a href=\"/webhooks/operation/user-validation/\">사용자 유효성 검사</a>(<code>user_validation</code>)</td>\n    </tr>\n    <tr>\n        <td></td>\n        <td>결제 &gt; <a href=\"/webhooks/operation/payment\">지불</a>(<code>payment</code>)</td>\n    </tr>\n</tbody>\n</table>\n\n<div class=\"note\">\n<p><strong>참고</strong></p>\n<p>테스트 섹션에 테스트를 통과하지 못했다는 경고가 표시되면 <a href=\"/webhooks/overview/#section/Webhook-listener\">웹훅 리스너</a>에서 웹훅 응답 설정을 확인합니다. 테스트 오류의 원인은 테스트 결과에 표시됩니다.</p>\n<p><b>예:</b></p>\n<p>전문 사이트 <a href=\"https://webhook.site/#!/\">webhook.site</a>를 테스트에 사용합니다.</p>\n<p><b>잘못된 서명에 대한 응답 테스트</b> 섹션에 오류가 표시됩니다.</p>\n<p>이는 엑솔라가 잘못된 서명이 포함된 웹훅을 전송하고 핸들러가 <code>INVALID_SIGNATURE</code> 오류 코드</p>를 지정하는 <code>4xx</code> HTTP 코드로 응답할 것으로 예상하기 때문에 발생합니다.\n<p><a href=\"https://webhook.site/#!/\">webhook.site</a>는 잘못된 서명이 있는 웹훅을 포함하여 모든 웹훅에 응답으로 <code>200</code> HTTP 코드를 전송합니다. 예상한 <code>4xx</code> HTTP 코드를 구할 수 없으므로 테스트 결과에 오류가 표시됩니다.</p>\n</div>\n\n![테스트 오류](https://cdn.xsolla.net/developers/current/images/api_docs/test-error.png)\n\n결합된 웹훅이 있는 시나리오를 테스트하는 프로세스는 아래와 같습니다.\n\n## 결제 및 스토어\n\n<b>결제 및 스토어</b> 탭에서 다음 웹훅을 테스트할 수 있습니다.\n- <a href=\"/webhooks/operation/user-validation/\">사용자 유효성 검사</a>(`user_validation`)\n- <a href=\"/webhooks/operation/successful-order-payment\">주문 결제 \n  성공</a>(`order_paid`)\n- <a href=\"/webhooks/operation/order-cancellation\">주문 취소</a>(`order_canceled`)\n\n테스트 방법:\n1. 웹훅 테스트 섹션에서 <b>결제 및 스토어</b> 탭으로 이동합니다.\n2. 드롭다운 메뉴에서 아이템 유형을 선택합니다. 선택한 유형의 아이템이 관리자 페이지에 설정되어 있지 않으면 다음을 클릭합니다.\n   * <b>연결</b> - 이 유형의 아이템이 있는 모듈이 연결되어 있지 않은 경우\n   * <b>구성</b> - 이전에 모듈을 연결했지만 설정을 완료하지 않은 경우 <br/>버튼을 클릭하면 선택한 아이템의 유형에 해당하는 관리자 \n     페이지 섹션으로 리디렉션됩니다. 아이템을 생성한 후 웹훅 테스트 섹션으로 돌아가 다음 단계를 진행합니다.\n3. 필수 입력란을 채우세요. <ol type=\"a\"> <li>드롭다운 목록에서 아이템의 SKU를 선택하고 금액을 표시합니다. <b>+</b>를 \n   클릭하고 새 줄에 추가하여 동일한 유형의 아이템을 여러 개 선택할 수 있습니다.</li> <li><b>사용자 ID</b> - 테스트 시 문자와 \n   숫자의 조합을 사용할 수 있습니다.</li> <li><b>공개 사용자 ID</b> - 이메일이나 닉네임 등 사용자에게 알려진 ID. 이 필드는 \n   <b>페이 스테이션 &gt; 설정</b>의 프로젝트에서 공개 사용자 ID가 활성화된 경우 표시됩니다.</li> <li><b>엑솔라 주문 ID \n   필드</b>에 값을 입력합니다.</li> <li><b>엑솔라 인보이스 ID</b> - 엑솔라 측 트랜잭션 ID. 테스트 시 숫자 값을 사용할 \n   수 있습니다.</li> <li><b>인보이스 ID</b> - 게임 측의 트랜잭션 ID. 테스트 시 문자와 숫자의 조합을 자유롭게 사용할 수 \n   있습니다. 성공적인 결제를 위한 필수 매개 변수는 아니지만, 사용자 측의 트랜잭션 ID를 엑솔라 측의 트랜잭션 ID에 연결하기 위해 전달할 수 \n   있습니다.</li> <li><b>금액</b> - 결제 금액. 테스트할 시 어떤 숫자든 사용할 수 있습니다.</li> <li><b>통화</b> \n   - 드롭다운 목록에서 통화를 선택합니다.</li> </ol>\n\n4. <b>웹훅 테스트</b>를 클릭합니다.\n\n\n<a href=\"/webhooks/operation/user-validation/\">사용자 유효성 검사</a>, <a \nhref=\"/webhooks/operation/successful-order-payment\">주문 결제 성공</a> 및 <a \nhref=\"/webhooks/operation/order-cancellation\">주문 취소</a> 웹훅은 지정된 데이터가 포함된 웹훅을 \n제공된 URL로 전송합니다. 각 웹훅 유형의 테스트 결과는 <b>웹훅 테스트</b> 버튼 아래에 표시됩니다.\n\n프로젝트에서 공개 사용자 ID가 활성화된 경우 사용자 검색 검사 결과도 볼 수 있습니다.\n\n각 웹훅에 대해 성공한 시나리오와 오류가 있는 시나리오를 모두 처리하도록 구성해야 합니다.\n\n![결제 테스트 섹션](https://cdn.xsolla.net/developers/current/images/api_docs/payments-tab.png)\n\n## 정기 결제\n<b>정기 결제</b> 탭에서 다음 웹훅을 테스트할 수 있습니다.\n- <a href=\"/webhooks/operation/user-validation/\">사용자 유효성 검사</a>(`user_validation`)\n- <a href=\"/webhooks/operation/payment\">결제</a> (`payment`)\n\n<div class=\"note\">\n<p><strong>참고</strong></p>\n<p>관리자 페이지에서는 기본 사용자 유효성 검사 및 결제 웹훅만 테스트할 수 있습니다. 다른 웹훅 유형을 테스트하려면 다음으로 이동합니다.</p>\n<p><ul><li><a href=\"/doc/subscriptions/integration-guide/get-subscription-information/#guides_subscriptions_get_subscription_set_up_webhooks_test_payment\">정기 결제 구매 테스트</a></li><li><a href=\"/doc/subscriptions/integration-guide/get-subscription-information/#guides_subscriptions_get_subscription_set_up_webhooks_test_renewal\">정기 결제 갱신 테스트</a></li><li><a href=\"/doc/subscriptions/integration-guide/get-subscription-information/#guides_subscriptions_get_subscription_set_up_webhooks_test_cancelation\">정기 결제 취소 테스트</a></li></ul></p>\n</div>\n\n<p></p>\n\n<div class=\"note\">\n<p><strong>참고</strong></p>\n<p>웹훅을 테스트하려면 <b>관리자 페이지 &gt; 정기 결제 &gt; 정기 결제 플랜</b> 섹션에 하나 이상의 <a href=\"/doc/subscriptions/integration-guide/set-up-plan/\"> 생성된 정기 결제</a>가 있어야 합니다.</p>\n</div>\n\n테스트하는 방법: <ol> <li>테스트 섹션에서 <b>정기 결제</b> 탭으로 이동합니다.</li> <li>필수 입력 필드에 값을 \n입력합니다. <ol type=\"a\"> <li><b>사용자 ID</b> - 테스트 시 문자와 숫자의 조합을 사용할 수 있습니다.</li><li><b>엑솔라 인보이스 ID</b> - 엑솔라 측의 트랜잭션 ID입니다. 테스트 시 숫자 값을 사용할 수 있습니다.</li><li><b>공개 사용자 ID</b> - 사용자에게 알려진 ID(예: 이메일 또는 닉네임). 이 필드는 페이 스테이션 &gt; 설정 &gt; \n추가 설정 섹션의 프로젝트에서 공개 사용자 ID가 활성화된 경우에 표시됩니다.</li> <li><b>통화</b> - 드롭다운 목록에서 통화를 \n선택합니다.</li> <li><b>플랜 ID</b> - 정기 결제 플랜입니다. 드롭다운 목록에서 플랜을 선택합니다.</li> <li><b>정기 \n결제 상품</b> - 드롭다운 목록에서 상품을 선택합니다(선택 사항).</li> <li><b>금액</b> - 결제 금액입니다. 테스트할 때는 \n아무 숫자나 사용할 수 있습니다.</li> <li><b>인보이스 ID</b> - 게임 측의 트랜잭션 ID입니다. 테스트할 때 문자와 숫자를 \n조합하여 사용할 수 있습니다. 성공적인 결제를 위한 필수 매개 변수는 아니지만 트랜잭션 ID를 엑솔라 측과 연결하기 위해 전달할 수 \n있습니다.</li> <li><b>평가 기간</b>. <a href=\"/doc/subscriptions/integration-guide/get-\nsubscription-\ninformation/#guides_subscriptions_get_subscription_set_up_webhooks_sandbox\">평가 \n기간 없이 정기 결제 구매를 테스트</a>하거나 <a href=\"/doc/subscriptions/integration-guide/get-\nsubscription-\ninformation/#guides_subscriptions_get_subscription_set_up_webhooks_test_renewal\">정기 결제 갱신</a>을 테스트하려면 <code>0</code> 값을 지정합니다.</li> </ol> </li> <li><b>웹훅 \n테스트</b>를 클릭합니다.</li> </ol>\n\n지정된 URL로 데이터가 채워진 웹훅을 받게 됩니다. 성공적인 시나리오와 오류가 있는 시나리오 모두에 대한 각 웹훅의 테스트 결과가 <b>웹훅 \n테스트</b> 버튼 아래에 표시됩니다.\n\n<a id=\"webhook-listener\"></a>\n\n# 웹훅 리스너\n\n웹훅 리스너는 지정된 URL 주소로 들어오는 웹훅을 수신하고, <a href=\"/webhooks/overview/#section/Webhook-\nlistener/Generation-of-signature\">서명을 생성하며</a>, 엑솔라 웹훅 서버로 <a \nhref=\"/webhooks/overview/#section/Webhook-listener/Sending-responses-to-\nwebhook\">응답을 전송</a>하는 프로그램 코드입니다.\n\n<div class=\"note\">\n<p><strong>참고</strong></p>\n<p>웹훅 처리를 위한 기성 클래스가 포함된 <a href=\"https://developers.xsolla.com/ko/sdk/php/\">페이 스테이션 PHP SDK 라이브러리</a>를 사용할 수 있습니다.</p>\n</div>\n\n<!-- IMPORTANT! Changing the list of IP addresses should be coordinated with the administrators. Request for Director of Infrastructure and IT approval in the ticket for changing the IP address list. -->\n\n애플리케이션 측의 다음 IP 주소에서 웹훅 수신을 구현합니다.\n- `185.30.20.0/24`\n- `185.30.21.0/24`\n- `185.30.22.0/24`\n- `185.30.23.0/24`\n- `34.102.38.178`\n- `34.94.43.207`\n- `35.236.73.234`\n- `34.94.69.44`\n- `34.102.22.197`\n\n<a href=\"/doc/login/\">로그인</a> 제품을 통합한 경우, 다음 IP 주소에서 처리 웹훅을 추가로 추가합니다:\n\n- `34.94.0.85`\n- `34.94.14.95`\n- `34.94.25.33`\n- `34.94.115.185`\n- `34.94.154.26`\n- `34.94.173.132`\n- `34.102.48.30`\n- `35.235.99.248`\n- `35.236.32.131`\n- `35.236.35.100`\n- `35.236.117.164`\n\n제한 사항:\n- 애플리케이션의 데이터베이스에 동일한 ID로 성공한 트랜잭션이 있으면 안 됩니다.\n- 웹훅 리스너가 데이터베이스에 이미 존재하는 ID로 웹훅을 수신한 경우 이 트랜잭션의 이전 처리 결과를 반환해야 합니다. 사용자에게 중복 구매 \n  항목을 추가하고 데이터베이스에 중복 레코드를 생성하는 것은 좋지 않습니다.\n\n## 서명 생성\n\n데이터의 안전한 전송을 보장하려면 웹훅이 실제로 엑솔라 서버에서 전송되었으며 전송 중에 변경되지 않았는지 확인해야 합니다. 이렇게 하려면, \n요청 본문 페이로드를 기반으로 자체 서명을 생성하고 수신 요청의`authorization` 헤더에서 제공된 서명과 비교해야 합니다. 서명이 \n일치하면 웹훅은 진짜이며 안전하게 처리된 것입니다.\n\n확인 단계:\n\n1. 들어오는 웹훅 요청의`authorization` 헤더에서 서명을 조회합니다. 헤더 형식은 `서명 <signature_value>`입니다.\n2. 웹훅 요청 본문을 JSON 형식으로 조회합니다. <div class=\"notice\"><p><strong>알림</strong></p><p>수신한 \n   JSON 페이로드를 그대로 사용하세요. 페이로드를 구문 분석하거나 다시 인코딩하면 서식이 변경되어 서명 확인에 실패할 수 있으므로 페이로드를 \n   구문 분석하거나 다시 인코딩해선 안 됩니다.</p></div><p></p>\n\n3. 비교를 위해 자체 서명을 생성합니다.<ol type=\"a\"> <li>문자열 끝에 키를 추가하여 JSON 페이로드를 프로젝트의 비밀 키와 \n   연결합니다.</li> <li>결과 문자열에 SHA-1 암호화 해시 함수를 적용합니다. 결과는 소문자 16진수 문자열이 됩니다.</li> \n   </ol>\n4. 생성된 서명과 `authorization` 헤더의 서명을 비교합니다. 일치하면 웹훅이 진짜인 것입니다.\n\n아래에서 C#, C++, Go, PHP, Node.js 언어로 서명 생성 구현 예시를 확인할 수 있습니다.\n\n### 웹훅(HTTP) 예시:\n\n```http\nPOST /your_uri HTTP/1.1\nhost: your.host\naccept: application/json\ncontent-type: application/json\ncontent-length: 165\nauthorization: Signature 52eac2713985e212351610d008e7e14fae46f902\n{\n  \"notification_type\":\"user_validation\",\n  \"user\":{\n      \"ip\":\"127.0.0.1\",\n      \"phone\":\"18777976552\",\n      \"email\":\"email@example.com\",\n      \"id\":1234567,\n      \"name\":\"Xsolla User\",\n      \"country\":\"US\"\n  }\n}\n```\n\n### 웹훅(curl) 예시:\n\n```bash\ncurl -v 'https://your.hostname/your/uri' \\\n-X POST \\\n-H 'authorization: Signature 52eac2713985e212351610d008e7e14fae46f902' \\\n-d '{\n  \"notification_type\":\n    \"user_validation\",\n    \"user\":\n      {\n        \"ip\": \"127.0.0.1\",\n        \"phone\": \"18777976552\",\n        \"email\": \"email@example.com\",\n        \"id\": 1234567,\n        \"name\": \"Xsolla User\",\n        \"country\": \"US\"\n      }\n    }'\n```\n\n### 서명 생성을 구현하는 C#의 예시(일반 예시):\n\n<div class=\"note\">\n<p><strong>참고</strong></p>\n<p> 이 코드 샘플은 .NET Framework 4.0 이상 버전, .NET Core 및 기타 최신 .NET 버전과 호환됩니다. 서명 검증은 타이밍 공격을 방지하는 데 도움이 되는 <code>ConstantTimeEquals</code> 메서드를 통해 일정 시간 비교 방법을 사용합니다.</p>\n</div>\n\n```csharp\nusing System;\nusing System.Security.Cryptography;\nusing System.Text;\npublic static class XsollaWebhookSignature\n{\n    public static string ComputeSha1(string jsonBody, string secretKey)\n    {\n        // Concatenation of the JSON from the request body and the project's secret key\n        string dataToSign = jsonBody + secretKey;\n        using (SHA1 sha1 = SHA1.Create())\n        {\n            byte[] hashBytes = sha1.ComputeHash(Encoding.UTF8.GetBytes(dataToSign));\n            // Convert hash bytes to lowercase hexadecimal string\n            var hexString = new StringBuilder(hashBytes.Length * 2);\n            foreach (byte b in hashBytes)\n            {\n                hexString.Append(b.ToString(\"x2\"));\n            }\n            return hexString.ToString();\n        }\n    }\n    public static bool VerifySignature(string jsonBody, string secretKey, string receivedSignature)\n    {\n        string computedSignature = ComputeSha1(jsonBody, secretKey);\n        string receivedSignatureLower = receivedSignature.ToLower();\n        // Use constant-time comparison to prevent timing attacks\n        return ConstantTimeEquals(computedSignature, receivedSignatureLower);\n    }\n    private static bool ConstantTimeEquals(string a, string b)\n    {\n        if (a.Length != b.Length)\n        {\n            return false;\n        }\n        int result = 0;\n        for (int i = 0; i < a.Length; i++)\n        {\n            result |= a[i] ^ b[i];\n        }\n        return result == 0;\n    }\n}\n```\n\n### 서명 생성을 구현하는 C# 예시(.NET 5.0 이상 버전):\n\n<div class=\"note\">\n<p><strong>참고</strong></p>\n<p><code>Convert.ToHexString</code> 메서드를 사용하려면 .NET 5.0 이상 버전이 필요합니다.<p></p>.NET 7.0 이상 버전인 경우, <code>ConstantTimeEquals</code> 대신 <code>CryptographicOperations.FixedTimeEquals</code> 메서드를 사용할 수도 있습니다.</p>\n</div>\n\n```csharp\n// For .NET 5.0 and later, you can use the more concise Convert.ToHexString method:\nusing System;\nusing System.Security.Cryptography;\nusing System.Text;\npublic static class XsollaWebhookSignature\n{\n    public static string ComputeSha1(string jsonBody, string secretKey)\n    {\n        string dataToSign = jsonBody + secretKey;\n        using var sha1 = SHA1.Create();\n        byte[] hashBytes = sha1.ComputeHash(Encoding.UTF8.GetBytes(dataToSign));\n        return Convert.ToHexString(hashBytes).ToLower();\n    }\n    public static bool VerifySignature(string jsonBody, string secretKey, string receivedSignature)\n    {\n        string computedSignature = ComputeSha1(jsonBody, secretKey);\n        string receivedSignatureLower = receivedSignature.ToLower();\n        // Use constant-time comparison to prevent timing attacks\n        return ConstantTimeEquals(computedSignature, receivedSignatureLower);\n    }\n    private static bool ConstantTimeEquals(string a, string b)\n    {\n        if (a.Length != b.Length)\n        {\n            return false;\n        }\n        int result = 0;\n        for (int i = 0; i < a.Length; i++)\n        {\n            result |= a[i] ^ b[i];\n        }\n        return result == 0;\n    }\n}\n```\n\n### 서명 생성을 구현하는 C# 예시(.NET 7.0 이상 버전):\n\n<div class=\"note\">\n<p><strong>참고</strong></p>\n<p>.NET 7.0 이상 버전인 경우 <code>CryptographicOperations.FixedTimeEquals</code> 메서드를 사용할 수도 있습니다.</p>\n</div>\n\n```csharp\n// For .NET 7.0+, you can use the built-in CryptographicOperations.FixedTimeEquals:\nusing System.Security.Cryptography;\npublic static bool VerifySignature(string jsonBody, string secretKey, string receivedSignature)\n{\n    string computedSignature = ComputeSha1(jsonBody, secretKey);\n    byte[] computedBytes = Encoding.UTF8.GetBytes(computedSignature);\n    byte[] receivedBytes = Encoding.UTF8.GetBytes(receivedSignature.ToLower());\n    return CryptographicOperations.FixedTimeEquals(computedBytes, receivedBytes);\n}\n```\n\n### 서명 생성을 구현하는 C++의 예시:\n\n```c++\n#include <string>\n#include <sstream>\n#include <iomanip>\n#include <openssl/sha.h>\nclass XsollaWebhookSignature {\npublic:\n    static std::string computeSha1(const std::string& jsonBody, const std::string& secretKey) {\n        // Concatenation of the JSON from the request body and the project's secret key\n        std::string dataToSign = jsonBody + secretKey;\n        unsigned char digest[SHA_DIGEST_LENGTH];\n        // Create SHA1 hash\n        SHA1(reinterpret_cast<const unsigned char*>(dataToSign.c_str()),\n             dataToSign.length(), digest);\n        // Convert to lowercase hexadecimal string\n        std::ostringstream hexStream;\n        hexStream << std::hex << std::setfill('0');\n        for (int i = 0; i < SHA_DIGEST_LENGTH; ++i) {\n            hexStream << std::setw(2) << static_cast<unsigned int>(digest[i]);\n        }\n        return hexStream.str();\n    }\n    static bool verifySignature(const std::string& jsonBody, const std::string& secretKey, const std::string& receivedSignature) {\n        std::string computedSignature = computeSha1(jsonBody, secretKey);\n        // Timing-safe comparison\n        if (computedSignature.length() != receivedSignature.length()) {\n            return false;\n        }\n        volatile unsigned char result = 0;\n        for (size_t i = 0; i < computedSignature.length(); ++i) {\n            result |= (computedSignature[i] ^ receivedSignature[i]);\n        }\n        return result == 0;\n    }\n};\n```\n\n### 서명 생성을 구현하는 Go 예시:\n\n```go\npackage main\nimport (\n\t\"crypto/sha1\"\n    \"crypto/subtle\"\n\t\"encoding/hex\"\n\t\"strings\"\n)\ntype XsollaWebhookSignature struct{}\nfunc (x *XsollaWebhookSignature) ComputeSha1(jsonBody, secretKey string) string {\n\t// Concatenation of the JSON from the request body and the project's secret key\n\tdataToSign := jsonBody + secretKey\n\t// Create SHA1 hash\n\th := sha1.New()\n\th.Write([]byte(dataToSign))\n\tsignature := h.Sum(nil)\n\t// Convert to lowercase hexadecimal string\n\treturn strings.ToLower(hex.EncodeToString(signature))\n}\nfunc (x *XsollaWebhookSignature) VerifySignature(jsonBody, secretKey, receivedSignature string) bool {\n\tcomputedSignature := x.ComputeSha1(jsonBody, secretKey)\n\treceivedSignatureLower := strings.ToLower(receivedSignature)\n\t// Use constant time comparison to prevent timing attacks\n\treturn subtle.ConstantTimeCompare([]byte(computedSignature), []byte(receivedSignatureLower)) == 1\n}\n```\n\n### 서명 생성을 구현하는 PHP의 예시:\n\n```php\n<?php\nclass XsollaWebhookSignature\n{\n    /**\n     * Compute SHA1 signature from webhook JSON body and secret key\n     *\n     * @param string $jsonBody The raw JSON body from webhook\n     * @param string $secretKey The project's secret key\n     * @return string The lowercase SHA1 signature\n     */\n    public static function computeSha1(string $jsonBody, string $secretKey): string\n    {\n        // Concatenation of the JSON from the request body and the project's secret key\n        $dataToSign = $jsonBody . $secretKey;\n        // Generate SHA1 signature\n        $signature = sha1($dataToSign);\n        return strtolower($signature);\n    }\n    /**\n     * Verify webhook signature using timing-safe comparison\n     *\n     * @param string $jsonBody The raw JSON body from webhook\n     * @param string $secretKey The project's secret key  \n     * @param string $receivedSignature The signature from authorization header\n     * @return bool True if signature is valid, false otherwise\n     */\n    public static function verifySignature(string $jsonBody, string $secretKey, string $receivedSignature): bool\n    {\n        $computedSignature = self::computeSha1($jsonBody, $secretKey);\n        // Use hash_equals for timing-safe comparison\n        return hash_equals($computedSignature, strtolower($receivedSignature));\n    }\n}\n?>\n```\n\n### 서명 생성을 구현하는 Node.js의 예시:\n\n```js\nconst crypto = require('crypto');\nclass XsollaWebhookSignature {\n    // IMPORTANT: jsonBody must be the raw JSON string exactly as received from Xsolla\n    static computeSha1(jsonBody, secretKey) {\n        // Concatenation of the JSON from the request body and the project's secret key\n        const dataToSign = jsonBody + secretKey;\n        // Create SHA1 hash\n        const hash = crypto.createHash('sha1');\n        hash.update(dataToSign, 'utf8');\n        // Convert to lowercase hexadecimal string\n        return hash.digest('hex').toLowerCase();\n    }\n    static verifySignature(jsonBody, secretKey, receivedSignature) {\n        const computedSignature = this.computeSha1(jsonBody, secretKey);\n        const cleanReceivedSignature = receivedSignature.toLowerCase();\n        // Check if signatures have the same length before using timingSafeEqual\n        if (computedSignature.length !== cleanReceivedSignature.length) {\n            return false;\n        }\n        try {\n            return crypto.timingSafeEqual(\n                Buffer.from(computedSignature, 'hex'),\n                Buffer.from(cleanReceivedSignature, 'hex')\n            );\n        } catch (error) {\n            // Return false if there's any error (e.g., invalid hex characters)\n            return false;\n        }\n    }\n}\n```\n\n## 웹훅에 응답 보내기\n\n웹훅 수신을 확인하려면 서버가 다음을 반환해야 합니다.\n* 성공적인 응답의 경우 `200`, `201` 또는 `204` HTTP 코드.\n* 지정한 사용자를 찾을 수 없거나 잘못된 서명이 전달된 경우 <a \n  href=\"/webhooks/overview/#section/오류\">문제 설명</a>이 포함된 `400` HTTP 코드. 서버에 \n  일시적인 문제가 발생한 경우 웹훅 핸들러가 `5xx` HTTP 코드를 반환할 수도 있습니다.\n\n엑솔라 서버가 <a href=\"/webhooks/operation/successful-order-payment\">주문 결제 성공</a> 및 \n<a href=\"/webhooks/operation/order-cancellation\">주문 취소</a> 웹훅에 대한 응답을 수신하지 않았거나 \n`5xx` 코드가 포함된 응답을 수신한 경우 다음 일정에 따라 웹훅이 재전송됩니다.\n* 5분 간격으로 2번 시도\n* 15분 간격으로 7번 시도\n* 60분 간격으로 10번 시도\n\n웹훅 전송은 첫 번째 시도 후 12시간 이내에 최대 20회까지 시도할 수 있습니다.\n\n<a href=\"/webhooks/operation/payment\">결제</a> 및 <a \nhref=\"/webhooks/operation/refund\">환불</a> 웹훅에 대한 재시도 로직은 개별 웹훅 페이지에 설명되어 있습니다.\n\n<div class=\"notice\">\n<p><strong>주의</strong></p>\n<p>다음 조건을 모두 충족하는 경우에도 사용자에게 결제가 환불됩니다:<ul><li>환불이 엑솔라 측에서 요청한 경우.</li><li>웹훅에 대한 응답으로, <code>4xx</code> 상태 코드가 반환되거나 모든 재시도 후 응답을 받지 않거나 <code>5xx</code> 상태 코드가 반환된 경우.</li></ul></p>\n</div>\n\n엑솔라 서버가 <a href=\"/webhooks/operation/user-validation/\">사용자 유효성 검사</a> 웹훅에 대한 \n응답을 수신하지 않았거나 `400` 또는 `5xx` 코드가 있는 응답을 수신한 경우 <a href=\"/webhooks/operation\n/user-validation/\">사용자 유효성 검사</a> 웹훅은 재전송되지 않습니다. 이 경우 사용자에게 오류가 표시되며 <a \nhref=\"/webhooks/operation/payment\">결제</a> 및 <a href=\"/webhooks/operation\n/successful-order-payment\">주문 결제 성공</a> 웹훅이 전송되지 않습니다.\n\n# 오류\n\nHTTP 코드 400에 대한 오류 코드:\n\n<table>\n<thead>\n    <tr>\n        <th>코드</th>\n        <th>메시지</th>\n    </tr>\n</thead>\n<tbody>\n    <tr>\n        <td>INVALID_USER</td>\n        <td>잘못된 게임유저</td>\n    </tr>\n    <tr>\n        <td>INVALID_PARAMETER</td>\n        <td>잘못된 매개 변수</td>\n    </tr>\n    <tr>\n        <td>INVALID_SIGNATURE</td>\n        <td>잘못된 서명</td>\n    </tr>\n    <tr>\n        <td>INCORRECT_AMOUNT</td>\n        <td>잘못된 금액</td>\n    </tr>\n    <tr>\n        <td>INCORRECT_INVOICE</td>\n        <td>잘못된 인보이스</td>\n    </tr>\n</tbody>\n</table>\n\n```\nHTTP/1.1 400 Bad Request\n{\n    \"error\":{\n        \"code\":\"INVALID_USER\",\n        \"message\":\"Invalid user\"\n    }\n}\n```\n\n# Webhook 목록\n\n<div class=\"note\">\n<p><strong>주의</strong></p>\n<p>참고 유형은 <code>notification_type</code> 매개 변수로 전송됩니다.</p>\n</div>\n\n<table>\n<thead>\n    <tr>\n        <th>웹훅</th>\n        <th>알림 유형</th>\n        <th>설명</th>\n    </tr>\n</thead>\n<tbody>\n    <tr>\n        <td><a href=\"/webhooks/operation/user-validation/\">사용자 유효성 검사</a></td>\n        <td><code>user_validation</code></td>\n        <td>게임 시스템 내 유저의 존재를 확인하기 위해 보냅니다.</td>\n    </tr>\n    <tr>\n        <td><a href=\"/webhooks/operation/user-search/\">사용자 검색</a></td>\n        <td><code>user_search</code></td>\n        <td>공개 사용자 ID별로 사용자 정보를 가져오기 위해 보냅니다.</td>\n    </tr>\n    <tr>\n        <td><a href=\"/webhooks/operation/payment/\">결제</a></td>\n        <td><code>payment</code></td>\n        <td>유저가 결제 프로세스를 완료했을 때 보냅니다.</td>\n    </tr>\n    <tr>\n        <td><a href=\"/webhooks/operation/refund/\">환불</a></td>\n        <td><code>refund</code></td>\n        <td>알 수 없는 이유로 결제가 취소되었을 때 보냅니다.</td>\n    </tr>\n    <tr>\n        <td><a href=\"/webhooks/operation/partial-refund/\">부분 환불</a></td>\n        <td><code>partial_refund</code></td>\n        <td>어떤 이유로든 결제를 부분적으로 취소해야 할 때 전송됩니다.</td>\n    </tr>\n    <tr>\n        <td><a href=\"/webhooks/operation/payment-declined/\">거부된 결제</a></td>\n        <td><code>ps_declined</code></td>\n        <td>결제 시스템에 의해 결제가 거부되었을 때 전송됩니다.</td>\n    </tr>\n    <tr>\n        <td><a href=\"https://developers.xsolla.com/ko/webhooks/operation/afs-rejected-transaction/\">AFS 거부 트랜잭션 </a></td>\n        <td><code>afs_reject</code></td>\n        <td>AFS 확인 중에 트랜잭션이 거부된 경우 전송.</td>\n    </tr>\n    <tr>\n      <td><a href=\"https://developers.xsolla.com/ko/webhooks/operation/afs-rejected-blocklist/\">AFS 업데이트된 차단 목록</a></td>\n      <td><code>afs_black_list</code></td>\n      <td>AFS 차단 목록이 업데이트될 때 보냅니다.</td>\n    </tr>\n    <tr>\n      <td><a href=\"https://developers.xsolla.com/ko/webhooks/operation/created-subscription/\">정기 결제 생성</a></td>\n      <td><code>create_subscription</code></td>\n      <td>유저가 정기 결제를 만들면 보냅니다.</td>\n    </tr>\n    <tr>\n      <td><a href=\"https://developers.xsolla.com/ko/webhooks/operation/updated-subscription/\">업데이트된 정기 결제</a></td>\n      <td><code>update_subscription</code></td>\n      <td>정기 결제가 갱신되거나 변경되었을 때 보냅니다.</td>\n    </tr>\n    <tr>\n      <td><a href=\"https://developers.xsolla.com/ko/webhooks/operation/canceled-subscription/\">취소된 정기 결제</a></td>\n      <td><code>cancel_subscription</code></td>\n      <td>정기 결제가 취소되었을 때 보냅니다.</td>\n    </tr>\n    <tr>\n      <td><a href=\"https://developers.xsolla.com/ko/webhooks/operation/nonrenewing-subscription/\">비갱신 정기 결제</a></td>\n      <td><code>non_renewal_subscription</code></td>\n      <td>상태가 비갱신으로 설정되면 보냅니다.</td>\n    </tr>\n    <tr>\n      <td><a href=\"https://developers.xsolla.com/ko/webhooks/operation/add-payment-account/\">결제 계정 추가</a></td>\n      <td><code>payment_account_add</code></td>\n      <td>사용자가 결제 계정을 추가하거나 저장할 때 보냅니다.</td>\n    </tr>\n    <tr>\n      <td><a href=\"https://developers.xsolla.com/ko/webhooks/operation/remove-payment-account/\">결제 계정 제거</a></td>\n      <td><code>payment_account_remove</code></td>\n      <td>사용자가 저장된 계정에서 결제 계정을 제거할 때 보냅니다.</td>\n    </tr>\n    <tr>\n      <td><a href=\"https://developers.xsolla.com/ko/webhooks/operation/user-validation-in-webshop\">웹 상점에서 사용자 유효성 검사</a></td>\n      <td><code>-</code></td>\n      <td>사용자가 게임에 존재하는지 확인하기 위해 웹 상점에서 전송됩니다.</td>\n    </tr>\n    <tr>\n      <td><a href=\"https://developers.xsolla.com/ko/webhooks/operation/personalized-partner-catalog\">파트너 측의 카탈로그 개인 설정</a></td>\n      <td><code>partner_side_catalog</code></td>\n      <td>사용자가 스토어와 상호작용할 때 전송됩니다.</td>\n    </tr>\n    <tr>\n      <td><a href=\"https://developers.xsolla.com/ko/webhooks/operation/successful-order-payment\">주문 결제 성공</a></td>\n      <td><code>order_paid</code></td>\n      <td>주문이 결제되면 전송됩니다.</td>\n    </tr>\n    <tr>\n      <td><a href=\"https://developers.xsolla.com/ko/webhooks/operation/order-cancellation\">주문 취소</a></td>\n      <td><code>order_canceled</code></td>\n      <td>주문이 취소되면 전송됩니다.</td>\n    </tr>\n    <tr>\n      <td><a href=\"https://developers.xsolla.com/ko/webhooks/operation/dispute\">분쟁</a></td>\n      <td><code>dispute</code></td>\n      <td>새로운 분쟁이 열리면 전송됩니다.</td>\n    </tr>\n</tbody>\n</table>\n"
  title: 웹훅
  version: '1.0'
servers:
  - url: https://api.xsolla.com/merchant/v2
tags:
  - name: user-validation
    x-displayName: 사용자 유효성 검사
  - name: payments
    x-displayName: 결제
  - name: game-services
    x-displayName: 게임 서비스
  - name: anti-fraud
    x-displayName: 부정 결제 방지
  - name: subscriptions
    x-displayName: 정기 결제
  - name: combined-webhooks
    x-displayName: 결합된 웹훅
  - name: separate-webhooks
    x-displayName: 개별 웹훅
  - name: personalization
    x-displayName: 개인화 웹훅
webhooks:
  add-payment-account:
    post:
      description: >-
        엑솔라는 사용자가 게임 내에서 상품을 구매할 때 결제 계정을 추가하거나 결제 계정을 저장할 때마다 웹훅 URL에
        `payment_account_add` 타입의 웹훅을 전송합니다. 이 웹훅을 수신하려면 고객 성공 매니저에게 문의하거나 <a
        href="mailto:csm@xsolla.com">csm@xsolla.com</a>으로 이메일을 보내주세요.
      operationId: add-payment-account
      requestBody:
        content:
          application/json:
            schema:
              properties:
                notification_type:
                  $ref: '#/components/schemas/notification_type'
                payment_account:
                  description: 결제 계정 세부내역 (객체).
                  properties:
                    country:
                      $ref: '#/components/schemas/payment_account.country'
                    id:
                      $ref: '#/components/schemas/payment_account.id'
                    name:
                      $ref: '#/components/schemas/payment_account.name'
                    payment_method:
                      $ref: '#/components/schemas/payment_account.payment_method'
                    type:
                      $ref: '#/components/schemas/payment_account.type'
                  required:
                    - id
                  type: object
                settings:
                  description: 사용자 정의 프로젝트 설정(개체)입니다.
                  properties:
                    merchant_id:
                      $ref: '#/components/schemas/settings.merchant_id'
                    project_id:
                      $ref: '#/components/schemas/settings.project_id'
                  type: object
                user:
                  description: 사용자 세부 사항(개체)입니다.
                  properties:
                    country:
                      $ref: '#/components/schemas/user.country'
                    email:
                      $ref: '#/components/schemas/user.email'
                    id:
                      $ref: '#/components/schemas/user.id'
                    ip:
                      $ref: '#/components/schemas/user.ip'
                    name:
                      $ref: '#/components/schemas/user.name'
                    zip:
                      $ref: '#/components/schemas/user.zip'
                  required:
                    - id
                  type: object
              required:
                - notification_type
      responses:
        '204':
          $ref: '#/components/responses/204'
        '400':
          $ref: '#/components/responses/400'
        '500':
          $ref: '#/components/responses/500'
      summary: 결제 계정 추가
      tags:
        - payments
      x-codeSamples:
        - label: CURL
          lang: cURL
          source: >-
            curl -v 'https://your.hostname/your/uri' \

            -X POST \

            -H 'accept: application/json' \

            -H 'content-type: application/json' \

            -H 'authorization: Signature
            d09695066c52c1b8bdae92f2d6eb59f5b5f89843' \

            -d '{
                "notification_type":"payment_account_add",
                "settings": {
                  "project_id": 18404,
                  "merchant_id": 2340
                },
                "user": {
                    "ip": "127.0.0.1",
                    "email": "email@example.com",
                    "id": "1234567",
                    "name": "John Smith",
                    "country": "US",
                    "zip": "12345"
                },
                "payment_account": {
                    "id": "12345678",
                    "name": "email@example.com",
                    "payment_method": "24",
                    "country": "US",
                    "type": "paypal"
                }
            }'
        - label: HTTP
          lang: HTTP
          source: |-
            POST /your/uri HTTP/1.1
            host:           your.hostname
            accept:         application/json
            content-length: 255
            content-type:   application/json
            authorization:  Signature d09695066c52c1b8bdae92f2d6eb59f5b5f89843

            {
                "notification_type": "payment_account_add",
                "settings": {
                  "project_id": 18404,
                  "merchant_id": 2340
                },
                "user": {
                    "ip": "127.0.0.1",
                    "email": "email@example.com",
                    "id": "1234567",
                    "name": "John Smith",
                    "country": "US",
                    "zip": "12345"
                },
                "payment_account": {
                    "id": "12345678",
                    "name": "email@example.com",
                    "payment_method": "24",
                    "country": "US",
                    "type": "paypal"
                }
            }
  afs-rejected-blocklist:
    post:
      description: >-
        부정 결제 방지 시스템 차단 목록이 업데이트되면(매개 변수 추가 또는 제거) 엑솔라는 웹훅 URL로 `afs_black_list`
        유형의 웹훅을 전송합니다. 매개 변수 추가는 엑솔라 측에서 자동으로 또는 요청 시 수행됩니다. 매개 변수 제거는 요청 시에만
        가능합니다. 이 웹훅을 수신하려면 고객 성공 매니저에게 문의하거나 <a
        href="mailto:csm@xsolla.com">csm@xsolla.com</a>으로 이메일을 보내주세요.
      operationId: afs-rejected-blocklist
      requestBody:
        content:
          application/json:
            schema:
              properties:
                event:
                  description: AFS 차단 목록 이벤트에 대한 정보가 있는 개체.
                  properties:
                    action:
                      description: 이벤트 유형입니다.
                      enum:
                        - adding
                        - removing
                      type: string
                    date_of_last_action:
                      description: >-
                        가장 최근의 [ISO
                        8601](https://en.wikipedia.org/wiki/ISO_8601) 형식의 AFS 차단
                        목록 이벤트.
                      type: string
                    parameter:
                      description: 이벤트가 발생한 매개변수의 이름입니다.
                      enum:
                        - nick
                        - email
                        - ps_account
                        - ip_address
                        - card_issuer
                        - phone
                      type: string
                      x-enumDescriptions:
                        card_issuer: 사용자의 신용카드 발급 은행
                        email: 사용자의 이메일 주소
                        ip_address: 사용자의 IP 주소
                        nick: 사용자의 별명
                        phone: 사용자의 전화번호
                        ps_account: 사용자의 청구 계정
                    parameter_value:
                      description: 이벤트가 발생하는 매개 변수의 값.
                      type: string
                    project_id:
                      $ref: '#/components/schemas/settings.project_id'
                    reason:
                      description: 이벤트의 원인입니다.
                      enum:
                        - chargeback
                        - fraud_activity
                        - suspicious_activity
                        - ps_reported_fraud
                        - linked_chargeback
                        - partner_request
                        - friendly_fraud
                        - user_reported_fraud
                        - linked_parameter
                        - other_data_in_blacklist
                        - by_afs_filters
                        - wrongly_added
                        - removed_by_cs_review
                        - other_forgiveness_reason
                      type: string
                      x-enumDescriptions:
                        by_afs_filters: AFS 필터(추가)
                        chargeback: 지불 거절(추가)
                        fraud_activity: 부정 결제(추가)
                        friendly_fraud: 우호적인 부정 결제(추가)
                        linked_chargeback: 지불 거절 관계(추가)
                        linked_parameter: AFS 차단 목록의 연결된 매개변수(추가)
                        other_data_in_blacklist: AFS 차단 목록의 기타 매개변수(추가)
                        other_forgiveness_reason: 제거의 기타 이유(제거)
                        partner_request: 요청 시(추가)
                        ps_reported_fraud: 부정 결제 관련 결제 시스템 알림(추가)
                        removed_by_cs_review: 엑솔라 기술 지원에 보고 후 제거됨(제거)
                        suspicious_activity: 수상한 활동(추가)
                        user_reported_fraud: 부정 결제 관련 사용자 신고(추가)
                        wrongly_added: 실수로 추가됨(제거)
                    transaction_id:
                      description: 이벤트가 발생한 매개 변수와 관련된 트랜잭션 ID.
                      type: string
                  type: object
                notification_type:
                  $ref: '#/components/schemas/notification_type'
              required:
                - notification_type
                - event
      responses:
        '204':
          $ref: '#/components/responses/204'
        '400':
          $ref: '#/components/responses/400'
        '500':
          $ref: '#/components/responses/500'
      summary: 부정 결제 방지 차단 목록 업데이트
      tags:
        - anti-fraud
      x-codeSamples:
        - label: CURL
          lang: cURL
          source: >-
            curl -v 'https://your.hostname/your/uri' \

            -X POST \

            -H 'authorization: Signature
            32c64a80d2527dc08906ae1891bac4489509b9f6' \

            -d '{
              "event": {
                "action": "adding",
                "date_of_last_action": "2020-11-27T10:09:05+03:00",
                "parameter": "email",
                "parameter_value": "email@example.com",
                "reason": "ps_reported_fraud",
                "transaction_id": "111111111",
                "project_id": "123456"
              },
              "notification_type": "afs_black_list"
            }'
        - label: HTTP
          lang: HTTP
          source: |-
            POST /your_uri HTTP/1.1
            host: your.host
            accept: application/json
            content-type: application/json
            content-length: 233
            authorization: Signature 32c64a80d2527dc08906ae1891bac4489509b9f6

            {
              "event": {
                "action": "adding",
                "date_of_last_action": "2020-11-27T10:09:05+03:00",
                "parameter": "email",
                "parameter_value": "email@example.com",
                "reason": "ps_reported_fraud",
                "transaction_id": "111111111",
                "project_id": "123456"
              },
              "notification_type": "afs_black_list"
            }
  afs-rejected-transaction:
    post:
      description: >
        부정 결제 방지 시스템 검사 중에 트랜잭션이 거부되면 엑솔라는 `afs_reject` 유형이 포함된 웹훅의 트랜잭션 세부 정보를
        웹훅 URL로 

        보냅니다. 이 웹훅을 수신하려면 고객 성공 관리자에게 문의하거나 <a 

        href="mailto:csm@xsolla.com">csm@xsolla.com</a>으로 이메일을 보내십시오.


        관리자 페이지에 웹훅 URL을 저장하면 웹훅에서 자세한 정보를 수신할 수 있는 권한을 부여할 수 있습니다. 이렇게 하려면 <a 

        href="https://publisher.xsolla.com/0/projects/0/edit/webhooks/store">프로젝트
        설정 

        &gt;웹훅&gt; 고급 설정</a> 섹션의 관리자 페이지에서 다음 토글을 활성화로 설정하십시오.


        <div class="note">

        <p><strong>참고</strong></p>

        <p>2025년 1월 22일 또는 그 이전에 관리자 페이지에 등록한 경우, <a
        href="https://publisher.xsolla.com/0/projects/0/edit/webhooks/payments">프로젝트
        설정 &gt;웹훅 &gt; 테스트 &gt; 결제 &gt; 고급 설정</a> 섹션에서 토글을 찾을 수 있습니다.</p>

        </div>


        <table>

        <thead>
            <tr>
                <th>토글</th>
                <th>설명</th>
            </tr>
        </thead>

        <tbody>
            <tr>
                <td>저장된 결제 방식을 사용한 트랜잭션에 대한 정보 표시</td>
                <td><p>정보는 웹훅의 다음 사용자 정의 매개 변수에서 전달됩니다.</p><ul><li><code>saved_payment_method</code>:<ul><li><code>0</code> - 저장된 결제 방식이 사용되지 않음</li><li><code>1</code> - 현재 결제를 진행할 때 결제 방식이 저장됨</li><li><code>2</code> - 이전에 저장한 결제 방식이 사용됨</li></ul></li><li><code>payment_type</code>:<ul><li><code>1</code> - 일회성 결제</li><li><code>2</code> - 반복 결제</li></ul></li></ul></td>
            </tr>
        </tbody>

        </table>
      operationId: afs-rejected-transaction
      requestBody:
        content:
          application/json:
            schema:
              properties:
                notification_type:
                  $ref: '#/components/schemas/notification_type'
                refund_details:
                  description: 환불 세부 정보(오브젝트).
                  properties:
                    author:
                      description: 환불 개시 프로그램.
                      type: string
                    code:
                      description: 코드 ID.
                      type: integer
                    reason:
                      description: 환불 이유입니다.
                      type: string
                  type: object
                settings:
                  description: 사용자 정의 프로젝트 설정(개체)입니다.
                  properties:
                    merchant_id:
                      $ref: '#/components/schemas/settings.merchant_id'
                    project_id:
                      $ref: '#/components/schemas/settings.project_id'
                  type: object
                transaction:
                  description: 트랜잭션 데이터 관련 값입니다.
                  properties:
                    agreement:
                      description: 계약 ID입니다.
                      type: integer
                    dry_run:
                      description: >-
                        테스트 트랜잭션(거래). 테스트 트랜잭션의 경우 매개변수는 1개 값을 갖습니다. 또는,
                        트랜잭션(거래)이 실제로 이루어지는 경우 매개변수가 전송되지 않습니다.
                      type: integer
                    external_id:
                      description: 트랜잭션 외부 ID 입니다.
                      type: string
                    id:
                      description: 트랜잭션 ID.
                      type: integer
                  type: object
                user:
                  description: 사용자 세부 사항(개체)입니다.
                  properties:
                    country:
                      $ref: '#/components/schemas/user.country'
                    email:
                      $ref: '#/components/schemas/user.email'
                    id:
                      $ref: '#/components/schemas/user.id'
                    ip:
                      $ref: '#/components/schemas/user.ip'
                    name:
                      $ref: '#/components/schemas/user.name'
                    phone:
                      description: 유저 전화 번호입니다(국제 형식).
                      type: string
                    zip:
                      $ref: '#/components/schemas/user.zip'
                  required:
                    - id
                  type: object
              required:
                - notification_type
                - transaction
      responses:
        '204':
          $ref: '#/components/responses/204'
        '400':
          $ref: '#/components/responses/400'
        '500':
          $ref: '#/components/responses/500'
      summary: 부정 결제 방지 시스템에서 거부한 트랜잭션
      tags:
        - anti-fraud
      x-codeSamples:
        - label: CURL
          lang: cURL
          source: |-
            curl -v 'https://your.hostname/your/uri' \
            -X POST \
            -d '{
              "notification_type": "afs_reject",
              "settings": {
                "project_id": 18404,
                "merchant_id": 2340
              },
              "user": {
                "ip": "127.0.0.1",
                "phone": "18777976552",
                "email": "email@example.com",
                "id": "1234567",
                "name": "John Smith",
                "country": "US"
              },
              "transaction": {
                "id": 1,
                "external_id": 1,
                "dry_run": 1,
                "agreement": 1
              },
              "refund_details": {
                "code": 4,
                "reason": "Potential fraud"
              }
            }'
        - label: PHP
          lang: PHP
          source: |-
            <?php

            $request = array(
              'notification_type' => 'afs_reject',
              'settings' => array(
                'project_id' => 18404,
                'merchant_id' => 2340
              ),
              'user' => array(
                'ip' => '127.0.0.1',
                'phone' => '18777976552',
                'email' => 'email@example.com',
                'id' => '1234567',
                'country' => 'US'
              ),
              'transaction' => array(
                'id' => 87654321,
                'payment_method' => 1380,
                'dry_run' => 1
              ),
              'refund_details' => array(
                'code' => 4,
                'reason' => 'Potential fraud'
              )
            );
        - label: HTTP
          lang: HTTP
          source: |-
            POST /your_uri HTTP/1.1
            host: your.host
            accept: application/json
            content-type: application/json
            content-length: 1220
            authorization: Signature 31bd5924dd6cbc9cbe99d331c4a086a57291f9d7

            {
              "notification_type": "afs_reject",
              "settings": {
                "project_id": 18404,
                "merchant_id": 2340
              },
              "user": {
                "ip": "127.0.0.1",
                "phone": "18777976552",
                "email": "email@example.com",
                "id": "1234567",
                "name": "John Smith",
                "country": "US"
              },
              "transaction": {
                "id": 1,
                "external_id": 1,
                "dry_run": 1,
                "agreement": 1
              },
              "refund_details": {
                "code": 4,
                "reason": "Potential fraud"
              }
            }
  canceled-subscription:
    post:
      description: 정기 결제가 취소되면 엑솔라는 `cancel_subscription` 유형이 포함된 웹훅을 웹훅 URL로 전송합니다.
      operationId: canceled-subscription
      requestBody:
        content:
          application/json:
            schema:
              properties:
                notification_type:
                  $ref: '#/components/schemas/notification_type'
                settings:
                  description: 사용자 정의 프로젝트 설정(개체)입니다.
                  properties:
                    merchant_id:
                      $ref: '#/components/schemas/settings.merchant_id'
                    project_id:
                      $ref: '#/components/schemas/settings.project_id'
                  type: object
                subscription:
                  description: 정기결제 세부 정보(오브젝트).
                  properties:
                    date_create:
                      $ref: '#/components/schemas/subscription.date_create'
                    date_end:
                      $ref: '#/components/schemas/subscription.date_end'
                    plan_id:
                      $ref: '#/components/schemas/subscription.plan_id'
                    product_id:
                      $ref: '#/components/schemas/subscription.product_id'
                    subscription_id:
                      $ref: '#/components/schemas/subscription.subscription_id'
                    tags:
                      $ref: '#/components/schemas/subscription.tags'
                  type: object
                user:
                  description: 사용자 세부 사항(개체)입니다.
                  properties:
                    id:
                      $ref: '#/components/schemas/user.id'
                    name:
                      $ref: '#/components/schemas/user.name'
                  required:
                    - id
                  type: object
              required:
                - notification_type
      responses:
        '204':
          $ref: '#/components/responses/204'
        '400':
          $ref: '#/components/responses/400'
        '500':
          $ref: '#/components/responses/500'
      summary: 취소된 정기결제
      tags:
        - subscriptions
      x-codeSamples:
        - label: CURL
          lang: cURL
          source: >-
            curl -v 'https://your.hostname/your/uri' \

            -X POST \

            -H 'accept: application/json' \

            -H 'content-type: application/json' \

            -H 'authorization: Signature
            13342703ccaca5064ad33ba451d800c5e823db8f' \

            -d '{
                    "notification_type": "cancel_subscription",
                    "settings": {
                      "project_id": 18404,
                      "merchant_id": 2340
                    },
                    "user": {
                        "id": "1234567",
                        "name": "John Smith"
                    },
                    "subscription": {
                        "plan_id": "b5dac9c8",
                        "subscription_id": "10",
                        "product_id": "Demo Product",
                        "date_create": "2014-09-22T19:25:25+04:00",
                        "date_end": "2015-01-22T19:25:25+04:00"
                    }
                }'
        - label: PHP
          lang: PHP
          source: |-
            <?php

            $request = array(
                'notification_type' => 'cancel_subscription',
                'settings' => array(
                  'project_id' => 18404,
                  'merchant_id' => 2340
                ),
                'user' => array(
                    'id' => '1234567',
                    'name' => 'John Smith'
                ),
                'subscription' => array(
                    'plan_id' => 'b5dac9c8',
                    'subscription_id' => '10',
                    'product_id' => 'Demo Product',
                    'date_create' => '2014-09-22T19:25:25+04:00',
                    'date_end' => '2015-01-22T19:25:25+04:00',
                )
            );
        - label: HTTP
          lang: HTTP
          source: |-
            POST /your/uri HTTP/1.1
            host: your.hostname
            accept: application/json
            content-type: application/json
            content-length: 240
            authorization: Signature 13342703ccaca5064ad33ba451d800c5e823db8f

            {
                "notification_type": "cancel_subscription",
                "settings": {
                  "project_id": 18404,
                  "merchant_id": 2340
                },
                "user":{
                    "id": "1234567",
                    "name": "John Smith"
                },
                "subscription": {
                    "plan_id": "b5dac9c8",
                    "subscription_id": "10",
                    "product_id": "Demo Product",
                    "date_create": "2014-09-22T19:25:25+04:00",
                    "date_end": "2015-01-22T19:25:25+04:00"
                }
            }
  created-subscription:
    post:
      description: 사용자가 정기 결제를 생성하면 엑솔라는 `create_subscription` 유형이 포함된 웹훅을 웹훅 URL로 전송합니다.
      operationId: created-subscription
      requestBody:
        content:
          application/json:
            schema:
              properties:
                custom_parameters:
                  description: 사용자 정의 매개 변수입니다.
                  type: object
                notification_type:
                  $ref: '#/components/schemas/notification_type'
                settings:
                  description: 사용자 정의 프로젝트 설정(개체)입니다.
                  properties:
                    merchant_id:
                      $ref: '#/components/schemas/settings.merchant_id'
                    project_id:
                      $ref: '#/components/schemas/settings.project_id'
                  type: object
                subscription:
                  description: 정기결제 세부 정보(오브젝트).
                  properties:
                    date_create:
                      $ref: '#/components/schemas/subscription.date_create'
                    date_next_charge:
                      $ref: '#/components/schemas/subscription.date_next_charge'
                    is_gift:
                      $ref: '#/components/schemas/subscription.is_gift'
                    plan_id:
                      $ref: '#/components/schemas/subscription.plan_id'
                    product_id:
                      $ref: '#/components/schemas/subscription.product_id'
                    subscription_id:
                      $ref: '#/components/schemas/subscription.subscription_id'
                    tags:
                      $ref: '#/components/schemas/subscription.tags'
                    trial:
                      description: 정기결제 평가 기간 데이터와 관련된 값입니다.
                      properties:
                        type:
                          description: 평가 기간 형식(day)입니다.
                          type: string
                        value:
                          description: 무료체험 기간 길이입니다.
                          type: integer
                      type: object
                  type: object
                user:
                  description: 사용자 세부 사항(개체)입니다.
                  properties:
                    id:
                      $ref: '#/components/schemas/user.id'
                    name:
                      $ref: '#/components/schemas/user.name'
                  required:
                    - id
                  type: object
              required:
                - notification_type
      responses:
        '204':
          $ref: '#/components/responses/204'
        '400':
          $ref: '#/components/responses/400'
        '500':
          $ref: '#/components/responses/500'
      summary: 정기결제 생성
      tags:
        - subscriptions
      x-codeSamples:
        - label: CURL
          lang: cURL
          source: >-
            curl -v 'https://your.hostname/your/uri' \

            -X POST \

            -H 'accept: application/json' \

            -H 'content-type: application/json' \

            -H 'authorization: Signature
            13342703ccaca5064ad33ba451d800c5e823db8f' \

            -d '{
                    "notification_type": "create_subscription",
                    "settings": {
                      "project_id": 18404,
                      "merchant_id": 2340
                    },
                    "user": {
                        "id": "1234567",
                        "name": "John Smith"
                    },
                    "subscription": {
                        "plan_id": "b5dac9c8",
                        "subscription_id": "10",
                        "product_id": "Demo Product",
                        "date_create": "2014-09-22T19:25:25+04:00",
                        "date_next_charge": "2015-01-22T19:25:25+04:00",
                        "trial": {
                                "value": 90,
                                "type": "day"
                            },
                        "is_gift": true
                    }
                }'
        - label: PHP
          lang: PHP
          source: |-
            <?php

            $request = array(
                'notification_type' => 'create_subscription',
                'settings' => array(
                  'project_id' => 18404,
                  'merchant_id' => 2340
                ),
                'user' => array(
                    'id' => '1234567',
                    'name' => 'John Smith'
                ),
                'subscription' => array(
                    'plan_id' => 'b5dac9c8',
                    'subscription_id' => '10',
                    'product_id' => 'Demo Product',
                    'date_create' => '2014-09-22T19:25:25+04:00',
                    'date_next_charge' => '2015-01-22T19:25:25+04:00',
                    'trial' =>  array(
                            'value' =>  90,
                            'type' =>  'day'
                        ),
                    'is_gift' => true,
                )
            );
        - label: HTTP
          lang: HTTP
          source: |-
            POST /your/uri HTTP/1.1
            Host: your.hostname
            accept: application/json
            content-type: application/json
            content-length: 240
            authorization: Signature 13342703ccaca5064ad33ba451d800c5e823db8f

            {
                "notification_type": "create_subscription",
                "settings": {
                  "project_id": 18404,
                  "merchant_id": 2340
                },
                "user": {
                    "id": "1234567",
                    "name": "John Smith"
                },
                "subscription": {
                    "plan_id": "b5dac9c8",
                    "subscription_id": "10",
                    "product_id": "Demo Product",
                    "date_create": "2014-09-22T19:25:25+04:00",
                    "date_next_charge": "2015-01-22T19:25:25+04:00",
                    "trial": {
                            "value": 90,
                            "type": "day"
                        },
                    "is_gift": true
                }
            }
  dispute:
    post:
      description: >-
        새 분쟁이 발생하거나 분쟁 상태가 변경되면 엑솔라는 해당 `dispute` 유형이 포함된 웹훅을 웹훅 URL로 보냅니다. 이
        웹훅을 수신하려면 고객 성공 매니저에게 문의하거나 <a
        href="mailto:csm@xsolla.com">csm@xsolla.com</a>으로 이메일을 보내주세요.
      operationId: dispute
      requestBody:
        content:
          application/json:
            schema:
              properties:
                action:
                  description: 작업 유형입니다.
                  enum:
                    - adding
                    - updating
                  type: string
                  x-enumDescriptions:
                    adding: 새로운 분쟁이 발생했습니다.
                    updating: 분쟁 상태가 변경되었습니다.
                dispute:
                  description: 분쟁에 대한 정보가 있는 개체입니다.
                  properties:
                    incoming_date:
                      $ref: '#/components/schemas/dispute-date'
                    reason:
                      $ref: '#/components/schemas/dispute-reason'
                    status:
                      $ref: '#/components/schemas/dispute-status'
                    type:
                      $ref: '#/components/schemas/dispute-type'
                  required:
                    - incoming_date
                    - reason
                    - type
                    - status
                  type: object
                notification_type:
                  $ref: '#/components/schemas/notification_type'
                settings:
                  description: 사용자 정의 프로젝트 설정에 대한 정보가 있는 개체입니다.
                  properties:
                    merchant_id:
                      $ref: '#/components/schemas/settings.merchant_id'
                    project_id:
                      $ref: '#/components/schemas/settings.project_id'
                  required:
                    - project_id
                    - merchant_id
                  type: object
                transaction:
                  description: 거래에 대한 정보가 있는 개체입니다.
                  properties:
                    country_code:
                      $ref: '#/components/schemas/user.country'
                    date_create:
                      $ref: '#/components/schemas/date-create'
                    external_id:
                      $ref: '#/components/schemas/external-id'
                    id:
                      $ref: '#/components/schemas/transaction-id'
                    payment_method:
                      $ref: '#/components/schemas/dispute-payment-method'
                    total:
                      description: 거래 금액에 대한 정보가 있는 개체입니다.
                      properties:
                        amount:
                          $ref: '#/components/schemas/transaction-total-amount'
                        currency:
                          $ref: '#/components/schemas/currency'
                      required:
                        - amount
                        - currency
                      type: object
                  required:
                    - id
                    - date_create
                    - total
                    - payment_method
                    - country_code
                  type: object
                user:
                  description: 사용자에 대한 정보가 있는 개체입니다.
                  properties:
                    email:
                      $ref: '#/components/schemas/user.email'
                    id:
                      $ref: '#/components/schemas/user.id'
                  required:
                    - id
                  type: object
              required:
                - notification_type
                - action
                - transaction
                - settings
                - user
                - dispute
      responses:
        '204':
          $ref: '#/components/responses/204'
        '400':
          $ref: '#/components/responses/400'
        '500':
          $ref: '#/components/responses/500'
      summary: 분쟁
      tags:
        - anti-fraud
      x-codeSamples:
        - label: CURL
          lang: cURL
          source: >-
            curl -v 'https://your.hostname/your/uri' \

            -X POST \

            -H 'authorization: Signature
            32c64a80d2527dc08906ae1891bac4489509b9f6' \

            -d '{
              "notification_type": "dispute",
              "action": "adding",
              "transaction": {
                "id": 123456789,
                "date_create": "2023-08-24T10:21:00+04:00",
                "total": {
                  "amount": 1,
                  "currency": "EUR"
                },
                "payment_method": "credit_debit_card"
              },
              "settings": {
                "project_id": 18404,
                "merchant_id": 2340
              },
              "user": {
                "id": "1234567",
                "email": "email@example.com",
                "country_code": "US"
              },
              "dispute": {
                "incoming_date": "2024-01-25T01:02:03+04:00",
                "reason": "not_as_described",
                "type": "retrieval",
                "status": "new"
              }
            }'
        - label: HTTP
          lang: HTTP
          source: |-
            POST /your_uri HTTP/1.1
            host: your.host
            accept: application/json
            content-Type: application/json
            content-Length: 578
            authorization: Signature 31bd5924dd6cbc9cbe99d331c4a086a57291f9d7

            {
              "notification_type": "dispute",
              "action": "adding",
              "transaction": {
                "id": 123456789,
                "date_create": "2023-08-24T10:21:00+04:00",
                "total": {
                  "amount": 1,
                  "currency": "EUR"
                },
                "payment_method": "credit_debit_card"
              },
              "settings": {
                "project_id": 18404,
                "merchant_id": 2340
              },
              "user": {
                "id": "1234567",
                "email": "email@example.com",
                "country_code": "US"
              },
              "dispute": {
                "incoming_date": "2024-01-25T01:02:03+04:00",
                "reason": "not_as_described",
                "type": "retrieval",
                "status": "new"
              }
            }
  nonrenewing-subscription:
    post:
      description: >-
        정기 결제 상태가 비갱신으로 설정된 경우 엑솔라는 `non_renewal_subscription` 유형이 포함된 웹훅을 웹훅
        URL로 보냅니다. 이 웹훅을 수신하려면 고객 성공 매니저에게 문의하거나 <a
        href="mailto:csm@xsolla.com">csm@xsolla.com</a>으로 이메일을 보내주세요.
      operationId: nonrenewing-subscription
      requestBody:
        content:
          application/json:
            schema:
              properties:
                notification_type:
                  $ref: '#/components/schemas/notification_type'
                settings:
                  description: 사용자 정의 프로젝트 설정(개체)입니다.
                  properties:
                    merchant_id:
                      $ref: '#/components/schemas/settings.merchant_id'
                    project_id:
                      $ref: '#/components/schemas/settings.project_id'
                  required:
                    - project_id
                  type: object
                subscription:
                  description: 정기결제 세부 정보(오브젝트).
                  properties:
                    amount:
                      description: 구매 금액입니다.
                      format: float
                      type: number
                    currency:
                      $ref: '#/components/schemas/currency'
                    date_create:
                      $ref: '#/components/schemas/subscription.date_create'
                    date_next_charge:
                      description: >-
                        다음 청구일. 정기 결제가 비갱신으로 설정되기 전 다음 지불 예정일입니다. 날짜 및 시간 당 [ISO
                        8601](https://en.wikipedia.org/wiki/ISO_8601).
                      type: string
                    plan_id:
                      $ref: '#/components/schemas/subscription.plan_id'
                    subscription_id:
                      $ref: '#/components/schemas/subscription.subscription_id'
                  type: object
                user:
                  description: 사용자 세부 사항(개체)입니다.
                  properties:
                    email:
                      $ref: '#/components/schemas/user.email'
                    id:
                      $ref: '#/components/schemas/user.id'
                    name:
                      $ref: '#/components/schemas/user.name'
                  required:
                    - id
                  type: object
              required:
                - notification_type
      responses:
        '204':
          $ref: '#/components/responses/204'
        '400':
          $ref: '#/components/responses/400'
        '500':
          $ref: '#/components/responses/500'
      summary: 비갱신 정기결제
      tags:
        - subscriptions
      x-codeSamples:
        - label: CURL
          lang: cURL
          source: >-
            curl -v 'https://your.hostname/your/uri' \

            -X POST \

            -H 'accept: application/json' \

            -H 'content-type: application/json' \

            -H 'authorization: Signature
            13342703ccaca5064ad33ba451d800c5e823db8f' \

            -d '{
                    "notification_type": "non_renewal_subscription",
                    "settings": {
                      "project_id": 12345,
                      "merchant_id": 1234
                    },
                    "user": {
                        "id": "1234567",
                        "email": "email@example.com"
                    },
                    "subscription": {
                        "plan_id": "a1bcd2e3",
                        "subscription_id": "10",
                        "date_create": "2014-12-22T15:25:25+04:00",
                        "date_next_charge": "2015-01-22T19:25:25+04:00",
                        "currency": "USD",
                        "amount": 0.03
                    }
                }'
        - label: PHP
          lang: PHP
          source: |-
            <?php

            $request = array(
                'notification_type' => 'non_renewal_subscription',
                'settings' => array(
                  'project_id' => 12345,
                  'merchant_id' => 1234
                ),
                'user' => array(
                    'id' => '1234567',
                    'email' => 'email@example.com'
                ),
                'subscription' => array(
                    'plan_id' => 'a1bcd2e3',
                    'subscription_id' => '10',
                    'date_create' => '2014-12-22T15:25:25+04:00',
                    'date_next_charge' => '2015-01-22T19:25:25+04:00',
                    'currency' => 'USD',
                    'amount' => 0.03
                )
            );
        - label: HTTP
          lang: HTTP
          source: |-
            POST /your/uri HTTP/1.1
            host: your.hostname
            accept: application/json
            content-type: application/json
            content-length: 240
            authorization: Signature 13342703ccaca5064ad33ba451d800c5e823db8f

            {
                "notification_type": "non_renewal_subscription",
                "settings": {
                  "project_id": 12345,
                  "merchant_id": 1234
                },
                "user": {
                    "id": "1234567",
                    "email": "email@example.com"
                },
                "subscription": {
                    "plan_id": "a1bcd2e3",
                    "subscription_id": "10",
                    "date_create": "2014-12-22T15:25:25+04:00",
                    "date_next_charge": "2015-01-22T19:25:25+04:00",
                    "currency": "USD",
                    "amount": 0.03
                }
            }
  order-cancellation:
    post:
      description: >
        사용자, 파트너 또는 자동으로 결제가 취소된 경우 엑솔라 측에서 지정된 URL로 <code>order_canceled</code>
        웹훅을 

        전송합니다. 웹훅에는 반품된 아이템 정보, 결제 데이터, 취소된 주문의 세부 정보가 포함되어 있습니다.


        결제에 실패할 경우 웹훅이 전송되지 않습니다. 예:

        * 결제 UI가 열렸지만 사용자가 주문을 결제하지 않은 경우

        * 결제 UI가 열렸지만 결제 중 오류가 발생한 경우


        권장되는 웹훅 처리 시간은 3초 이내입니다.
      operationId: order-cancellation
      requestBody:
        content:
          application/json:
            schema:
              properties:
                billing:
                  description: 거래 및 결제 세부 정보.
                  properties:
                    notification_type:
                      $ref: '#/components/schemas/notification_type'
                    payment_details:
                      description: 결제 내역 관련 값.
                      properties:
                        country_wht:
                          description: 국경 간 거래(대상)로 인해 특정 국가에서 적용되는 원천징수세.
                          properties:
                            amount:
                              description: 금액.
                              format: float
                              type: number
                            currency:
                              $ref: '#/components/schemas/currency'
                            percent:
                              description: 국가 원천징수세율(%).
                              format: float
                              type: number
                          type: object
                        direct_wht:
                          description: 직접 원천징수세.
                          properties:
                            amount:
                              description: 금액.
                              format: float
                              type: number
                            currency:
                              $ref: '#/components/schemas/currency'
                            percent:
                              description: 직접 원천징수세율.
                              format: float
                              type: number
                          type: object
                        payment:
                          description: 게임유저 결제 데이터 관련 값.
                          properties:
                            amount:
                              description: 금액.
                              format: float
                              type: number
                            currency:
                              $ref: '#/components/schemas/currency'
                          type: object
                        payment_method_fee:
                          description: 결제 방식 수수료율.
                          properties:
                            amount:
                              description: 금액.
                              format: float
                              type: number
                            currency:
                              $ref: '#/components/schemas/currency'
                          type: object
                        payment_method_sum:
                          description: 결제 방법에서 청구된 금액에 대한 데이터가 포함된 값.
                          properties:
                            amount:
                              description: 금액.
                              format: float
                              type: number
                            currency:
                              $ref: '#/components/schemas/currency'
                          type: object
                        payout:
                          description: 지급 내역 관련 값.
                          properties:
                            amount:
                              description: 금액.
                              format: float
                              type: number
                            currency:
                              $ref: '#/components/schemas/currency'
                          type: object
                        payout_currency_rate:
                          description: 결제 통화를 지급 통화로 환전할 때의 환율.
                          type: string
                        repatriation_commission:
                          description: 본국 송금 비용에 대한 데이터가 있는 오브젝트. 타사가 엑솔라에 부과.
                          properties:
                            amount:
                              description: 금액.
                              format: float
                              type: number
                            currency:
                              $ref: '#/components/schemas/currency'
                          type: object
                        sales_tax:
                          description: 판매세(미국과 캐나다만 해당).
                          properties:
                            amount:
                              description: 금액.
                              format: float
                              type: number
                            currency:
                              $ref: '#/components/schemas/currency'
                            percent:
                              description: 판매세율.
                              format: float
                              type: number
                          type: object
                        user_acquisition_fee:
                          description: >-
                            제휴 네트워크 및 인플루언서를 통한 구매에 대해 공제된 사용자 확보 수수료의
                            총액(대상)입니다.
                          properties:
                            amount:
                              description: 금액.
                              format: float
                              type: number
                            currency:
                              $ref: '#/components/schemas/currency'
                            percent:
                              description: 사용자 확보 수수료율(%).
                              format: float
                              type: number
                          type: object
                        vat:
                          description: VAT 세율(유럽연합만 해당).
                          properties:
                            amount:
                              description: 금액.
                              format: float
                              type: number
                            currency:
                              $ref: '#/components/schemas/currency'
                            percent:
                              description: 부가가치세율.
                              format: float
                              type: number
                          type: object
                        xsolla_balance_sum:
                          description: 엑솔라 잔액에서 청구된 금액에 대한 데이터가 포함된 값.
                          properties:
                            amount:
                              description: 금액.
                              format: float
                              type: number
                            currency:
                              $ref: '#/components/schemas/currency'
                          type: object
                        xsolla_fee:
                          description: 엑솔라 수수료 요율.
                          properties:
                            amount:
                              description: 금액.
                              format: float
                              type: number
                            currency:
                              $ref: '#/components/schemas/currency'
                          type: object
                      type: object
                    purchase:
                      description: 구매 데이터 관련 값.
                      properties:
                        subscription:
                          description: 정기결제 내역 관련 값.
                          properties:
                            amount:
                              $ref: '#/components/schemas/amount-float'
                            currency:
                              $ref: '#/components/schemas/currency'
                            date_create:
                              $ref: '#/components/schemas/subscription.date_create'
                            plan_id:
                              $ref: '#/components/schemas/subscription.plan_id'
                            subscription_id:
                              $ref: >-
                                #/components/schemas/subscription.subscription_id
                            tags:
                              $ref: '#/components/schemas/subscription.tags'
                          type: object
                        total:
                          description: 구매 총 가격 데이터 관련 값.
                          properties:
                            amount:
                              description: 총 구매 금액.
                              format: float
                              type: number
                            currency:
                              $ref: '#/components/schemas/currency'
                          type: object
                      required:
                        - total
                      type: object
                    refund_details:
                      description: 환불 세부 정보(오브젝트).
                      properties:
                        author:
                          description: |
                            환불 시작자. 필드 값이 다음 표에 따라 전달됩니다.

                            <table>
                                <thead>
                                <tr>
                                    <th>환불 시작자</th>
                                    <th>필드 값</th>
                                </tr>
                                </thead>
                                <tbody>
                                <tr>
                                    <td>게임(API를 통해).</td>
                                    <td>API</td>
                                </tr>
                                <tr>
                                    <td>게시자 계정 사용자(자동 환불).</td>
                                    <td>사용자 이메일</td>
                                </tr>
                                <tr>
                                    <td>게시자 계정 사용자(엑솔라 고객 지원의 도움을 받아).</td>
                                    <td>support@xsolla.com</td>
                                </tr>
                                <tr>
                                    <td>엑솔라(엑솔라 고객 지원의 도움을 받아).</td>
                                    <td>support@xsolla.com</td>
                                </tr>
                                </tbody>
                            </table>
                          type: string
                        code:
                          description: 코드 ID.
                          type: integer
                        reason:
                          description: 환불 이유입니다.
                          type: string
                      type: object
                    settings:
                      description: 사용자 정의 프로젝트 설정 관련 값.
                      properties:
                        merchant_id:
                          $ref: '#/components/schemas/settings.merchant_id'
                        project_id:
                          $ref: '#/components/schemas/settings.project_id'
                      type: object
                    transaction:
                      description: 트랜잭션 데이터 관련 값.
                      properties:
                        agreement:
                          description: 계약 ID.
                          type: integer
                        dry_run:
                          description: >-
                            테스트 트랜잭션. 테스트 트랜잭션의 경우 매개 변수는 1개 값을 갖습니다. 또는, 트랜잭션이
                            실제로 이루어지는 경우 매개 변수가 전송되지 않습니다.
                          type: integer
                        external_id:
                          description: 트랜잭션 외부 ID 입니다.
                          type: string
                        id:
                          description: 트랜잭션 ID.
                          type: integer
                        payment_method_order_id:
                          description: 결제 시스템의 결제 ID.
                          type: string
                      type: object
                  required:
                    - notification_type
                    - transaction
                    - payment_details
                  type: object
                custom_parameters:
                  description: 추가 정보입니다.
                  type: object
                items:
                  description: >
                    사용자가 구매한 아이템 목록입니다.


                    배열에 포함된 매개 변수 집합은 웹훅 버전에 따라 다릅니다. 버전 2에는 `is_free`,
                    `is_bonus` 및 

                    `is_bundle_content`와 같은 추가 매개 변수가 포함되어 있습니다. 버전을 전환하려면 [웹훅 

                    설정](/ko/api/igs/operation/update-webhook/) API 호출에 대한 정보
                    업데이트에서 `version` 매개 변수 

                    번호를 전달하십시오.
                  items:
                    oneOf:
                      - properties:
                          amount:
                            description: 아이템 수량에 따른 총 비용입니다.
                            type: string
                          custom_attributes:
                            description: 아이템 특성 및 값이 포함된 JSON 개체입니다.
                            type: object
                          is_pre_order:
                            description: '`true`이면 항목이 사전 판매됩니다.'
                            type: boolean
                          promotions:
                            $ref: '#/components/schemas/items.promotions'
                          quantity:
                            description: 아이템 수량.
                            type: integer
                          sku:
                            $ref: '#/components/schemas/items.sku'
                          type:
                            $ref: '#/components/schemas/items.type'
                        required:
                          - sku
                          - type
                          - quantity
                          - amount
                          - promotions
                          - is_pre_order
                        title: 버전 = 1
                        type: object
                      - properties:
                          amount:
                            description: 아이템 수량에 따른 총 비용입니다.
                            type: string
                          custom_attributes:
                            description: 아이템 특성 및 값이 포함된 JSON 개체입니다.
                            type: object
                          is_bonus:
                            description: '`true`이면 항목이 보너스입니다.'
                            type: boolean
                          is_bundle_content:
                            description: '`true`이면 항목이 번들에 포함됩니다.'
                            type: boolean
                          is_free:
                            description: '`true`이면 아이템이 무료입니다.'
                            type: boolean
                          is_pre_order:
                            description: '`true`이면 항목이 사전 판매됩니다.'
                            type: boolean
                          promotions:
                            $ref: '#/components/schemas/items.promotions'
                          quantity:
                            description: 아이템 수량.
                            type: integer
                          sku:
                            $ref: '#/components/schemas/items.sku'
                          type:
                            $ref: '#/components/schemas/items.type'
                        required:
                          - sku
                          - type
                          - quantity
                          - amount
                          - promotions
                          - is_pre_order
                          - is_free
                          - is_bonus
                          - is_bundle_content
                        title: 버전 = 2
                        type: object
                  type: array
                notification_type:
                  $ref: '#/components/schemas/notification_type'
                order:
                  description: 주문에 대한 정보입니다.
                  properties:
                    amount:
                      description: 선택한 통화를 기준으로 한 장바구니의 총 비용입니다.
                      type: string
                    comment:
                      description: 주문에 대한 사용자의 코멘트.
                      nullable: true
                      type: string
                    coupons:
                      description: 적용된 쿠폰. 쿠폰을 적용되지 않았으면 배열이 돌아오지 않습니다.
                      items:
                        properties:
                          code:
                            description: 적용된 쿠폰 코드.
                            type: string
                          external_id:
                            description: 외부 ID.
                            type: string
                        type: object
                      type: array
                    currency:
                      description: >-
                        주문 통화. 가상 화폐는 SKU를 사용하고 실제 화폐는 3글자 [ISO
                        4217](https://en.wikipedia.org/wiki/ISO_4217) 코드를 사용합니다.
                      type: string
                    currency_type:
                      $ref: '#/components/schemas/currency-type'
                    id:
                      description: 엑솔라 측에서 사용자 주문의 고유 식별자입니다.
                      type: integer
                    invoice_id:
                      description: 실질 화폐 결제 인보이스 ID. 인게임 재화 결제 또는 무료 아이템은 `null` 값을 사용합니다.
                      nullable: true
                      type: string
                    mode:
                      description: >-
                        결제 모드. 실제 결제에는 `default`를 사용합니다. 테스트 결제에는 `sandbox`를
                        사용합니다.
                      enum:
                        - default
                        - sandbox
                      type: string
                    platform:
                      description: >-
                        결제 플랫폼. 엑솔라를 통한 결제에 `xsolla` 값을 사용합니다. 다른 결제의 경우
                        `playstation_network`, `xbox_live`, `pc_standalone`,
                        `nintendo_shop`, `google_play`, `app_store_ios`,
                        `android_standalone`, `ios_standalone`, `android_other`,
                        `ios_other`, `pc_other`와 같이 게임 퍼블리싱 플랫폼의 이름에 해당하는 값을
                        사용합니다.
                      enum:
                        - xsolla
                        - playstation_network
                        - xbox_live
                        - pc_standalone
                        - nintendo_shop
                        - google_play
                        - app_store_ios
                        - android_standalone
                        - ios_standalone
                        - android_other
                        - ios_other
                        - pc_other
                      nullable: true
                      type: string
                    promocodes:
                      description: 적용된 프로모션 코드. 프로모션 코드가 적용되지 않았으면 배열이 돌아오지 않습니다.
                      items:
                        properties:
                          code:
                            description: 적용된 프로모션 코드의 코드.
                            type: string
                          external_id:
                            description: 외부 ID.
                            type: string
                        type: object
                      type: array
                    promotions:
                      $ref: '#/components/schemas/order.promotions'
                    status:
                      description: 주문 상태.
                      type: string
                  required:
                    - id
                    - mode
                    - currency_type
                    - currency
                    - amount
                    - status
                    - platform
                    - comment
                    - invoice_id
                    - promotions
                  type: object
                user:
                  description: 사용자 정보.
                  properties:
                    country:
                      $ref: '#/components/schemas/user.country'
                    email:
                      description: 사용자 이메일 주소.
                      type: string
                    external_id:
                      description: 사용자 ID.
                      type: string
                  required:
                    - external_id
                    - email
                  type: object
              required:
                - notification_type
                - items
                - order
                - user
                - transaction
                - payment_details
      responses:
        '200':
          description: 성공적인 처리 표시를 반환합니다.
        '400':
          description: '제공된 정보에 오류가 있는 경우 반환합니다(예: 필수 매개변수 누락, 인증 실패 등).'
      summary: 주문 취소(결제 및 거래 세부 정보 포함)
      tags:
        - combined-webhooks
      x-codeSamples:
        - label: CURL
          lang: cURL
          source: >-
            curl -v 'https://your.hostname/your/uri' \

            -X POST \

            -H 'accept: application/json' \

            -H 'content-type: application/json' \

            -H 'authorization: Signature
            d09695066c52c1b8bdae92f2d6eb59f5b5f89843' \

            -d '{
                "notification_type": "order_canceled",
                "items": [
                  {
                    "sku": "com.xsolla.v.item_1",
                    "type": "virtual_good",
                    "is_pre_order": false,
                    "quantity": 3,
                    "amount": "1000",
                    "promotions": [
                      {
                        "amount_without_discount": "6000",
                        "amount_with_discount": "5000",
                        "sequence": 1
                      },
                      {
                        "amount_without_discount": "5000",
                        "amount_with_discount": "4000",
                        "sequence": 2
                      }
                    ],
                    "custom_attributes": {
                        "purchased": 0,
                        "attr": "value"
                      }
                  },
                  {
                    "sku": "com.xsolla.v.item_new_1",
                    "type": "bundle",
                    "is_pre_order": false,
                    "quantity": 1,
                    "amount": "1000",
                    "promotions": []
                  },
                  {
                    "sku": "com.xsolla.gold_1",
                    "type": "virtual_currency",
                    "is_pre_order": false,
                    "quantity": 1500,
                    "amount": null,
                    "promotions": []
                  }
                ],
                "order": {
                  "id": 1,
                  "mode": "default",
                  "currency_type": "virtual",
                  "currency": "sku_currency",
                  "amount": "2000",
                  "status": "paid",
                  "platform": "xsolla",
                  "comment": null,
                  "invoice_id": "1",
                  "promotions": [
                    {
                      "amount_without_discount": "4000",
                      "amount_with_discount": "2000",
                      "sequence": 1
                    }
                  ],
                  "promocodes": [
                    {
                      "code": "promocode_some_code",
                      "external_id": "promocode_sku"
                    }
                  ],
                  "coupons": [
                    {
                      "code": "WINTER2021",
                      "external_id": "coupon_sku"
                    }
                  ]
                },
                "user": {
                  "external_id": "id_xsolla_login_1",
                  "email": "email@example.com",
                  "country": "US"
                },
                "billing": {
                  "notification_type": "refund",
                  "settings": {
                    "project_id": 18404,
                    "merchant_id": 2340
                  },
                  "purchase": {
                          "subscription": {
                              "plan_id": "b5dac9c8",
                              "subscription_id": "10",
                              "date_create": "2014-09-22T19:25:25+04:00",
                              "currency": "USD",
                              "amount": 9.99
                          },
                          "total":{
                              "currency": "USD",
                              "amount": 200
                          }
                      },
                  "transaction": {
                          "id": 1,
                          "external_id": 1,
                          "dry_run": 1,
                          "agreement": 1
                      },
                  "refund_details": {
                          "code": 4,
                          "reason": "Potential fraud"
                      },
                  "payment_details": {
                          "sales_tax": {
                              "currency": "USD",
                              "amount": 0
                          },
                          "direct_wht": {
                              "currency": "USD",
                              "amount": 0.70
                          },
                          "xsolla_fee": {
                              "currency": "USD",
                              "amount": "10"
                          },
                          "payout": {
                              "currency": "USD",
                              "amount": "200"
                          },
                          "payment_method_fee": {
                              "currency": "USD",
                              "amount": "20"
                          },
                          "payment": {
                              "currency": "USD",
                              "amount": "230"
                          },
                          "repatriation_commission": {
                              "currency": "USD",
                              "amount": 10
                          }
                      }
                }
            }
        - label: HTTP
          lang: HTTP
          source: |-
            POST /your/uri HTTP/1.1
            host:           your.hostname
            accept:         application/json
            content-length: 258
            content-type:   application/json
            authorization:  Signature d90d319f05df7b0f86d2485f48e7079f0f752523


            {
                "notification_type": "order_canceled",
                "items": [
                  {
                    "sku": "com.xsolla.v.item_1",
                    "type": "virtual_good",
                    "is_pre_order": false,
                    "quantity": 3,
                    "amount": "1000",
                    "promotions": [
                      {
                        "amount_without_discount": "6000",
                        "amount_with_discount": "5000",
                        "sequence": 1
                      },
                      {
                        "amount_without_discount": "5000",
                        "amount_with_discount": "4000",
                        "sequence": 2
                      }
                    ],
                    "custom_attributes": {
                        "purchased": 0,
                        "attr": "value"
                      }
                  },
                  {
                    "sku": "com.xsolla.v.item_new_1",
                    "type": "bundle",
                    "is_pre_order": false,
                    "quantity": 1,
                    "amount": "1000",
                    "promotions": []
                  },
                  {
                    "sku": "com.xsolla.gold_1",
                    "type": "virtual_currency",
                    "is_pre_order": false,
                    "quantity": 1500,
                    "amount": null,
                    "promotions": []
                  }
                ],
                "order": {
                  "id": 1,
                  "mode": "default",
                  "currency_type": "virtual",
                  "currency": "sku_currency",
                  "amount": "2000",
                  "status": "paid",
                  "platform": "xsolla",
                  "comment": null,
                  "invoice_id": "1",
                  "promotions": [
                    {
                      "amount_without_discount": "4000",
                      "amount_with_discount": "2000",
                      "sequence": 1
                    }
                  ],
                  "promocodes": [
                    {
                      "code": "promocode_some_code",
                      "external_id": "promocode_sku"
                    }
                  ],
                  "coupons": [
                    {
                      "code": "WINTER2021",
                      "external_id": "coupon_sku"
                    }
                  ]
                },
                "user": {
                  "external_id": "id_xsolla_login_1",
                  "email": "email@example.com",
                  "country": "US"
                },
                "billing": {
                  "notification_type": "refund",
                  "settings": {
                    "project_id": 18404,
                    "merchant_id": 2340
                  },
                  "purchase": {
                      "subscription": {
                          "plan_id": "b5dac9c8",
                          "subscription_id": "10",
                          "date_create": "2014-09-22T19:25:25+04:00",
                          "currency": "USD",
                          "amount": 9.99
                      },
                      "total": {
                          "currency": "USD",
                          "amount": 200
                      }
                  },
                  "transaction": {
                      "id": 1,
                      "external_id": 1,
                      "dry_run": 1,
                      "agreement": 1
                  },
                  "refund_details": {
                      "code": 4,
                      "reason": "Potential fraud"
                  },
                  "payment_details": {
                      "sales_tax": {
                          "currency": "USD",
                          "amount": 0
                      },
                      "direct_wht": {
                          "currency": "USD",
                          "amount": 0.70
                      },
                      "xsolla_fee": {
                          "currency": "USD",
                          "amount": "10"
                      },
                      "payout": {
                          "currency": "USD",
                          "amount": "200"
                      },
                      "payment_method_fee": {
                          "currency": "USD",
                          "amount": "20"
                      },
                      "payment": {
                          "currency": "USD",
                          "amount": "230"
                      },
                      "repatriation_commission": {
                          "currency": "USD",
                          "amount": 10
                      }
                    }
                  }
                }
  order-cancellation-separate:
    post:
      description: >
        사용자, 파트너 또는 자동으로 결제가 취소된 경우 엑솔라 측에서 지정된 URL로 <code>order_canceled</code>
        웹훅을 

        전송합니다. 웹훅에는 반품된 아이템 정보와 취소된 주문의 세부 정보가 포함되어 있습니다.


        결제에 실패할 경우 웹훅이 전송되지 않습니다. 예:

        * 결제 UI가 열렸지만 사용자가 주문을 결제하지 않은 경우

        * 결제 UI가 열렸지만 결제 중 오류가 발생한 경우


        권장되는 웹훅 처리 시간은 3초 이내입니다.
      operationId: order-cancellation-separate
      requestBody:
        content:
          application/json:
            schema:
              properties:
                custom_parameters:
                  description: 추가 정보입니다.
                  type: object
                items:
                  description: >
                    사용자가 구매한 아이템 목록입니다.


                    배열에 포함된 매개 변수 집합은 웹훅 버전에 따라 다릅니다. 버전 2에는 `is_free`,
                    `is_bonus` 및 

                    `is_bundle_content`와 같은 추가 매개 변수가 포함되어 있습니다. 버전을 전환하려면 [웹훅 

                    설정](/ko/api/igs/operation/update-webhook/) API 호출에 대한 정보
                    업데이트에서 `version` 매개 변수 

                    번호를 전달하십시오.
                  items:
                    oneOf:
                      - properties:
                          amount:
                            description: 아이템 수량에 따른 총 비용입니다.
                            type: string
                          custom_attributes:
                            description: 아이템 특성 및 값이 포함된 JSON 개체입니다.
                            type: object
                          is_pre_order:
                            description: '`true`이면 항목이 사전 판매됩니다.'
                            type: boolean
                          promotions:
                            $ref: '#/components/schemas/items.promotions'
                          quantity:
                            description: 아이템 수량.
                            type: integer
                          sku:
                            $ref: '#/components/schemas/items.sku'
                          type:
                            $ref: '#/components/schemas/items.type'
                        required:
                          - sku
                          - type
                          - quantity
                          - amount
                          - promotions
                          - is_pre_order
                        title: 버전 = 1
                        type: object
                      - properties:
                          amount:
                            description: 아이템 수량에 따른 총 비용입니다.
                            type: string
                          custom_attributes:
                            description: 아이템 특성 및 값이 포함된 JSON 개체입니다.
                            type: object
                          is_bonus:
                            description: '`true`이면 항목이 보너스입니다.'
                            type: boolean
                          is_bundle_content:
                            description: '`true`이면 항목이 번들에 포함됩니다.'
                            type: boolean
                          is_free:
                            description: '`true`이면 아이템이 무료입니다.'
                            type: boolean
                          is_pre_order:
                            description: '`true`이면 항목이 사전 판매됩니다.'
                            type: boolean
                          promotions:
                            description: 적용된 프로모션. 프로모션이 적용되지 않은 경우, 매개변수에 빈 배열이 전달됩니다.
                            items:
                              properties:
                                amount_with_discount:
                                  description: 할인이 적용된 아이템의 총 비용.
                                  type: string
                                amount_without_discount:
                                  description: 할인이 미적용된 아이템의 총 비용.
                                  type: string
                                sequence:
                                  description: 프로모션 신청 순서입니다.
                                  type: integer
                              type: object
                            type: array
                          quantity:
                            description: 아이템 수량.
                            type: integer
                          sku:
                            $ref: '#/components/schemas/items.sku'
                          type:
                            $ref: '#/components/schemas/items.type'
                        required:
                          - sku
                          - type
                          - quantity
                          - amount
                          - promotions
                          - is_pre_order
                          - is_free
                          - is_bonus
                          - is_bundle_content
                        title: 버전 = 2
                        type: object
                  type: array
                notification_type:
                  $ref: '#/components/schemas/notification_type'
                order:
                  description: 주문에 대한 정보입니다.
                  properties:
                    amount:
                      description: 선택한 통화를 기준으로 한 장바구니의 총 비용입니다.
                      type: string
                    comment:
                      description: 주문에 대한 사용자의 코멘트.
                      nullable: true
                      type: string
                    coupons:
                      description: 적용된 쿠폰. 쿠폰을 적용되지 않았으면 배열이 돌아오지 않습니다.
                      items:
                        properties:
                          code:
                            description: 적용된 쿠폰 코드.
                            type: string
                          external_id:
                            description: 외부 ID.
                            type: string
                        type: object
                      type: array
                    currency:
                      description: >-
                        주문 통화. 가상 화폐는 SKU를 사용하고 실제 화폐는 3글자 [ISO
                        4217](https://en.wikipedia.org/wiki/ISO_4217) 코드를 사용합니다.
                      type: string
                    currency_type:
                      $ref: '#/components/schemas/currency-type'
                    id:
                      description: 엑솔라 측에서 사용자 주문의 고유 식별자입니다.
                      type: integer
                    invoice_id:
                      description: 실질 화폐 결제 인보이스 ID. 인게임 재화 결제 또는 무료 아이템은 `null` 값을 사용합니다.
                      nullable: true
                      type: string
                    mode:
                      description: >-
                        결제 모드. 실제 결제에는 `default`를 사용합니다. 테스트 결제에는 `sandbox`를
                        사용합니다.
                      enum:
                        - default
                        - sandbox
                      type: string
                    platform:
                      description: >-
                        결제 플랫폼. 엑솔라를 통한 결제에 `xsolla` 값을 사용합니다. 다른 결제의 경우
                        `playstation_network`, `xbox_live`, `pc_standalone`,
                        `nintendo_shop`, `google_play`, `app_store_ios`,
                        `android_standalone`, `ios_standalone`, `android_other`,
                        `ios_other`, `pc_other`와 같이 게임 퍼블리싱 플랫폼의 이름에 해당하는 값을
                        사용합니다.
                      enum:
                        - xsolla
                        - playstation_network
                        - xbox_live
                        - pc_standalone
                        - nintendo_shop
                        - google_play
                        - app_store_ios
                        - android_standalone
                        - ios_standalone
                        - android_other
                        - ios_other
                        - pc_other
                      nullable: true
                      type: string
                    promocodes:
                      description: 적용된 프로모션 코드. 프로모션 코드가 적용되지 않았으면 배열이 돌아오지 않습니다.
                      items:
                        properties:
                          code:
                            description: 적용된 프로모션 코드의 코드.
                            type: string
                          external_id:
                            description: 외부 ID.
                            type: string
                        type: object
                      type: array
                    promotions:
                      $ref: '#/components/schemas/order.promotions'
                    status:
                      description: 주문 상태.
                      type: string
                  required:
                    - id
                    - mode
                    - currency_type
                    - currency
                    - amount
                    - status
                    - platform
                    - comment
                    - invoice_id
                    - promotions
                  type: object
                user:
                  description: 사용자 정보.
                  properties:
                    country:
                      $ref: '#/components/schemas/user.country'
                    email:
                      description: 사용자 이메일 주소.
                      type: string
                    external_id:
                      description: 사용자 ID.
                      type: string
                  required:
                    - external_id
                    - email
                  type: object
              required:
                - notification_type
                - items
                - order
                - user
      responses:
        '200':
          description: 성공적인 처리 표시를 반환합니다.
        '400':
          description: '제공된 정보에 오류가 있는 경우 반환합니다(예: 필수 매개변수 누락, 인증 실패 등).'
      summary: 주문 취소(결제 및 거래 세부 정보 없음)
      tags:
        - separate-webhooks
      x-codeSamples:
        - label: CURL
          lang: cURL
          source: >-
            curl -v 'https://your.hostname/your/uri' \

            -X POST \

            -H 'accept: application/json' \

            -H 'content-type: application/json' \

            -H 'authorization: Signature
            d09695066c52c1b8bdae92f2d6eb59f5b5f89843' \

            -d '{
                "notification_type": "order_canceled",
                "items": [
                  {
                    "sku": "com.xsolla.v.item_1",
                    "type": "virtual_good",
                    "is_pre_order": false,
                    "quantity": 3,
                    "amount": "1000",
                    "promotions": [
                      {
                        "amount_without_discount": "6000",
                        "amount_with_discount": "5000",
                        "sequence": 1
                      },
                      {
                        "amount_without_discount": "5000",
                        "amount_with_discount": "4000",
                        "sequence": 2
                      }
                    ],
                    "custom_attributes": {
                        "purchased": 0,
                        "attr": "value"
                      }
                  },
                  {
                    "sku": "com.xsolla.v.item_new_1",
                    "type": "bundle",
                    "is_pre_order": false,
                    "quantity": 1,
                    "amount": "1000",
                    "promotions": []
                  },
                  {
                    "sku": "com.xsolla.gold_1",
                    "type": "virtual_currency",
                    "is_pre_order": false,
                    "quantity": 1500,
                    "amount": "[null]",
                    "promotions": []
                  }
                ],
                "order": {
                  "id": 1,
                  "mode": "default",
                  "currency_type": "virtual",
                  "currency": "sku_currency",
                  "amount": "2000",
                  "status": "paid",
                  "platform": "xsolla",
                  "comment": null,
                  "invoice_id": "1",
                  "promotions": [
                    {
                      "amount_without_discount": "4000",
                      "amount_with_discount": "2000",
                      "sequence": 1
                    }
                  ],
                  "promocodes": [
                    {
                      "code": "promocode_some_code",
                      "external_id": "promocode_sku"
                    }
                  ],
                  "coupons": [
                    {
                      "code": "WINTER2021",
                      "external_id": "coupon_sku"
                    }
                  ]
                },
                "user": {
                  "external_id": "id_xsolla_login_1",
                  "email": "email@example.com",
                  "country": "US"
                }

            }'
        - label: HTTP
          lang: HTTP
          source: |-
            POST /your/uri HTTP/1.1
            host:           your.hostname
            accept:         application/json
            content-length: 258
            content-type:   application/json
            authorization:  Signature d90d319f05df7b0f86d2485f48e7079f0f752523


            {
                "notification_type": "order_canceled",
                "items": [
                  {
                    "sku": "com.xsolla.v.item_1",
                    "type": "virtual_good",
                    "is_pre_order": false,
                    "quantity": 3,
                    "amount": "1000",
                    "promotions": [
                      {
                        "amount_without_discount": "6000",
                        "amount_with_discount": "5000",
                        "sequence": 1
                      },
                      {
                        "amount_without_discount": "5000",
                        "amount_with_discount": "4000",
                        "sequence": 2
                      }
                    ],
                    "custom_attributes": {
                        "purchased": 0,
                        "attr": "value"
                      }
                  },
                  {
                    "sku": "com.xsolla.v.item_new_1",
                    "type": "bundle",
                    "is_pre_order": false,
                    "quantity": 1,
                    "amount": "1000",
                    "promotions": []
                  },
                  {
                    "sku": "com.xsolla.gold_1",
                    "type": "virtual_currency",
                    "is_pre_order": false,
                    "quantity": 1500,
                    "amount": "[null]",
                    "promotions": []
                  }
                ],
                "order": {
                  "id": 1,
                  "mode": "default",
                  "currency_type": "virtual",
                  "currency": "sku_currency",
                  "amount": "2000",
                  "status": "paid",
                  "platform": "xsolla",
                  "comment": null,
                  "invoice_id": "1",
                  "promotions": [
                    {
                      "amount_without_discount": "4000",
                      "amount_with_discount": "2000",
                      "sequence": 1
                    }
                  ],
                  "promocodes": [
                    {
                      "code": "promocode_some_code",
                      "external_id": "promocode_sku"
                    }
                  ],
                  "coupons": [
                    {
                      "code": "WINTER2021",
                      "external_id": "coupon_sku"
                    }
                  ]
                },
                "user": {
                  "external_id": "id_xsolla_login_1",
                  "email": "email@example.com",
                  "country": "US"
                }
            }
  partial-refund:
    post:
      description: >
        부분 환불이 이루어지면 엑솔라는 `partial_refund` 유형이 포함된 웹훅의 취소된 거래에 대한 세부 정보를 웹훅 URL로
        전송합니다. 

        부분 환불 절차에 대한 자세한 내용은
        [지침](/ko/doc/pay-station/features/refund/#pay_station_features_refund_how_it_works_partial_refund_flow)을
        참조해 주세요.


        관리자 페이지에 웹훅 URL을 저장하면 웹훅에서 자세한 정보를 수신할 수 있는 권한을 부여할 수 있습니다. 이렇게 하려면 <a 

        href="https://publisher.xsolla.com/0/projects/0/edit/webhooks/store">프로젝트
        설정 

        &gt;웹훅&gt; 고급 설정</a> 섹션의 관리자 페이지에서 다음 토글을 활성화로 설정하십시오.


        <div class="note">

        <p><strong>참고</strong></p>

        <p>2025년 1월 22일 또는 그 이전에 관리자 페이지에 등록한 경우, <a
        href="https://publisher.xsolla.com/0/projects/0/edit/webhooks/payments">프로젝트
        설정 &gt;웹훅 &gt; 테스트 &gt; 결제 &gt; 고급 설정</a> 섹션에서 토글을 찾을 수 있습니다.</p>

        </div>


        <table>

        <thead>
            <tr>
                <th>토글</th>
                <th>설명</th>
            </tr>
        </thead>

        <tbody>
            <tr>
                <td>저장된 결제 방식을 사용한 트랜잭션에 대한 정보 표시</td>
                <td><p>정보는 웹훅의 다음 사용자 정의 매개 변수에서 전달됩니다.</p><ul><li><code>saved_payment_method</code>:<ul><li><code>0</code> - 저장된 결제 방식이 사용되지 않음</li><li><code>1</code> - 현재 결제를 진행할 때 결제 방식이 저장됨</li><li><code>2</code> - 이전에 저장한 결제 방식이 사용됨</li></ul></li><li><code>payment_type</code>:<ul><li><code>1</code> - 일회성 결제</li><li><code>2</code> - 반복 결제</li></ul></li></ul></td>
            </tr>
        </tbody>

        </table>


        환불 코드:


        <table>
            <thead>
            <tr>
                <th>코드</th>
                <th>환불 이유</th>
                <th>설명</th>
            </tr>
            </thead>
            <tbody>
            <tr>
                <td>1</td>
                <td>사용자 요청/게임 요청에 의한 취소</td>
                <td>관리자 페이지에서 취소가 요청된 경우 사용됩니다.</td>
            </tr>
            <tr>
                <td>3</td>
                <td>연동 오류</td>
                <td>엑솔라와 게임 사이의 연동에 문제가 있을 경우 사용됩니다.<br /><b>권장 사항: 사용자를 차단 목록에 추가하지 마세요.</b></td>
            </tr>
            <tr>
                <td>5</td>
                <td>테스트 결제</td>
                <td>테스트 트랜잭션인 경우 사용되며 이후 취소로 이어집니다.<br /><b>권장 사항: 사용자를 차단 목록에 추가하지 마세요.</b></td>
            </tr>
            <tr>
                <td>7</td>
                <td>PS에서 전송된 사기 참고</td>
                <td>결제 시스템에서 결제가 거부되었습니다. PS에서 잠재적 사기를 감지했습니다.<br /><b>권장 사항: 사용자를 차단 목록에 추가하세요.</b></td>
            </tr>
            <tr>
                <td>9</td>
                <td>사용자 요청에 의한 취소</td>
                <td>사용자의 요청에 의한 환불 사유입니다. 어떤 이유로 사용자가 게임 또는 구매에 만족하지 못한 못하였음을 의미합니다.<br /><b>권장 사항: 사용자를 차단 목록에 추가하지 마세요.</b></td>
            </tr>
            <tr>
                <td>10</td>
                <td>게임 요청에 의한 취소</td>
                <td>게임을 통해 취소를 요청한 경우 사용됩니다.<br /><b>권장 사항: 사용자를 차단 목록에 추가하지 마세요.</b></td>
            </tr>
            </tbody>
        </table>
      operationId: partial-refund
      requestBody:
        content:
          application/json:
            schema:
              properties:
                custom_parameters:
                  description: 사용자 정의 매개 변수입니다.
                  type: object
                notification_type:
                  $ref: '#/components/schemas/notification_type'
                payment_details:
                  description: 결제 내역 관련 값입니다.
                  properties:
                    direct_wht:
                      description: 직접 원천징수세.
                      properties:
                        amount:
                          description: 총계.
                          format: float
                          type: number
                        currency:
                          $ref: '#/components/schemas/currency'
                        percent:
                          description: 직접 원천징수세율
                          format: float
                          type: number
                      type: object
                    payment:
                      description: 게임유저 결제 데이터 관련 값입니다.
                      properties:
                        amount:
                          description: 총계.
                          format: float
                          type: number
                        currency:
                          $ref: '#/components/schemas/currency'
                      type: object
                    payment_method_fee:
                      description: 결제 방식 수수료율입니다.
                      properties:
                        amount:
                          description: 총계.
                          format: float
                          type: number
                        currency:
                          $ref: '#/components/schemas/currency'
                      type: object
                    payment_method_sum:
                      description: 결제 방법에서 청구된 금액에 대한 데이터가 포함된 값입니다.
                      properties:
                        amount:
                          description: 총계.
                          format: float
                          type: number
                        currency:
                          $ref: '#/components/schemas/currency'
                      type: object
                    payout:
                      description: 지급 내역 관련 값입니다.
                      properties:
                        amount:
                          description: 총계.
                          format: float
                          type: number
                        currency:
                          $ref: '#/components/schemas/currency'
                      type: object
                    payout_currency_rate:
                      description: 결제 통화를 지급 통화로 환전할 때의 환율입니다.
                      type: string
                    repatriation_commission:
                      description: 본국 송금 비용에 대한 데이터가 있는 오브젝트. 타사가 엑솔라에 부과.
                      properties:
                        amount:
                          description: 총계.
                          format: float
                          type: number
                        currency:
                          $ref: '#/components/schemas/currency'
                      type: object
                    sales_tax:
                      description: 판매세(대상; 미국과 캐나다만).
                      properties:
                        amount:
                          description: 총계.
                          format: float
                          type: number
                        currency:
                          $ref: '#/components/schemas/currency'
                        percent:
                          description: 판매세율.
                          format: float
                          type: number
                      type: object
                    vat:
                      description: VAT 세율입니다(유럽연합만 해당).
                      properties:
                        amount:
                          description: 총계.
                          format: float
                          type: number
                        currency:
                          $ref: '#/components/schemas/currency'
                        percent:
                          description: 부가가치세율.
                          format: float
                          type: number
                      type: object
                    xsolla_balance_sum:
                      description: 엑솔라 잔액에서 청구된 금액에 대한 데이터가 포함된 값입니다.
                      properties:
                        amount:
                          description: 총계.
                          format: float
                          type: number
                        currency:
                          $ref: '#/components/schemas/currency'
                      type: object
                    xsolla_fee:
                      description: 엑솔라 수수료 요율입니다.
                      properties:
                        amount:
                          description: 총계.
                          format: float
                          type: number
                        currency:
                          $ref: '#/components/schemas/currency'
                      type: object
                  type: object
                purchase:
                  description: 구매 데이터 관련 값입니다.
                  properties:
                    checkout:
                      description: 결제 파라미터 데이터와 관련된 값입니다.
                      properties:
                        amount:
                          description: 구매 금액입니다.
                          format: float
                          type: number
                        currency:
                          $ref: '#/components/schemas/currency'
                      type: object
                    total:
                      description: 구매 총 가격 데이터와 관련된 값입니다.
                      properties:
                        amount:
                          description: 부분 환불 결제 금액입니다.
                          format: float
                          type: number
                        currency:
                          $ref: '#/components/schemas/currency'
                      type: object
                  required:
                    - total
                  type: object
                refund_details:
                  description: 환불 세부 정보(오브젝트).
                  properties:
                    author:
                      description: |
                        환불 시작자. 필드 값이 다음 표에 따라 전달됩니다.

                        <table>
                            <thead>
                            <tr>
                                <th>환불 시작자</th>
                                <th>필드 값</th>
                            </tr>
                            </thead>
                            <tbody>
                            <tr>
                                <td>게임(API를 통해).</td>
                                <td>API</td>
                            </tr>
                            <tr>
                                <td>게시자 계정 사용자(자동 환불).</td>
                                <td>사용자 이메일</td>
                            </tr>
                            <tr>
                                <td>게시자 계정 사용자(엑솔라 고객 지원의 도움을 받아).</td>
                                <td>support@xsolla.com</td>
                            </tr>
                            <tr>
                                <td>엑솔라(엑솔라 고객 지원의 도움을 받아).</td>
                                <td>support@xsolla.com</td>
                            </tr>
                            </tbody>
                        </table>
                      type: string
                    code:
                      description: 코드 ID.
                      type: integer
                    date:
                      description: 환불 날짜입니다.
                      type: string
                    reason:
                      description: 환불 이유입니다.
                      type: string
                  type: object
                settings:
                  description: 사용자 정의 프로젝트 설정(개체)입니다.
                  properties:
                    merchant_id:
                      $ref: '#/components/schemas/settings.merchant_id'
                    project_id:
                      $ref: '#/components/schemas/settings.project_id'
                  type: object
                transaction:
                  description: 트랜잭션 데이터 관련 값입니다.
                  properties:
                    agreement:
                      description: 계약 ID입니다.
                      type: integer
                    date:
                      description: 트랜잭션 날짜입니다.
                      type: string
                    dry_run:
                      description: >-
                        테스트 트랜잭션(거래). 테스트 트랜잭션의 경우 매개변수는 1개 값을 갖습니다. 또는,
                        트랜잭션(거래)이 실제로 이루어지는 경우 매개변수가 전송되지 않습니다.
                      type: integer
                    external_id:
                      description: 트랜잭션 외부 ID 입니다.
                      type: string
                    id:
                      description: 트랜잭션 ID.
                      type: integer
                  type: object
                user:
                  description: 사용자 세부 사항(개체)입니다.
                  properties:
                    country:
                      $ref: '#/components/schemas/user.country'
                    email:
                      $ref: '#/components/schemas/user.email'
                    id:
                      $ref: '#/components/schemas/user.id'
                    ip:
                      $ref: '#/components/schemas/user.ip'
                    name:
                      $ref: '#/components/schemas/user.name'
                    phone:
                      $ref: '#/components/schemas/user.phone'
                    zip:
                      $ref: '#/components/schemas/user.zip'
                  required:
                    - id
                  type: object
              required:
                - notification_type
                - transaction
                - payment_details
      responses:
        '204':
          $ref: '#/components/responses/204'
        '400':
          $ref: '#/components/responses/400'
        '500':
          $ref: '#/components/responses/500'
      summary: 부분 환불
      tags:
        - payments
      x-codeSamples:
        - label: CURL
          lang: cURL
          source: |-
            curl -v 'https://your.hostname/your/uri' \
            -X POST \
            -d '{
                    "notification_type": "partial_refund",
                    "settings": {
                      "project_id": 18404,
                      "merchant_id": 2340
                    },
                    "purchase": {
                        "checkout": {
                            "currency": "USD",
                            "amount": 50
                        },
                        "total":{
                            "currency": "USD",
                            "amount": 200
                        }
                    },
                    "user": {
                        "ip": "127.0.0.1",
                        "phone": "18777976552",
                        "email": "email@example.com",
                        "id": "1234567",
                        "name": "John Smith",
                        "country": "US"
                    },
                    "transaction": {
                        "id": 1,
                        "external_id": 1,
                        "dry_run": 1,
                        "agreement": 1,
                        "date": "2022-03-01 10:53:15"
                    },
                    "refund_details": {
                        "author": "email@example.com",
                        "date": "2022-03-01 10:56:48"
                    },
                    "payment_details": {
                        "sales_tax": {
                            "currency": "USD",
                            "amount": 0
                        },
                        "direct_wht": {
                            "currency": "USD",
                            "amount": 0.70
                        },
                        "xsolla_fee": {
                            "currency": "USD",
                            "amount": "10"
                        },
                        "payout": {
                            "currency": "USD",
                            "amount": "200"
                        },
                        "payment_method_fee": {
                            "currency": "USD",
                            "amount": "20"
                        },
                        "payment": {
                            "currency": "USD",
                            "amount": "230"
                        },
                        "repatriation_commission": {
                            "currency": "USD",
                            "amount": 10
                        }
                    }
                }
            }'
        - label: PHP
          lang: PHP
          source: |-
            <?php

            $request = array(
                'notification_type' => 'partial_refund',
                'settings' => array(
                  'project_id' => 18404,
                  'merchant_id' => 2340
                ),
                'purchase' => array(
                    'total' => array(
                        'currency' => 'USD',
                        'amount' => 9.99
                    )
                ),
                'user' => array(
                    'ip' => '127.0.0.1',
                    'phone' => '18777976552',
                    'email' => 'email@example.com',
                    'id' => '1234567',
                    'country' => 'US'
                ),
                'transaction' => array(
                    'id' => 87654321,
                    'payment_date' => '2014-09-23T19:25:25+04:00',
                    'payment_method' => 1380,
                    'dry_run' => 1,
                    'date' => '2022-03-31 10:53:15'
                ),
                'refund_details' => array(
                        'author' => 'email@example.com',
                        'date' => '2022-03-01 10:56:48'
                ),
                'payment_details' => array(
                    'payment' => array(
                        'currency' => 'USD',
                        'amount' => 9.99
                    ),
                    'vat' => array(
                        'currency' => 'USD',
                        'amount' => 0
                    ),
                    'sales_tax' => array(
                        'currency' => 'USD',
                        'amount' => 0
                    ),
                    'direct_wht' => array(
                        'currency' => 'USD',
                        'amount' => 70
                    ),
                    'payout_currency_rate' => 1,
                    'payout' => array(
                        'currency' => 'USD',
                        'amount' => 9.49
                    ),
                    'xsolla_fee' => array(
                        'currency' => 'USD',
                        'amount' => 0.19
                    ),
                    'payment_method_fee' => array(
                        'currency' => 'USD',
                        'amount' => 0.31
                    ),
                    'repatriation_commission' => array(
                        'currency' => 'USD',
                        'amount' => 0.2
                    )
                )
            );
        - label: HTTP
          lang: HTTP
          source: |-
            POST /your_uri HTTP/1.1
            host: your.host
            accept: application/json
            content-type: application/json
            content-length: 1220
            authorization: Signature 31bd5924dd6cbc9cbe99d331c4a086a57291f9d7

            {
                "notification_type": "partial_refund",
                "settings": {
                  "project_id": 18404,
                  "merchant_id": 2340
                },
                "purchase": {
                    "checkout": {
                        "currency": "USD",
                        "amount": 50
                    },
                    "total": {
                        "currency": "USD",
                        "amount": 200
                    }
                },
                "user": {
                    "ip": "127.0.0.1",
                    "phone": "18777976552",
                    "email": "email@example.com",
                    "id": "1234567",
                    "name": "John Smith",
                    "country": "US"
                },
                "transaction": {
                    "id": 1,
                    "external_id": 1,
                    "dry_run": 1,
                    "agreement": 1,
                    "date": "2022-03-31 10:53:15"
                },
                "refund_details": {
                    "author": "email@example.com",
                    "date": "2022-03-31 10:56:48"
                },
                "payment_details": {
                    "sales_tax": {
                        "currency": "USD",
                        "amount": 0
                    },
                    "direct_wht": {
                        "currency": "USD",
                        "amount": 0.70
                    },
                    "xsolla_fee": {
                        "currency": "USD",
                        "amount": "10"
                    },
                    "payout": {
                        "currency": "USD",
                        "amount": "200"
                    },
                    "payment_method_fee": {
                        "currency": "USD",
                        "amount": "20"
                    },
                    "payment": {
                        "currency": "USD",
                        "amount": "230"
                    },
                    "repatriation_commission": {
                        "currency": "USD",
                        "amount": 10
                    }
                }
            }
  payment:
    post:
      description: >
        사용자가 결제를 완료하면 엑솔라는 `payment` 유형이 포함된 웹훅의 결제 세부 정보를 웹훅 URL로 전송합니다.


        예상되는 응답 코드는 <b>Responses</b> 섹션에 설명되어 있지만 다른 응답 코드도 사용할 수 있습니다.


        <table>
            <thead>
            <tr>
                <th>응답 코드</th>
                <th>설명</th>
            </tr>
            </thead>
            <tbody>
            <tr>
                <td><code>200</code>, <code>201</code>, <code>204</code></td>
                <td>성공적인 응답입니다.</td>
            </tr>
            <tr>
                <td><code>4xx</code></td>
                <td>오류가 발생했습니다. 예를 들어, 지정된 사용자를 찾을 수 없거나 잘못된 서명이 전달된 경우입니다.</td>
            </tr>
            <tr>
                <td><code>5xx</code></td>
                <td>일시적인 서버 오류입니다. 이 응답이 수신되면 엑솔라는 자동으로 웹훅 전송을 재시도하며, 수신자가 수신을 확인할 때까지 시도 간격을 점차 늘립니다. 최대 재시도 횟수는 48시간 동안 12회입니다.</td>
            </tr>
            </tbody>
        </table>


        <a
        href="https://publisher.xsolla.com/0/projects/0/edit/webhooks/store">관리자 

        페이지</a>에서 웹훅 URL을 저장할 때 웹훅을 통해 추가 정보를 수신하도록 설정할 수도 있습니다.


        <div class="note">

        <p><strong>참고</strong></p>

        <p>2025년 1월 22일 또는 그 이전에 관리자 페이지에 등록한 경우, <a
        href="https://publisher.xsolla.com/0/projects/0/edit/webhooks/payments">설정
        &gt;웹훅 &gt; 테스트 &gt; 결제 &gt; 고급 설정</a> 섹션에서 토글을 찾을 수 있습니다.</p>

        </div>


        <table>

        <thead>
            <tr>
                <th>토글</th>
                <th>설명</th>
            </tr>
        </thead>

        <tbody>
            <tr>
                <td>저장된 결제 계정에 대한 정보 표시</td>
                <td>저장된 결제 방식에 대한 정보는 <code>payment_account</code> 사용자 정의 개체에서 전달됩니다.</td>
            </tr>
            <tr>
                <td>저장된 결제 방식을 사용한 트랜잭션에 대한 정보 표시</td>
                <td><p>정보는 웹훅의 다음 사용자 정의 매개 변수에서 전달됩니다.</p><ul><li><code>saved_payment_method</code>:<ul><li><code>0</code> - 저장된 결제 방식이 사용되지 않음</li><li><code>1</code> - 현재 결제를 진행할 때 결제 방식이 저장됨</li><li><code>2</code> - 이전에 저장한 결제 방식이 사용됨</li></ul></li><li><code>payment_type</code>:<ul><li><code>1</code> - 일회성 결제</li><li><code>2</code> - 반복 결제</li></ul></li></ul></td>
            </tr>
            <tr>
                <td>주문 개체를 웹훅에 추가</td>
                <td>주문 관련 정보는 <a href="/ko/webhooks/operation/payment/">결제</a> 웹훅의 <code>order</code> 개체에서 전달됩니다.</td>
            </tr>
            <tr>
                <td>민감한 데이터 없이 필수 사용자 매개 변수만 전송</td>
                <td><p>사용자에 대한 다음 정보만 웹훅에서 전달됩니다.</p><ul><li>ID</li><li>국가</li></ul></td>
            </tr>
            <tr>
                <td>카드 BIN 및 접미사 표시</td>
                <td><p>은행 카드 번호에 대한 다음 정보가 웹훅에서 전달됩니다.</p><ul><li><code>card_bin</code> 매개 변수의 처음 6자리</li><li><code>card_suffix</code>의 마지막 4자리</li></ul></td>
            </tr>
            <tr>
                <td>카드 브랜드 표시</td>
                <td>결제에 사용된 카드의 브랜드. 예: Mastercard 또는 Visa.</td>
            </tr>
        </tbody>

        </table>


        <div class="notice">

        <p><strong>참고</strong></p>

        <p>웹훅으로 전송되는 필드 세트는 <ul><li>관리자 페이지에서 구성한 고급 설정</li><li>엑솔라 측에 구성한 사용자
        지정 설정</li></ul></p><p>에 따라 달라집니다. 질문이 있는 경우, 고객 성공 관리자에게 문의하거나 <a
        href="mailto:csm@xsolla.com">csm@xsolla.com</a>으로 이메일을 보내십시오.</p>

        </div>
      operationId: payment
      requestBody:
        content:
          application/json:
            schema:
              properties:
                custom_parameters:
                  description: 사용자 정의 매개 변수.
                  type: object
                notification_type:
                  $ref: '#/components/schemas/notification_type'
                payment_details:
                  description: 결제 내역 관련 값.
                  properties:
                    country_wht:
                      description: 국경 간 거래(대상)로 인해 특정 국가에서 적용되는 원천징수세.
                      properties:
                        amount:
                          description: 금액.
                          format: float
                          type: number
                        currency:
                          $ref: '#/components/schemas/currency'
                        percent:
                          description: 국가 원천징수세율(%).
                          format: float
                          type: number
                      type: object
                    direct_wht:
                      description: 직접 원천징수세.
                      properties:
                        amount:
                          description: 금액.
                          format: float
                          type: number
                        currency:
                          $ref: '#/components/schemas/currency'
                        percent:
                          description: 직접 원천징수세율.
                          format: float
                          type: number
                      type: object
                    payment:
                      description: 게임유저 결제 데이터 관련 값.
                      properties:
                        amount:
                          description: 금액.
                          format: float
                          type: number
                        currency:
                          $ref: '#/components/schemas/currency'
                      type: object
                    payment_method_fee:
                      description: 결제 방식 수수료율.
                      properties:
                        amount:
                          description: 금액.
                          format: float
                          type: number
                        currency:
                          $ref: '#/components/schemas/currency'
                      type: object
                    payment_method_sum:
                      description: 결제 방법에서 청구된 금액에 대한 데이터가 포함된 값.
                      properties:
                        amount:
                          description: 금액.
                          format: float
                          type: number
                        currency:
                          $ref: '#/components/schemas/currency'
                      type: object
                    payout:
                      description: 지급 내역 관련 값.
                      properties:
                        amount:
                          description: 금액.
                          format: float
                          type: number
                        currency:
                          $ref: '#/components/schemas/currency'
                      type: object
                    payout_currency_rate:
                      description: 결제 통화를 지급 통화로 환전할 때의 환율.
                      type: string
                    repatriation_commission:
                      description: 본국 송금 비용에 대한 데이터가 있는 오브젝트. 타사가 엑솔라에 부과.
                      properties:
                        amount:
                          description: 금액.
                          format: float
                          type: number
                        currency:
                          $ref: '#/components/schemas/currency'
                      type: object
                    sales_tax:
                      description: 판매세(미국과 캐나다만 해당).
                      properties:
                        amount:
                          description: 금액.
                          format: float
                          type: number
                        currency:
                          $ref: '#/components/schemas/currency'
                        percent:
                          description: 판매세율.
                          format: float
                          type: number
                      type: object
                    user_acquisition_fee:
                      description: 제휴 네트워크 및 인플루언서를 통한 구매에 대해 공제된 사용자 확보 수수료의 총액(대상)입니다.
                      properties:
                        amount:
                          description: 금액.
                          format: float
                          type: number
                        currency:
                          $ref: '#/components/schemas/currency'
                        percent:
                          description: 사용자 확보 수수료율(%).
                          format: float
                          type: number
                      type: object
                    vat:
                      description: VAT 세율(유럽연합만 해당).
                      properties:
                        amount:
                          description: 금액.
                          format: float
                          type: number
                        currency:
                          $ref: '#/components/schemas/currency'
                        percent:
                          description: 부가가치세율.
                          format: float
                          type: number
                      type: object
                    xsolla_balance_sum:
                      description: 엑솔라 잔액에서 청구된 금액에 대한 데이터가 포함된 값.
                      properties:
                        amount:
                          description: 금액.
                          format: float
                          type: number
                        currency:
                          $ref: '#/components/schemas/currency'
                      type: object
                    xsolla_fee:
                      description: 엑솔라 수수료 요율.
                      properties:
                        amount:
                          description: 금액.
                          format: float
                          type: number
                        currency:
                          $ref: '#/components/schemas/currency'
                      type: object
                  type: object
                purchase:
                  description: 구매 데이터 관련 값.
                  properties:
                    checkout:
                      description: 체크아웃 내역 관련 값.
                      properties:
                        amount:
                          description: 구매 금액.
                          format: float
                          type: number
                        currency:
                          $ref: '#/components/schemas/currency'
                      type: object
                    coupon:
                      description: 쿠폰 데이터 관련 값(이 트랜잭션에 쿠폰이 사용된 경우).
                      properties:
                        campaign_code:
                          description: 쿠폰 캠페인 코드.
                          type: string
                        coupon_code:
                          description: 쿠폰 코드.
                          type: string
                      type: object
                    gift:
                      description: 기프트 내역 관련 값.
                      properties:
                        giver_id:
                          description: 제공자 ID.
                          type: string
                        hide_giver_from_receiver:
                          description: 수신자에서 제공자 ID를 숨길지 여부.
                          type: string
                        message:
                          description: 제공자로부터 전송된 메시지.
                          type: string
                        receiver_email:
                          description: 기프트 수령인 이메일.
                          type: string
                        receiver_id:
                          description: 기프트 수령인 ID.
                          type: string
                      type: object
                    order:
                      $ref: '#/components/schemas/order'
                      properties:
                        id:
                          description: 주문 ID.
                          type: integer
                        lineitems:
                          description: 아잍템에 대한 정보를 포함하는 매개 변수 배열.
                          items:
                            properties:
                              price:
                                description: 아이템 가격에 대한 정보가 포함된 개체.
                                properties:
                                  amount:
                                    description: 선택한 통화로 표시된 아이템의 총 가격.
                                    format: float
                                    type: number
                                  currency:
                                    description: 아이템 가격의 통화.
                                    type: string
                                type: object
                              quantity:
                                description: 아이템 수량.
                                type: integer
                              sku:
                                description: 아이템 SKU.
                                type: string
                            type: object
                          type: array
                    promotions:
                      description: 이 트랜잭션에 적용된 프로모션.
                      items:
                        properties:
                          id:
                            description: 프로모션 ID.
                            type: integer
                          technical_name:
                            description: 프로모션의 기술명.
                            type: string
                        type: object
                      type: array
                    subscription:
                      description: 정기결제 내역 관련 값.
                      properties:
                        amount:
                          $ref: '#/components/schemas/amount-float'
                        currency:
                          $ref: '#/components/schemas/currency'
                        date_create:
                          $ref: '#/components/schemas/subscription.date_create'
                        date_next_charge:
                          description: >-
                            다음 충전 날짜. [ISO
                            8601](https://en.wikipedia.org/wiki/ISO_8601)에 따른 날짜
                            및 시간.
                          type: string
                        plan_id:
                          $ref: '#/components/schemas/subscription.plan_id'
                        product_id:
                          description: 상품 ID(액세스 토큰으로 보낸 경우).
                          type: string
                        subscription_id:
                          $ref: '#/components/schemas/subscription.subscription_id'
                        tags:
                          $ref: '#/components/schemas/subscription.tags'
                      type: object
                    total:
                      description: 구매 총 가격 데이터 관련 값.
                      properties:
                        amount:
                          description: 총 구매 금액.
                          format: float
                          type: number
                        currency:
                          $ref: '#/components/schemas/currency'
                      type: object
                  required:
                    - total
                  type: object
                settings:
                  description: 사용자 정의 프로젝트 설정(개체).
                  properties:
                    merchant_id:
                      $ref: '#/components/schemas/settings.merchant_id'
                    project_id:
                      $ref: '#/components/schemas/settings.project_id'
                  type: object
                transaction:
                  description: 트랜잭션 데이터 관련 값.
                  properties:
                    agreement:
                      description: 계약 ID.
                      type: integer
                    dry_run:
                      description: >-
                        테스트 트랜잭션. 테스트 트랜잭션의 경우 매개 변수는 1개 값을 갖습니다. 또는, 트랜잭션이 실제로
                        이루어지는 경우 매개 변수가 전송되지 않습니다.
                      type: integer
                    external_id:
                      $ref: '#/components/schemas/external-id'
                    id:
                      description: 트랜잭션 ID.
                      type: integer
                    payment_date:
                      description: 결제 날짜.
                      type: string
                    payment_method:
                      description: 결제 수단 ID.
                      type: integer
                    payment_method_name:
                      description: 결제 방식 이름.
                      type: string
                    payment_method_order_id:
                      description: 결제 시스템의 결제 ID.
                      type: string
                  type: object
                user:
                  description: 사용자 세부 사항(개체).
                  properties:
                    country:
                      $ref: '#/components/schemas/user.country'
                    email:
                      $ref: '#/components/schemas/user.email'
                    id:
                      $ref: '#/components/schemas/user.id'
                    ip:
                      $ref: '#/components/schemas/user.ip'
                    name:
                      $ref: '#/components/schemas/user.name'
                    phone:
                      $ref: '#/components/schemas/user.phone'
                    zip:
                      $ref: '#/components/schemas/user.zip'
                  required:
                    - id
                  type: object
              required:
                - notification_type
                - transaction
                - payment_details
      responses:
        '204':
          $ref: '#/components/responses/204'
        '400':
          $ref: '#/components/responses/400-payment'
        '500':
          $ref: '#/components/responses/500'
      summary: 결제
      tags:
        - payments
      x-codeSamples:
        - label: CURL
          lang: cURL
          source: |-
            curl -v 'https://your.hostname/your/uri' \
            -X POST \
            -d '{
                "notification_type": "payment",
                "settings": {
                  "project_id": 18404,
                  "merchant_id": 2340
                },
                "purchase": {
                    "subscription": {
                        "plan_id": "b5dac9c8",
                        "subscription_id": "10",
                        "product_id": "Demo Product",
                        "date_create": "2014-09-22T19:25:25+04:00",
                        "date_next_charge": "2014-10-22T19:25:25+04:00",
                        "currency": "USD",
                        "amount": 9.99
                    },
                    "checkout": {
                        "currency": "USD",
                        "amount": 50
                    },
                    "total": {
                        "currency": "USD",
                        "amount": 200
                    },
                    "promotions": [{
                        "technical_name": "Demo Promotion",
                        "id": 853
                    }],
                    "coupon": {
                        "coupon_code": "ICvj45S4FUOyy",
                        "campaign_code": "1507"
                    },
                    "order": {
                      "id": 1234
                      "lineitems": [
                      {
                        "sku": "com.xsolla.item_1",
                        "quantity": 1,
                        "price": {
                          "currency": "EUR",
                          "amount": 6.5
                          }
                      }
                      ]
                      }
                },
                "user": {
                    "ip": "127.0.0.1",
                    "phone": "18777976552",
                    "email": "email@example.com",
                    "id": "1234567",
                    "name": "John Smith",
                    "country": "US"
                },
                "transaction": {
                    "id": 1,
                    "external_id": 1,
                    "payment_date": "2014-09-24T20:38:16+04:00",
                    "payment_method": 1,
                    "payment_method_name": "PayPal",
                    "payment_method_order_id": 1234567890123456789,
                    "dry_run": 1,
                    "agreement": 1
                },
                "payment_details": {
                    "payment": {
                        "currency": "USD",
                        "amount": 230
                    },
                    "vat": {
                        "currency": "USD",
                        "amount": 0,
                        "percent": 20
                    },
                    "sales_tax": {
                        "currency": "USD",
                        "amount": 0,
                        "percent": 0
                    },
                    "direct_wht": {
                        "currency": "USD",
                        "amount": 0,
                        "percent": 0
                    },
                    "payout_currency_rate": "1",
                    "payout": {
                        "currency": "USD",
                        "amount": 200
                    },
                    "country_wht": {
                        "currency": "USD",
                        "amount": 2,
                        "percent": 10
                    },
                    "user_acquisition_fee": {
                        "currency": "USD",
                        "amount": 2,
                        "percent": 1
                    },
                    "xsolla_fee": {
                        "currency": "USD",
                        "amount": 10
                    },
                    "payment_method_fee": {
                        "currency": "USD",
                        "amount": 20
                    },
                    "repatriation_commission": {
                        "currency": "USD",
                        "amount": 10
                    }
                },
                "custom_parameters": {
                    "parameter1": "value1",
                    "parameter2": "value2"
                }
            }'
        - label: PHP
          lang: PHP
          source: |-
            <?php

            $request = array(
                'notification_type' => 'payment',
                'settings' => array(
                  'project_id' => 18404,
                  'merchant_id' => 2340
                ),
                'purchase' => array(
                    'total' => array(
                        'currency' => 'USD',
                        'amount' => 9.99
                    )
                ),
                'user' => array(
                    'ip' => '127.0.0.1',
                    'phone' => '18777976552',
                    'email' => 'email@example.com',
                    'id' => '1234567',
                    'country' => 'US'
                ),
                'transaction' => array(
                    'id' => 87654321,
                    'payment_date' => '2014-09-23T19:25:25+04:00',
                    'payment_method' => 1380,
                    'payment_method_name' => 'PayPal'
                    'payment_method_order_id' => 1234567890123456789,
                    'dry_run' => 1
                ),
                'payment_details' => array(
                    'payment' => array(
                        'currency' => 'USD',
                        'amount' => 9.99
                    ),
                    'vat' => array(
                        'currency' => 'USD',
                        'amount' => 0
                    ),
                    'sales_tax' => array(
                        'currency' => 'USD',
                        'amount' => 0
                    ),
                    'direct_wht' => array(
                        'currency' => 'USD',
                        'amount' => 70
                    ),
                    'payout_currency_rate' => '1',
                    'country_wht ' => array(
                        'currency' => 'USD',
                        'amount' => 2,
                        'percent' => 10
                    ),
                    'user_acquisition_fee' => array(
                        'currency' => 'USD',
                        'amount' => 2,
                        'percent' => 1
                    ),
                    'payout' => array(
                        'currency' => 'USD',
                        'amount' => 9.49
                    ),
                    'xsolla_fee' => array(
                        'currency' => 'USD',
                        'amount' => 0.19
                    ),
                    'payment_method_fee' => array(
                        'currency' => 'USD',
                        'amount' => 0.31
                    ),
                    'repatriation_commission' => array(
                        'currency' => 'USD',
                        'amount' => 0.2
                    )
                )
            );
        - label: HTTP
          lang: HTTP
          source: |-
            POST /your_uri HTTP/1.1
            host: your.host
            accept: application/json
            content-type: application/json
            content-length: 1721
            authorization: Signature 34553d151e656110c656696c919f9a10e05de542

            {
                "notification_type": "payment",
                "settings": {
                  "project_id": 18404,
                  "merchant_id": 2340
                },
                "purchase":{
                    "subscription": {
                        "plan_id": "b5dac9c8",
                        "subscription_id": "10",
                        "product_id": "Demo Product",
                        "date_create": "2014-09-22T19:25:25+04:00",
                        "date_next_charge": "2014-10-22T19:25:25+04:00",
                        "currency": "USD",
                        "amount": 9.99
                    },
                    "checkout": {
                        "currency": "USD",
                        "amount": 50
                    },
                    "total": {
                        "currency": "USD",
                        "amount": 200
                    },
                    "promotions": [{
                        "technical_name": "Demo Promotion",
                        "id": 853
                    }],
                    "coupon": {
                        "coupon_code": "ICvj45S4FUOyy",
                        "campaign_code": "1507"
                    },
                    "order": {
                      "id": 1234
                      "lineitems": [
                      {
                        "sku": "com.xsolla.item_1",
                        "quantity": 1,
                        "price": {
                          "currency": "EUR",
                          "amount": 6.5
                          }
                      }
                      ]
                      }
                },
                "user": {
                    "ip": "127.0.0.1",
                    "phone": "18777976552",
                    "email": "email@example.com",
                    "id": "1234567",
                    "name": "John Smith",
                    "country": "US"
                },
                "transaction": {
                    "id": 1,
                    "external_id": 1,
                    "payment_date": "2014-09-24T20:38:16+04:00",
                    "payment_method": 1,
                    "payment_method_name": "PayPal"
                    "payment_method_order_id": 1234567890123456789,
                    "dry_run": 1,
                    "agreement": 1
                },
                "payment_details": {
                    "payment": {
                        "currency": "USD",
                        "amount": 230
                    },
                    "vat": {
                        "currency": "USD",
                        "amount": 0,
                        "percent": 20
                    },
                    "sales_tax": {
                        "currency": "USD",
                        "amount": 0,
                        "percent": 0
                    },
                    "direct_wht": {
                        "currency": "USD",
                        "amount": 0,
                        "percent": 0
                    },
                    "payout_currency_rate": "1",
                    "country_wht": {
                        "currency": "USD",
                        "amount": 2,
                        "percent": 10
                    },
                    "user_acquisition_fee": {
                        "currency": "USD",
                        "amount": 2,
                        "percent": 1
                    },
                    "payout": {
                        "currency": "USD",
                        "amount": 200
                    },
                    "xsolla_fee": {
                        "currency": "USD",
                        "amount": 10
                    },
                    "payment_method_fee": {
                        "currency": "USD",
                        "amount": 20
                    },
                    "repatriation_commission": {
                        "currency": "USD",
                        "amount": 10
                    }
                },
                "custom_parameters": {
                    "parameter1": "value1",
                    "parameter2": "value2"
                }
            }
  payment-declined:
    post:
      description: >
        결제 시스템에서 트랜잭션이 거부되면 엑솔라는 구성된 웹훅 URL 측의 `ps_declined` 유형 웹훅에 트랜잭션 세부 정보를
        전송합니다. 

        웹훅은 승인 또는 결제 처리 단계에서 전송됩니다. 이 경우,
        [payment](/ko/webhooks/operation/payment/)\ 

        [order_paid](/ko/webhooks/operation/successful-order-payment/) 웹훅이 전송되지
        않았습니다.


        결제 시스템이 거부되는 일반적인 이유:


        * 카드 승인에 실패(예: 기술적 오류 또는 은행의 응답이 없어 결제 시스템이 승인 절차를 완료하지 못함)했거나
        거부되었습니다(예: 은행에서 
          응답했지만 자금이 부족하거나 카드 정보가 유효하지 않아 트랜잭션을 거부함).
        * 3-D Secure 검증에 실패했거나, 완료되지 않았거나, 사용자 확인 시간이 초과되었습니다.

        * 계좌 폐쇄 또는 유효하지 않은 카드 번호 등 되돌릴 수 없는 오류로 인해 처리업체 또는 매입 은행이 일시적으로 접속이
        불가능하거나 강제 거부 
          메시지를 반환합니다. 근본적인 문제를 해결하지 않고 재시도하면 트랜잭션이 성공적으로 이루어지지 않습니다.

        다음과 혼동되어서는 안 됩니다.


        * 사기 방지 거부는
        [afs_reject](https://developers.xsolla.com/ko/webhooks/operation/afs-rejected-transaction/)
        웹훅을 통해 보고됩니다.

        * 성공적인 결제 후 환불 및 부분 환불은 
          [환불](https://developers.xsolla.com/ko/webhooks/operation/refund/) 및 
          [partial_refund](https://developers.xsolla.com/ko/webhooks/operation/partial-refund/) 웹훅을 통해 보고됩니다.

        <div class="note">

        <p><strong>참고</strong></p>

        <p><code>ps_declined</code> 웹훅을 수신하려면 고객 성공 매니저에게 문의하거나 <a
        href="mailto:csm@xsolla.com">csm@xsolla.com</a>으로 이메일을 보내주세요.</p>

        </div>
      operationId: payment-declined
      requestBody:
        content:
          application/json:
            schema:
              properties:
                notification_type:
                  $ref: '#/components/schemas/notification_type'
                refund_details:
                  description: 환불 세부 정보(개체).
                  properties:
                    author:
                      description: |
                        환불 시작자. 필드 값이 다음 표에 따라 전달됩니다.

                        <table>
                            <thead>
                            <tr>
                                <th>환불 시작자</th>
                                <th>필드 값</th>
                            </tr>
                            </thead>
                            <tbody>
                            <tr>
                                <td>게임(API를 통해).</td>
                                <td>API</td>
                            </tr>
                            <tr>
                                <td>게시자 계정 사용자(자동 환불).</td>
                                <td>사용자 이메일</td>
                            </tr>
                            <tr>
                                <td>게시자 계정 사용자(엑솔라 고객 지원의 도움을 받아).</td>
                                <td>support@xsolla.com</td>
                            </tr>
                            <tr>
                                <td>엑솔라(엑솔라 고객 지원의 도움을 받아).</td>
                                <td>support@xsolla.com</td>
                            </tr>
                            </tbody>
                        </table>
                      type: string
                    code:
                      description: 코드 ID.
                      type: integer
                    reason:
                      description: 환불 이유.
                      type: string
                  type: object
                settings:
                  description: 사용자 정의 프로젝트 설정(개체).
                  properties:
                    merchant_id:
                      $ref: '#/components/schemas/settings.merchant_id'
                    project_id:
                      $ref: '#/components/schemas/settings.project_id'
                  type: object
                transaction:
                  description: 트랜잭션 데이터 관련 값.
                  properties:
                    dry_run:
                      description: >-
                        테스트 트랜잭션. 테스트 트랜잭션의 경우 매개 변수는 1개 값을 갖습니다. 또는, 트랜잭션이 실제로
                        이루어지는 경우 매개 변수가 전송되지 않습니다.
                      type: integer
                    external_id:
                      description: 트랜잭션 외부 ID.
                      type: string
                    id:
                      description: 트랜잭션 ID.
                      type: integer
                    payment_method:
                      description: 결제 수단 ID.
                      type: integer
                  type: object
                user:
                  description: 사용자 세부 사항(개체).
                  properties:
                    country:
                      $ref: '#/components/schemas/user.country'
                    email:
                      $ref: '#/components/schemas/user.email'
                    id:
                      $ref: '#/components/schemas/user.id'
                    ip:
                      $ref: '#/components/schemas/user.ip'
                    name:
                      $ref: '#/components/schemas/user.name'
                  required:
                    - id
                  type: object
              required:
                - notification_type
                - transaction
      responses:
        '204':
          $ref: '#/components/responses/204'
        '400':
          $ref: '#/components/responses/400-payment'
        '500':
          $ref: '#/components/responses/500'
      summary: 거부된 결제
      tags:
        - payments
      x-codeSamples:
        - label: CURL
          lang: cURL
          source: >-
            curl -v 'https://your.hostname/your/uri' \

            -X POST \

            -H 'Accept: application/json' \

            -H 'Content-Type: application/json' \

            -H 'Authorization: Signature
            80543ba63e1e50cf05f15150fe75e7245da9a898' \

            -d '{
              "notification_type": "ps_declined",
              "settings": {
                "project_id": "18404",
                "merchant_id": "2340"
              },
              "user": {
                "ip": "127.0.0.1",
                "email": "email@example.com",
                "id": "1234567",
                "country": "US"
              },
              "transaction": {
                "id": "1",
                "dry_run": "1",
                "payment_method": "1"
              },
              "refund_details": {
                "author": "support@xsolla.com",
                "code": "8",
                "reason": "Cancellation by the PS request",
                "reason_detail": "Insufficient funds"
              }
            }'
        - label: PHP
          lang: PHP
          source: |-
            <?php

            $request = array(
              'notification_type' => 'ps_declined',
              'settings' => array(
                'project_id' => '18404',
                'merchant_id' => '2340',
              ),
              'user' => array(
                'ip' => '127.0.0.1',
                'email' => 'email@example.com',
                'id' => '1234567',
                'country' => 'US',
              ),
              'transaction' => array(
                'id' => '1',
                'dry_run' => '1',
                'payment_method' => '1',
              ),
              'refund_details' => array(
                'author' => 'support@xsolla.com',
                'code' => '8',
                'reason' => 'Cancellation by the PS request',
                'reason_detail' => 'Insufficient funds',
              ),
            );
        - label: HTTP
          lang: HTTP
          source: |-
            POST /your_uri HTTP/1.1
            host: your.host
            accept: application/json
            content-type: application/json
            content-length: 338
            authorization: Signature 80543ba63e1e50cf05f15150fe75e7245da9a898

            {
              "notification_type": "ps_declined",
              "settings": {
                "project_id": "18404",
                "merchant_id": "2340"
              },
              "user": {
                "ip": "127.0.0.1",
                "email": "email@example.com",
                "id": "1234567",
                "country": "US"
              },
              "transaction": {
                "id": "1",
                "dry_run": "1",
                "payment_method": "1"
              },
              "refund_details": {
                "author": "support@xsolla.com",
                "code": "8",
                "reason": "Cancellation by the PS request",
                "reason_detail": "Insufficient funds"
              }
            }
  personalized-partner-catalog:
    post:
      description: >
        사용자가 스토어와 상호 작용하면 엑솔라는 웹훅 URL로 사용자 및 프로젝트 매개변수가 포함된 

        <code>partner_side_catalog</code> 웹훅을 보냅니다.


        응답으로 사용자가 사용할 수 있는 <code>item_id</code> 또는 아이템 SKU 목록을 반환합니다. 이 경우 특정
        사용자가 특정 

        제품을 지정된 횟수만큼 구매할 수 있다는 정보도 포함할 수 있습니다. 이 기능을 사용하여 사용자가 장바구니에 추가하고 구매할 수
        있는 제품의 

        수와 유형을 제어할 수 있습니다.


        <code>partner_side_catalog</code> 웹훅의 처리 시간은 3초 이내로 하는 것이 좋습니다.
      operationId: personalized-partner-catalog
      requestBody:
        content:
          application/json:
            schema:
              properties:
                user:
                  description: 사용자 세부 사항(개체).
                  properties:
                    country:
                      $ref: '#/components/schemas/user.country'
                    currency:
                      $ref: '#/components/schemas/currency'
                    locale:
                      $ref: '#/components/schemas/locale'
                    user_id:
                      description: 사용자 ID. 사용자가 인증되지 않은 경우 `null` 값이 전송됩니다.
                      type: string
                  required:
                    - user_id
                  type: object
              required:
                - user
      responses:
        '200':
          content:
            application/json:
              example:
                - date_from: '2024-08-11T23:59:59+08:00'
                  date_until: '2024-08-12T23:59:59+08:00'
                  quantity: 0
                  sku: com.xsolla.boots_1
                - date_from: '2024-08-11T23:59:59+08:00'
                  date_until: '2024-08-12T23:59:59+08:00'
                  quantity: null
                  sku: com.xsolla.sword_1
                - quantity: 1
                  sku: com.xsolla.helmet_1
                - content:
                    - description: Description of custom content item
                      image_url: https://example.com/content_image.png
                      name: Custom content item
                      quantity: 5
                  description: Custom description
                  image_url: https://example.com/image.png
                  json_attributes:
                    purchased: 0
                    type: lootbox
                  name: Custom name
                  quantity: null
                  sku: com.xsolla.custom_item_1
                - available: 7
                  sku: com.xsolla.limited_item_1
                  total: 10
              schema:
                items:
                  anyOf:
                    - oneOf:
                        - properties:
                            quantity:
                              $ref: '#/components/schemas/quantity'
                          title: quantity
                        - properties:
                            available:
                              $ref: '#/components/schemas/available'
                            total:
                              $ref: '#/components/schemas/total'
                          title: available
                      properties:
                        content:
                          $ref: '#/components/schemas/bundle_content'
                        date_from:
                          $ref: '#/components/schemas/date_from'
                        date_until:
                          $ref: '#/components/schemas/date_until'
                        description:
                          $ref: '#/components/schemas/description'
                        image_url:
                          $ref: '#/components/schemas/image_url'
                        json_attributes:
                          $ref: '#/components/schemas/json_attributes'
                        name:
                          $ref: '#/components/schemas/name'
                        sku:
                          $ref: '#/components/schemas/sku'
                      required:
                        - sku
                      title: sku
                    - oneOf:
                        - properties:
                            quantity:
                              $ref: '#/components/schemas/quantity'
                          title: quantity
                        - properties:
                            available:
                              $ref: '#/components/schemas/available'
                            total:
                              $ref: '#/components/schemas/total'
                          title: available
                      properties:
                        content:
                          $ref: '#/components/schemas/bundle_content'
                        date_from:
                          $ref: '#/components/schemas/date_from'
                        date_until:
                          $ref: '#/components/schemas/date_until'
                        description:
                          $ref: '#/components/schemas/description'
                        image_url:
                          $ref: '#/components/schemas/image_url'
                        item_id:
                          $ref: '#/components/schemas/item_id'
                        json_attributes:
                          $ref: '#/components/schemas/json_attributes'
                        name:
                          $ref: '#/components/schemas/name'
                      required:
                        - item_id
                      title: item_id
                  type: object
                type: array
          description: 사용자가 사용할 수 있는 아이템 목록과 특정 사용자가 특정 아이템을 구매할 수 있는 횟수를 반환합니다.
        '404':
          description: 사용자를 찾을 수 없습니다.
      summary: 파트너 측의 카탈로그 개인 설정
      tags:
        - personalization
      x-codeSamples:
        - label: CURL
          lang: cURL
          source: >-
            curl -v 'https://your.hostname/your/uri' \

            -X POST \

            -H 'accept: application/json' \

            -H 'content-type: application/json' \

            -H 'authorization: Signature
            d90d319f05df7b0f86d2485f48e7079f0f752523' \

            -d '{
                    "notification_type": "partner_side_catalog",
                    "user": {
                        "user_id": "12345",
                        "country": "US"
                    }
                }'
        - label: HTTP
          lang: HTTP
          source: |-
            POST /your/uri HTTP/1.1
            host:           your.hostname
            accept:         application/json
            content-type:   application/json
            authorization:  Signature d90d319f05df7b0f86d2485f48e7079f0f752523

            {
                "notification_type": "partner_side_catalog",
                "user": {
                  "user_id": "12345",
                  "country": "US"
                }
            }
  refund:
    post:
      description: >
        결제가 취소되면 엑솔라는 취소된 거래 내역을 `refund` 유형의 웹훅으로 웹훅 URL로 전송합니다.


        웹훅 재시도 메커니즘은 환불을 시작한 사람에 따라 달라집니다:

        * 환불이 귀하 측에서 요청된 경우 웹훅은 재전송되지 않습니다. 웹훅에 대한 응답 여부와 관계없이 결제 금액은 사용자에게
        환불됩니다.

        * 제3자(예: 결제 시스템 또는 엑솔라 고객 지원팀)가 환불을 요청했고 웹훅에 대한 응답으로 `5xx` 상태 코드가 반환된
        경우, 웹훅은 점점 
          더 빠른 간격으로 재전송됩니다. 재시도 횟수는 첫 번째 시도 후 48시간 이내에 최대 12회입니다.

        환불 절차에 대한 자세한 내용은 [지침](/ko/doc/pay-station/features/refund/)을 참조하세요.


        <div class="notice">

        <p><strong>주의</strong></p>

        <p>다음 조건을 모두 충족하는 경우에도 사용자에게 결제가 환불됩니다:<ul><li>환불이 엑솔라 측에서 요청한
        경우.</li><li>웹훅에 대한 응답으로, <code>4xx</code> 상태 코드가 반환되거나 모든 재시도 후 응답을 받지
        않거나 <code>5xx</code> 상태 코드가 반환된 경우.</li></ul></p>

        </div>


        <a
        href="https://publisher.xsolla.com/0/projects/0/edit/webhooks/store">관리자 

        페이지</a>에서 웹훅 URL을 저장할 때 웹훅을 통해 추가 정보를 수신하도록 설정할 수도 있습니다.


        <div class="note">

        <p><strong>참고</strong></p>

        <p>2025년 1월 22일 또는 그 이전에 관리자 페이지에 등록한 경우, <a
        href="https://publisher.xsolla.com/0/projects/0/edit/webhooks/payments">설정
        &gt;웹훅 &gt; 테스트 &gt; 결제 &gt; 고급 설정</a> 섹션에서 토글을 찾을 수 있습니다.</p>

        </div>


        <table>

        <thead>
            <tr>
                <th>토글</th>
                <th>설명</th>
            </tr>
        </thead>

        <tbody>
            <tr>
                <td>저장된 결제 방식을 사용한 트랜잭션에 대한 정보 표시</td>
                <td><p>정보는 웹훅의 다음 사용자 정의 매개 변수에서 전달됩니다.</p><ul><li><code>saved_payment_method</code>:<ul><li><code>0</code> - 저장된 결제 방식이 사용되지 않음</li><li><code>1</code> - 현재 결제를 진행할 때 결제 방식이 저장됨</li><li><code>2</code> - 이전에 저장한 결제 방식이 사용됨</li></ul></li><li><code>payment_type</code>:<ul><li><code>1</code> - 일회성 결제</li><li><code>2</code> - 반복 결제</li></ul></li></ul></td>
            </tr>
        </tbody>

        </table>


        환불 코드:


        <table>
            <thead>
            <tr>
                <th>코드</th>
                <th>환불 이유</th>
                <th>설명</th>
            </tr>
            </thead>
            <tbody>
            <tr>
                <td>1</td>
                <td>사용자 요청/게임 요청에 의한 취소</td>
                <td>관리자 페이지에서 취소가 요청된 경우 사용됩니다.</td>
            </tr>
            <tr>
                <td>2</td>
                <td>지불 거절</td>
                <td>거래 지불 거절 요청되었습니다.</td>
            </tr>
            <tr>
                <td>3</td>
                <td>연동 오류</td>
                <td>엑솔라와 게임 사이의 연동에 문제가 있을 경우 사용됩니다.<br /><b>권장 사항: 사용자를 차단 목록에 추가하지 마세요.</b></td>
            </tr>
            <tr>
                <td>4</td>
                <td>잠재적 사기</td>
                <td>부정 결제가 의심됩니다.<br /><b>권장사항: 사용자를 차단 목록에 추가하세요.</b></td>
            </tr>
            <tr>
                <td>5</td>
                <td>테스트 결제</td>
                <td>테스트 트랜잭션인 경우 사용되며 이후 취소로 이어집니다.<br /><b>권장 사항: 사용자를 차단 목록에 추가하지 마세요.</b></td>
            </tr>
            <tr>
                <td>6</td>
                <td>사용자 인보이스 만료</td>
                <td>후불 결제 방식에 의해 트랜잭션이 이뤄진 경우 사용됩니다.</td>
            </tr>
            <tr>
                <td>7</td>
                <td>PS에서 전송된 사기 참고</td>
                <td>결제 시스템에서 결제가 거부되었습니다. PS에서 잠재적 사기를 감지했습니다.<br /><b>권장 사항: 사용자를 차단 목록에 추가하세요.</b></td>
            </tr>
            <tr>
                <td>8</td>
                <td>PS 요청에 의한 취소</td>
                <td>결제시스템이 취소를 요청한 경우 사용됩니다.<br /><b>권장사항: 사용자를 차단 목록에 추가하지 마세요.</b></td>
            </tr>
            <tr>
                <td>9</td>
                <td>사용자 요청에 의한 취소</td>
                <td>사용자의 요청에 의한 환불 사유입니다. 어떤 이유로 사용자가 게임 또는 구매에 만족하지 못한 못하였음을 의미합니다.<br /><b>권장 사항: 사용자를 차단 목록에 추가하지 마세요.</b></td>
            </tr>
            <tr>
                <td>10</td>
                <td>게임 요청에 의한 취소</td>
                <td>게임을 통해 취소를 요청한 경우 사용됩니다.<br /><b>권장 사항: 사용자를 차단 목록에 추가하지 마세요.</b></td>
            </tr>
            <tr>
                <td>11</td>
                <td>계정 소유자가 사기 신고를 위해 전화한 경우</td>
                <td>계정 소유자가 본인 미사용 결제로 신고한 경우입니다.</td>
            </tr>
            <tr>
                <td>12</td>
                <td>지불 거절 사기</td>
                <td>우호적인 부정결제에 대한 메시지를 수신했을 때 사용됩니다.</td>
            </tr>
            <tr>
                <td>13</td>
                <td>복제</td>
                <td>동일 인보이스에 대하여 거래 복제.</td>
            </tr>
            </tbody>
        </table>
      operationId: refund
      requestBody:
        content:
          application/json:
            schema:
              properties:
                custom_parameters:
                  description: 사용자 정의 매개 변수.
                  type: object
                notification_type:
                  $ref: '#/components/schemas/notification_type'
                payment_details:
                  description: 결제 내역 관련 값.
                  properties:
                    country_wht:
                      description: 국경 간 거래(대상)로 인해 특정 국가에서 적용되는 원천징수세.
                      properties:
                        amount:
                          description: 금액.
                          format: float
                          type: number
                        currency:
                          $ref: '#/components/schemas/currency'
                        percent:
                          description: 국가 원천징수세율(%).
                          format: float
                          type: number
                      type: object
                    direct_wht:
                      description: 직접 원천징수세.
                      properties:
                        amount:
                          description: 금액.
                          format: float
                          type: number
                        currency:
                          $ref: '#/components/schemas/currency'
                        percent:
                          description: 직접 원천징수세율.
                          format: float
                          type: number
                      type: object
                    payment:
                      description: 게임유저 결제 데이터 관련 값.
                      properties:
                        amount:
                          description: 금액.
                          format: float
                          type: number
                        currency:
                          $ref: '#/components/schemas/currency'
                      type: object
                    payment_method_fee:
                      description: 결제 방식 수수료율.
                      properties:
                        amount:
                          description: 금액.
                          format: float
                          type: number
                        currency:
                          $ref: '#/components/schemas/currency'
                      type: object
                    payment_method_sum:
                      description: 결제 방법에서 청구된 금액에 대한 데이터가 포함된 값.
                      properties:
                        amount:
                          description: 금액.
                          format: float
                          type: number
                        currency:
                          $ref: '#/components/schemas/currency'
                      type: object
                    payout:
                      description: 지급 내역 관련 값.
                      properties:
                        amount:
                          description: 금액.
                          format: float
                          type: number
                        currency:
                          $ref: '#/components/schemas/currency'
                      type: object
                    payout_currency_rate:
                      description: 결제 통화를 지급 통화로 환전할 때의 환율.
                      type: string
                    repatriation_commission:
                      description: 본국 송금 비용에 대한 데이터가 있는 오브젝트. 타사가 엑솔라에 부과.
                      properties:
                        amount:
                          description: 금액.
                          format: float
                          type: number
                        currency:
                          $ref: '#/components/schemas/currency'
                      type: object
                    sales_tax:
                      description: 판매세(미국과 캐나다만 해당).
                      properties:
                        amount:
                          description: 금액.
                          format: float
                          type: number
                        currency:
                          $ref: '#/components/schemas/currency'
                        percent:
                          description: 판매세율.
                          format: float
                          type: number
                      type: object
                    user_acquisition_fee:
                      description: 제휴 네트워크 및 인플루언서를 통한 구매에 대해 공제된 사용자 확보 수수료의 총액(대상)입니다.
                      properties:
                        amount:
                          description: 금액.
                          format: float
                          type: number
                        currency:
                          $ref: '#/components/schemas/currency'
                        percent:
                          description: 사용자 확보 수수료율(%).
                          format: float
                          type: number
                      type: object
                    vat:
                      description: VAT 세율(유럽연합만 해당).
                      properties:
                        amount:
                          description: 금액.
                          format: float
                          type: number
                        currency:
                          $ref: '#/components/schemas/currency'
                        percent:
                          description: 부가가치세율.
                          format: float
                          type: number
                      type: object
                    xsolla_balance_sum:
                      description: 엑솔라 잔액에서 청구된 금액에 대한 데이터가 포함된 값.
                      properties:
                        amount:
                          description: 금액.
                          format: float
                          type: number
                        currency:
                          $ref: '#/components/schemas/currency'
                      type: object
                    xsolla_fee:
                      description: 엑솔라 수수료 요율.
                      properties:
                        amount:
                          description: 금액.
                          format: float
                          type: number
                        currency:
                          $ref: '#/components/schemas/currency'
                      type: object
                  type: object
                purchase:
                  description: 구매 데이터 관련 값.
                  properties:
                    checkout:
                      description: 체크아웃 내역 관련 값.
                      properties:
                        amount:
                          description: 구매 금액.
                          format: float
                          type: number
                        currency:
                          $ref: '#/components/schemas/currency'
                      type: object
                    subscription:
                      description: 정기결제 내역 관련 값.
                      properties:
                        amount:
                          $ref: '#/components/schemas/amount-float'
                        currency:
                          $ref: '#/components/schemas/currency'
                        date_create:
                          $ref: '#/components/schemas/subscription.date_create'
                        plan_id:
                          $ref: '#/components/schemas/subscription.plan_id'
                        subscription_id:
                          $ref: '#/components/schemas/subscription.subscription_id'
                        tags:
                          $ref: '#/components/schemas/subscription.tags'
                      type: object
                    total:
                      description: 구매 총 가격 데이터 관련 값.
                      properties:
                        amount:
                          description: 총 구매 금액.
                          format: float
                          type: number
                        currency:
                          $ref: '#/components/schemas/currency'
                      type: object
                  required:
                    - total
                  type: object
                refund_details:
                  description: 환불 세부 정보(오브젝트).
                  properties:
                    author:
                      description: |
                        환불 시작자. 필드 값이 다음 표에 따라 전달됩니다.

                        <table>
                            <thead>
                            <tr>
                                <th>환불 시작자</th>
                                <th>필드 값</th>
                            </tr>
                            </thead>
                            <tbody>
                            <tr>
                                <td>게임(API를 통해).</td>
                                <td>API</td>
                            </tr>
                            <tr>
                                <td>게시자 계정 사용자(자동 환불).</td>
                                <td>사용자 이메일</td>
                            </tr>
                            <tr>
                                <td>게시자 계정 사용자(엑솔라 고객 지원의 도움을 받아).</td>
                                <td>support@xsolla.com</td>
                            </tr>
                            <tr>
                                <td>엑솔라(엑솔라 고객 지원의 도움을 받아).</td>
                                <td>support@xsolla.com</td>
                            </tr>
                            </tbody>
                        </table>
                      type: string
                    code:
                      description: 코드 ID.
                      type: integer
                    reason:
                      description: 환불 이유입니다.
                      type: string
                  type: object
                settings:
                  description: 사용자 정의 프로젝트 설정 관련 값.
                  properties:
                    merchant_id:
                      $ref: '#/components/schemas/settings.merchant_id'
                    project_id:
                      $ref: '#/components/schemas/settings.project_id'
                  type: object
                transaction:
                  description: 트랜잭션 데이터 관련 값.
                  properties:
                    agreement:
                      description: 계약 ID.
                      type: integer
                    dry_run:
                      description: >-
                        테스트 트랜잭션. 테스트 트랜잭션의 경우 매개 변수는 1개 값을 갖습니다. 또는, 트랜잭션이 실제로
                        이루어지는 경우 매개 변수가 전송되지 않습니다.
                      type: integer
                    external_id:
                      description: 트랜잭션 외부 ID 입니다.
                      type: string
                    id:
                      description: 트랜잭션 ID.
                      type: integer
                    payment_method_order_id:
                      description: 결제 시스템의 결제 ID.
                      type: string
                  type: object
                user:
                  description: 사용자 세부 사항 관련 값.
                  properties:
                    country:
                      $ref: '#/components/schemas/user.country'
                    email:
                      $ref: '#/components/schemas/user.email'
                    id:
                      $ref: '#/components/schemas/user.id'
                    ip:
                      $ref: '#/components/schemas/user.ip'
                    name:
                      $ref: '#/components/schemas/user.name'
                    phone:
                      $ref: '#/components/schemas/user.phone'
                    zip:
                      $ref: '#/components/schemas/user.zip'
                  required:
                    - id
                  type: object
              required:
                - notification_type
                - transaction
                - payment_details
      responses:
        '204':
          $ref: '#/components/responses/204'
        '400':
          $ref: '#/components/responses/400'
        '500':
          $ref: '#/components/responses/500'
      summary: 환불
      tags:
        - payments
      x-codeSamples:
        - label: CURL
          lang: cURL
          source: |-
            curl -v 'https://your.hostname/your/uri' \
            -X POST \
            -d '{
                    "notification_type": "refund",
                    "settings": {
                      "project_id": 18404,
                      "merchant_id": 2340
                    },
                    "purchase": {
                        "subscription": {
                            "plan_id": "b5dac9c8",
                            "subscription_id": "10",
                            "date_create": "2014-09-22T19:25:25+04:00",
                            "currency": "USD",
                            "amount": 9.99
                        },
                        "checkout": {
                            "currency": "USD",
                            "amount": 50
                        },
                        "total":{
                            "currency": "USD",
                            "amount": 200
                        }
                    },
                    "user": {
                        "ip": "127.0.0.1",
                        "phone": "18777976552",
                        "email": "email@example.com",
                        "id": "1234567",
                        "name": "John Smith",
                        "country": "US"
                    },
                    "transaction": {
                        "id": 1,
                        "external_id": 1,
                        "dry_run": 1,
                        "agreement": 1
                    },
                    "refund_details": {
                        "code": 4,
                        "reason": "Potential fraud"
                    },
                    "payment_details": {
                        "sales_tax": {
                            "currency": "USD",
                            "amount": 0
                        },
                        "direct_wht": {
                            "currency": "USD",
                            "amount": 0.70
                        },
                        "xsolla_fee": {
                            "currency": "USD",
                            "amount": "10"
                        },
                        "payout": {
                            "currency": "USD",
                            "amount": "200"
                        },
                        "payment_method_fee": {
                            "currency": "USD",
                            "amount": "20"
                        },
                        "payment": {
                            "currency": "USD",
                            "amount": "230"
                        },
                        "repatriation_commission": {
                            "currency": "USD",
                            "amount": 10
                        }
                    }
                }
            }'
        - label: PHP
          lang: PHP
          source: |-
            <?php

            $request = array(
                'notification_type' => 'refund',
                'settings' => array(
                  'project_id' => 18404,
                  'merchant_id' => 2340
                ),
                'purchase' => array(
                    'total' => array(
                        'currency' => 'USD',
                        'amount' => 9.99
                    )
                ),
                'user' => array(
                    'ip' => '127.0.0.1',
                    'phone' => '18777976552',
                    'email' => 'email@example.com',
                    'id' => '1234567',
                    'country' => 'US'
                ),
                'transaction' => array(
                    'id' => 87654321,
                    'payment_date' => '2014-09-23T19:25:25+04:00',
                    'payment_method' => 1380,
                    'dry_run' => 1
                ),
                'refund_details' => array(
                        'code' => 4,
                        'reason' => 'Potential fraud'
                ),
                'payment_details' => array(
                    'payment' => array(
                        'currency' => 'USD',
                        'amount' => 9.99
                    ),
                    'vat' => array(
                        'currency' => 'USD',
                        'amount' => 0
                    ),
                    'sales_tax' => array(
                        'currency' => 'USD',
                        'amount' => 0
                    ),
                    'direct_wht' => array(
                        'currency' => 'USD',
                        'amount' => 70
                    ),
                    'payout_currency_rate' => 1,
                    'payout' => array(
                        'currency' => 'USD',
                        'amount' => 9.49
                    ),
                    'xsolla_fee' => array(
                        'currency' => 'USD',
                        'amount' => 0.19
                    ),
                    'payment_method_fee' => array(
                        'currency' => 'USD',
                        'amount' => 0.31
                    ),
                    'repatriation_commission' => array(
                        'currency' => 'USD',
                        'amount' => 0.2
                    )
                )
            );
        - label: HTTP
          lang: HTTP
          source: |-
            POST /your_uri HTTP/1.1
            host: your.host
            accept: application/json
            content-type: application/json
            content-length: 1220
            authorization: Signature 31bd5924dd6cbc9cbe99d331c4a086a57291f9d7

            {
                "notification_type": "refund",
                "settings": {
                  "project_id": 18404,
                  "merchant_id": 2340
                },
                "purchase": {
                    "subscription": {
                        "plan_id": "b5dac9c8",
                        "subscription_id": "10",
                        "date_create": "2014-09-22T19:25:25+04:00",
                        "currency": "USD",
                        "amount": 9.99
                    },
                    "checkout": {
                        "currency": "USD",
                        "amount": 50
                    },
                    "total": {
                        "currency": "USD",
                        "amount": 200
                    }
                },
                "user": {
                    "ip": "127.0.0.1",
                    "phone": "18777976552",
                    "email": "email@example.com",
                    "id": "1234567",
                    "name": "John Smith",
                    "country": "US"
                },
                "transaction": {
                    "id": 1,
                    "external_id": 1,
                    "dry_run": 1,
                    "agreement": 1
                },
                "refund_details": {
                    "code": 4,
                    "reason": "Potential fraud"
                },
                "payment_details": {
                    "sales_tax": {
                        "currency": "USD",
                        "amount": 0
                    },
                    "direct_wht": {
                        "currency": "USD",
                        "amount": 0.70
                    },
                    "xsolla_fee": {
                        "currency": "USD",
                        "amount": "10"
                    },
                    "payout": {
                        "currency": "USD",
                        "amount": "200"
                    },
                    "payment_method_fee": {
                        "currency": "USD",
                        "amount": "20"
                    },
                    "payment": {
                        "currency": "USD",
                        "amount": "230"
                    },
                    "repatriation_commission": {
                        "currency": "USD",
                        "amount": 10
                    }
                }
            }
  remove-payment-account:
    post:
      description: >-
        사용자가 저장된 계정에서 결제 계정을 제거하면 엑솔라는 `payment_account_remove` 유형이 포함된 웹훅을 웹훅
        URL로 보냅니다. 이 웹훅을 수신하려면 고객 성공 매니저에게 문의하거나 <a
        href="mailto:csm@xsolla.com">csm@xsolla.com</a>으로 이메일을 보내주세요.
      operationId: remove-payment-account
      requestBody:
        content:
          application/json:
            schema:
              properties:
                notification_type:
                  $ref: '#/components/schemas/notification_type'
                payment_account:
                  description: 결제 계정 세부내역 (객체).
                  properties:
                    id:
                      $ref: '#/components/schemas/payment_account.id'
                    name:
                      $ref: '#/components/schemas/payment_account.name'
                    payment_method:
                      $ref: '#/components/schemas/payment_account.payment_method'
                    type:
                      $ref: '#/components/schemas/payment_account.type'
                  required:
                    - id
                  type: object
                settings:
                  description: 사용자 정의 프로젝트 설정(개체)입니다.
                  properties:
                    merchant_id:
                      $ref: '#/components/schemas/settings.merchant_id'
                    project_id:
                      $ref: '#/components/schemas/settings.project_id'
                  type: object
                user:
                  description: 사용자 세부 사항(개체)입니다.
                  properties:
                    email:
                      $ref: '#/components/schemas/user.email'
                    id:
                      $ref: '#/components/schemas/user.id'
                    name:
                      $ref: '#/components/schemas/user.name'
                  required:
                    - id
                  type: object
              required:
                - notification_type
      responses:
        '204':
          $ref: '#/components/responses/204'
        '400':
          $ref: '#/components/responses/400'
        '500':
          $ref: '#/components/responses/500'
      summary: 결제 계정 제거
      tags:
        - payments
      x-codeSamples:
        - label: CURL
          lang: cURL
          source: >-
            curl -v 'https://your.hostname/your/uri' \

            -X POST \

            -H 'accept: application/json' \

            -H 'content-type: application/json' \

            -H 'authorization: Signature
            d09695066c52c1b8bdae92f2d6eb59f5b5f89843' \

            -d '{
                "notification_type": "payment_account_remove",
                "settings": {
                  "project_id": 18404,
                  "merchant_id": 2340
                },
                "user": {
                    "email": "email@example.com",
                    "id": "1234567",
                    "name": "John Smith"
                },
                "payment_account": {
                    "id": "12345678",
                    "name": "email@example.com",
                    "payment_method": "24",
                    "type": "paypal"
                }
            }'
        - label: HTTP
          lang: HTTP
          source: |-
            POST /your/uri HTTP/1.1
            host:           your.hostname
            accept:         application/json
            content-length: 258
            content-type:   application/json
            authorization:  Signature d90d319f05df7b0f86d2485f48e7079f0f752523


            {
                "notification_type": "payment_account_remove",
                "settings": {
                  "project_id": 18404,
                  "merchant_id": 2340
                },
                "user": {
                    "email": "email@example.com",
                    "id": "1234567",
                    "name": "John Smith"
                },
                "payment_account": {
                    "id": "12345678",
                    "name": "email@example.com",
                    "payment_method": "24",
                    "type": "paypal"
                }
            }
  successful-order-payment:
    post:
      description: >
        엑솔라는 사용자가 주문에 대한 결제를 성공적으로 완료하면 지정된 URL로 <code>order_paid</code> 웹훅을
        전송합니다.


        <code>order_paid</code> 웹훅에는 구매한 아이템, 결제 데이터 및 거래 세부 정보에 대한 정보가 포함되어
        있습니다.


        결제가 성공하지 못한 경우 <code>order_paid</code> 웹훅이 전송되지 않습니다. 예:

        * 결제 양식이 열렸지만 사용자가 주문을 결제하지 않았습니다.

        * 결제창이 열렸으나 결제 중 오류가 발생했습니다.


        <code>order_paid</code> 웹훅의 처리 시간은 3초 이내로 하는 것이 좋습니다.


        <div class="notice">

        <p><strong>참고</strong></p>

        <p>웹훅에 전송되는 필드 세트는 <ul><li><a
        href="https://publisher.xsolla.com/0/projects/0/edit/webhooks/store">프로젝트
        설정 &gt; 웹훅 &gt; 고급 설정</a> 섹션의 관리자 페이지에서 구성한 설정</li><li>엑솔라 측에서 구성한
        설정</li></ul> 설정에 따라 달라집니다.</p><p>질문이 있을 경우, 고객 성공 관리자에게 문의하거나 <a
        href="mailto:csm@xsolla.com">csm@xsolla.com</a>으로 이메일을 보내십시오.</p>

        </div>


        <b>응답</b> 섹션에서 예상 답변을 볼 수 있습니다. 다른 응답 코드를 사용할 수도 있습니다. 응답 코드 및 자동 결제 환불
        기능 연결에 

        따른 엑솔라 측의 웹훅 처리 로직은 다음과 같습니다.


        <table>
            <thead>
            <tr>
                <th>응답 코드</th>
                <th>자동 결제 환불이 비활성화됨(기본값)</th>
                <th>자동 결제 환불이 비활성화됨</th>
            </tr>
            </thead>
            <tbody>
            <tr>
                <td><code>400</code>, <code>401</code>, <code>402</code>, <code>403</code>, <code>404</code>, <code>409</code>, <code>422</code>, <code>415</code></td>
                <td>작업 없음</td>
                <td>사용자에게 자동 환불</td>
            </tr>
            <tr>
                <td><code>200</code>, <code>201</code>, <code>204</code></td>
                <td>작업 없음</td>
                <td>작업 없음</td>
            </tr>
            <tr>
                <td>웹훅에 다른 코드 또는 응답 없음</td>
                <td>5분 간격으로 2번, 15분 간격으로 7번, 60분 간격으로 10번 등 지정한 시간 간격으로 웹훅을 여러 번 전송합니다. </td>
                <td>5분 간격으로 2번, 15분 간격으로 7번, 60분 간격으로 10번 등 지정한 시간 간격으로 웹훅을 여러 번 전송합니다. 모든 웹훅을 전송해도 응답을 성공적으로 받지 못하면 사용자에게 환불이 자동으로 이루어집니다.</td>
            </tr>
            </tbody>
        </table>


        자동 환불 기능을 연결하려면 고객 성공 관리자에게 문의하거나 csm@xsolla.com으로 이메일 전송하십시오.
      operationId: successful-order-payment
      requestBody:
        content:
          application/json:
            schema:
              properties:
                billing:
                  description: 거래 및 결제 세부 정보.
                  properties:
                    notification_type:
                      $ref: '#/components/schemas/notification_type'
                    payment_details:
                      description: 결제 내역 관련 값.
                      properties:
                        country_wht:
                          description: 국경 간 거래(대상)로 인해 특정 국가에서 적용되는 원천징수세.
                          properties:
                            amount:
                              description: 금액.
                              format: float
                              type: number
                            currency:
                              $ref: '#/components/schemas/currency'
                            percent:
                              description: 국가 원천징수세율(%).
                              format: float
                              type: number
                          type: object
                        direct_wht:
                          description: 직접 원천징수세.
                          properties:
                            amount:
                              description: 금액.
                              format: float
                              type: number
                            currency:
                              $ref: '#/components/schemas/currency'
                            percent:
                              description: 직접 원천징수세율.
                              format: float
                              type: number
                          type: object
                        payment:
                          description: 게임유저 결제 데이터 관련 값.
                          properties:
                            amount:
                              description: 금액.
                              format: float
                              type: number
                            currency:
                              $ref: '#/components/schemas/currency'
                          type: object
                        payment_method_fee:
                          description: 결제 방식 수수료율.
                          properties:
                            amount:
                              description: 금액.
                              format: float
                              type: number
                            currency:
                              $ref: '#/components/schemas/currency'
                          type: object
                        payment_method_sum:
                          description: 결제 방법에서 청구된 금액에 대한 데이터가 포함된 값.
                          properties:
                            amount:
                              description: 금액.
                              format: float
                              type: number
                            currency:
                              $ref: '#/components/schemas/currency'
                          type: object
                        payout:
                          description: 지급 내역 관련 값.
                          properties:
                            amount:
                              description: 금액.
                              format: float
                              type: number
                            currency:
                              $ref: '#/components/schemas/currency'
                          type: object
                        payout_currency_rate:
                          description: 결제 통화를 지급 통화로 환전할 때의 환율.
                          type: string
                        repatriation_commission:
                          description: 본국 송금 비용에 대한 데이터가 있는 오브젝트. 타사가 엑솔라에 부과.
                          properties:
                            amount:
                              description: 금액.
                              format: float
                              type: number
                            currency:
                              $ref: '#/components/schemas/currency'
                          type: object
                        sales_tax:
                          description: 판매세(미국과 캐나다만 해당).
                          properties:
                            amount:
                              description: 금액.
                              format: float
                              type: number
                            currency:
                              $ref: '#/components/schemas/currency'
                            percent:
                              description: 판매세율.
                              format: float
                              type: number
                          type: object
                        user_acquisition_fee:
                          description: >-
                            제휴 네트워크 및 인플루언서를 통한 구매에 대해 공제된 사용자 확보 수수료의
                            총액(대상)입니다.
                          properties:
                            amount:
                              description: 금액.
                              format: float
                              type: number
                            currency:
                              $ref: '#/components/schemas/currency'
                            percent:
                              description: 사용자 확보 수수료율(%).
                              format: float
                              type: number
                          type: object
                        vat:
                          description: VAT 세율(유럽연합만 해당).
                          properties:
                            amount:
                              description: 금액.
                              format: float
                              type: number
                            currency:
                              $ref: '#/components/schemas/currency'
                            percent:
                              description: 부가가치세율.
                              format: float
                              type: number
                          type: object
                        xsolla_balance_sum:
                          description: 엑솔라 잔액에서 청구된 금액에 대한 데이터가 포함된 값.
                          properties:
                            amount:
                              description: 금액.
                              format: float
                              type: number
                            currency:
                              $ref: '#/components/schemas/currency'
                          type: object
                        xsolla_fee:
                          description: 엑솔라 수수료 요율.
                          properties:
                            amount:
                              description: 금액.
                              format: float
                              type: number
                            currency:
                              $ref: '#/components/schemas/currency'
                          type: object
                      type: object
                    purchase:
                      description: 구매 데이터 관련 값.
                      properties:
                        coupon:
                          description: 쿠폰 데이터 관련 값(이 트랜잭션에 쿠폰이 사용된 경우).
                          properties:
                            campaign_code:
                              description: 쿠폰 캠페인 코드.
                              type: string
                            coupon_code:
                              description: 쿠폰 코드.
                              type: string
                          type: object
                        gift:
                          description: 기프트 내역 관련 값.
                          properties:
                            giver_id:
                              description: 제공자 ID.
                              type: string
                            hide_giver_from_receiver:
                              description: 수신자에서 제공자 ID를 숨길지 여부.
                              type: string
                            message:
                              description: 제공자로부터 전송된 메시지.
                              type: string
                            receiver_email:
                              description: 기프트 수령인 이메일.
                              type: string
                            receiver_id:
                              description: 기프트 수령인 ID.
                              type: string
                          type: object
                        promotions:
                          description: 이 트랜잭션에 적용된 프로모션.
                          items:
                            properties:
                              id:
                                description: 프로모션 ID.
                                type: integer
                              technical_name:
                                description: 프로모션의 기술명.
                                type: string
                            type: object
                          type: array
                        subscription:
                          description: 정기결제 내역 관련 값.
                          properties:
                            amount:
                              $ref: '#/components/schemas/amount-float'
                            currency:
                              $ref: '#/components/schemas/currency'
                            date_create:
                              $ref: '#/components/schemas/subscription.date_create'
                            date_next_charge:
                              description: >-
                                다음 충전 날짜. [ISO
                                8601](https://en.wikipedia.org/wiki/ISO_8601)에
                                따른 날짜 및 시간.
                              type: string
                            plan_id:
                              $ref: '#/components/schemas/subscription.plan_id'
                            product_id:
                              description: 상품 ID(액세스 토큰으로 보낸 경우).
                              type: string
                            subscription_id:
                              $ref: >-
                                #/components/schemas/subscription.subscription_id
                            tags:
                              $ref: '#/components/schemas/subscription.tags'
                          type: object
                        total:
                          description: 구매 총 가격 데이터 관련 값.
                          properties:
                            amount:
                              description: 총 구매 금액.
                              format: float
                              type: number
                            currency:
                              $ref: '#/components/schemas/currency'
                          type: object
                      required:
                        - total
                      type: object
                    settings:
                      description: 사용자 정의 프로젝트 설정 관련 값.
                      properties:
                        merchant_id:
                          $ref: '#/components/schemas/settings.merchant_id'
                        project_id:
                          $ref: '#/components/schemas/settings.project_id'
                      type: object
                    transaction:
                      description: 트랜잭션 데이터 관련 값.
                      properties:
                        agreement:
                          description: 계약 ID.
                          type: integer
                        dry_run:
                          description: >-
                            테스트 트랜잭션. 테스트 트랜잭션의 경우 매개 변수는 1개 값을 갖습니다. 또는, 트랜잭션이
                            실제로 이루어지는 경우 매개 변수가 전송되지 않습니다.
                          type: integer
                        external_id:
                          $ref: '#/components/schemas/external-id'
                        id:
                          description: 트랜잭션 ID.
                          type: integer
                        payment_date:
                          description: 결제 날짜.
                          type: string
                        payment_method:
                          description: 결제 수단 ID.
                          type: integer
                        payment_method_name:
                          description: 결제 방식 이름.
                          type: string
                        payment_method_order_id:
                          description: 결제 시스템의 결제 ID.
                          type: string
                      type: object
                  required:
                    - notification_type
                    - transaction
                    - payment_details
                  type: object
                custom_parameters:
                  description: 추가 정보입니다.
                  type: object
                items:
                  description: >
                    사용자가 구매한 아이템 목록입니다.


                    배열에 포함된 매개 변수 집합은 웹훅 버전에 따라 다릅니다. 버전 2에는 `is_free`,
                    `is_bonus` 및 

                    `is_bundle_content`와 같은 추가 매개 변수가 포함되어 있습니다. 버전을 전환하려면 [웹훅 

                    설정](/ko/api/igs/operation/update-webhook/) API 호출에 대한 정보
                    업데이트에서 `version` 매개 변수 

                    번호를 전달하십시오.
                  items:
                    oneOf:
                      - properties:
                          amount:
                            description: 아이템 수량에 따른 총 비용입니다.
                            type: string
                          custom_attributes:
                            description: 아이템 특성 및 값이 포함된 JSON 개체입니다.
                            type: object
                          is_pre_order:
                            description: '`true`이면 항목이 사전 판매됩니다.'
                            type: boolean
                          promotions:
                            $ref: '#/components/schemas/items.promotions'
                          quantity:
                            description: 아이템 수량.
                            type: integer
                          sku:
                            $ref: '#/components/schemas/items.sku'
                          type:
                            $ref: '#/components/schemas/items.type'
                        required:
                          - sku
                          - type
                          - quantity
                          - amount
                          - promotions
                          - is_pre_order
                        title: 버전 = 1
                        type: object
                      - properties:
                          amount:
                            description: 아이템 수량에 따른 총 비용입니다.
                            type: string
                          custom_attributes:
                            description: 아이템 특성 및 값이 포함된 JSON 개체입니다.
                            type: object
                          is_bonus:
                            description: '`true`이면 항목이 보너스입니다.'
                            type: boolean
                          is_bundle_content:
                            description: '`true`이면 항목이 번들에 포함됩니다.'
                            type: boolean
                          is_free:
                            description: '`true`이면 아이템이 무료입니다.'
                            type: boolean
                          is_pre_order:
                            description: '`true`이면 항목이 사전 판매됩니다.'
                            type: boolean
                          promotions:
                            $ref: '#/components/schemas/items.promotions'
                          quantity:
                            description: 아이템 수량.
                            type: integer
                          sku:
                            $ref: '#/components/schemas/items.sku'
                          type:
                            $ref: '#/components/schemas/items.type'
                        required:
                          - sku
                          - type
                          - quantity
                          - amount
                          - promotions
                          - is_pre_order
                          - is_free
                          - is_bonus
                          - is_bundle_content
                        title: 버전 = 2
                        type: object
                  type: array
                notification_type:
                  $ref: '#/components/schemas/notification_type'
                order:
                  description: 주문에 대한 정보입니다.
                  properties:
                    amount:
                      description: 선택한 통화를 기준으로 한 장바구니의 총 비용입니다.
                      type: string
                    comment:
                      description: 주문에 대한 사용자의 코멘트.
                      nullable: true
                      type: string
                    coupons:
                      description: 적용된 쿠폰. 쿠폰을 적용되지 않았으면 배열이 돌아오지 않습니다.
                      items:
                        properties:
                          code:
                            description: 적용된 쿠폰 코드.
                            type: string
                          external_id:
                            description: 외부 ID.
                            type: string
                        type: object
                      type: array
                    currency:
                      description: >-
                        주문 통화. 가상 화폐는 SKU를 사용하고 실제 화폐는 3글자 [ISO
                        4217](https://en.wikipedia.org/wiki/ISO_4217) 코드를 사용합니다.
                      type: string
                    currency_type:
                      $ref: '#/components/schemas/currency-type'
                    id:
                      description: 엑솔라 측에서 사용자 주문의 고유 식별자입니다.
                      type: integer
                    invoice_id:
                      description: 실질 화폐 결제 인보이스 ID. 인게임 재화 결제 또는 무료 아이템은 `null` 값을 사용합니다.
                      nullable: true
                      type: string
                    mode:
                      description: >-
                        결제 모드. 실제 결제에는 `default`를 사용합니다. 테스트 결제에는 `sandbox`를
                        사용합니다.
                      enum:
                        - default
                        - sandbox
                      type: string
                    platform:
                      description: >-
                        결제 플랫폼. `xsolla` 값은 엑솔라를 통한 결제에 사용됩니다. 기타 결제는 게임 퍼블리싱
                        플랫폼의 이름에 해당하는 값을 사용합니다.
                      enum:
                        - xsolla
                        - playstation_network
                        - xbox_live
                        - pc_standalone
                        - nintendo_shop
                        - google_play
                        - app_store_ios
                        - android_standalone
                        - ios_standalone
                        - android_other
                        - ios_other
                        - pc_other
                      nullable: true
                      type: string
                    promocodes:
                      description: 적용된 프로모션 코드. 프로모션 코드가 적용되지 않았으면 배열이 돌아오지 않습니다.
                      items:
                        properties:
                          code:
                            description: 적용된 프로모션 코드의 코드.
                            type: string
                          external_id:
                            description: 외부 ID.
                            type: string
                        type: object
                      type: array
                    promotions:
                      $ref: '#/components/schemas/order.promotions'
                    status:
                      description: 주문 상태.
                      type: string
                  required:
                    - id
                    - mode
                    - currency_type
                    - currency
                    - amount
                    - status
                    - platform
                    - comment
                    - invoice_id
                    - promotions
                  type: object
                user:
                  description: 사용자 정보.
                  properties:
                    country:
                      $ref: '#/components/schemas/user.country'
                    email:
                      description: 사용자 이메일 주소.
                      type: string
                    external_id:
                      description: 사용자 ID.
                      type: string
                  required:
                    - external_id
                    - email
                  type: object
              required:
                - notification_type
                - items
                - order
                - user
                - transaction
                - payment_details
      responses:
        '200':
          description: 성공적인 처리 표시를 반환합니다.
        '400':
          description: '제공된 정보에 오류가 있는 경우 반환합니다(예: 필수 매개변수 누락, 인증 실패 등).'
      summary: 주문 결제 성공(결제 및 거래 세부 정보 포함)
      tags:
        - combined-webhooks
      x-codeSamples:
        - label: CURL
          lang: cURL
          source: >-
            curl -v 'https://your.hostname/your/uri' \

            -X POST \

            -H 'accept: application/json' \

            -H 'content-type: application/json' \

            -H 'authorization: Signature
            d09695066c52c1b8bdae92f2d6eb59f5b5f89843' \

            -d '{
                "notification_type": "order_paid",
                "items": [
                  {
                    "sku": "com.xsolla.item_1",
                    "type": "virtual_good",
                    "is_pre_order": false,
                    "quantity": 3,
                    "amount": "1000",
                    "promotions": [
                      {
                        "amount_without_discount": "6000",
                        "amount_with_discount": "5000",
                        "sequence": 1
                      },
                      {
                        "amount_without_discount": "5000",
                        "amount_with_discount": "4000",
                        "sequence": 2
                      }
                    ],
                    "custom_attributes":
                      {
                        "purchased": 0,
                        "attr": "value"
                      }
                  },
                  {
                    "sku": "com.xsolla.item_new_1",
                    "type": "bundle",
                    "is_pre_order": false,
                    "quantity": 1,
                    "amount": "1000",
                    "promotions": []
                  },
                  {
                    "sku": "com.xsolla.gold_1",
                    "type": "virtual_currency",
                    "is_pre_order": false,
                    "quantity": 1500,
                    "amount": null,
                    "promotions": []
                  }
                ],
                "order": {
                  "id": 1,
                  "mode": "default",
                  "currency_type": "virtual",
                  "currency": "sku_currency",
                  "amount": "2000",
                  "status": "paid",
                  "platform": "xsolla",
                  "comment": null,
                  "invoice_id": "1",
                  "promotions": [
                    {
                      "amount_without_discount": "4000",
                      "amount_with_discount": "2000",
                      "sequence": 1
                    }
                  ],
                  "promocodes": [
                    {
                      "code": "promocode_some_code",
                      "external_id": "promocode_sku"
                    }
                  ],
                  "coupons": [
                    {
                      "code": "WINTER2021",
                      "external_id": "coupon_sku"
                    }
                  ]
                },
                "user": {
                  "external_id": "id_xsolla_login_1",
                  "email": "gc_user@xsolla.com",
                  "country": "US"
                },
                "billing": {
                  "notification_type": "payment",
                  "settings": {
                    "project_id": 18404,
                    "merchant_id": 2340
                  },
                  "purchase": {
                      "subscription": {
                          "plan_id": "b5dac9c8",
                          "subscription_id": "10",
                          "product_id": "Demo Product",
                          "date_create": "2014-09-22T19:25:25+04:00",
                          "date_next_charge": "2014-10-22T19:25:25+04:00",
                          "currency": "USD",
                          "amount": 9.99
                      },
                      "total": {
                          "currency": "USD",
                          "amount": 200
                      },
                      "promotions": [{
                          "technical_name": "Demo Promotion",
                          "id": 853
                      }],
                      "coupon": {
                          "coupon_code": "ICvj45S4FUOyy",
                          "campaign_code": "1507"
                      }
                    },
                  "transaction": {
                      "id": 1,
                      "external_id": 1,
                      "payment_date": "2014-09-24T20:38:16+04:00",
                      "payment_method": 1,
                      "payment_method_name": "PayPal",
                      "payment_method_order_id": 1234567890123456789,
                      "dry_run": 1,
                      "agreement": 1
                  },
                  "payment_details": {
                      "payment": {
                          "currency": "USD",
                          "amount": 230
                      },
                      "vat": {
                          "currency": "USD",
                          "amount": 0,
                          "percent": 20
                      },
                      "sales_tax": {
                          "currency": "USD",
                          "amount": 0,
                          "percent": 0
                      },
                      "direct_wht": {
                          "currency": "USD",
                          "amount": 0,
                          "percent": 0
                      },
                      "payout_currency_rate": "1",
                      "payout": {
                          "currency": "USD",
                          "amount": 200
                      },
                      "country_wht": {
                          "currency": "USD",
                          "amount": 2,
                          "percent": 10
                      },
                      "user_acquisition_fee": {
                          "currency": "USD",
                          "amount": 2,
                          "percent": 1
                      },
                      "xsolla_fee": {
                          "currency": "USD",
                          "amount": 10
                      },
                      "payment_method_fee": {
                          "currency": "USD",
                          "amount": 20
                      },
                      "repatriation_commission": {
                          "currency": "USD",
                          "amount": 10
                      }
                  }
                }
             ,
              "custom_parameters": {
                "parameter1": "value1",
                "parameter2": "value2"
              }
            }
        - label: HTTP
          lang: HTTP
          source: |-
            POST /your/uri HTTP/1.1
            host:           your.hostname
            accept:         application/json
            content-length: 258
            content-type:   application/json
            authorization:  Signature d90d319f05df7b0f86d2485f48e7079f0f752523


            {
                "notification_type": "order_paid",
                "items": [
                  {
                    "sku": "com.xsolla.item_1",
                    "type": "virtual_good",
                    "is_pre_order": false,
                    "quantity": 3,
                    "amount": "1000",
                    "promotions": [
                      {
                        "amount_without_discount": "6000",
                        "amount_with_discount": "5000",
                        "sequence": 1
                      },
                      {
                        "amount_without_discount": "5000",
                        "amount_with_discount": "4000",
                        "sequence": 2
                      }
                    ],
                    "custom_attributes":
                      {
                        "purchased": 0,
                        "attr": "value"
                      }
                  },
                  {
                    "sku": "com.xsolla.item_new_1",
                    "type": "bundle",
                    "is_pre_order": false,
                    "quantity": 1,
                    "amount": "1000",
                    "promotions": []
                  },
                  {
                    "sku": "com.xsolla.gold_1",
                    "type": "virtual_currency",
                    "is_pre_order": false,
                    "quantity": 1500,
                    "amount": null,
                    "promotions": []
                  }
                ],
                "order": {
                  "id": 1,
                  "mode": "default",
                  "currency_type": "virtual",
                  "currency": "sku_currency",
                  "amount": "2000",
                  "status": "paid",
                  "platform": "xsolla",
                  "comment": null,
                  "invoice_id": "1",
                  "promotions": [
                    {
                      "amount_without_discount": "4000",
                      "amount_with_discount": "2000",
                      "sequence": 1
                    }
                  ],
                  "promocodes": [
                    {
                      "code": "promocode_some_code",
                      "external_id": "promocode_sku"
                    }
                  ],
                  "coupons": [
                    {
                      "code": "WINTER2021",
                      "external_id": "coupon_sku"
                    }
                  ]
                },
                "user": {
                  "external_id": "id_xsolla_login_1",
                  "email": "gc_user@xsolla.com",
                  "country": "US"
                },
                "billing": {
                  "notification_type": "payment",
                  "settings": {
                    "project_id": 18404,
                    "merchant_id": 2340
                  },
                  "purchase":{
                      "subscription": {
                          "plan_id": "b5dac9c8",
                          "subscription_id": "10",
                          "product_id": "Demo Product",
                          "date_create": "2014-09-22T19:25:25+04:00",
                          "date_next_charge": "2014-10-22T19:25:25+04:00",
                          "currency": "USD",
                          "amount": 9.99
                      },
                      "total": {
                          "currency": "USD",
                          "amount": 200
                      },
                      "promotions": [{
                          "technical_name": "Demo Promotion",
                          "id": 853
                      }],
                      "coupon": {
                          "coupon_code": "ICvj45S4FUOyy",
                          "campaign_code": "1507"
                      }
                  },
                  "transaction": {
                      "id": 1,
                      "external_id": 1,
                      "payment_date": "2014-09-24T20:38:16+04:00",
                      "payment_method": 1,
                      "payment_method_name": "PayPal",
                      "payment_method_order_id": 1234567890123456789,
                      "dry_run": 1,
                      "agreement": 1
                  },
                  "payment_details": {
                      "payment": {
                          "currency": "USD",
                          "amount": 230
                      },
                      "vat": {
                          "currency": "USD",
                          "amount": 0,
                          "percent": 20
                      },
                      "sales_tax": {
                          "currency": "USD",
                          "amount": 0,
                          "percent": 0
                      },
                      "direct_wht": {
                          "currency": "USD",
                          "amount": 0,
                          "percent": 0
                      },
                      "payout_currency_rate": "1",
                      "country_wht": {
                          "currency": "USD",
                          "amount": 2,
                          "percent": 10
                      },
                      "user_acquisition_fee": {
                          "currency": "USD",
                          "amount": 2,
                          "percent": 1
                      },
                      "payout": {
                          "currency": "USD",
                          "amount": 200
                      },
                      "xsolla_fee": {
                          "currency": "USD",
                          "amount": 10
                      },
                      "payment_method_fee": {
                          "currency": "USD",
                          "amount": 20
                      },
                      "repatriation_commission": {
                          "currency": "USD",
                          "amount": 10
                      }
                  }
                },
                "custom_parameters": {
                    "parameter1": "value1",
                    "parameter2": "value2"
                    }
                }
  successful-order-payment-separate:
    post:
      description: >
        엑솔라는 다음 조건이 충족되면 지정된 URL로 <code>order_paid</code> 웹훅을 전송합니다.

        1. 사용자가 주문을 성공적으로 결제했습니다.

        2. 엑솔라는 [결제](/ko/webhooks/operation/payment/) 웹훅이 성공적으로 처리되었다는 응답을
        받았습니다.


        <code>order_paid</code> 웹훅에는 구매한 아이템 및 거래 세부 정보에 대한 정보가 포함되어 있습니다.


        다음의 경우 <code>order_paid</code> 웹훅이 전송되지 않습니다.

        * 결제에 실패했습니다. 결제 실패 예시:
          * 결제 양식이 열렸지만 사용자가 주문을 결제하지 않았습니다.
          * 결제창이 열렸으나 결제 중 오류가 발생했습니다.
        * [결제](/ko/webhooks/operation/payment/) 웹훅을 성공적으로 처리했다는 응답을 받지 못했습니다.


        <code>order_paid</code> 웹훅의 처리 시간은 3초 이내로 하는 것이 좋습니다.


        <b>응답</b> 섹션에서 예상 답변을 볼 수 있습니다. 다른 응답 코드를 사용할 수도 있습니다. 응답 코드 및 자동 결제 환불
        기능 연결에 

        따른 엑솔라 측의 웹훅 처리 로직은 다음과 같습니다.


        <table>
            <thead>
            <tr>
                <th>응답 코드</th>
                <th>자동 결제 환불이 비활성화됨(기본값)</th>
                <th>자동 결제 환불이 비활성화됨</th>
            </tr>
            </thead>
            <tbody>
            <tr>
                <td><code>400</code>, <code>401</code>, <code>402</code>, <code>403</code>, <code>404</code>, <code>409</code>, <code>422</code>, <code>415</code></td>
                <td>작업 없음</td>
                <td>사용자에게 자동 환불</td>
            </tr>
            <tr>
                <td><code>200</code>, <code>201</code>, <code>204</code></td>
                <td>작업 없음</td>
                <td>작업 없음</td>
            </tr>
            <tr>
                <td>웹훅에 다른 코드 또는 응답 없음</td>
                <td>5분 간격으로 2번, 15분 간격으로 7번, 60분 간격으로 10번 등 지정한 시간 간격으로 웹훅을 여러 번 전송합니다. </td>
                <td>5분 간격으로 2번, 15분 간격으로 7번, 60분 간격으로 10번 등 지정한 시간 간격으로 웹훅을 여러 번 전송합니다. 모든 웹훅을 전송해도 응답을 성공적으로 받지 못하면 사용자에게 환불이 자동으로 이루어집니다.</td>
            </tr>
            </tbody>
        </table>


        자동 환불 기능을 연결하려면 고객 성공 관리자에게 문의하거나 csm@xsolla.com으로 이메일 전송하십시오.
      operationId: successful-order-payment-separate
      requestBody:
        content:
          application/json:
            schema:
              properties:
                custom_parameters:
                  description: 추가 정보입니다.
                  type: object
                items:
                  description: >
                    사용자가 구매한 아이템 목록입니다.


                    배열에 포함된 매개 변수 집합은 웹훅 버전에 따라 다릅니다. 버전 2에는 `is_free`,
                    `is_bonus` 및 

                    `is_bundle_content`와 같은 추가 매개 변수가 포함되어 있습니다. 버전을 전환하려면 [웹훅 

                    설정](/ko/api/igs/operation/update-webhook/) API 호출에 대한 정보
                    업데이트에서 `version` 매개 변수 

                    번호를 전달하십시오.
                  items:
                    oneOf:
                      - properties:
                          amount:
                            description: 아이템 수량에 따른 총 비용입니다.
                            type: string
                          custom_attributes:
                            description: 아이템 특성 및 값이 포함된 JSON 개체입니다.
                            type: object
                          is_pre_order:
                            description: '`true`이면 항목이 사전 판매됩니다.'
                            type: boolean
                          promotions:
                            $ref: '#/components/schemas/items.promotions'
                          quantity:
                            description: 아이템 수량.
                            type: integer
                          sku:
                            $ref: '#/components/schemas/items.sku'
                          type:
                            $ref: '#/components/schemas/items.type'
                        required:
                          - sku
                          - type
                          - quantity
                          - amount
                          - promotions
                          - is_pre_order
                        title: 버전 = 1
                        type: object
                      - properties:
                          amount:
                            description: 아이템 수량에 따른 총 비용입니다.
                            type: string
                          custom_attributes:
                            description: 아이템 특성 및 값이 포함된 JSON 개체입니다.
                            type: object
                          is_bonus:
                            description: '`true`이면 항목이 보너스입니다.'
                            type: boolean
                          is_bundle_content:
                            description: '`true`이면 항목이 번들에 포함됩니다.'
                            type: boolean
                          is_free:
                            description: '`true`이면 아이템이 무료입니다.'
                            type: boolean
                          is_pre_order:
                            description: '`true`이면 항목이 사전 판매됩니다.'
                            type: boolean
                          promotions:
                            $ref: '#/components/schemas/items.promotions'
                          quantity:
                            description: 아이템 수량.
                            type: integer
                          sku:
                            $ref: '#/components/schemas/items.sku'
                          type:
                            $ref: '#/components/schemas/items.type'
                        required:
                          - sku
                          - type
                          - quantity
                          - amount
                          - promotions
                          - is_pre_order
                          - is_free
                          - is_bonus
                          - is_bundle_content
                        title: 버전 = 2
                        type: object
                  type: array
                notification_type:
                  $ref: '#/components/schemas/notification_type'
                order:
                  description: 주문에 대한 정보입니다.
                  properties:
                    amount:
                      description: 선택한 통화를 기준으로 한 장바구니의 총 비용입니다.
                      type: string
                    comment:
                      description: 주문에 대한 사용자의 코멘트.
                      nullable: true
                      type: string
                    coupons:
                      description: 적용된 쿠폰. 쿠폰을 적용되지 않았으면 배열이 돌아오지 않습니다.
                      items:
                        properties:
                          code:
                            description: 적용된 쿠폰 코드.
                            type: string
                          external_id:
                            description: 외부 ID.
                            type: string
                        type: object
                      type: array
                    currency:
                      description: >-
                        주문 통화. 가상 화폐는 SKU를 사용하고 실제 화폐는 3글자 [ISO
                        4217](https://en.wikipedia.org/wiki/ISO_4217) 코드를 사용합니다.
                      type: string
                    currency_type:
                      $ref: '#/components/schemas/currency-type'
                    id:
                      description: 엑솔라 측에서 사용자 주문의 고유 식별자입니다.
                      type: integer
                    invoice_id:
                      description: 실질 화폐 결제 인보이스 ID. 인게임 재화 결제 또는 무료 아이템은 `null` 값을 사용합니다.
                      nullable: true
                      type: string
                    mode:
                      description: >-
                        결제 모드. 실제 결제에는 `default`를 사용합니다. 테스트 결제에는 `sandbox`를
                        사용합니다.
                      enum:
                        - default
                        - sandbox
                      type: string
                    platform:
                      description: >-
                        결제 플랫폼. `xsolla` 값은 엑솔라를 통한 결제에 사용됩니다. 기타 결제는 게임 퍼블리싱
                        플랫폼의 이름에 해당하는 값을 사용합니다.
                      enum:
                        - xsolla
                        - playstation_network
                        - xbox_live
                        - pc_standalone
                        - nintendo_shop
                        - google_play
                        - app_store_ios
                        - android_standalone
                        - ios_standalone
                        - android_other
                        - ios_other
                        - pc_other
                      nullable: true
                      type: string
                    promocodes:
                      description: 적용된 프로모션 코드. 프로모션 코드가 적용되지 않았으면 배열이 돌아오지 않습니다.
                      items:
                        properties:
                          code:
                            description: 적용된 프로모션 코드의 코드.
                            type: string
                          external_id:
                            description: 외부 ID.
                            type: string
                        type: object
                      type: array
                    promotions:
                      $ref: '#/components/schemas/order.promotions'
                    status:
                      description: 주문 상태.
                      type: string
                  required:
                    - id
                    - mode
                    - currency_type
                    - currency
                    - amount
                    - status
                    - platform
                    - comment
                    - invoice_id
                    - promotions
                  type: object
                user:
                  description: 사용자 정보.
                  properties:
                    country:
                      $ref: '#/components/schemas/user.country'
                    email:
                      description: 사용자 이메일 주소.
                      type: string
                    external_id:
                      description: 사용자 ID.
                      type: string
                  required:
                    - external_id
                    - email
                  type: object
              required:
                - notification_type
                - items
                - order
                - user
      responses:
        '200':
          description: 성공적인 처리 표시를 반환합니다.
        '400':
          description: '제공된 정보에 오류가 있는 경우 반환합니다(예: 필수 매개변수 누락, 인증 실패 등).'
      summary: 주문 결제 성공(결제 및 거래 세부 정보 없음)
      tags:
        - separate-webhooks
      x-codeSamples:
        - label: CURL
          lang: cURL
          source: >-
            curl -v 'https://your.hostname/your/uri' \

            -X POST \

            -H 'accept: application/json' \

            -H 'content-type: application/json' \

            -H 'authorization: Signature
            d09695066c52c1b8bdae92f2d6eb59f5b5f89843' \

            -d '{
                "notification_type": "order_paid",
                "items": [
                  {
                    "sku": "com.xsolla.v.item_1",
                    "type": "virtual_good",
                    "is_pre_order": false,
                    "quantity": 3,
                    "amount": "1000",
                    "promotions": [
                      {
                        "amount_without_discount": "6000",
                        "amount_with_discount": "5000",
                        "sequence": 1
                      },
                      {
                        "amount_without_discount": "5000",
                        "amount_with_discount": "4000",
                        "sequence": 2
                      }
                    ],
                    "custom_attributes":
                      {
                        "purchased": 0,
                        "attr": "value"
                      }
                  },
                  {
                    "sku": "com.xsolla.v.item_new_1",
                    "type": "bundle",
                    "is_pre_order": false,
                    "quantity": 1,
                    "amount": "1000",
                    "promotions": []
                  },
                  {
                    "sku": "com.xsolla.gold_1",
                    "type": "virtual_currency",
                    "is_pre_order": false,
                    "quantity": 1500,
                    "amount": "[null]",
                    "promotions": []
                  }
                ],
                "order": {
                  "id": 1,
                  "mode": "default",
                  "currency_type": "virtual",
                  "currency": "sku_currency",
                  "amount": "2000",
                  "status": "paid",
                  "platform": "xsolla",
                  "comment": null,
                  "invoice_id": "1",
                  "promotions": [
                    {
                      "amount_without_discount": "4000",
                      "amount_with_discount": "2000",
                      "sequence": 1
                    }
                  ],
                  "promocodes": [
                    {
                      "code": "promocode_some_code",
                      "external_id": "promocode_sku"
                    }
                  ],
                  "coupons": [
                    {
                      "code": "WINTER2021",
                      "external_id": "coupon_sku"
                    }
                  ]
                },
                "user": {
                  "external_id": "id_xsolla_login_1",
                  "email": "gc_user@xsolla.com",
                  "country": "US"
                }

            }'
        - label: HTTP
          lang: HTTP
          source: |-
            POST /your/uri HTTP/1.1
            host:           your.hostname
            accept:         application/json
            content-length: 258
            content-type:   application/json
            authorization:  Signature d90d319f05df7b0f86d2485f48e7079f0f752523


            {
                "notification_type": "order_paid",
                "items": [
                  {
                    "sku": "com.xsolla.v.item_1",
                    "type": "virtual_good",
                    "is_pre_order": false,
                    "quantity": 3,
                    "amount": "1000",
                    "promotions": [
                      {
                        "amount_without_discount": "6000",
                        "amount_with_discount": "5000",
                        "sequence": 1
                      },
                      {
                        "amount_without_discount": "5000",
                        "amount_with_discount": "4000",
                        "sequence": 2
                      }
                    ],
                    "custom_attributes":
                      {
                        "purchased": 0,
                        "attr": "value"
                      }
                  },
                  {
                    "sku": "com.xsolla.v.item_new_1",
                    "type": "bundle",
                    "is_pre_order": false,
                    "quantity": 1,
                    "amount": "1000",
                    "promotions": []
                  },
                  {
                    "sku": "com.xsolla.gold_1",
                    "type": "virtual_currency",
                    "is_pre_order": false,
                    "quantity": 1500,
                    "amount": "[null]",
                    "promotions": []
                  }
                ],
                "order": {
                  "id": 1,
                  "mode": "default",
                  "currency_type": "virtual",
                  "currency": "sku_currency",
                  "amount": "2000",
                  "status": "paid",
                  "platform": "xsolla",
                  "comment": null,
                  "invoice_id": "1",
                  "promotions": [
                    {
                      "amount_without_discount": "4000",
                      "amount_with_discount": "2000",
                      "sequence": 1
                    }
                  ],
                  "promocodes": [
                    {
                      "code": "promocode_some_code",
                      "external_id": "promocode_sku"
                    }
                  ],
                  "coupons": [
                    {
                      "code": "WINTER2021",
                      "external_id": "coupon_sku"
                    }
                  ]
                },
                "user": {
                  "external_id": "id_xsolla_login_1",
                  "email": "gc_user@xsolla.com",
                  "country": "US"
                }
            }
  updated-subscription:
    post:
      description: >-
        정기 결제의 일부 매개 변수(`plan_id`, `date_next_charge`)가 변경된 경우, 그리고 정기 결제가 갱신될
        때마다 엑솔라는 `update_subscription` 유형이 포함된 웹훅을 웹훅 URL로 전송합니다.
      operationId: updated-subscription
      requestBody:
        content:
          application/json:
            schema:
              properties:
                notification_type:
                  $ref: '#/components/schemas/notification_type'
                settings:
                  description: 사용자 정의 프로젝트 설정(개체)입니다.
                  properties:
                    merchant_id:
                      $ref: '#/components/schemas/settings.merchant_id'
                    project_id:
                      $ref: '#/components/schemas/settings.project_id'
                  type: object
                subscription:
                  description: 정기결제 세부 정보(오브젝트).
                  properties:
                    date_next_charge:
                      $ref: '#/components/schemas/subscription.date_next_charge'
                    plan_id:
                      $ref: '#/components/schemas/subscription.plan_id'
                    product_id:
                      $ref: '#/components/schemas/subscription.product_id'
                    subscription_id:
                      $ref: '#/components/schemas/subscription.subscription_id'
                    tags:
                      $ref: '#/components/schemas/subscription.tags'
                  type: object
                user:
                  description: 사용자 세부 사항(개체)입니다.
                  properties:
                    id:
                      $ref: '#/components/schemas/user.id'
                    name:
                      $ref: '#/components/schemas/user.name'
                  required:
                    - id
                  type: object
              required:
                - notification_type
      responses:
        '204':
          $ref: '#/components/responses/204'
        '400':
          $ref: '#/components/responses/400'
        '500':
          $ref: '#/components/responses/500'
      summary: 업데이트된 정기결제
      tags:
        - subscriptions
      x-codeSamples:
        - label: CURL
          lang: cURL
          source: >-
            curl -v 'https://your.hostname/your/uri' \

            -X POST \

            -H 'accept: application/json' \

            -H 'content-type: application/json' \

            -H 'authorization: Signature
            13342703ccaca5064ad33ba451d800c5e823db8f' \

            -d '{
                    "notification_type": "update_subscription",
                    "settings": {
                      "project_id": 18404,
                      "merchant_id": 2340
                    },
                    "user": {
                        "id": "1234567",
                        "name": "John Smith"
                    },
                    "subscription": {
                        "plan_id": "b5dac9c8",
                        "subscription_id": "10",
                        "product_id": "Demo Product",
                        "date_next_charge": "2015-01-22T19:25:25+04:00"
                    }
                }'
        - label: PHP
          lang: PHP
          source: |-
            <?php

            $request = array(
                'notification_type' => 'update_subscription',
                'settings' => array(
                  'project_id' => 18404,
                  'merchant_id' => 2340
                ),
                'user' => array(
                    'id' => '1234567',
                    'name' => 'John Smith'
                ),
                'subscription' => array(
                    'plan_id' => 'b5dac9c8',
                    'subscription_id' => '10',
                    'product_id' => 'Demo Product',
                    'date_next_charge' => '2015-01-22T19:25:25+04:00'
                )
            );
        - label: HTTP
          lang: HTTP
          source: |-
            POST /your/uri HTTP/1.1
            host: your.hostname
            accept: application/json
            content-type: application/json
            content-length: 240
            authorization: Signature 13342703ccaca5064ad33ba451d800c5e823db8f

            {
                "notification_type": "update_subscription",
                "settings": {
                  "project_id": 18404,
                  "merchant_id": 2340
                },
                "user": {
                    "id": "1234567",
                    "name": "John Smith"
                },
                "subscription": {
                    "plan_id": "b5dac9c8",
                    "subscription_id": "10",
                    "product_id": "Demo Product",
                    "date_next_charge": "2015-01-22T19:25:25+04:00"
                }
            }
  user-search:
    post:
      description: >-
        <nt>Public User ID</nt>는 <nt>User ID</nt>와 달리 사용자를 고유하게 식별하고 사용자에게 알려진
        매개 변수입니다(<nt>Public User ID</nt>는 이메일, 화면 이름 등일 수 있음). 엑솔라는 게임 스토어 외부(예:
        현금 키오스크를 통한 구매 등)에서 구매가 이루어질 때 `user_search` 유형이 포함된 웹훅을 전송합니다.
      operationId: user-search
      requestBody:
        content:
          application/json:
            schema:
              properties:
                notification_type:
                  $ref: '#/components/schemas/notification_type'
                settings:
                  description: 사용자 정의 프로젝트 설정(개체)입니다.
                  properties:
                    merchant_id:
                      $ref: '#/components/schemas/settings.merchant_id'
                    project_id:
                      $ref: '#/components/schemas/settings.project_id'
                  type: object
                user:
                  description: 사용자 세부 사항(개체)입니다.
                  properties:
                    id:
                      $ref: '#/components/schemas/user.id'
                    public_id:
                      $ref: '#/components/schemas/user.public_id'
                  required:
                    - id
                  type: object
              required:
                - notification_type
                - user
      responses:
        '204':
          $ref: '#/components/responses/204'
        '400':
          $ref: '#/components/responses/400'
        '500':
          $ref: '#/components/responses/500'
      summary: 사용자 검색
      tags:
        - user-validation
      x-codeSamples:
        - label: CURL
          lang: cURL
          source: >-
            curl -v 'https://your.hostname/your/uri' \

            -X POST \

            -H 'accept: application/json' \

            -H 'content-type: application/json' \

            -H 'authorization: Signature
            13342703ccaca5064ad33ba451d800c5e823db8f' \

            -d '{
                "notification_type": "user_search",
                "settings": {
                  "project_id": 18404,
                  "merchant_id": 2340
                },
                "user": {
                    "public_id": "email@example.com"
                }
            }'
        - label: PHP
          lang: PHP
          source: |-
            <?php

            $request = array(
                'notification_type' => 'user_search',
                'settings' => array(
                  'project_id' => 18404,
                  'merchant_id' => 2340
                ),
                'user' => array(
                    'public_id' => 'email@example.com'
                )
            );
        - label: HTTP
          lang: HTTP
          source: |-
            POST /your/uri HTTP/1.1
            host: your.hostname
            accept: application/json
            content-type: application/json
            content-length: 240
            authorization: Signature 13342703ccaca5064ad33ba451d800c5e823db8f

            {
                "notification_type": "user_search",
                "settings": {
                  "project_id": 18404,
                  "merchant_id": 2340
                },
                "user": {
                    "public_id": "email@example.com"
                }
            }
  user-validation:
    post:
      description: >
        엑솔라는 사용자가 게임에 등록되어 있는지 확인하기 위해 `user_validation` 유형이 포함된 웹훅을 웹훅 URL로
        전송합니다. 이 

        요청은 결제 프로세스의 일부이며 여러 번 전송됩니다.


        * 사용자가 결제 UI에서 결제 방법을 선택한 경우

        * 사용자가 결제 양식에 데이터를 입력한 경우(예: PayPal을 통해 결제할 경우 은행 카드 데이터 또는 우편번호)

        * 사용자가 **지금 지불**을 클릭하여 결제를 진행하는 경우

        * 결제 프로세스가 완료되고 거래 상태가 `done`로 변경되는 경우


        어떤 결제 방법으로 지불을 진행하여도 요청이 전송됩니다.


        관리자 페이지에 웹훅 URL을 저장하면 웹훅에서 자세한 정보를 수신할 수 있는 권한을 부여할 수 있습니다. 이렇게 하려면 <a 

        href="https://publisher.xsolla.com/0/projects/0/edit/webhooks/store">프로젝트
        설정 

        &gt;웹훅&gt; 고급 설정</a> 섹션의 관리자 페이지에서 필요한 토글을 활성화로 설정하십시오.


        <div class="note">

        <p><strong>참고</strong></p>

        <p>2025년 1월 22일 또는 그 이전에 관리자 페이지에 등록한 경우, <a
        href="https://publisher.xsolla.com/0/projects/0/edit/webhooks/payments">프로젝트
        설정 &gt;웹훅 &gt; 테스트 &gt; 결제 &gt; 고급 설정</a> 섹션에서 토글을 찾을 수 있습니다.</p>

        </div>


        <table>

        <thead>
            <tr>
                <th>토글</th>
                <th>설명</th>
            </tr>
        </thead>

        <tbody>
            <tr>
                <td>민감한 데이터 없이 필수 사용자 매개 변수만 전송</td>
                <td><p>사용자에 대한 다음 정보만 웹훅에서 전달됩니다.</p><ul><li>ID</li><li>국가</li></ul></td>
            </tr>
            <tr>
                <td>사용자 정의 매개 변수 전송</td>
                <td><a href="/ko/api/pay-station/operation/create-token/">사용자 정의 토큰 매개 변수</a> 관련 정보가 웹훅에서 전달됩니다.</td>
            </tr>
        </tbody>

        </table>
      operationId: user-validation
      requestBody:
        content:
          application/json:
            schema:
              properties:
                notification_type:
                  $ref: '#/components/schemas/notification_type'
                settings:
                  description: 사용자 정의 프로젝트 설정(개체)입니다.
                  properties:
                    merchant_id:
                      $ref: '#/components/schemas/settings.merchant_id'
                    project_id:
                      $ref: '#/components/schemas/settings.project_id'
                  type: object
                user:
                  description: 사용자 세부 사항(개체)입니다.
                  properties:
                    country:
                      $ref: '#/components/schemas/user.country'
                    email:
                      $ref: '#/components/schemas/user.email'
                    id:
                      $ref: '#/components/schemas/user.id'
                    ip:
                      $ref: '#/components/schemas/user.ip'
                    name:
                      $ref: '#/components/schemas/user.name'
                    phone:
                      $ref: '#/components/schemas/user.phone'
                  required:
                    - id
                  type: object
              required:
                - notification_type
      responses:
        '204':
          $ref: '#/components/responses/204'
        '400':
          $ref: '#/components/responses/400'
        '500':
          $ref: '#/components/responses/500'
      summary: 사용자 유효성 검사
      tags:
        - user-validation
      x-codeSamples:
        - label: CURL
          lang: cURL
          source: >-
            curl -v 'https://your.hostname/your/uri' \

            -X POST \

            -H 'accept: application/json' \

            -H 'content-type: application/json' \

            -H 'authorization: Signature
            13342703ccaca5064ad33ba451d800c5e823db8f' \

            -d '{
                "notification_type":"user_validation",
                "settings": {
                  "project_id": 18404,
                  "merchant_id": 2340
                },
                "user": {
                    "ip": "127.0.0.1",
                    "phone": "18777976552",
                    "email": "email@example.com",
                    "id": "1234567",
                    "name": "John Smith",
                    "country": "US"
                }
            }'
        - label: PHP
          lang: PHP
          source: |-
            <?php

            $request = array(
                'notification_type' => 'user_validation',
                'settings' => array(
                  'project_id' => 18404,
                  'merchant_id' => 2340
                ),
                'user' => array(
                    'ip' => '127.0.0.1',
                    'phone' => '18777976552',
                    'email'=> 'email@example.com',
                    'id'=> '1234567',
                    'country' => 'US'
                )
            );
        - label: HTTP
          lang: HTTP
          source: |-
            POST /your/uri HTTP/1.1
            host: your.hostname
            accept: application/json
            content-type: application/json
            content-length: 240
            authorization: Signature 13342703ccaca5064ad33ba451d800c5e823db8f

            {
                "notification_type": "user_validation",
                "settings": {
                  "project_id": 18404,
                  "merchant_id": 2340
                },
                "user": {
                    "ip": "127.0.0.1",
                    "phone": "18777976552",
                    "email": "email@example.com",
                    "id": "1234567",
                    "name": "John Smith",
                    "country": "US"
                }
            }
  user-validation-in-webshop:
    post:
      description: >-
        엑솔라는 사용자가 게임에 존재하는지 확인하기 위해 웹샵 사이트에서 웹훅을 전송합니다. 웹훅이 다음 IP 주소
        '34.102.38.178'로부터 전송되었습니다.

        <div class="note"><strong>참고</strong> <br><br>

        웹훅은 웹샵 솔루션에서 사용자 확인에만 사용됩니다. 웹사이트 빌더에서 웹훅을 구성하는 방법에 대한 자세한 정보는 <a
        target="_blank"
        href="https://developers.xsolla.com/ko/solutions/web-shop/authentication-and-analytics/set-up-authentication/">지침</a>을
        참조해 주세요.</div>
      operationId: user-validation-in-webshop
      requestBody:
        content:
          application/json:
            schema:
              properties:
                settings:
                  description: 사용자 정의 프로젝트 설정 관련 값.
                  properties:
                    merchant_id:
                      $ref: '#/components/schemas/settings.merchant_id'
                    project_id:
                      $ref: '#/components/schemas/settings.project_id'
                  type: object
                user:
                  description: 사용자 세부 사항 관련 값.
                  properties:
                    country:
                      $ref: '#/components/schemas/user.country'
                    id:
                      $ref: '#/components/schemas/user.id'
                  required:
                    - id
                  type: object
              required:
                - user
      responses:
        '200':
          content:
            application/json:
              example:
                attributes:
                  - key: level
                    value: '2'
                  - key: register_country
                    value: AE
                removingKeys:
                  - company
                user:
                  id: '1234567890'
                  name: test-name
                  picture: https://example.com
              schema:
                properties:
                  attributes:
                    description: >-
                      맞춤 설정에 사용되는 사용자 특성. 자세한 정보는 <a target="_blank"
                      href="https://developers.xsolla.com/ko/doc/login/features/user-attributes/#login_features_user_attributes">문서</a>를
                      참조하세요.
                    items:
                      properties:
                        key:
                          description: 특성 이름.
                          type: string
                        value:
                          description: 특성 값.
                      required:
                        - key
                        - value
                    type: array
                  removingKeys:
                    description: >-
                      삭제하려는 특성의 목록입니다. `attributes` 매개변수에서 동일한 특성을 지정하면 삭제되지
                      않습니다.
                    items:
                      type: string
                    type: array
                  user:
                    description: 사용자 세부 사항 관련 값.
                    properties:
                      id:
                        description: 사용자 ID.
                        type: string
                      name:
                        description: 사용자 이름.
                        type: string
                      picture:
                        description: 사용자 아바타에 대한 링크.
                        type: string
                    required:
                      - id
                    type: object
                required:
                  - user
                type: object
          description: 사용자에 대한 정보를 반환.
        '404':
          description: 사용자를 찾을 수 없습니다.
      summary: 웹 상점에서 사용자 유효성 검사
      tags:
        - user-validation
      x-codeSamples:
        - label: CURL
          lang: cURL
          source: |-
            curl -v 'https://your.hostname/your/uri' \
            -X POST \
            -H 'accept: application/json' \
            -H 'content-type: application/json' \
            -d '{
                "settings": {
                  "project_id": 18404,
                  "merchant_id": 2340
                },
                "user": {
                    "id": "1234567",
                    "country": "US"
                }
            }'
        - label: HTTP
          lang: HTTP
          source: |-
            POST /your/uri HTTP/1.1
            host: your.hostname
            accept: application/json
            content-type: application/json
            content-length: 240

            {
                "settings": {
                  "project_id": 18404,
                  "merchant_id": 2340
                },
                "user": {
                    "id": "1234567",
                    "country": "US"
                }
            }
components:
  schemas:
    notification_type:
      description: 알림 유형.
      type: string
    payment_account.country:
      description: >-
        결제 계정의 국가입니다. 예를 들어 카드를 발급한 은행의 국가 또는 PayPal 계정을 생성할 때 지정한 국가입니다. [ISO
        3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)에 따른
        2자리 대문자 국가 코드입니다.
      type: string
    payment_account.id:
      description: 결제 계정 ID.
      type: string
    payment_account.name:
      description: '결제 시스템의 결제 계정 명칭(예: 결제 카드 번호, 이메일).'
      type: string
    payment_account.payment_method:
      description: 결제 수단의 ID입니다.
      type: integer
    payment_account.type:
      description: '결제 계정 유형(예: 카드, PayPal)'
      type: string
    settings.merchant_id:
      description: 판매자 ID입니다.
      type: integer
    settings.project_id:
      description: >-
        프로젝트 ID. 이 매개 변수는 [관리자 페이지](https://publisher.xsolla.com/)의 프로젝트 이름 옆에서
        확인할 수 있습니다.
      type: integer
    user.country:
      description: >-
        사용자의 국가. [ISO 3166-1 alpha-2
        standard](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)에 따른 2자로 된 국가
        코드를 사용합니다.
      type: string
    user.email:
      description: 사용자 이메일.
      type: string
    user.id:
      description: 사용자 ID.
      type: string
    user.ip:
      description: 유저 IP 주소입니다.
      type: string
    user.name:
      description: 사용자 이름.
      type: string
    user.zip:
      description: 우편번호.
      type: string
    subscription.date_create:
      description: >-
        정기결제 생성 날짜입니다. [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601)에 따른 날짜
        및 시간입니다.
      type: string
    subscription.date_end:
      description: >-
        정기결제 종료 날짜입니다. [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601)에 따른 날짜
        및 시간입니다.
      type: string
    subscription.plan_id:
      description: 요금제 ID(API를 통해 생성된 경우, 외부 ID).
      type: string
    subscription.product_id:
      description: 상품 ID(액세스 토큰으로 보낸 경우)입니다.
      type: string
    subscription.subscription_id:
      description: 엑솔라 시스템 내의 정기결제 ID입니다.
      type: integer
    subscription.tags:
      description: 플랜 태그.
      items:
        type: string
      type: array
    subscription.date_next_charge:
      description: >-
        다음 충전 날짜입니다. [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601)에 따른 날짜 및
        시간입니다.
      type: string
    subscription.is_gift:
      description: 정기 결제를 선물했는지 여부입니다. 이 매개 변수는 값이 `true`인 경우에만 전달됩니다.
      type: boolean
    dispute-date:
      description: >-
        [RFC 3339](https://datatracker.ietf.org/doc/html/rfc3339) 표준에 따른 분쟁 시작
        날짜.
      type: string
    dispute-reason:
      description: >-
        분쟁을 시작한 이유. 이유 그룹에 대한 설명은
        [문서](/ko/solutions/payments/anti-fraud/chargeback/#payments_chargeback_reasons)를
        참조해 주세요.
      enum:
        - non_receipt
        - not_as_described
        - duplicate_processing
        - paid_by_other_means
        - incorrect_amount
        - credit_not_processed
        - general
        - fraud
        - cancelled_recurring
        - cancelled_merchandise
        - late_presentment
        - no_authorization
        - problem_with_remittance
        - other
      type: string
    dispute-status:
      description: 분쟁 상태.
      enum:
        - new
        - accepted
        - no_actions_required
        - won
        - lost
      type: string
      x-enumDescriptions:
        accepted: <b>수락됨</b>
        lost: <b>분실</b>
        new: <b>신규</b>
        no_actions_required: <b>진행 중</b>
        won: <b>승소</b>
    dispute-type:
      description: 분쟁 유형.
      enum:
        - 1st_time_chargeback
        - 2nd_time_chargeback
        - arbitration
        - retrieval
        - representment
        - chargeback_reversal
        - representment_reversal
        - reimbursement
        - dispute
        - chargeback
        - claim
        - reimbursement_reversal
        - inquiry
        - other
      type: string
      x-enumDescriptions:
        1st_time_chargeback: 1차 지불 거절.
        2nd_time_chargeback: 2차 지불 거절(사전 중재).
        arbitration: 1차 지불 거절 및 2차 지불 거절이 거부된 경우 발급 은행과 판매자 간의 분쟁 해결.
        chargeback: 1차 지불 거절.
        chargeback_reversal: 지불 거절이 취소되었습니다.
        claim: PayPal에서 고객과 판매자 간의 분쟁.
        dispute: 카드 소유자가 은행에 결제 세부 정보를 요청했습니다.
        inquiry: 카드 소유자가 은행에 결제 세부 정보를 요청했습니다.
        other: 다른 유형에 포함되지 않는 지불 거절 유형에 사용됨.
        reimbursement: 환불이 완료되었습니다.
        reimbursement_reversal: 지불 거절이 취소되었습니다.
        representment: 지불 거절 관리 팀에서 증거를 결제 시스템으로 보냈습니다.
        representment_reversal: 지불 거절이 취소되었습니다.
        retrieval: 카드 소유자가 은행에 결제 세부 정보를 요청했습니다.
    date-create:
      description: 결제일.
      type: string
    external-id:
      description: >-
        거래 외부 ID. 자세한 내용은
        [FAQs](/ko/doc/pay-station/references/faq/#faq_payments_q_new_transaction_external_id)를
        참조해 주세요.
      type: string
    transaction-id:
      description: 트랜잭션 ID.
      type: integer
    dispute-payment-method:
      description: 결제 방식.
      enum:
        - credit_debit_card
        - paypal
      type: string
      x-enumDescriptions:
        credit_debit_card: 신용 카드 또는 직불 카드
        paypal: PayPal
    transaction-total-amount:
      description: 결제 금액입니다.
      format: float
      type: number
    currency:
      description: 통화. [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217)에 따른 3자리 통화 코드입니다.
      type: string
    amount-float:
      description: 구매 금액입니다.
      format: float
      type: number
    items.promotions:
      description: |-
        주문의 특정 아이템에 프로모션을 적용했습니다.
        배열은 다음의 경우에 반환됩니다.
          - 특정 아이템에 대한 할인 프로모션이 구성되어 있는 경우.
          - **선택한 아이템에 대한 할인** 설정이 있는 프로모션 코드가 적용된 경우.

        아이템 수준 프로모션이 적용되지 않으면 빈 배열이 반환됩니다.
      items:
        properties:
          amount_with_discount:
            description: 할인이 적용된 아이템의 총 비용.
            type: string
          amount_without_discount:
            description: 할인이 미적용된 아이템의 총 비용.
            type: string
          sequence:
            description: 프로모션 신청 순서입니다.
            type: integer
        type: object
      type: array
    items.sku:
      description: 아이템의 고유 ID입니다. `game_key` 유형의 아이템은 `sku_drm` 형식의 값을 사용합니다.
      type: string
    items.type:
      description: |-
        아이템 유형.
         인게임 재화 패키지를 포함한 `bundle` 유형의 아이템은 `items` 어레이가 표시됩니다:
          - 번들 또는 인게임 재화 패키지의 매개 변수
          - 번들에 포함된 아이템 또는 패키지에 포함된 화폐
          
         [로열티 포인트](/ko/solutions/loyalty-as-service/) 작업에서 사용하는 `value_point` 유형(포인트를 사용하거나 지급하는 경우).
      enum:
        - virtual_good
        - virtual_currency
        - game_key
        - bundle
        - value_point
      type: string
    currency-type:
      description: 결제 통화 유형. 무료 주문의 경우 `unknown` 값이 지정됩니다.
      enum:
        - real
        - virtual
        - unknown
        - loyalty_point
      type: string
      x-enumDescriptions:
        loyalty_point: 로열티 포인트
        real: 실제 통화
        unknown: 무료 주문
        virtual: 인게임 재화
    order.promotions:
      description: |-
        전체 주문에 프로모션을 적용했습니다.
        배열은 다음의 경우에 반환됩니다.
          - 프로모션이 총 구매 금액에 영향을 미치는 경우(예: **구매 할인** 설정이 적용된 프로모션 코드).
          - 구매에 할인이 적용되지 않지만, 보너스 아이템이 주문에 추가된 경우. 이 경우, 할인이 적용된 가격([amount_with_discount](/ko/webhooks/#operation/order-cancellation!path=order/promotions/amount_with_discount&t=request)) 및 할인이 적용되지 않은 가격([amount_without_discount](/ko/webhooks/#operation/order-cancellation!path=order/promotions/amount_without_discount&t=request))은 할인이 적용되지 않으므로 반환되고 동일하게 유지됩니다.

        주문 수준 프로모션이 적용되지 않으면 빈 배열이 반환됩니다.
      items:
        properties:
          amount_with_discount:
            description: 할인이 적용된 아이템의 총 비용.
            type: string
          amount_without_discount:
            description: 할인이 미적용된 아이템의 총 비용.
            type: string
          sequence:
            description: 프로모션 신청 순서입니다.
            type: integer
        type: object
      type: array
    user.phone:
      description: 유저 전화 번호입니다(국제 형식).
      type: string
    order:
      description: >-
        주문에 대한 정보가 포함된 개체입니다. 이 정보를 받으려면 **프로젝트 설정 &gt; 웹훅 &gt; 고급 설정** 섹션의 [관리자
        페이지](https://publisher.xsolla.com/)에서 **웹훅에 주문 개체 추가** 토글을 **온**으로 설정해
        주세요.
      type: object
    locale:
      description: >-
        사용자 언어입니다. 두 자릿수 소문자 [언어
        코드](https://developers.xsolla.com/ko/doc/pay-station/features/localization/)입니다.
      type: string
    quantity:
      deprecated: true
      description: >-
        한 사용자가 구매할 수 있는 아이템 수량입니다. 수량 한도를 설정하려면 `null`을 전달하세요. 아이템을 구매할 수는 없지만
        카탈로그에는 표시되도록 하려면 `0`을 전달하세요.


        이 매개 변수를 사용하면 구매 한도 정보가 카탈로그에 표시되지 않습니다. 카탈로그에 구매 한도 정보(예: `7/10`)를
        표시하려면 `quantity` 대신 `available` 및 `total` 쌍을 전달하세요.
      type: integer
    available:
      description: |-
        사용자가 구매할 수 있는 남은 아이템 수량입니다.

         카탈로그에 구매 한도 정보(예: `7/10`)를 표시하려면 `available`과 `total` 쌍을 전달하세요.
      type: integer
    total:
      description: |-
        사용자 한 명이 구매할 수 있는 최대 아이템 수량입니다.

         카탈로그에 구매 한도 정보(예: `7/10`)를 표시하려면 `available`과 `total` 쌍을 전달하세요.
      exclusiveMinimum: 0
      type: integer
    bundle_content:
      description: >-
        카탈로그에 표시할 번들 콘텐츠가 포함된 개체 배열입니다. 개체 배열은 번들 유형
        [partner_side_content](https://developers.xsolla.com/ko/api/shop-builder/operation/admin-create-bundle/)에만
        사용할 수 있습니다.
      items:
        properties:
          description:
            description: 카탈로그에 번들로 표시하기 위한 아이템 설명입니다. 입력하지 않으면`null` 값이 전달됩니다.
            maxLength: 255
            type: string
          image_url:
            description: >-
              카탈로그에 번들로 표시될 아이템 이미지 URL입니다. HTTPS 프로토콜만 지원됩니다. 입력하지 않으면 `null`
              값이 전달됩니다.
            format: uri
            maxLength: 255
            type: string
          name:
            description: 카탈로그에 번들의 일부로 표시할 아이템 이름입니다. 입력하지 않으면 빈 문자열이 전달됩니다.
            maxLength: 255
            type: string
          quantity:
            default: 1
            description: 번들에 있는 아이템의 수량입니다.
            minimum: 1
            type: integer
        type: object
      type: array
    date_from:
      description: >-
        아이템을 판매할 수 있는 날짜입니다. 형식은 [RFC
        3339](https://datatracker.ietf.org/doc/html/rfc3339) 기준을 따릅니다.
      type: string
    date_until:
      description: >-
        아이템을 판매할 수 있는 날짜입니다. 형식은 [RFC
        3339](https://datatracker.ietf.org/doc/html/rfc3339) 기준을 따릅니다.
      type: string
    description:
      description: 카탈로그에 표시할 아이템 설명입니다. 아이템에 저장된 설명을 덮어씁니다.
      maxLength: 255
      type: string
    image_url:
      description: >-
        카탈로그에 표시할 이미지 URL입니다. 아이템에 저장된 이미지 URL을 덮어씁니다. HTTPS 프로토콜만 지원됩니다. URL이
        요구 사항에 부합하지 않을 경우 무시됩니다.
      format: uri
      maxLength: 255
      type: string
    json_attributes:
      description: >-
        아이템 속성과 값을 포함하는 JSON 개체입니다. JSON 개체는 아이템에 저장된
        [custom_attributes](https://developers.xsolla.com/ko/webhooks/operation/successful-order-payment/#!path=items/0/custom_attributes&t=request)를
        아이템에 저장합니다. JSON이 요구 사항에 부합하지 않거나 최대 길이보다 길면 무시됩니다.
      format: json
      maxLength: 500
      type: object
    name:
      description: 카탈로그에 표시할 아이템 이름입니다. 아이템에 저장된 이름을 덮어씁니다.
      maxLength: 255
      type: string
    sku:
      description: 게시자 계정에서 지정한 아이템의 고유 ID입니다. `sku` 또는 `item_id`를 전달해야 합니다.
      type: string
    item_id:
      description: 엑솔라 측의 고유 아이템 ID입니다. `sku` 또는 `item_id`를 전달해야 합니다.
      type: integer
    user.public_id:
      description: 공개 사용자 ID입니다.
      type: string
  responses:
    '204':
      description: 성공적인 처리 표시를 반환합니다.
    '400':
      content:
        application/json:
          schema:
            properties:
              error:
                properties:
                  code:
                    type: string
                  message:
                    type: string
                type: object
            type: object
      description: '제공된 정보에 오류가 있는 경우 반환합니다(예: 필수 매개변수 누락, 인증 실패 등).'
      x-examples:
        application/json:
          INCORRECT_AMOUNT:
            summary: Incorrect amount
            value:
              error:
                code: INCORRECT_AMOUNT
                message: Incorrect amount
          INCORRECT_INVOICE:
            summary: Incorrect invoice
            value:
              error:
                code: INCORRECT_INVOICE
                message: Incorrect invoice
          INVALID_PARAMETER:
            summary: Invalid parameter
            value:
              error:
                code: INVALID_PARAMETER
                message: Invalid parameter
          INVALID_SIGNATURE:
            summary: Invalid signature
            value:
              error:
                code: INVALID_SIGNATURE
                message: Invalid signature
          INVALID_USER:
            summary: Invalid user
            value:
              error:
                code: INVALID_USER
                message: Invalid user
    '500':
      description: 서버에 일시적인 오류가 있음을 표시하려면 돌아가세요.
    400-payment:
      content:
        application/json:
          schema:
            properties:
              error:
                properties:
                  code:
                    type: string
                  message:
                    type: string
                type: object
            type: object
      description: >-
        제공된 정보에 오류가 있는 경우 반환됩니다(예: 필수 매개변수 누락, 인증 실패 등). 이 경우 사용자의 돈은 인출되지만 구매는
        실패합니다. 환불을 진행하려면 support@xsolla.com으로 엑솔라 고객 지원에 문의해 주세요.
      x-examples:
        application/json:
          INCORRECT_AMOUNT:
            summary: Incorrect amount
            value:
              error:
                code: INCORRECT_AMOUNT
                message: Incorrect amount
          INCORRECT_INVOICE:
            summary: Incorrect invoice
            value:
              error:
                code: INCORRECT_INVOICE
                message: Incorrect invoice
          INVALID_PARAMETER:
            summary: Invalid parameter
            value:
              error:
                code: INVALID_PARAMETER
                message: Invalid parameter
          INVALID_SIGNATURE:
            summary: Invalid signature
            value:
              error:
                code: INVALID_SIGNATURE
                message: Invalid signature
          INVALID_USER:
            summary: Invalid user
            value:
              error:
                code: INVALID_USER
                message: Invalid user
x-tagGroups:
  - name: 사용자 유효성 검사
    tags:
      - user-validation
  - name: 결제
    tags:
      - payments
  - name: 게임 서비스
    tags:
      - combined-webhooks
      - separate-webhooks
      - personalization
  - name: 부정 결제 방지
    tags:
      - anti-fraud
  - name: 정기 결제
    tags:
      - subscriptions
