Build Static Payment

Applicable only for QRIS and Virtual Account, and the mode is API

Finalize Payment Method early

If you choose autoConfirm = true, The payment will be automatically confirmed after you complete the API mode flow — no additional confirmation step is needed

Create Payment Static

A windowed time for the end customer to complete the payment, starting when the client initiates the payment request through your app. For Static Payment, the payment session is always ACTIVE and can be charged multiple times.

API Reference: Create Payment Session

POST [BASE_URL]/v2/payments

{
  "clientReferenceId": "1751610085",
  "amount": { // Mandatory if VA is Closed Static
    "value": 10000,
    "currency": "IDR"
  }, 
  "paymentType": "MULTIPLE",
  "paymentMethod": {
    "type": "VIRTUAL_ACCOUNT"
  },
  "paymentMethodOptions": {
    "virtualAccount": {
      "channel": "PERMATA",
      "virtualAccountName": "Reforza Pivot",
      "virtualAccountNumber": "00000001"
    }
  },
  "mode": "API",
  "redirectUrl": {
    "successReturnUrl": "https://merchant.com/success",
    "failureReturnUrl": "https://merchant.com/failure",
    "expirationReturnUrl": "https://merchant.com/expiration"
  },
  "autoConfirm": true,
  "statementDescriptor": "Reforza Pivot",
  "metadata": {
    "invoiceNo": "INV001"
  }
}
Choose a Payment Type

To create Payment Static, choose Payment Type “MULTIPLE”

{
  "paymentType": "MULTIPLE"
}
Send your Amount object (*conditional)

Only for the Closed Static Virtual Account, you must send the Amount object

{
  "amount": {
    "value": 10000,
    "currency": "IDR"
  }
}
Define Payment Method

Set autoConfirm to true and fill paymentMethod and paymentMethodOptions Object to finalize the payment method from the previous step.

Make sure virtualAccountNumber within our default Static Range or your Configuration range

Reference:

{
  "paymentMethod": {
    "type": "VIRTUAL_ACCOUNT"
  },
  "paymentMethodOptions": {
    "virtualAccount": {
      "channel": "PERMATA",
      "virtualAccountName": "Reforza Pivot",
      "virtualAccountNumber": "99996662"
    }
  },
  "autoConfirm": true
}
Get Payment Information details

After creating the Payment Session, display the payment information details on your customized Payment page, which is returned in the response.

Object Reference: Payment Method Object

{
  "paymentMethod": {
    "type": "VIRTUAL_ACCOUNT",
    "virtualAccount": {
      "channel": "PERMATA",
      "virtualAccountNumber": "7699013199996662",
      "virtualAccountName": "Reforza Pivot",
      "expiryAt": "0001-01-01T00:00:00Z"
    }
  }
}
Simulate Payment

Finalize Payment Method later

If you choose autoConfirm = false, Payment Method can be submitted later during the confirmation step using the confirm API

Create Payment Static

A windowed time for the end customer to complete the payment, starting when the client initiates the payment request through your app. For Static Payment, the payment session is always ACTIVE and can be charged multiple times.

API Reference: Create Payment Session

POST [BASE_URL]/v2/payments

{
  "clientReferenceId": "1751612565",
  "amount": {
    "value": 10000, // Mandatory if VA is Closed Static
    "currency": "IDR"
  },
  "paymentType": "MULTIPLE",
  "mode": "API",
  "redirectUrl": {
    "successReturnUrl": "https://merchant.com/success",
    "failureReturnUrl": "https://merchant.com/failure",
    "expirationReturnUrl": "https://merchant.com/expiration"
  },
  "autoConfirm": false,
  "statementDescriptor": "Reforza Pivot",
  "metadata": {
    "invoiceNo": "INV001"
  }
}
Choose a Payment Type

To create Payment Static, choose Payment Type “MULTIPLE”

{
  "paymentType": "MULTIPLE"
}
Send your Amount object (*conditional)

Only for the Closed Static Virtual Account, you must send the Amount object

{
  "amount": {
    "value": 10000,
    "currency": "IDR"
  }
}
Confirm Payment Session

If you set autoConfirm to false on the Create Payment Session API, you can finalize the Payment Method by filling paymentMethod and paymentMethodOptions objects

Make sure virtualAccountNumber within our default Static Range or your Configuration range

Reference:

POST [BASE_URL]/v2/payments/{id}/confirm

{
  "paymentMethod": {
    "type": "VIRTUAL_ACCOUNT"
  },
  "paymentMethodOptions": {
    "virtualAccount": {
      "channel": "PERMATA",
      "virtualAccountName": "Reforza Pivot",
      "virtualAccountNumber": "99996662"
    }
  }
}
Get Payment Information details

After confirming the Payment Session, display the payment information details on your customized Payment page, which is returned in the response.

Object Reference: Payment Method Object

{
  "paymentMethod": {
    "type": "VIRTUAL_ACCOUNT",
    "virtualAccount": {
      "channel": "PERMATA",
      "virtualAccountNumber": "7699013199996662",
      "virtualAccountName": "Reforza Pivot",
      "expiryAt": "0001-01-01T00:00:00Z"
    }
  }
}
Simulate Payment

Last updated