# Toss Payments

### 1. Configure Toss Payments PG settings

Refer to the [**Toss Payments settings**](https://portone.gitbook.io/docs-en/ready/2.-pg/payment-gateway-settings/undefined) page to configure the PG settings.

![](https://2814812280-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FhTv8JEzyM5h4cYcL5StH%2Fuploads%2FQMmHK2gY2o2VYfQ3hVJk%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202022-05-29%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%207.38.40.png?alt=media\&token=a6fbe019-7770-445e-8d9c-5919531cdf14)

### 2. Request payment

To open the payment window, call [JavaScript SDK](https://portone.gitbook.io/docs-en/sdk/javascript-sdk) IMP.**request\_pay**(param, callback).

In PC browsers, <mark style="color:red;">**callback**</mark> is invoked after calling `IMP.request_pay(param, callback)`. In mobile browsers, the page is redirected to <mark style="color:red;">**m\_redirect\_url**</mark>.

{% tabs %}
{% tab title="Authenticated payment request" %}
{% code title="Javascript SDK" %}

```javascript
IMP.request_pay({
    pg : 'uplus',
    pay_method : 'card',
    merchant_uid : '{Merchant created Order ID}', // Example: order_no_0001
    name : 'Order name: Test payment request',
    amount : 14000,
    buyer_email : 'iamport@siot.do',
    buyer_name : 'John Doe',
    buyer_tel : '010-1234-5678',
    buyer_addr : 'Shinsa-dong, Gangnam-gu, Seoul',
    buyer_postcode : '123-456',
    m_redirect_url : '{Mobile only - URL to redirect to after payment approval}' // Example: https://www.my-service.com/payments/complete/mobile
}, function(rsp) { // callback logic
	//* ...Omitted... *//
});
```

{% endcode %}

#### Key parameter description

**`pg`** <mark style="color:red;">**\***</mark>\*\* \*\*<mark style="color:green;">**string**</mark>

**PG code**

* If not specified and this is the only PG setting that exists, `default PG` is automatically set.
* If there are multiple PG settings, set to **`uplus`**.

**`pay_method`** <mark style="color:red;">**\***</mark>\*\* \*\*<mark style="color:green;">**string**</mark>

**Payment method code**

<details>

<summary>Payment method codes</summary>

* `card` (credit card)
* `trans`(instant account transfer)
* `vbank`(virtual account)
* `phone`(mobile micropayment)

</details>

**`merchant_uid`** <mark style="color:red;">**\***</mark>\*\* \*\*<mark style="color:green;">**string**</mark>

**Order ID**

Must be unique for each request.

**`amount`** <mark style="color:red;">**\***</mark>\*\* \*\*<mark style="color:purple;">**integer**</mark>

**Payment amount**

Must be an integer (not string).

**` escrow`` `` `**<mark style="color:orange;">**`boolean`**</mark>

**Ecrow option**

{% embed url="<https://codepen.io/chaiport/pen/qBxbGXy>" %}
Toss Payments payment window
{% endembed %}
{% endtab %}

{% tab title="Non-authenticated payment request" %}
To open non-authenticated payment window, specify the **customer\_uid** parameter. After getting a billing key from this window, you can request payment using the billing key.

{% code title="Javascript SDK" %}

```javascript
IMP.request_pay({
    pg : 'tosspayments',
    pay_method : 'card', // only 'card' supported.
    merchant_uid : '{Merchant created Order ID}', // Example: issue_billingkey_monthly_0001
    name : 'Initial billing key request',
    amount : 0, // For display purpose only (no payment approval).
    customer_uid : '{Unique ID for the card (billing key)}', // Required (Example: gildong_0001_1234)
    buyer_email: "johndoe@gmail.com",
    buyer_name: "John Doe",
    buyer_tel : '02-1234-1234',
    m_redirect_url : '{redirect URL}', // Example: https://www.my-service.com/payments/complete/mobile (for mobile only)
    customer_id :'matthew' // Merchant user ID
}, function(rsp) {
	if ( rsp.success ) {
		alert('Success');
	} else {
		alert('Failed');
	}
});
```

{% endcode %}

{% hint style="info" %}

* To request non-authenticated payment, you must set the **MID issued by Toss Payments** in the Admin console.
* Toss Payments <mark style="color:red;">**does not process the payment**</mark> when issuing the billing key even if you specify an amount.
  {% endhint %}

#### Key parameter description

**`pg`** <mark style="color:red;">**\***</mark>\*\* \*\*<mark style="color:green;">**string**</mark>

**PG code**

* If not specified and this is the only PG setting that exists, `default PG` is automatically set.
* If there are multiple PG settings, set to **`tosspayments`**.

**`customer_uid`** <mark style="color:red;">**\***</mark>\*\* \*\*<mark style="color:green;">**string**</mark>

**Credit card billing key**

Billing key to be mapped 1:1 with the user-entered credit card information.

**`amount`** <mark style="color:red;">**\***</mark>\*\* \*\*<mark style="color:purple;">**Integer**</mark>

**Payment amount**

Amount to display in the payment window, but <mark style="color:red;">actual payment approval is not processed.</mark> (To request payment, use the **REST API with the customer\_uid**.)

**`customer_id`** <mark style="color:red;">**\***</mark>\*\* \*\*<mark style="color:green;">**string**</mark>

**Customer ID**

Customer user ID that maps to billing key. If not specified, this is generated by i'mport.\\

#### Request payment with billing key (customer\_uid)

After successfully getting the billing key, the billing key is **stored on the i'mport server** mapped 1:1 with the specified `customer_uid`. For security reasons, the server cannot directly access the billing key. Subsequent payments can be requested by calling the [<mark style="color:blue;">**non-authenticated payment request REST API**</mark>](https://portone.gitbook.io/docs-en/api/api/api) with the `customer_uid` as follows:

{% code title="sever-side" %}

```
curl -H "Content-Type: application/json" \   
     -X POST -d '{"customer_uid":"your-customer-unique-id", "merchant_uid":"order_id_8237352", "amount":3000}' \
     https://api.iamport.kr/subscribe/payments/again
```

{% endcode %}
{% endtab %}

{% tab title="Non-authenticated API  request" %}
**You can use i'mport REST API to request billing key, request payment, and schedule payment.**

{% hint style="danger" %}
**MID Issuance**

When you get an MID from Toss Payments, the <mark style="color:red;">**API version**</mark> must be <mark style="color:red;">**1.4**</mark>.
{% endhint %}

#### Request one-time payment

To request a one-time payment, use the key-in REST[ **API POST /subscribe/payments/onetime**](https://portone.gitbook.io/docs-en/api/api/request-non-authenticated-payment-one-time-api). The card information is not saved during this process.

```
curl -H "Content-Type: application/json" \   
     -X POST -d '{"merchant_uid":"order_id_8237352", "card_number":"1234-1234-1234-1234", "expiry":"2019-01", "birth":"123456", "amount":3000}' \
     https://api.iamport.kr/subscribe/payments/onetime
```

####

#### Request billing key

To request a billing key, use the billing key request REST [**API POST /subscribe/customers/{customer\_uid}**](https://portone.gitbook.io/docs-en/api/billing-key-api/api-1).

```
curl -H "Content-Type: application/json" \   
     -X POST -d '{"card_number":"1234-1234-1234-1234", "expiry":"2025-12", "birth":"820213", "pwd_2digit":"00"}' \
     https://api.iamport.kr/subscribe/customers/your-customer-unique-id
```

#### Request billing key + initial payment

To request a billing key and initial payment, use the key-in REST [**API POST /subscribe/payments/onetime**](https://portone.gitbook.io/docs-en/api/api/request-non-authenticated-payment-one-time-api).

* **`customer_uid`** : required for saving the billing key.

```
curl -H "Content-Type: application/json" \   
     -X POST -d '{"customer_uid":"your-customer-unique-id", "merchant_uid":"order_id_8237352", "card_number":"1234-1234-1234-1234", "expiry":"2019-01", "birth":"123456", "amount":3000}' \
     https://api.iamport.kr/subscribe/payments/onetime 
```

#### Request payment with billing key

After successfully getting the billing key and making the initial payment, the billing key is stored on the i'mport server mapped 1:1 with the specified `customer_uid`. For security reasons, the server cannot directly access the billing key. Subsequent payments can be requested by calling the repeat pay REST API ([**POST /subscribe/payments/again**](https://portone.gitbook.io/docs-en/api/api/api)) with the `customer_uid` as follows:

```
curl -H "Content-Type: application/json" \   
     -X POST -d '{"customer_uid":"your-customer-unique-id", "merchant_uid":"order_id_8237352", "amount":3000}' \
     https://api.iamport.kr/subscribe/payments/again
```

**For detailed information, refer to:**

{% content-ref url="../../auth/guide-1" %}
[guide-1](https://portone.gitbook.io/docs-en/auth/guide-1)
{% endcontent-ref %}
{% endtab %}
{% endtabs %}

### 3. Additional functions

{% tabs %}
{% tab title="Installment setting" %}
{% code title="javascript" %}

```javascript
display: {
    card_quota: [6],  // Display up to 6 months installment plans
    only_installment: true  // Disable immediate pay option
}
```

{% endcode %}

**Parameters**

* **card\_quota :**
  * Enable only specified installment months
  * `[]`: Only immediate pay
  * `2,3,4,5,6`: immediate, 2, 3, 4, 5, 6 month installment plans
* If **only\_installment: `true`**, only shows specified months in **`card_quota`**.\\

{% hint style="info" %}
Installment plan option is available only for **KRW 50,000 or more**.
{% endhint %}
{% endtab %}

{% tab title="Direct credit card module call" %}
{% code title="javascript" %}

```javascript
card: {
     direct: {
        code: "367",
        quota: 3
    }
}
```

{% endcode %}

**Parameters**

* **code**: [<mark style="color:red;">**Credit card code**</mark>](https://chaifinance.notion.site/53589280bbc94fab938d93257d452216?v=eb405baf52134b3f90d438e3bf763630) (**string**)
* **quota**: Installment plan. For immediate, set to 0. (**integer**)
  {% endtab %}

{% tab title="Enable specific credit cards" %}
{% code title="javascript" %}

```javascript
card : {
    detail : [
        {card_code:"*", enabled:false},     // Disable all credit cards
        {card_code:'366', enabled:true}     // Enable specific credit card
    ]
}
```

{% endcode %}

**Parameters**

* **card\_code:** [<mark style="color:red;">**Credit card code**</mark>](https://chaifinance.notion.site/53589280bbc94fab938d93257d452216?v=eb405baf52134b3f90d438e3bf763630) (<mark style="color:green;">**string)**</mark>
* **enabled:** Option to enable the credit card (<mark style="color:orange;">**boolean)**</mark>
  {% endtab %}
  {% endtabs %}

{% hint style="info" %}
**Hub-type simple payment**

Simple payments (Kakao Pay, Naver Pay, etc.) are not supported in Toss Payments payment window.
{% endhint %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://portone.gitbook.io/docs-en/payment-integration-by-pg/payment-gateways/toss.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
