> For the complete documentation index, see [llms.txt](https://onestore-dev.gitbook.io/dev/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://onestore-dev.gitbook.io/dev/eng/tools/webshop/billing.md).

# Webshop Payment Integration

{% hint style="info" %}
To integrate ONEshop payments, both PNS reception and purchase confirmation must be implemented.

* [**PNS(Payment Notification Service)**](https://onestore-dev.gitbook.io/dev/eng/tools/webshop/billing#pns)
  * When a user completes a ONEshop item purchase, ONE store sends the payment result to the developer's server URL.
  * Use this information to deliver the item to the user.
* [**Purchase confirmation**](https://onestore-dev.gitbook.io/dev/eng/tools/webshop/billing#purchase)
  * Notifies the ONE store server that the item has been successfully delivered to the user.
  * Depending on your purpose, use consumePurchase or acknowledgePurchase.
  * If purchase confirmation is not completed within 3 days, the purchase is considered undelivered and is automatically canceled. When a purchase is automatically canceled, a PNS with `purchaseState` set to `CANCELED` is sent.
    {% endhint %}

### 1. PNS <a href="#pns" id="pns"></a>

When a payment or cancellation occurs, ONE store sends a notification to the developer’s server.

{% hint style="info" %}
PNS uses the same specification as In‑App Payment API V7. For details, refer to [Using PNS (Push Notification Service)](https://onestore-dev.gitbook.io/dev/eng/tools/billing/v21/pns).
{% endhint %}

#### **1.1 Configure PNS Reception Server URL** <a href="#id-07.pns-pushnotificationservice-pns-url" id="id-07.pns-pushnotificationservice-pns-url"></a>

{% hint style="warning" %}
**Notice**

According to the ONEshop security policy, only the **HTTPS protocol and port 443** are supported. Using any other configuration may result in improper operation.
{% endhint %}

You can configure the PNS server URL in `ONEconsole > Webshop > Developer > Server Integration`.

For detailed setup instructions, refer to [Server Integration](https://onestore-dev.gitbook.io/dev/eng/webshop/integration).

#### 1.2 PNS Detailed Specifications

**HTTP Type :** HTTPS

**URI** : The Payment Notification (PNS) URL set in `ONEconsole > Webshop > Developer > Server Integration`

**Method** : POST

**Request Parameters** : N/A

**Request Header** :

| Name         | Type   | Value              |
| ------------ | ------ | ------------------ |
| Content-Type | String | `application/json` |

**Request Body** : JSON format

<table><thead><tr><th width="328.740478515625">Name</th><th width="155.9791259765625">Type</th><th width="303.3809814453125">Description</th></tr></thead><tbody><tr><td><code>msgVersion</code></td><td>String</td><td><p>Message version</p><ul><li>Development (Sandbox): 3.1.0D</li><li>Production (Production test): 3.1.0</li></ul></td></tr><tr><td><code>clientId</code></td><td>String</td><td>ONEshop Title ID (e.g. <code>WS00000001</code>)</td></tr><tr><td><code>productId</code></td><td>String</td><td>ONEshop Item ID</td></tr><tr><td><code>messageType</code></td><td>String</td><td>Fix SINGLE_PAYMENT_TRANSACTION</td></tr><tr><td><code>purchaseId</code></td><td>String</td><td>Purchase ID</td></tr><tr><td><code>developerPayload</code></td><td>String</td><td>Identifier managed by the developer to identify purchases. The value passed in the validation response is included as is.</td></tr><tr><td><code>purchaseTimeMillis</code></td><td>Long</td><td><p>Time (ms) when the purchase state changed</p><ul><li><code>COMPLETED</code>: Time when the payment was completed</li><li><code>CANCELED</code>: Time when the payment was canceled</li><li>The original payment time can be checked through the purchase details query.</li></ul></td></tr><tr><td><code>purchaseState</code></td><td>String</td><td><p><code>COMPLETED</code>: Payment completed</p><p><code>CANCELED</code>: An order that was refunded or canceled after payment was completed. When you receive this, perform the necessary processing, such as revoking the item you delivered.</p><ul><li><code>CANCELED</code> is also sent when the purchase is automatically canceled because purchase confirmation was not processed within 3 days.</li></ul></td></tr><tr><td><code>price</code></td><td>String</td><td>Payment amount</td></tr><tr><td><code>priceCurrencyCode</code></td><td>String</td><td>Currency code for payment amount (KRW, USD, ...)</td></tr><tr><td><code>productName</code></td><td>String</td><td>It is transmitted when the developer sets up the customized in-app title at the time of purchase request</td></tr><tr><td><code>paymentTypeList[]</code></td><td>List</td><td>List of payment information</td></tr><tr><td><code>paymentTypeList[].paymentMethod</code></td><td>String</td><td>Payment method (for details, refer to the definition of paymentMethod below)</td></tr><tr><td><code>paymentTypeList[].amount</code></td><td>String</td><td>Amount per payment method</td></tr><tr><td><code>billingKey</code></td><td>String</td><td>Billing key for extended function</td></tr><tr><td><code>isTestMdn</code></td><td>Boolean</td><td>Test phone or not (true: test phone, false: not test phone)</td></tr><tr><td><code>purchaseToken</code></td><td>String</td><td>Purchase token</td></tr><tr><td><code>environment</code></td><td>String</td><td><p>Payment environment</p><ul><li>Development (Sandbox): SANDBOX</li><li>Production: COMMERCIAL</li></ul></td></tr><tr><td><code>marketCode</code></td><td>String</td><td><p>Market identification code (MKT_ONE: ONE store, MKT_GLB: Global ONE store)</p><ul><li>For ONEshop, the value is fixed as MKT_ONE</li></ul></td></tr><tr><td><code>signature</code></td><td>String</td><td>Signature for this message</td></tr><tr><td><code>serviceUserId</code></td><td>String</td><td>User's Game ID</td></tr><tr><td><code>serviceServerId</code></td><td>String</td><td>User's Server ID (when a Server List type is set in the Player Identity Field)</td></tr><tr><td><code>serviceCustomFields</code></td><td>String (JSON String)</td><td>User's Custom Field. The <code>{"field key": "input value"}</code> of each Custom Field added in the Player Identity Field (see <a href="https://onestore-dev.gitbook.io/dev/eng/webshop/player-id-fields">Player Identity Field</a>)</td></tr><tr><td><code>quantity</code></td><td>Integer</td><td>Item Quantity</td></tr><tr><td><code>productPrice</code></td><td>String</td><td>Item Price</td></tr></tbody></table>

\
**Example**

```json
{
    "msgVersion":"3.1.0",
    "clientId":"WS00000001",
    "productId":"item1000",
    "messageType":"SINGLE_PAYMENT_TRANSACTION",
    "purchaseId":"SANDBOX3000000004564",
    "developerPayload":"OS_000211234",
    "purchaseTimeMillis":24431212233,
    "purchaseState":"COMPLETED",
    "price":"10000",
    "priceCurrencyCode":"KRW",
    "productName":"GOLD100(+20)",
    "paymentTypeList":[
        {
            "paymentMethod":"ONEPAY",
            "amount":"3000"
        },
        {
            "paymentMethod":"ONESTORECASH",
            "amount":"7000"
        }
    ],
      "billingKey": "36FED4C6E4AC9E29ADAF356057DB98B5CB92126B1D52E8757701E3A261AF49CCFBFC49F5FEF6E277A7A10E9076B523D839E9D84CE9225498155C5065529E22F5",
      "isTestMdn": true,
      "purchaseToken": "TOKEN",
      "environment": "SANDBOX",
      "marketCode": "MKT_ONE",
      "signature": "ajkfl;askfjkladfjksl",
      "serviceUserId": "user1234",
      "serviceServerId": "server01",
      "serviceCustomFields": "{\"characterId\":\"char_1001\",\"guildId\":\"guild_77\"}",
      "quantity": 1,
      "productPrice": "10000"
}
```

<br>

**Definition of paymentMethod (ONE store payment method)**

<table><thead><tr><th width="249.33333333333331">paymentMethod</th><th>Payment method name</th><th>Description</th></tr></thead><tbody><tr><td>DCB</td><td>Mobile phone payment</td><td>Charged as the 'information use fee' item in the telecommunication bill by mobile carriers</td></tr><tr><td>PHONEBILL</td><td>Mobile phone micropayment</td><td>Charged as the 'micropayment' item in the telecommunication bill by mobile carriers</td></tr><tr><td>ONEPAY</td><td>ONE pay</td><td>Easy pay provided by ONE store</td></tr><tr><td>CREDITCARD</td><td>Credit card</td><td>Typical credit card payment</td></tr><tr><td>11PAY</td><td>11Pay</td><td>Simple credit card payment provided by 11st</td></tr><tr><td>NAVERPAY</td><td>N pay</td><td>Naver pay's payment provided by Naver</td></tr><tr><td>CULTURELAND</td><td>Culture Cash</td><td>Culture cash payment provided by Korea Culture Promotion Inc.</td></tr><tr><td>OCB</td><td>OK cashbag</td><td>OK cashback payment provided by SK planet</td></tr><tr><td>ONESTORECASH</td><td>ONE store cash</td><td>ONE store cash payment</td></tr><tr><td>COUPON</td><td>ONE store coupon</td><td>ONE store coupon payment</td></tr><tr><td>POINT</td><td>ONE store point</td><td>ONE store point payment</td></tr><tr><td>TELCOMEMBERSHIP</td><td>Mobile carrier membership</td><td>Membership payment provided by the mobile carrier</td></tr><tr><td>EWALLET</td><td>e-Wallet</td><td>e-Wallet Payment</td></tr><tr><td>BANKACCT</td><td>Account Payment</td><td>Regular Account Payment</td></tr><tr><td>PAYPAL</td><td>Paypal</td><td>Payment provided by PayPal</td></tr><tr><td>MYCARD</td><td>My Card</td><td>Payment with MyCard provided by Soft World</td></tr></tbody></table>

**How to review the signature**

You can check whether the signature has been forced or falsified by using the code below.

* The PublicKey in the code refers to the license key in the License tab of `ONEconsole > Webshop > Developer > Server Integration`.

{% tabs %}
{% tab title="Java" %}

```
import java.security.PublicKey;
import java.security.Signature;
   
import org.apache.commons.codec.binary.Base64;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.node.ObjectNode;
   
   
public class SignatureVerifier {
   
    private static final String SIGN_ALGORITHM = "SHA512withRSA";
    private ObjectMapper mapper = new ObjectMapper();
   
   
    boolean verify(String rawMsg, PublicKey key) throws Exception {
        // Extract the signature from the JSON message.
        JsonNode root = mapper.readTree(rawMsg);
        String signature = root.get("signature").getValueAsText();
        ((ObjectNode)root).remove("signature");
          
        // Verify that the extracted signature is correct.
        Signature sign = Signature.getInstance(SIGN_ALGORITHM);
        sign.initVerify(key);
        sign.update(root.toString().getBytes("UTF-8"));
        return sign.verify(Base64.decodeBase64(signature));
    }
}
```

{% endtab %}

{% tab title="PHP" %}

```
<?php
function formatPublicKey($publicKey) {
 $BEGIN= "-----BEGIN PUBLIC KEY-----";
 $END = "-----END PUBLIC KEY-----";
  
 $pem = $BEGIN . "\n";
 $pem .= chunk_split($publicKey, 64, "\n");
 $pem .= $END . "\n";
  
 return $pem;
}
  
function formatSignature($signature) {
 return base64_decode(chunk_split($signature, 64, "\n"));
}
  
// Sample message
$sampleMessage = '{"msgVersion":"3.1.0D","purchaseId":"SANDBOX3000000004564","developerPayload":"OS_000211234","clientId":"0000000001","productId":"0900001234","messageType":"SINGLE_PAYMENT_TRANSACTION","purchaseMillis":24431212233,"purchaseState":"COMPLETED","price":20000,"productName":"한글은?GOLD100(+20)","paymentTypeList":[{"paymentMethod":"DCB","amount":3000},{"paymentMethod":"ONESTORECASH","amount":7000}],"billingKey":"36FED4C6E4AC9E29ADAF356057DB98B5CB92126B1D52E8757701E3A261AF49CCFBFC49F5FEF6E277A7A10E9076B523D839E9D84CE9225498155C5065529E22F5","isTestMdn":true,"signature":"MNxIl32ws+yYWpUr7om+jail4UQxBUXdNX5yw5PJKlqW2lurfvhiqF0p4XWa+fmyV6+Ot63w763Gnx2+7Zp2Wgl73TWru5kksBjqVJ3XqyjUHDDaF80aq0KvoQdLAHfKze34cJXKR/Qu8dPHK65PDH/Vu6MvPVRB8TvCJpkQrqg="}';
  
// Sample public key
$publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMzpWJoK1GSOrr4juma5+sREYjdCW8/xSd9+6z6PAkUH5af97wy8ecfkLtP9LK5VskryfDlcOjfu0BgmHYntAqKT7B4KWk8jWbJ8VHUpp30H95UbcnCRFDqpEtwYzNA5gNMYKtAdbL41K8Fbum0Xqxo65pPEI4UC3MAG96O7X1WQIDAQAB";
  
  
// Parse JSON message
$jsonArr = json_decode($sampleMessage, true);
  
// Extract and remove signature
$signature = $jsonArr["signature"];
unset($jsonArr["signature"]);
$originalMessage = json_encode($jsonArr, JSON_UNESCAPED_UNICODE);
  
// Veify
$formattedKey = formatPublicKey($publicKey);
$formattedSign = formatSignature($signature);
$hash_algorithm = 'sha512';
  
$success = openssl_verify($originalMessage, $formattedSign, $formattedKey, $hash_algorithm);
if ($success == 1) {
 echo "verified";
}
else {
 echo "unverified";
}
?>
```

{% endtab %}

{% tab title="Python" %}
{% code overflow="wrap" %}

```
# -*- coding: utf-8 -*-
  
import json
from base64 import b64decode
from collections import OrderedDict
  
from Crypto.Hash import SHA512
from Crypto.PublicKey import RSA
from Crypto.Signature import PKCS1_v1_5
  
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
  
hash = "SHA-512"
  
  
def verify(message, signature, pub_key):
    signer = PKCS1_v1_5.new(pub_key)
    digest = SHA512.new()
    digest.update(message)
    return signer.verify(digest, signature)
  
  
jsonData = json.loads(rawMsg, encoding='utf-8', object_pairs_hook=OrderedDict)
signature = jsonData['signature']
del jsonData['signature']
originalMessage = json.dumps(jsonData, ensure_ascii=False, encoding='utf-8', separators=(',', ':'))
  
RSA.importKey(publickey).publickey()
print(verify(originalMessage, b64decode(signature), RSA.importKey(publickey).publickey()))
```

{% endcode %}
{% endtab %}
{% endtabs %}

#### 1.3 Notification Transmission Policy

ONE store's PNS server shall send notification to the developer's server through HTTP(S) requests.

At this time, the developer's server must respond with the HTTP Status Code as 200 to indicate that the notification has been normally received.

If the HTTP Status Code fails to be received as 200 (as the response due to the loss of notification caused by delays in the network or due to the failure in the developer's server), the PNS server determines that the notification transmission has failed, and thereby will perform up to 30 rounds of retransmission during 3 days.

The retransmission of the notification will be performed after certain delays as seen in the example below, and more retransmission rounds will lead to more delays.

**Example**

| Round     | delay (s) | Retransmission Time |
| --------- | --------- | ------------------- |
| 0 (first) | 0         | 2020-05-17 13:10:00 |
| 1         | 30        | 2020-05-17 13:10:30 |
| 2         | 120       | 2020-05-17 13:12:30 |
| 3         | 270       | 2020-05-17 13:17:00 |
| 4         | 480       | 2020-05-17 13:25:00 |
| ...       | ...       | ...                 |

{% hint style="warning" %}
**Notice**

* Because of retransmission, you may receive the same PNS more than once. For notifications whose `purchaseState` is `COMPLETED`, check by `purchaseId` whether the purchase has already been delivered, so that the item is not delivered twice.
* New fields may be added to PNS. Even if a message contains fields that are not defined, do not respond with an error: ignore them and respond with HTTP 200. Signature verification is performed on the original message as received, including any added fields.
  {% endhint %}

### 2. Purchase Confirmation <a href="#purchase" id="purchase"></a>

To ensure that items are delivered correctly, purchase confirmation must be completed.

{% hint style="warning" %}
**OAuth authentication is required to use the ONE store server Open API for purchase confirmation.**

* For details, refer to [ONE store OAuth](https://onestore-dev.gitbook.io/dev/eng/tools/billing/v21/serverapi#onestoreiapserverapi-apiv7-onestoreoauth).
  {% endhint %}

{% hint style="success" %}
**You can retrieve purchases with unprocessed confirmation using the `getUnconfirmedPurchases` API.**

We recommend using this API to ensure stable payment processing.

* Path: `GET https://{host}/v7/apps/{clientId}/unconfirmed-purchases` (`{host}`: the host for each payment environment below, `{clientId}`: ONEshop Title ID)
* The query period covers up to the most recent 1 month from now, and up to 100 records are returned at a time. If more records remain, continue the query with `continuationKey` from the response.
* For details, refer to [getUnconfirmedPurchases](https://onestore-dev.gitbook.io/dev/eng/tools/billing/v21/serverapi#getunconfirmedpurchases).
  {% endhint %}

**Hosts by payment environment**

Call the purchase confirmation APIs and the Access Token issuance API with the host of the same environment as the `environment` value in the PNS.

| PNS `environment` | PNS `msgVersion` | Host                            |
| ----------------- | ---------------- | ------------------------------- |
| `SANDBOX`         | `3.1.0D`         | `https://sbpp.onestore.net`     |
| `COMMERCIAL`      | `3.1.0`          | `https://iap-apis.onestore.net` |

{% hint style="warning" %}
**Notice**

If you call a purchase confirmation API with a host that does not match the payment environment, purchase confirmation fails. A purchase is automatically canceled if purchase confirmation is not processed within 3 days, so be careful not to mix hosts.
{% endhint %}

**Issue an Access Token**

To call the purchase confirmation APIs, you must first issue an Access Token.

| Item     | Details                                                                                         |
| -------- | ----------------------------------------------------------------------------------------------- |
| URI      | `https://{host}/v7/oauth/token` (`{host}`: the host for each payment environment above)         |
| Method   | POST                                                                                            |
| Header   | `Content-Type: application/x-www-form-urlencoded`, `x-market-code` (market classification code) |
| Body     | `grant_type=client_credentials`, `client_id`, `client_secret`                                   |
| Response | `access_token`, `token_type` (bearer), `expires_in` (seconds), `scope`                          |

* For `client_id` and `client_secret`, use the OAuth Client ID and Client Secret in the License tab of `ONEconsole > Webshop > Developer > Server Integration`.
* Access Tokens for Development (Sandbox) and Production are managed separately. Manage Access Tokens separately for each environment.
* For `{clientId}` in the purchase confirmation API path, use the ONEshop Title ID (starting with `WS`).
* Set the issued `access_token` in the `Authorization` header of the purchase confirmation APIs in the format `Bearer {access_token}`.

#### 2.1 consumePurchase

<table data-header-hidden><thead><tr><th width="129.44921875"></th><th></th></tr></thead><tbody><tr><td><strong>Path</strong></td><td>(Production)<br>https://iap-apis.onestore.net/v7/apps/{clientId}/purchases/inapp/products/{productId}/{purchaseToken}/consume<br><br>(Development)<br>https://sbpp.onestore.net/v7/apps/{clientId}/purchases/inapp/products/{productId}/{purchaseToken}/consume</td></tr><tr><td><strong>Description</strong></td><td><ul><li><p>Changes the state of the purchased item (managed product) to consumed.</p><ul><li>After processing, the <strong>user can repurchase the same item.</strong></li></ul></li><li>Error Code: Refer to the <a href="https://onestore-dev.gitbook.io/dev/eng/tools/billing/v21/serverapi#onestoreiapserverapi-apiv7-standardresponsecode">Standard response codes</a></li></ul></td></tr></tbody></table>

* **Method :** POST
* **Request Parameter :** Path Variable format
  * String clientId : ONEshop Title ID (Data Size : 128)
  * String productId : ONEshop Item ID (Data Size : 150)
  * String purchaseToken : Purchase token (Data Size : 20)
* **Request Header:**

  | Parameter Name | Data Type | Required | Description                                                                        |
  | -------------- | --------- | -------- | ---------------------------------------------------------------------------------- |
  | Authorization  | String    | true     | The access\_token issued through the Access Token API                              |
  | Content-Type   | String    | true     | application/json                                                                   |
  | x-market-code  | String    | false    | Market classification code. Enter the `marketCode` value received in the PNS as is |
* **Example**

  ```java
  Request.setHeader("Authorization", "Bearer 680b3621-1234-1234-1234-8adfaef561b4");
  Request.setHeader("Content-Type", "application/json");
  Request.setHeader("x-market-code", "MKT_ONE");
  ```
* **Request Body** : JSON format

  | Element Name     | Data Type | Required | Description |
  | ---------------- | --------- | -------- | ----------- |
  | developerPayload | String    | false    | <p><br></p> |
* **Example :**

  ```json
  {
      "developerPayload": "your payload"
  }
  ```
* **Response Body :** JSON format

  The response is returned in the following format to allow for a more intuitive determination of the process completion when API processing is successful. However, when the API processing fails, it returns the standard error response.

  | Element Name | Data Type | Data Size | Description      |
  | ------------ | --------- | --------- | ---------------- |
  | code         | String    | -         | Response code    |
  | message      | String    | -         | Response message |
  | result       | Object    | -         | <p><br></p>      |
* **Example :**

  ```json
  HTTP/1.1 200 OK
  Content-type: application/json;charset=UTF-8
  {
      "result" : {
          "code" : "Success",
          "message" : "Request has been completed successfully."
      }
  }
  ```

#### 2.2 acknowledgePurchase

<table data-header-hidden><thead><tr><th width="125.921875"></th><th></th></tr></thead><tbody><tr><td><strong>Path</strong></td><td>(Production)<br>https://iap-apis.onestore.net/v7/apps/{clientId}/purchases/all/products/{productId}/{purchaseToken}/acknowledge<br><br>(Development)<br>https://sbpp.onestore.net/v7/apps/{clientId}/purchases/all/products/{productId}/{purchaseToken}/acknowledge</td></tr><tr><td><strong>Description</strong></td><td><ul><li><p>Changes the purchased item (managed product) to the purchase confirmation status.</p><ul><li>After processing, <strong>the user cannot repurchase the same item.</strong></li></ul></li><li>Error Code: Refer to the <a href="https://onestore-dev.gitbook.io/dev/eng/tools/billing/v21/serverapi#onestoreiapserverapi-apiv7-standardresponsecode">Standard response codes</a></li></ul></td></tr></tbody></table>

* **Method :** POST
* **Request Parameter :** Path Variable format
  * String clientId : ONEshop Title ID (Data Size : 128)
  * String productId : ONEshop Item ID (Data Size : 150)
  * String purchaseToken : Purchase token (Data Size : 20)
* **Request Header:**

  | Parameter Name | Data Type | Required | Description                                                                        |
  | -------------- | --------- | -------- | ---------------------------------------------------------------------------------- |
  | Authorization  | String    | true     | The access\_token issued through the Access Token API                              |
  | Content-Type   | String    | true     | application/json                                                                   |
  | x-market-code  | String    | false    | Market classification code. Enter the `marketCode` value received in the PNS as is |
* **Example**

  ```java
  Request.setHeader("Authorization", "Bearer 680b3621-1234-1234-1234-8adfaef561b4");
  Request.setHeader("Content-Type", "application/json");
  Request.setHeader("x-market-code", "MKT_ONE");
  ```
* **Request Body** : JSON format

  | Element Name     | Data Type | Required | Description |
  | ---------------- | --------- | -------- | ----------- |
  | developerPayload | String    | false    | <p><br></p> |
* **Example :**

  ```json
  {
      "developerPayload": "your payload"
  }
  ```
* **Response Body :** JSON format

  The response is returned in the following format to allow for a more intuitive determination of the process completion when API processing is successful. However, when the API processing fails, it returns the standard error response.

  | Element Name | Data Type | Data Size | Description      |
  | ------------ | --------- | --------- | ---------------- |
  | code         | String    | -         | Response code    |
  | message      | String    | -         | Response message |
  | result       | Object    | -         | <p><br></p>      |
* **Example :**

  ```json
  HTTP/1.1 200 OK
  Content-type: application/json;charset=UTF-8
  {
      "result" : {
          "code" : "Success",
          "message" : "Request has been completed successfully."
      }
  }
  ```
