# SSLCommerz
[SSLCommerz](https://www.sslcommerz.com/) is the first payment gateway in Bangladesh opening doors for merchants to receive payments on the internet via their online stores.

Official documentation [here](https://developer.sslcommerz.com/).

## Installation
```bash
$ composer require smiftakhairul/sslcommerz
```

## Vendor
```bash
$ php artisan vendor:publish --provider="SSLCZ\SSLCommerz\SSLCommerzServiceProvider"
```
A file `sslcommerz.php` will be added to `config` directory after running above command. We need to setup our configuration to `.env` file as follows:

```bash
STORE_ID="your-store-id"
STORE_PASSWORD="your-store-password"
IS_PRODUCTION=false
```
For deveopment mode we need to set `IS_PRODUCTION=false`, and for production mode `IS_PRODUCTION=true`. Please go through the official [docs](https://developer.sslcommerz.com/) of SSLCommerz for further information.

## Usage
#### *Initiate a payment*
```php
$sslcommerz = new SSLCommerz();
$sslcommerz->setPaymentDisplayType('hosted'); // enum('hosted', 'checkout')
$sslcommerz->setPrimaryInformation([
    'total_amount' => 1000,
    'currency' => 'BDT',
]);
$sslcommerz->setTranId('your-transaction-id'); // set your transaction id here
$sslcommerz->setSuccessUrl('http://www.example.com/success');
$sslcommerz->setFailUrl('http://www.example.com/fail');
$sslcommerz->setCancelUrl('http://www.example.com/cancel');
$sslcommerz->setCustomerInformation([
    'cus_name' => 'John Doe',
    'cus_email' => 'john.doe@yahoo.com',
    'cus_add1' => 'Dhaka',
    'cus_add2' => 'Dhaka',
    'cus_city' => 'Dhaka',
    'cus_state' => 'Dhaka',
    'cus_postcode' => '1000',
    'cus_country' => 'Bangladesh',
    'cus_phone' => '+880**********',
]);
$sslcommerz->setShipmentInformation([
    'ship_name' => 'Store Test',
    'ship_add1' => 'Dhaka',
    'ship_add2' => 'Dhaka',
    'ship_city' => 'Dhaka',
    'ship_state' => 'Dhaka',
    'ship_postcode' => '1000',
    'ship_country' => 'Bangladesh',
    'shipping_method' => 'NO',
]);
$sslcommerz->setAdditionalInformation([
    'value_a' => 'CPT-112-A',
    'value_b' => 'CPT-112-B',
    'value_c' => 'CPT-112-C',
    'value_d' => 'CPT-112-D',
]);
$sslcommerz->setEmiOption(1); // enum(1, 0)
$sslcommerz->setProductInformation([
    'product_name' => 'Computer',
    'product_category' => 'Goods',
    'product_profile' => 'physical-goods',
]);
$sslcommerz->setCart([
    ['product' => 'Product X', 'amount' => '2000.00'],
    ['product' => 'Product Y', 'amount' => '4000.00'],
    ['product' => 'Product Z', 'amount' => '8000.00'],
]);
$sslcommerz->setProductAmount('1000');
$sslcommerz->setVat('100');
$sslcommerz->setDiscountAmount('0');
$sslcommerz->setConvenienceFee('50');

$response = $sslcommerz->initPayment($sslcommerz);
```
#### *Set store information dynamically*

```php
$sslcommerz = new SSLCommerz([
    'store_id' => 'your-store-id',
    'store_password' => 'your-store-password',
    'is_production' => false
]);
```

#### *Response*
> You will get a response after initiating a payment by which you can deal with. You can see a sample response format in the official documentation.

### Hosted Payment Integration
```php
// Controller
$sslcommerz = new SSLCommerz();
$sslcommerz->setPaymentDisplayType('hosted');
// ---

$response = $sslcommerz->initPayment($sslcommerz);
return redirect($response['GatewayPageURL']); // redirect to gateway page url
```

### Easy Checkout Integration
```javascript
// View(js) - Step 1
(function (window, document) {
    var loader = function () {
        var script = document.createElement("script"), tag = document.getElementsByTagName("script")[0];
        script.src = "{{ 'Sandbox or Live(Production) Script' }}" + Math.random().toString(36).substring(7);
        tag.parentNode.insertBefore(script, tag);
    };

    window.addEventListener ? window.addEventListener("load", loader, false) : window.attachEvent("onload", loader);
})(window, document);

/*
Sandbox Script URL: https://sandbox.sslcommerz.com/embed.min.js?
Live or Production Script URL: https://seamless-epay.sslcommerz.com/embed.min.js?
 */
```

```html
<!-- View(js) - Step 2 -->
<button class="your-button-class" id="sslczPayBtn"
        token="if you have any token validation"
        postdata="your javascript arrays or objects which requires in backend"
        order="If you already have the transaction generated for current order"
        endpoint="{{ 'your-easy-checkout-pay-url' }}"> Pay Now
</button>
```

```php
// Controller
$sslcommerz = new SSLCommerz();
$sslcommerz->setPaymentDisplayType('checkout');
// ---

$response = $sslcommerz->initPayment($sslcommerz);
echo $sslcommerz->formatCheckoutResponse($response); // show easycheckout pay popup
```

### Disable CSRF Protection
Disable `CSRF` protection for the following URL's. 
- `init-payment-via-ajax` url
- `success` url
- `fail` url
- `cancel` url
- `ipn` url

Disable them from `VerifyCsrfToken` middleware.
```php
// VerifyCsrfToken.php
protected $except = [
    '/init-payment-via-ajax', 
    '/success', 
    '/cancel', 
    '/fail', 
    '/ipn'
];
```

### Order Validation
```php
$sslcommerz = new SSLCommerz();
$response = $sslcommerz->orderValidate([
    'val_id' => $request->input('val_id'),
    'store_id' => 'your-store-id', // Optional: by default `$sslcommerz->getStoreId()`
    'store_password' => 'your-store-password', // Optional: by default `$sslcommerz->getStorePassword()`
    'v' => '1', // Optional: by default `1`
    'format' => 'json' // Optional: by default `json`
]);
```

### Transaction Query
```php
$sslcommerz = new SSLCommerz();

// by Transaction Id
$response = $sslcommerz->transactionQueryById([
    'tran_id' => $request->input('tran_id'),
    'store_id' => 'your-store-id', // Optional: by default `$sslcommerz->getStoreId()`
    'store_password' => 'your-store-password', // Optional: by default `$sslcommerz->getStorePassword()`
]);
// by Session Id
$response = $sslcommerz->transactionQueryBySessionId([
    'sessionkey' => 'initiated-session-key',
    'store_id' => 'your-store-id', // Optional: by default `$sslcommerz->getStoreId()`
    'store_password' => 'your-store-password', // Optional: by default `$sslcommerz->getStorePassword()`
]);
```

### Refund
```php
$sslcommerz = new SSLCommerz();

// Initiate
$response = $sslcommerz->refundPayment([
    'bank_tran_id' => $request->input('bank_tran_id'),
    'store_id' => 'your-store-id', // Optional: by default `$sslcommerz->getStoreId()`
    'store_password' => 'your-store-password', // Optional: by default `$sslcommerz->getStorePassword()`
    'refund_amount' => 1000,
    'refund_remarks' => 'your-refund-remarks',
    'refe_id' => 'your-ref-id', // Optional
    'format' => 'json', // Optional: by default `json`
]);
// Status
$response = $sslcommerz->refundStatus([
    'refund_ref_id' => 'refund-ref-id',
    'store_id' => 'your-store-id', // Optional: by default `$sslcommerz->getStoreId()`
    'store_password' => 'your-store-password', // Optional: by default `$sslcommerz->getStorePassword()`
]);
```

## Available Env's & API's
***Environments:*** `getApiEnvironment()`
- **sandbox** (`IS_PRODUCTION` false)
- **production** (`IS_PRODUCTION` true)

***Domains:*** `getApiDomain()`
- **sandbox** (https://sandbox.sslcommerz.com)
- **production** (https://securepay.sslcommerz.com)

***APIs:***
- `getApiUrl()` ([api_domain]/gwprocess/v4/api.php)
- `getOrderValidateApiUrl()` ([api_domain]/validator/api/validationserverAPI.php)
- `getTransactionStatusApiUrl()` ([api_domain]/validator/api/merchantTransIDvalidationAPI.php)
- `getRefundPaymentApiUrl()` ([api_domain]/validator/api/merchantTransIDvalidationAPI.php)
- `getRefundStatusApiUrl()` ([api_domain]/validator/api/merchantTransIDvalidationAPI.php)


## Available Methods
##### Environment & domain related configuration:
<table>
    <thead>
    <tr>
        <th>Method Name</th>
        <th style="text-align: center">Param Info</th>
        <th>Description</th>
    </tr>
    </thead>
    <tbody>
    <tr>
        <td><code>getApiEnvironment()</code></td>
        <td style="text-align: center"></td>
        <td>API environment: <b>sandbox</b> or <b>production</b>.</td>
    </tr>
    <tr>
        <td><code>setApiEnvironment()</code></td>
        <td style="text-align: center"><span><code>string</code></span></td>
        <td>Set API environment: <b>sandbox</b> or <b>production</b> only.</td>
    </tr>
    <tr>
        <td><code>getApiDomain()</code></td>
        <td style="text-align: center"></td>
        <td>API domain: for example <br><a href="https://sandbox.sslcommerz.com">https://sandbox.sslcommerz.com</a> <br>or
            <br> <a
                href="https://securepay.sslcommerz.com">https://securepay.sslcommerz.com</a></td>
    </tr>
    <tr>
        <td><code>isProductionMode()</code></td>
        <td style="text-align: center"></td>
        <td>Get <b>production_mode</b>.</td>
    </tr>
    <tr>
        <td><code>setProductionMode()</code></td>
        <td style="text-align: center"><span><code>boolean</code></span></td>
        <td>Set <b>production_mode</b>. By default, <b>production_mode</b> sets by <code>IS_PRODUCTION</code> value.</td>
    </tr>
    </tbody>
</table>

##### API url configuration:
<table>
    <thead>
    <tr>
        <th>Method Name</th>
        <th style="text-align: center">Param Info</th>
        <th>Description</th>
    </tr>
    </thead>
    <tbody>
    <tr>
        <td><code>getApiUrl()</code></td>
        <td style="text-align: center"></td>
        <td>Get payment initiate api url.</td>
    </tr>
    <tr>
        <td><code>setApiUrl()</code></td>
        <td style="text-align: center"><span><code>string</code></span></td>
        <td>Set payment initiate api url. By default, api url sets based on <code>IS_PRODUCTION</code> value. If <code>IS_PRODUCTION = true</code>, live api url will be set and for <code>IS_PRODUCTION = false</code> sandbox api url will be set.</td>
    </tr>
    <tr>
        <td><code>getTransactionStatusApiUrl()</code></td>
        <td style="text-align: center"></td>
        <td>Get transaction status api url.</td>
    </tr>
    <tr>
        <td><code>setTransactionStatusApiUrl()</code></td>
        <td style="text-align: center"><span><code>string</code></span></td>
        <td>Set transaction status api url.</td>
    </tr>
    <tr>
        <td><code>getOrderValidateApiUrl()</code></td>
        <td style="text-align: center"></td>
        <td>Get order validation api url.</td>
    </tr>
    <tr>
        <td><code>setOrderValidateApiUrl()</code></td>
        <td style="text-align: center"><span><code>string</code></span></td>
        <td>Set order validation api url.</td>
    </tr>
    <tr>
        <td><code>getRefundPaymentApiUrl()</code></td>
        <td style="text-align: center"></td>
        <td>Get refund payment api url.</td>
    </tr>
    <tr>
        <td><code>setRefundPaymentApiUrl()</code></td>
        <td style="text-align: center"><span><code>string</code></span></td>
        <td>Set refund payment api url.</td>
    </tr>
    <tr>
        <td><code>getRefundStatusApiUrl()</code></td>
        <td style="text-align: center"></td>
        <td>Get refund status api url.</td>
    </tr>
    <tr>
        <td><code>setRefundStatusApiUrl()</code></td>
        <td style="text-align: center"><span><code>string</code></span></td>
        <td>Set refund status api url.</td>
    </tr>
    </tbody>
</table>

#### Set information as a compact:
<table>
    <thead>
    <tr>
        <th>Method Name</th>
        <th style="text-align: center">Param Info</th>
        <th>Description</th>
    </tr>
    </thead>
    <tbody>
    <tr>
        <td><code>getPrimaryInformation()</code></td>
        <td style="text-align: center"></td>
        <td>
            Get primary information such as:
            <br>
            <span>
                    <span><b>store_id</b></span>,
                    <span><b>store_passwd</b></span>,
                    <span><b>total_amount</b></span>,
                    <span><b>currency</b></span>,
                    <span><b>tran_id</b></span>,
                    <span><b>success_url</b></span>,
                    <span><b>fail_url</b></span>,
                    <span><b>cancel_url</b></span> and other optional information.
                </span>
        </td>
    </tr>
    <tr>
        <td><code>setPrimaryInformation()</code></td>
        <td style="text-align: center"><span><code>array()</code></span></td>
        <td>
            Set primary information.
            <br><br>
            Required parameter key elements:
            <ul>
                <li><b>store_id</b></li>
                <li><b>store_passwd</b></li>
                <li><b>total_amount</b></li>
                <li><b>currency</b></li>
                <li><b>tran_id</b></li>
                <li><b>success_url</b></li>
                <li><b>fail_url</b></li>
                <li><b>cancel_url</b></li>
            </ul>
            Optional parameter key elements:
            <ul>
                <li><b>ipn_url</b></li>
                <li><b>multi_card_name</b></li>
                <li><b>allowed_bin</b></li>
            </ul>
        </td>
    </tr>
    <tr>
        <td><code>getCustomerInformation()</code></td>
        <td style="text-align: center"></td>
        <td>
            Get customer information such as:
            <br>
            <span>
                    <span><b>cus_name</b></span>,
                    <span><b>cus_email</b></span>,
                    <span><b>cus_add1</b></span>,
                    <span><b>cus_add2</b></span>,
                    <span><b>cus_city</b></span>,
                    <span><b>cus_postcode</b></span>,
                    <span><b>cus_country</b></span>,
                    <span><b>cus_phone</b></span> and other optional information.
                </span>
        </td>
    </tr>
    <tr>
        <td><code>setCustomerInformation()</code></td>
        <td style="text-align: center"><span><code>array()</code></span></td>
        <td>
            Set customer information.
            <br><br>
            Required parameter key elements:
            <ul>
                <li><b>cus_name</b></li>
                <li><b>cus_email</b></li>
                <li><b>cus_add1</b></li>
                <li><b>cus_add2</b></li>
                <li><b>cus_city</b></li>
                <li><b>cus_postcode</b></li>
                <li><b>cus_country</b></li>
                <li><b>cus_phone</b></li>
            </ul>
            Optional parameter key elements:
            <ul>
                <li><b>cus_state</b></li>
                <li><b>cus_fax</b></li>
            </ul>
        </td>
    </tr>
    <tr>
        <td><code>getProductInformation()</code></td>
        <td style="text-align: center"></td>
        <td>
            Get product information such as:
            <br>
            <span>
                    <span><b>product_name</b></span>,
                    <span><b>product_category</b></span>,
                    <span><b>product_profile</b></span> and other optional information.
                </span>
        </td>
    </tr>
    <tr>
        <td><code>setProductInformation()</code></td>
        <td style="text-align: center"><span><code>array()</code></span></td>
        <td>
            Set product information.
            <br><br>
            Required parameter key elements:
            <ul>
                <li><b>product_name</b></li>
                <li><b>product_category</b></li>
                <li><b>product_profile</b></li>
            </ul>
            Optional parameter key elements:
            <ul>
                <li><b>cart</b></li>
                <li><b>product_amount</b></li>
                <li><b>vat</b></li>
                <li><b>discount_amount</b></li>
                <li><b>convenience_fee</b></li>
                <li><b>hours_till_departure</b></li>
                <li><b>flight_type</b></li>
                <li><b>pnr</b></li>
                <li><b>journey_from_to</b></li>
                <li><b>third_party_booking</b></li>
                <li><b>hotel_name</b></li>
                <li><b>length_of_stay</b></li>
                <li><b>check_in_time</b></li>
                <li><b>hotel_city</b></li>
                <li><b>product_type</b></li>
                <li><b>topup_number</b></li>
                <li><b>country_topup</b></li>
            </ul>
        </td>
    </tr>
    <tr>
        <td><code>getShipmentInformation()</code></td>
        <td style="text-align: center"></td>
        <td>
            Get shipment information such as:
            <br>
            <span>
                    <span><b>shipping_method</b></span>,
                    <span><b>num_of_item</b></span> and other optional information.
                </span>
        </td>
    </tr>
    <tr>
        <td><code>setShipmentInformation()</code></td>
        <td style="text-align: center"><span><code>array()</code></span></td>
        <td>
            Set shipment information.
            <br><br>
            Required parameter key elements:
            <ul>
                <li><b>shipping_method</b></li>
                <li><b>num_of_item</b></li>
            </ul>
            Optional parameter key elements:
            <ul>
                <li><b>ship_name</b></li>
                <li><b>ship_add1</b></li>
                <li><b>ship_add2</b></li>
                <li><b>ship_state</b></li>
                <li><b>ship_city</b></li>
                <li><b>ship_postcode</b></li>
                <li><b>ship_country</b></li>
            </ul>
        </td>
    </tr>
    <tr>
        <td><code>getEmiInformation()</code></td>
        <td style="text-align: center"></td>
        <td>
            Get EMI information such as:
            <br>
            <span>
                    <span><b>emi_option</b></span> and other optional information.
                </span>
        </td>
    </tr>
    <tr>
        <td><code>setEmiInformation()</code></td>
        <td style="text-align: center"><span><code>array()</code></span></td>
        <td>
            Set EMI information.
            <br><br>
            Required parameter key elements:
            <ul>
                <li><b>emi_option</b></li>
            </ul>
            Optional parameter key elements:
            <ul>
                <li><b>emi_max_inst_option</b></li>
                <li><b>emi_selected_inst</b></li>
                <li><b>emi_allow_only</b></li>
            </ul>
        </td>
    </tr>
    <tr>
        <td><code>getAdditionalInformation()</code></td>
        <td style="text-align: center"></td>
        <td>
            Get additional information such as:
            <br>
            <span>
                    <span><b>value_a</b></span>,
                    <span><b>value_b</b></span>,
                    <span><b>value_c</b></span>,
                    <span><b>value_d</b></span>.
                </span>
        </td>
    </tr>
    <tr>
        <td><code>setAdditionalInformation()</code></td>
        <td style="text-align: center"><span><code>array()</code></span></td>
        <td>
            Set additional information.
            <br><br>
            Optional parameter key elements:
            <ul>
                <li><b>value_a</b></li>
                <li><b>value_b</b></li>
                <li><b>value_c</b></li>
                <li><b>value_d</b></li>
            </ul>
        </td>
    </tr>
    </tbody>
</table>

##### Other getters and setters:
<table>
    <thead>
    <tr>
        <th>Method Name</th>
        <th style="text-align: center">Param Info</th>
        <th>Description</th>
    </tr>
    </thead>
    <tbody>
    <tr>
        <td><code>getPaymentDisplayType()</code></td>
        <td style="text-align: center"></td>
        <td>Get payment display type.</td>
    </tr>
    <tr>
        <td><code>setPaymentDisplayType()</code><b>*</b></td>
        <td style="text-align: center"><span><code>enum('hosted', 'checkout')</code></span></td>
        <td>Set payment display type. Default value is <b>checkout</b>.</td>
    </tr>
    <tr>
        <td><code>getStoreId()</code></td>
        <td style="text-align: center"></td>
        <td>Get SSLCommerz <b>store_id</b>.</td>
    </tr>
    <tr>
        <td><code>setStoreId()</code><b>*</b></td>
        <td style="text-align: center"><span><code>string</code></span></td>
        <td>Set SSLCommerz <b>store_id</b>. Default value sets by <code>STORE_ID</code> value.</td>
    </tr>
    <tr>
        <td><code>getStorePassword()</code></td>
        <td style="text-align: center"></td>
        <td>Get SSLCommerz <b>store_passwd</b>.</td>
    </tr>
    <tr>
        <td><code>setStorePassword()</code><b>*</b></td>
        <td style="text-align: center"><span><code>string</code></span></td>
        <td>Set SSLCommerz <b>store_passwd</b>. Default value sets by <code>STORE_PASSWORD</code> value.</td>
    </tr>
    <tr>
        <td><code>getTotalAmount()</code></td>
        <td style="text-align: center"></td>
        <td>Get <b>total_amount</b> of transaction.</td>
    </tr>
    <tr>
        <td><code>setTotalAmount()</code><b>*</b></td>
        <td style="text-align: center"><span><code>decimal</code></span></td>
        <td>Set <b>total_amount</b> of transaction. The transaction amount must be from <b>10.00 BDT</b> to <b>500000.00 BDT</b></td>
    </tr>
    <tr>
        <td><code>getCurrency()</code></td>
        <td style="text-align: center"></td>
        <td>Get <b>currency</b> type. Example: BDT, USD, EUR, SGD, INR, MYR, etc</td>
    </tr>
    <tr>
        <td><code>setCurrency()</code><b>*</b></td>
        <td style="text-align: center"><span><code>string</code></span></td>
        <td>Set <b>currency</b> type.</td>
    </tr>
    <tr>
        <td><code>getTranId()</code></td>
        <td style="text-align: center"></td>
        <td>Get unique <b>tran_id</b> to identify order.</td>
    </tr>
    <tr>
        <td><code>setTranId()</code><b>*</b></td>
        <td style="text-align: center"><span><code>string</code></span></td>
        <td>Set <b>tran_id</b> to unify your order.</td>
    </tr>
    <tr>
        <td><code>getSuccessUrl()</code></td>
        <td style="text-align: center"></td>
        <td>Get callback <b>success_url</b>.</td>
    </tr>
    <tr>
        <td><code>setSuccessUrl()</code><b>*</b></td>
        <td style="text-align: center"><span><code>string</code></span></td>
        <td>Set callback <b>success_url</b> where user will redirect after successful payment.</td>
    </tr>
    <tr>
        <td><code>getFailUrl()</code></td>
        <td style="text-align: center"></td>
        <td>Get callback <b>fail_url</b>.</td>
    </tr>
    <tr>
        <td><code>setFailUrl()</code><b>*</b></td>
        <td style="text-align: center"><span><code>string</code></span></td>
        <td>Set callback <b>fail_url</b> where user will redirect after any failure occurs during payment.</td>
    </tr>
    <tr>
        <td><code>getCancelUrl()</code></td>
        <td style="text-align: center"></td>
        <td>Get callback <b>cancel_url</b>.</td>
    </tr>
    <tr>
        <td><code>setCancelUrl()</code><b>*</b></td>
        <td style="text-align: center"><span><code>string</code></span></td>
        <td>Set callback <b>cancel_url</b> where user will redirect if user cancels the transaction.</td>
    </tr>
    <tr>
        <td><code>getIpnUrl()</code></td>
        <td style="text-align: center"></td>
        <td>Get Instant Payment Notification <b>ipn_url</b>.</td>
    </tr>
    <tr>
        <td><code>setIpnUrl()</code></td>
        <td style="text-align: center"><span><code>string</code></span></td>
        <td>Set <b>ipn_url</b>. Enable instant payment notification option so that SSLCommerz can send the transaction's status to ipn_url.</td>
    </tr>
    <tr>
        <td><code>getMultiCardName()</code></td>
        <td style="text-align: center"></td>
        <td>Get <b>multi_card_name</b>.</td>
    </tr>
    <tr>
        <td><code>setMultiCardName()</code></td>
        <td style="text-align: center"><span><code>string</code></span></td>
        <td>Set <b>multi_card_name</b>. Use it only if gateway list needs to be customized.</td>
    </tr>
    <tr>
        <td><code>getAllowedBin()</code></td>
        <td style="text-align: center"></td>
        <td>Get <b>allowed_bin</b>.</td>
    </tr>
    <tr>
        <td><code>setAllowedBin()</code></td>
        <td style="text-align: center"><span><code>string</code></span></td>
        <td>Set <b>allowed_bin</b>. Use it only if transaction needs to be controlled.</td>
    </tr>
    <tr>
        <td><code>getCustomerName()</code></td>
        <td style="text-align: center"></td>
        <td>Get <b>cus_name</b>.</td>
    </tr>
    <tr>
        <td><code>setCustomerName()</code><b>*</b></td>
        <td style="text-align: center"><span><code>string</code></span></td>
        <td>Set <b>cus_name</b>.</td>
    </tr>
    <tr>
        <td><code>getCustomerEmail()</code></td>
        <td style="text-align: center"></td>
        <td>Get <b>cus_email</b>.</td>
    </tr>
    <tr>
        <td><code>setCustomerEmail()</code><b>*</b></td>
        <td style="text-align: center"><span><code>string</code></span></td>
        <td>Set <b>cus_email</b>.</td>
    </tr>
    <tr>
        <td><code>getCustomerAddress1()</code></td>
        <td style="text-align: center"></td>
        <td>Get <b>cus_add1</b>.</td>
    </tr>
    <tr>
        <td><code>setCustomerAddress1()</code><b>*</b></td>
        <td style="text-align: center"><span><code>string</code></span></td>
        <td>Set <b>cus_add1</b>.</td>
    </tr>
    <tr>
        <td><code>getCustomerAddress2()</code></td>
        <td style="text-align: center"></td>
        <td>Get <b>cus_add2</b>.</td>
    </tr>
    <tr>
        <td><code>setCustomerAddress2()</code></td>
        <td style="text-align: center"><span><code>string</code></span></td>
        <td>Set <b>cus_add2</b>.</td>
    </tr>
    <tr>
        <td><code>getCustomerCity()</code></td>
        <td style="text-align: center"></td>
        <td>Get <b>cus_city</b>.</td>
    </tr>
    <tr>
        <td><code>setCustomerCity()</code><b>*</b></td>
        <td style="text-align: center"><span><code>string</code></span></td>
        <td>Set <b>cus_city</b>.</td>
    </tr>
    <tr>
        <td><code>getCustomerState()</code></td>
        <td style="text-align: center"></td>
        <td>Get <b>cus_state</b>.</td>
    </tr>
    <tr>
        <td><code>setCustomerState()</code></td>
        <td style="text-align: center"><span><code>string</code></span></td>
        <td>Set <b>cus_state</b>.</td>
    </tr>
    <tr>
        <td><code>getCustomerPostCode()</code></td>
        <td style="text-align: center"></td>
        <td>Get <b>cus_postcode</b>.</td>
    </tr>
    <tr>
        <td><code>setCustomerPostCode()</code><b>*</b></td>
        <td style="text-align: center"><span><code>string</code></span></td>
        <td>Set <b>cus_postcode</b>.</td>
    </tr>
    <tr>
        <td><code>getCustomerCountry()</code></td>
        <td style="text-align: center"></td>
        <td>Get <b>cus_country</b>.</td>
    </tr>
    <tr>
        <td><code>setCustomerCountry()</code><b>*</b></td>
        <td style="text-align: center"><span><code>string</code></span></td>
        <td>Set <b>cus_country</b>.</td>
    </tr>
    <tr>
        <td><code>getCustomerPhone()</code></td>
        <td style="text-align: center"></td>
        <td>Get <b>cus_phone</b>.</td>
    </tr>
    <tr>
        <td><code>setCustomerPhone()</code><b>*</b></td>
        <td style="text-align: center"><span><code>string</code></span></td>
        <td>Set <b>cus_phone</b>.</td>
    </tr>
    <tr>
        <td><code>getCustomerFax()</code></td>
        <td style="text-align: center"></td>
        <td>Get <b>cus_fax</b>.</td>
    </tr>
    <tr>
        <td><code>setCustomerFax()</code></td>
        <td style="text-align: center"><span><code>string</code></span></td>
        <td>Set <b>cus_fax</b>.</td>
    </tr>
    <tr>
        <td><code>getProductName()</code></td>
        <td style="text-align: center"></td>
        <td>Get <b>product_name</b>.</td>
    </tr>
    <tr>
        <td><code>setProductName()</code><b>*</b></td>
        <td style="text-align: center"><span><code>string</code></span></td>
        <td>Set <b>product_name</b>.</td>
    </tr>
    <tr>
        <td><code>getProductCategory()</code></td>
        <td style="text-align: center"></td>
        <td>Get <b>product_category</b>.</td>
    </tr>
    <tr>
        <td><code>setProductCategory()</code><b>*</b></td>
        <td style="text-align: center"><span><code>string</code></span></td>
        <td>Set <b>product_category</b>.</td>
    </tr>
    <tr>
        <td><code>getProductProfile()</code></td>
        <td style="text-align: center"></td>
        <td>Get <b>product_profile</b>.</td>
    </tr>
    <tr>
        <td><code>setProductProfile()</code><b>*</b></td>
        <td style="text-align: center"><span><code>string</code></span></td>
        <td>Set <b>product_profile</b>.
            <br><br>Available keys:
            <ol>
                <li>general</li>
                <li>physical-goods</li>
                <li>non-physical-goods</li>
                <li>airline-tickets</li>
                <li>travel-vertical</li>
                <li>telecom-vertical</li>
            </ol>
        </td>
    </tr>
    <tr>
        <td><code>getProductHoursTillDeparture()</code></td>
        <td style="text-align: center"></td>
        <td>Get <b>hours_till_departure</b>.</td>
    </tr>
    <tr>
        <td><code>setProductHoursTillDeparture()</code><b>**</b></td>
        <td style="text-align: center"><span><code>string</code></span></td>
        <td>Set <b>hours_till_departure</b>. <b>Required</b> if <code>product_profile</code> is <b>airline-tickets</b>.</td>
    </tr>
    <tr>
        <td><code>getProductFlightType()</code></td>
        <td style="text-align: center"></td>
        <td>Get <b>flight_type</b>.</td>
    </tr>
    <tr>
        <td><code>setProductFlightType()</code><b>**</b></td>
        <td style="text-align: center"><span><code>string</code></span></td>
        <td>Set <b>flight_type</b>. <b>Required</b> if <code>product_profile</code> is <b>airline-tickets</b>.</td>
    </tr>
    <tr>
        <td><code>getProductPnr()</code></td>
        <td style="text-align: center"></td>
        <td>Get <b>pnr</b>.</td>
    </tr>
    <tr>
        <td><code>setProductPnr()</code><b>**</b></td>
        <td style="text-align: center"><span><code>string</code></span></td>
        <td>Set <b>pnr</b>. <b>Required</b> if <code>product_profile</code> is <b>airline-tickets</b>.</td>
    </tr>
    <tr>
        <td><code>getProductJourneyFromTo()</code></td>
        <td style="text-align: center"></td>
        <td>Get <b>journey_from_to</b>.</td>
    </tr>
    <tr>
        <td><code>setProductJourneyFromTo()</code><b>**</b></td>
        <td style="text-align: center"><span><code>string</code></span></td>
        <td>Set <b>journey_from_to</b>. <b>Required</b> if <code>product_profile</code> is <b>airline-tickets</b>.</td>
    </tr>
    <tr>
        <td><code>getProductThirdPartyBooking()</code></td>
        <td style="text-align: center"></td>
        <td>Get <b>third_party_booking</b>.</td>
    </tr>
    <tr>
        <td><code>setProductThirdPartyBooking()</code><b>**</b></td>
        <td style="text-align: center"><span><code>string</code></span></td>
        <td>Set <b>third_party_booking</b>. <b>Required</b> if <code>product_profile</code> is <b>airline-tickets</b>.</td>
    </tr>
    <tr>
        <td><code>getProductHotelName()</code></td>
        <td style="text-align: center"></td>
        <td>Get <b>hotel_name</b>.</td>
    </tr>
    <tr>
        <td><code>setProductHotelName()</code><b>**</b></td>
        <td style="text-align: center"><span><code>string</code></span></td>
        <td>Set <b>hotel_name</b>. <b>Required</b> if <code>product_profile</code> is <b>travel-vertical</b>.</td>
    </tr>
    <tr>
        <td><code>getProductLengthOfStay()</code></td>
        <td style="text-align: center"></td>
        <td>Get <b>length_of_stay</b>.</td>
    </tr>
    <tr>
        <td><code>setProductLengthOfStay()</code><b>**</b></td>
        <td style="text-align: center"><span><code>string</code></span></td>
        <td>Set <b>length_of_stay</b>. <b>Required</b> if <code>product_profile</code> is <b>travel-vertical</b>.</td>
    </tr>
    <tr>
        <td><code>getProductCheckInTime()</code></td>
        <td style="text-align: center"></td>
        <td>Get <b>check_in_time</b>.</td>
    </tr>
    <tr>
        <td><code>setProductCheckInTime()</code><b>**</b></td>
        <td style="text-align: center"><span><code>string</code></span></td>
        <td>Set <b>check_in_time</b>. <b>Required</b> if <code>product_profile</code> is <b>travel-vertical</b>.</td>
    </tr>
    <tr>
        <td><code>getProductHotelCity()</code></td>
        <td style="text-align: center"></td>
        <td>Get <b>hotel_city</b>.</td>
    </tr>
    <tr>
        <td><code>setProductHotelCity()</code><b>**</b></td>
        <td style="text-align: center"><span><code>string</code></span></td>
        <td>Set <b>hotel_city</b>. <b>Required</b> if <code>product_profile</code> is <b>travel-vertical</b>.</td>
    </tr>
    <tr>
        <td><code>getProductType()</code></td>
        <td style="text-align: center"></td>
        <td>Get <b>product_type</b>.</td>
    </tr>
    <tr>
        <td><code>setProductType()</code><b>**</b></td>
        <td style="text-align: center"><span><code>string</code></span></td>
        <td>Set <b>product_type</b>. <b>Required</b> if <code>product_profile</code> is <b>telecom-vertical</b>.</td>
    </tr>
    <tr>
        <td><code>getProductTopUpNumber()</code></td>
        <td style="text-align: center"></td>
        <td>Get <b>topup_number</b>.</td>
    </tr>
    <tr>
        <td><code>setProductTopUpNumber()</code><b>**</b></td>
        <td style="text-align: center"><span><code>string</code></span></td>
        <td>Set <b>topup_number</b>. <b>Required</b> if <code>product_profile</code> is <b>telecom-vertical</b>.</td>
    </tr>
    <tr>
        <td><code>getProductCountryTopUp()</code></td>
        <td style="text-align: center"></td>
        <td>Get <b>country_topup</b>.</td>
    </tr>
    <tr>
        <td><code>setProductCountryTopUp()</code><b>**</b></td>
        <td style="text-align: center"><span><code>string</code></span></td>
        <td>Set <b>country_topup</b>. <b>Required</b> if <code>product_profile</code> is <b>telecom-vertical</b>.</td>
    </tr>
    <tr>
        <td><code>getCart()</code></td>
        <td style="text-align: center"></td>
        <td>Get <b>cart</b>.</td>
    </tr>
    <tr>
        <td><code>setCart()</code></td>
        <td style="text-align: center"><span><code>json</code></span></td>
        <td>Set <b>cart</b>. JSON data with two elements. <b>product</b>: Max 255 characters, <b>quantity</b>: Quantity in numeric value and <b>amount</b>: Decimal (12,2).<br><br>Example:<br><code>[{"product":"DHK TO BRS AC A1","quantity":"1","amount":"200.00"},{"product":"DHK TO BRS AC A2","quantity":"1","amount":"200.00"},{"product":"DHK TO BRS AC A3","quantity":"1","amount":"200.00"},{"product":"DHK TO BRS AC A4","quantity":"2","amount":"200.00"}]</code></td>
    </tr>
    <tr>
        <td><code>getProductAmount()</code></td>
        <td style="text-align: center"></td>
        <td>Get <b>product_amount</b>.</td>
    </tr>
    <tr>
        <td><code>setProductAmount()</code></td>
        <td style="text-align: center"><span><code>decimal</code></span></td>
        <td>Set <b>product_amount</b>.</td>
    </tr>
    <tr>
        <td><code>getVat()</code></td>
        <td style="text-align: center"></td>
        <td>Get <b>vat</b>.</td>
    </tr>
    <tr>
        <td><code>setVat()</code></td>
        <td style="text-align: center"><span><code>decimal</code></span></td>
        <td>Set <b>vat</b>.</td>
    </tr>
    <tr>
        <td><code>getDiscountAmount()</code></td>
        <td style="text-align: center"></td>
        <td>Get <b>discount_amount</b>.</td>
    </tr>
    <tr>
        <td><code>setDiscountAmount()</code></td>
        <td style="text-align: center"><span><code>decimal</code></span></td>
        <td>Set <b>discount_amount</b>.</td>
    </tr>
    <tr>
        <td><code>getConvenienceFee()</code></td>
        <td style="text-align: center"></td>
        <td>Get <b>convenience_fee</b>.</td>
    </tr>
    <tr>
        <td><code>setConvenienceFee()</code></td>
        <td style="text-align: center"><span><code>decimal</code></span></td>
        <td>Set <b>convenience_fee</b>.</td>
    </tr>
    <tr>
        <td><code>getShippingMethod()</code></td>
        <td style="text-align: center"></td>
        <td>Get <b>shipping_method</b> of the order.</td>
    </tr>
    <tr>
        <td><code>setShippingMethod()</code><b>*</b></td>
        <td style="text-align: center"><span><code>string</code></span></td>
        <td>Set <b>shipping_method</b> of the order. Example: YES or NO or Courier.</td>
    </tr>
    <tr>
        <td><code>getShippingItemNumber()</code></td>
        <td style="text-align: center"></td>
        <td>Get <b>num_of_item</b> of product.</td>
    </tr>
    <tr>
        <td><code>setShippingItemNumber()</code><b>*</b></td>
        <td style="text-align: center"><span><code>integer</code></span></td>
        <td>Set <b>num_of_item</b> of product will be shipped.</td>
    </tr>
    <tr>
        <td><code>getShippingName()</code></td>
        <td style="text-align: center"></td>
        <td>Get <b>ship_name</b> of address.</td>
    </tr>
    <tr>
        <td><code>setShippingName()</code><b>**</b></td>
        <td style="text-align: center"><span><code>string</code></span></td>
        <td>Set <b>ship_name</b> of address. <b>Required</b> if <code>shipping_method</code> is <b>YES</b>.</td>
    </tr>
    <tr>
        <td><code>getShippingAddress1()</code></td>
        <td style="text-align: center"></td>
        <td>Get <b>ship_add1</b>.</td>
    </tr>
    <tr>
        <td><code>setShippingAddress1()</code><b>**</b></td>
        <td style="text-align: center"><span><code>string</code></span></td>
        <td>Set <b>ship_add1</b>. <b>Required</b> if <code>shipping_method</code> is <b>YES</b>.</td>
    </tr>
    <tr>
        <td><code>getShippingAddress2()</code></td>
        <td style="text-align: center"></td>
        <td>Get <b>ship_add2</b>.</td>
    </tr>
    <tr>
        <td><code>setShippingAddress2()</code></td>
        <td style="text-align: center"><span><code>string</code></span></td>
        <td>Set <b>ship_add2</b>.</td>
    </tr>
    <tr>
        <td><code>getShippingCity()</code></td>
        <td style="text-align: center"></td>
        <td>Get <b>ship_city</b>.</td>
    </tr>
    <tr>
        <td><code>setShippingCity()</code><b>**</b></td>
        <td style="text-align: center"><span><code>string</code></span></td>
        <td>Set <b>ship_city</b>. <b>Required</b> if <code>shipping_method</code> is <b>YES</b>.</td>
    </tr>
    <tr>
        <td><code>getShippingState()</code></td>
        <td style="text-align: center"></td>
        <td>Get <b>ship_state</b>.</td>
    </tr>
    <tr>
        <td><code>setShippingState()</code></td>
        <td style="text-align: center"><span><code>string</code></span></td>
        <td>Set <b>ship_state</b>.</td>
    </tr>
    <tr>
        <td><code>getShippingPostCode()</code></td>
        <td style="text-align: center"></td>
        <td>Get <b>ship_postcode</b>.</td>
    </tr>
    <tr>
        <td><code>setShippingPostCode()</code><b>**</b></td>
        <td style="text-align: center"><span><code>string</code></span></td>
        <td>Set <b>ship_postcode</b>. <b>Required</b> if <code>shipping_method</code> is <b>YES</b>.</td>
    </tr>
    <tr>
        <td><code>getShippingCountry()</code></td>
        <td style="text-align: center"></td>
        <td>Get <b>ship_country</b>.</td>
    </tr>
    <tr>
        <td><code>setShippingCountry()</code><b>**</b></td>
        <td style="text-align: center"><span><code>string</code></span></td>
        <td>Set <b>ship_country</b>. <b>Required</b> if <code>shipping_method</code> is <b>YES</b>.</td>
    </tr>
    <tr>
        <td><code>getEmiOption()</code></td>
        <td style="text-align: center"></td>
        <td>Get <b>emi_option</b>.</td>
    </tr>
    <tr>
        <td><code>setEmiOption()</code><b>*</b></td>
        <td style="text-align: center"><span><code>integer</code></span></td>
        <td>Set <b>emi_option</b>. Value must be 1 or 0.</td>
    </tr>
    <tr>
        <td><code>getEmiMaxInstOption()</code></td>
        <td style="text-align: center"></td>
        <td>Get <b>emi_max_inst_option</b>.</td>
    </tr>
    <tr>
        <td><code>setEmiMaxInstOption()</code></td>
        <td style="text-align: center"><span><code>integer</code></span></td>
        <td>Set <b>emi_max_inst_option</b>.</td>
    </tr>
    <tr>
        <td><code>getEmiSelectedInst()</code></td>
        <td style="text-align: center"></td>
        <td>Get <b>emi_selected_inst</b>.</td>
    </tr>
    <tr>
        <td><code>setEmiSelectedInst()</code></td>
        <td style="text-align: center"><span><code>integer</code></span></td>
        <td>Set <b>emi_selected_inst</b>.</td>
    </tr>
    <tr>
        <td><code>getEmiAllowOnly()</code></td>
        <td style="text-align: center"></td>
        <td>Get <b>emi_allow_only</b>.</td>
    </tr>
    <tr>
        <td><code>setEmiAllowOnly()</code></td>
        <td style="text-align: center"><span><code>integer</code></span></td>
        <td>Set <b>emi_allow_only</b>. Value must be 1 or 0. This parameter depends on <b>emi_option</b> and <b>emi_selected_inst</b></td>
    </tr>
    <tr>
        <td><code>getAdditionalValueA()</code></td>
        <td style="text-align: center"></td>
        <td>Get <b>value_a</b>.</td>
    </tr>
    <tr>
        <td><code>setAdditionalValueA()</code></td>
        <td style="text-align: center"><span><code>string</code></span></td>
        <td>Set <b>value_a</b>.</td>
    </tr>
    <tr>
        <td><code>getAdditionalValueB()</code></td>
        <td style="text-align: center"></td>
        <td>Get <b>value_b</b>.</td>
    </tr>
    <tr>
        <td><code>setAdditionalValueB()</code></td>
        <td style="text-align: center"><span><code>string</code></span></td>
        <td>Set <b>value_b</b>.</td>
    </tr>
    <tr>
        <td><code>getAdditionalValueC()</code></td>
        <td style="text-align: center"></td>
        <td>Get <b>value_c</b>.</td>
    </tr>
    <tr>
        <td><code>setAdditionalValueC()</code></td>
        <td style="text-align: center"><span><code>string</code></span></td>
        <td>Set <b>value_c</b>.</td>
    </tr>
    <tr>
        <td><code>getAdditionalValueD()</code></td>
        <td style="text-align: center"></td>
        <td>Get <b>value_d</b>.</td>
    </tr>
    <tr>
        <td><code>setAdditionalValueD()</code></td>
        <td style="text-align: center"><span><code>string</code></span></td>
        <td>Set <b>value_d</b>.</td>
    </tr>
    </tbody>
</table>


`*` = **Required** and `**` = **Dependently Required**.

## License
[MIT](https://choosealicense.com/licenses/mit/)