# 9. Available Web-Components

Web components provide a user-friendly solution for partners looking to implement a streamlined and interactive payment system. Its ease of inclusion and integration make it simple to set up and customize, providing a seamless user experience from onboarding to transaction and batch processing, to eventual payouts.&#x20;

{% hint style="warning" %}
**Note:** Refer to [this doc](https://docs.payengine.co/developer-docs/getting-started-1/securing-embedded-uis-merchant-session) for guidance on implementing embedded web components. PayEngine now uses **MerchantSession** to enable embedded web components.

If you're currently using HMAC-based security, please note that it has been deprecated and will continue to be supported for backward compatibility. However, we strongly recommend migrating to **MerchantSession** for improved security and future support.
{% endhint %}

### 1. Onboarding

```javascript
<pay-engine
    id="elementID"
    merchant-id="<Merchant ID>"
    type="boarding">
</pay-engine>
```

### 2. Transactions

```javascript
<pay-engine
    id="elementID"
    merchant-id="<Merchant ID>"
    type="transactions">
</pay-engine>
```

To enable the print option in the transaction widget, set the "print-receipt" attribute to true in the transaction web-component as shown below:

```javascript
<pay-engine
    id="elementID"
    merchant-id="<Merchant ID>"
    print-receipt="true"
    type="transactions">
</pay-engine>
```

### 3. Batch Settlements

```javascript
<pay-engine
    id="elementID"
    merchant-id="<Merchant ID>"
    type="payouts"
    view-type="settlement">
</pay-engine>
```

### 4. Payouts (Funding)&#x20;

```javascript
<pay-engine
    id="elementID"
    merchant-id="<Merchant ID>"
    type="payouts"
    view-type="funding">
</pay-engine>
```

### 5. Credit Card Form

{% tabs %}
{% tab title="Credit Card Form" %}

```javascript
<pay-engine
    id="elementID"
    merchant-id="<Merchant ID>"
    type="creditcardform"
    show-zip="true" >
</pay-engine>
```

{% endtab %}

{% tab title="Credit Card Form - Zip Code Properties" %}

```javascript
<pay-engine
    id="elementID"
    merchant-id="<Merchant ID>"
    type="creditcardform"
    show-zip="true" 
    allowed-countries="UK, JP, AU"
    validate-zip="true">
</pay-engine>
```

{% endtab %}

{% tab title="Example" %}

```html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>PayEngine Test</title>

    <script src="http://<PayEngine_HOST>/js/1.0.0/embed.js?key=<Public API Key>"></script>
    <style>
      #btn {
        width: 100%;
        color: #fff;
        background-color: #409eff;
        display: block;
        line-height: 1;
        white-space: nowrap;
        cursor: pointer;
        border: 1px solid #409eff;
        -webkit-appearance: none;
        text-align: center;
        box-sizing: border-box;
        outline: none;
        margin: 0;
        transition: .1s;
        font-weight: 500;
        padding: 12px 20px;
        font-size: 14px;
        border-radius: 4px;
      }
    </style>
  </head>

  <body style="overflow: auto !important">
    <pay-engine style="width: 500px;" id="pf-cc" 
      type="creditcardform" 
      show-zip="true" 
      merchant-id="<Merchant ID>" 
      hash="<HMAC>">
    </pay-engine>
    <button id="btn">Submit</button>
    <h4>Result</h4>
    <div id="result"></div>
    <script>
      document.getElementById('btn').addEventListener('click', function() {
        document.getElementById("pf-cc").submit();
      })
      document.getElementById("pf-cc")?.addEventListener("success", function (e) {
        console.log(e.detail);
        document.getElementById("result").innerHTML = JSON.stringify(e.detail);
      });
      document.getElementById("pf-cc")?.addEventListener("error", function (e) {
        console.log(e.detail);
        document.getElementById("result").innerHTML = JSON.stringify(e.detail);
      });
    </script>
  </body>
</html>
```

{% endtab %}
{% endtabs %}

You can customize the **allowed countries** and **ZIP code validation** behavior in the credit card form web-component using the following properties:

#### `allowed-countries` (optional)

* Defines which countries are allowed for the zip code in the form.
* If not specified, the default is **US** and **CA**.
* Provide a comma-separated list of country codes (case-insensitive), for example: `"JP, AU"`
* To allow **all supported countries**, use: `allowed-countries="INTL"`

#### `validate-zip` (optional)

* Accepts `true` or `false`. Default is `true`.
* When `true`, the form will validate ZIP/postal codes for the allowed countries.
* When `false`, ZIP validation will be skipped for all allowed countries.

{% hint style="info" %}
Supported countries for zip code

`UK`, `JE`, `GG`, `IM`, `US`, `CA`, `IE`, `DE`, `JP`, `FR`, `AU`, `IT`, `CH`, `AT`, `ES`, `NL`, `BE`, `DK`, `SE`, `NO`, `BR`, `PT`, `FI`, `AX`, `KR`, `CN`, `TW`, `SG`, `DZ`, `AD`, `AR`, `AM`, `AZ`, `BH`, `BD`, `BB`, `BY`, `BM`, `BA`, `IO`, `BN`, `BG`, `KH`, `CV`, `CL`, `CR`, `HR`, `CY`, `CZ`, `DO`, `EC`, `EG`, `EE`, `FO`, `GE`, `GR`, `GL`, `GT`, `HT`, `HN`, `HU`, `IS`, `IN`, `ID`, `IL`, `JO`, `KZ`, `KE`, `KW`, `LA`, `LV`, `LB`, `LI`, `LT`, `LU`, `MK`, `MY`, `MV`, `MT`, `MU`, `MX`, `MD`, `MC`, `MA`, `NP`, `NZ`, `NI`, `NG`, `OM`, `PK`, `PY`, `PH`, `PL`, `PR`, `RO`, `RU`, `SM`, `SA`, `SN`, `SK`, `SI`, `ZA`, `LK`, `TJ`, `TH`, `TN`, `TR`, `TM`, `UA`, `UY`, `UZ`, `VA`, `VE`, `ZM`, `AS`, `CC`, `CK`, `RS`, `ME`, `CS`, `YU`, `CX`, `ET`, `FK`, `NF`, `FM`, `GF`, `GN`, `GP`, `GS`, `GU`, `GW`, `HM`, `IQ`, `KG`, `LR`, `LS`, `MG`, `MH`, `MN`, `MP`, `MQ`, `NC`, `NE`, `VI`, `PF`, `PG`, `PM`, `PN`, `PW`, `RE`, `SH`, `SJ`, `SO`, `SZ`, `TC`, `WF`, `XK`, `YT`, `INTL`
{% endhint %}

{% hint style="warning" %}
**Visa 3D Secure Mandate**

Partners must collect cardholder's mobile number OR email address during payment processing. For this purpose, set show-email = "true" and/or show-phone-number = "true"
{% endhint %}

### 6. ACH Form

{% tabs %}
{% tab title="ACH Form" %}

```javascript
<pay-engine
    id="elementID"
    merchant-id="<Merchant ID>"
    type="bankaccountform"> 
</pay-engine>
```

{% endtab %}

{% tab title="ACH Form - Optional Business Bank Account Name" %}

```javascript
<pay-engine
    id="elementID"
    merchant-id="<Merchant ID>"
    type="bankaccountform"
    show-business-name="true"> //optional field
</pay-engine>
```

{% endtab %}

{% tab title="Example" %}

```html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>PayEngine Test</title>

    <script src="http://<PayEngine_HOST>/js/1.0.0/embed.js?key=<Public API Key>"></script>
    <style>
      #btn {
        width: 100%;
        color: #fff;
        background-color: #409eff;
        display: block;
        line-height: 1;
        white-space: nowrap;
        cursor: pointer;
        border: 1px solid #409eff;
        text-align: center;
        box-sizing: border-box;
        outline: none;
        margin: 0;
        transition: .1s;
        font-weight: 500;
        padding: 12px 20px;
        font-size: 14px;
        border-radius: 4px;
      }
    </style>
  </head>

  <body style="overflow: auto !important">
    <pay-engine style="width: 500px;" 
      id="pf-ach" 
      type="bankaccountform" 
      merchant-id="<Merchant ID>" 
      hash="<HAMC>">
    </pay-engine>
    <button id="btn">Submit</button>
    <h4>Result</h4>
    <div id="result"></div>
    <script>
      document.getElementById('btn').addEventListener('click', function() {
        document.getElementById("pf-ach").submit();
      })
      document.getElementById("pf-ach")?.addEventListener("success", function (e) {
        console.log(e.detail);
        document.getElementById("result").innerHTML = JSON.stringify(e.detail);
      });
      document.getElementById("pf-ach")?.addEventListener("error", function (e) {
        console.log(e.detail);
        document.getElementById("result").innerHTML = JSON.stringify(e.detail);
      });
    </script>
  </body>
</html>

```

{% endtab %}
{% endtabs %}

If your use case supports both personal and business bank accounts, you can include the optional `show-business-name` property in the ACH web-component. When enabled, the form will display a **Business Name** input field. This field should be completed by the user when they are entering a business bank account.

### 7. Device Management

```javascript
<pay-engine
    id="elementID"
    merchant-id="<Merchant ID>"
    type="devices">
</pay-engine>
```

### 8. Dispute Management (Contact support to enable)

```javascript
<pay-engine
    id="elementID"
    merchant-id="<Merchant ID>"
    type="disputes">
</pay-engine>
```

### 9. Plaid Connect (Plaid Account Required)

```javascript
<pay-engine
    id="elementID"
    merchant-id="<Merchant ID>"
    type="plaidconnect">
</pay-engine>
```

### 10. Dashboard (Merchant's GMV)

```javascript
<pay-engine
    id="elementID"
    merchant-id="<Merchant ID>"
    type="dashboard">
</pay-engine>
```

### 11. Virtual Terminal

{% tabs %}
{% tab title="Virtual terminal" %}

```javascript
<pay-engine
    id="elementID"
    merchant-id="<Merchant ID>"
    type="merchant-terminal">
</pay-engine>
```

{% endtab %}

{% tab title="Virtual terminal with zip code validation" %}

```javascript
<pay-engine
    id="elementID"
    merchant-id="<Merchant ID>"
    type="merchant-terminal"
    show-zip="true"> //optional field
</pay-engine>
```

{% endtab %}
{% endtabs %}

#### `show-zip` (optional)

* Accepts `true` or `false`. Default is `false`.
* When set to `true`, the form will display a mandatory ZIP/postal code field and apply validation based on the entered ZIP/postal code.

### 12. Merchant Statements

```
<pay-engine
    id="elementID"
    merchant-id="<Merchant ID>"
    type="statements">
</pay-engine>
```

### 13. Merchant Reports

```
<pay-engine
    id="elementID"
    merchant-id="<Merchant ID>"
    type="merchant-reports">
</pay-engine>
```

### &#x20;14. Payment Session and Link

#### a. **Payment Session**

Use the following web-component to embed a customer-facing payment session on your page:

```javascript
<pay-engine
    id="elementID"
    payment-link-id="<Payment Link ID>"
    shouldProcess3ds="true" // Optional. Default is false
    onTransactionEvent="<custom callback function>"
    type="payment-session">
</pay-engine>
```

Note: Refer to the `onTransactionEvent` [documentation](https://docs.payengine.co/api-reference/ui-styleguide-specs/accounting-web-component/payment-link-web-component) for details and usage examples of the callback function.

#### b. Payment Link

To embed the payment link, use the following web-component:

```javascript
<pay-engine
    id="elementID"
    payment-link-id="<Payment Link ID>"
    shouldProcess3ds="true" // Optional. Default is false
    type="payment-link">
</pay-engine>
```

{% hint style="warning" %}
**Difference between Payment Link and Payment Session**

**Payment Session**: If your use case involves displaying a secure form to collect payment information within a modal and showing the transaction status in the same modal through a callback mechanism, then use Payment Session.

**Payment Link**: If your use case requires presenting a payment link that captures additional details—such as contact information—along with payment details, and you prefer to display the link in a flexible manner (not necessarily in a modal), then use Payment Link.
{% endhint %}

#### c.  Creating and Managing Payment Links

To embed the interface for creating and managing payment links, use the following web-component:

```javascript
<pay-engine
    id="elementID"
    merchant-id="<Merchant ID>"
    type="payment-link-create">
</pay-engine>
```

### 15. Payment page

```javascript
<pay-engine
    id="elementID"
    merchant-id="<Merchant ID>"
    shouldProcess3ds="true" // Optional. Default is false
    type="payment-hosted-page">
</pay-engine>
```

### 16. Recurring Payments

```
<pay-engine
    id="elementID"
    merchant-id="<Merchant ID>"
    type="merchant-recurring-payment">
</pay-engine>
```

### 17. Gateway Connection&#x20;

<pre><code><strong>&#x3C;pay-engine
</strong>    id="elementID"
    merchant-id="&#x3C;Merchant ID>"
    type="gateway-connect"
    gateway-id="&#x3C;GATEWAY-ID>">
&#x3C;/pay-engine>
</code></pre>

Please see [Gateway Orchestration](https://docs.payengine.co/payengine-api-reference/transactions/gateway-orchestration) for more details
