# rn-amazon-payment-services

Amazon Payment Service Sdk react native package

## Installation

```sh
npm install rn-amazon-payment-services
```

#### Android

You need to add the repository to your build file. Add it in your root build.gradle (/android/build.gradle) at the end of repositories

```java
allprojects {
  repositories {
    ...
      maven { url "https://android-sdk.payfort.com" }
  }
}
```

You need to also make sure that following two permission are set in the AndroidManifest.xml (android/app/src/main/AndroidManifest.xml):
```xml
    < uses-permission android:name="android.permission.INTERNET" />
    < uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
```


#### iOS

1- Add the following code to your Podfile (inside the target section):

```
pod 'PayFortSDK'
```

2- Add the following to the bottom of your Podfile:

```
   post_install do |installer|
        installer.pods_project.targets.each do |target|
          if ['PayFortSDK'].include? target.name
            target.build_configurations.each do |config|
                config.build_settings['BUILD_LIBRARY_FOR_DISTRIBUTION'] = 'YES'
            end
          end
        end
      end

```
<br>


## Usage

```js
import {
  getDeviceId,
  FortRequestObject,
  StandardCheckout,
} from 'rn-amazon-payment-services';

// ...

export default function App() {

  const [deviceId, setDeviceId] = useState<string>('');
  const [showStandardCheckout, setShowStandardCheckout] = useState<boolean>(false);

  const setupDeviceId = async () => {
    const id: string = await getDeviceId();
    setDeviceId(id);
  };

  const onSuccess = (response: any) => {
    console.log('success', response);
    setShowCustomScreen(false);
  };

  const onFailure = (response: any) => {
    console.log('failure', response);
    setShowCustomScreen(false);
  };

  const onCancel = (response: any) => {
    console.log('cancel', response);
    setShowStandardCheckout(false);
  };

  // request object example for standard and custom ui checkout
  const requestObject: FortRequestObject = {
    command: 'PURCHASE',
    merchant_reference: 'ORD-0000007682',
    amount: '100',
    currency: 'AED',
    language: 'en',
    customer_email: 'sam@gmail.com',
    sdk_token: sdkToken,
    payment_option: 'VISA',
  };

  //...

  // Standard Checkout component
  return(
      <StandardCheckout
        showStandardCheckoutPage={showStandardCheckout}
        environment={'TEST'}
        requestCode={123455}
        showLoading={true}
        showResponsePage={true}
        requestObject={requestObject}
        onSuccess={onSuccess}
        onFailure={onFailure}
        onCancel={onCancel}
      />
  )
}

// ...

```
<br>

### Standard Checkout Props

| Name                                     | Value                        | Description                                                                                                              |   Mandatory   |
| ---------------------------------------- | ---------------------------- | -------------------------------------------------------------------------------------------------------------------------|---------------|
| showStandardCheckoutPage                 | `boolean`                    | Navigates to Amazon Payment Service Standard Checkout screen                                                             |      Yes      |
| environment                              | `'TEST'`, `'PRODUCTION'`     | Parameter used to determine whether the request is going to be submitted to the test or production environment.          |      Yes      |
| requestCode                              | `number`                     | Unique ID for this request.                                                                                              |      Yes      |
| showLoading                              | `boolean`                    | Flag to show or hide the loading dialog.                                                                                 |      Yes      |
| showResponsePage                         | `boolean`                    | Flag to show or hide response page after payment is done.                                                                |      Yes      |
| requestObject                            | `object`                     | Parameters you need to send when you send a request (the full list of parameters is in the last section of the document) |      Yes      |
| onSuccess                                | `function`                   | Callback to handle when the transaction is processed successfully.                                                       |      Yes      |
| onFailure                                | `function`                   | Callback to handle when the transaction is failed.                                                                       |      Yes      |
| onCancel                                 | `function`                   | Callback to handle when the user cancels the payment by clicking the back button.                                        |      No       |

<br>


### Custom UI Checkout

```js
import {
  CustomCheckoutView,
} from 'rn-amazon-payment-services';


// ...


// Custom Checkout UI component
  return(
    <CustomCheckoutView
      requestObject={requestObject}
      environment={'TEST'}
      style={{ width: 300, height: 400 }}
      payButtonProps={{
        marginLeft: 20,
        marginTop: 20,
        backgroundColor: '#026cff',
        text: 'Pay',
        textSize: 20,
        textColor: '#ffffff',
        buttonWidth: 40,
        buttonHeight: 40,
        borderRadius: 20,
        borderWidth: 1,
        borderColor: '#383333',
      }}
      onFailure={onFailure}
      onSuccess={onSuccess}
    />
  )

```
<br>

### Direct Pay Checkout


```js
import {
  DirectPayButton,
  FortRequestObjectDirectPay,
} from 'rn-amazon-payment-services';

//...

  const requestObjectDirectPay: FortRequestObjectDirectPay = {
    command: 'AUTHORIZATION',
    merchant_reference: 'ORD-0000007682',
    amount: '100',
    currency: 'AED',
    language: 'en',
    customer_email: 'sam@gmail.com',
    sdk_token: sdkToken,
    payment_option: 'VISA',
    token_name: tokenName,
    card_security_code: '123',
  };


  return(
      <DirectPayButton
        requestObject={requestObjectDirectPay}
        environment={'TEST'}
        style={{ width: 200, height: 100 }}
        payButtonProps={{
          marginLeft: 20,
          marginTop: 20,
          backgroundColor: '#026cff',
          text: 'Pay',
          textSize: 20,
          textColor: '#ffffff',
          buttonWidth: 40,
          buttonHeight: 40,
          borderRadius: 20,
          borderWidth: 1,
          borderColor: '#383333',
        }}
        onFailure={onFailure}
        onSuccess={onSuccess}
      />
    )

```

### Custom UI and Direct Checkout Props

| Name                                     | Value                        | Description                                                                                        |   Mandatory   |
| ---------------------------------------- | ---------------------------- | ---------------------------------------------------------------------------------------------------|---------------|
| environment                              | `'TEST'`, `'PRODUCTION'`     | Parameter used to determine whether the request is going to be submitted to the test or production environment. |      Yes      |
| style                                    | `object`                     | Set the height and width of the view                                                               |      Yes      |
| payButtonProps                           | `object`                     | Customization of the pay button                                                                    |      Yes      |
| requestObject                            | `object`                     | Parameters you need to send when you send a request (the full list of parameters is in the last section of the document)                                   |      Yes      |
| onSuccess                                | `function`                   | Callback to handle when the transaction is processed successfully.                                 |      Yes      |
| onFailure                                | `function`                   | Callback to handle when the transaction is failed.                                                 |      Yes      |


<br>
<hr/>


### Request Parameters (FortRequestObject)

| Attribute            | Type         | Description                                                                                                                                                                                                                                                                        | Mandatory | Maximum | Example                                                               |
|----------------------|--------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------|---------|-----------------------------------------------------------------------|
| command              | Alpha        | Command.<br>Possible/ expected values: AUTHORIZATION, PURCHASE                                                                                                                                                                                                                     | Yes       | 20      | PURCHASE                                                              |
| merchant_reference   | Alphanumeric | The Merchant’s unique order number.                                                                                                                                                                                                                                                | Yes       | 40      | XYZ9239-yu898                                                         |
| amount               | Numeric      | The transaction’s amount. *Each currency has predefined allowed decimal points that should be taken into consideration when sending the amount                                                                                                                                     | Yes       | 10      | 10000                                                                 |
| currency             | Alpha        | The currency of the transaction’s amount in ISO code 3.                                                                                                                                                                                                                            | Yes       | 3       | AED                                                                   |
| language             | Alpha        | The checkout page and messages language.<br>Possible/ expected values: en/ ar                                                                                                                                                                                                      | Yes       | 2       | en                                                                    |
| customer_email       | Alphanumeric | The customer’s email.<br>Special characters: _ - . @ +                                                                                                                                                                                                                             | Yes       | 254     | customer@domain.com                                                   |
| sdk_token            | Alphanumeric | An SDK Token to enable using the Amazon Payment Services Mobile SDK.                                                                                                                                                                                                               | Yes       | 100     | Dwp78q3                                                               |
| token_name           | Alphanumeric | The Token received from the Tokenization process.<br>Special characters: . @ - _                                                                                                                                                                                                   | No        | 100     | Op9Vmp                                                                |
| payment_option       | Alpha        | Payment option.<br>Possible/ expected values:<br>- MASTERCARD<br>- VISA<br>- AMEX<br>- MADA (for Purchase operations and eci Ecommerce only) Click here to download [MADA Branding Document](https://paymentservices-reference.payfort.com/pdf/mada%20branding%20-%20ecommerce%20merchant%20-%20payment%20providers.pdf)  <br>- MEEZA (for Purchase operations and ECOMMERCE eci only) | No        | 10      | VISA                                                                  |
| eci                  | Alpha        | Ecommerce indicator.<br>Possible/ expected values: ECOMMERCE                                                                                                                                                                                                                       | No        | 150     | ECOMMERCE                                                             |
| order_description    | Alphanumeric | A description of the order.<br>Special characters:'/ . _ - # : $ Space                                                                                                                                                                                                             | No        | 150     | iPhone 6-S                                                            |
| customer_ip          | Alphanumeric | It holds the customer’s IP address. *It’s Mandatory, if the fraud service is active. *We support IPv4 and IPv6 as shown in the example below.                                                                                                                                      | No        | 45      | IPv4 → 192.178.1.10<br>IPv6 → 2001:0db8:3042:0002:5a55:caff:fef6:bdbf |
| customer_name        | Alpha        | The customer’s name.<br>Special characters: _ \ / - .'                                                                                                                                                                                                                             | No        | 40      | John Smith                                                            |
| phone_number         | Alphanumeric | The customer’s phone number.<br>Special characters: + - ( ) Space                                                                                                                                                                                                                  | No        | 19      | 00962797219966                                                        |
| settlement_reference | Alphanumeric | The Merchant submits unique value to Amazon Payment Services. The value is then passed to the Acquiring bank and displayed to the merchant in the Acquirer settlement file.                                                                                                        | No        | 34      | XYZ9239-yu898                                                         |
| merchant_extra1      | Alphanumeric | Extra data sent by merchant. Will be received and sent back as received. Will not be displayed in any report.                                                                                                                                                                      | No        | 250     | JohnSmith                                                             |
| merchant_extra2      | Alphanumeric | Extra data sent by merchant. Will be received and sent back as received. Will not be displayed in any report.                                                                                                                                                                      | No        | 250     | JohnSmith                                                             |
| merchant_extra3      | Alphanumeric | Extra data sent by merchant. Will be received and sent back as received. Will not be displayed in any report.                                                                                                                                                                      | No        | 250     | JohnSmith                                                             |
| merchant_extra4      | Alphanumeric | Extra data sent by merchant. Will be received and sent back as received. Will not be displayed in any report.                                                                                                                                                                      | No        | 250     | JohnSmith                                                             |
| merchant_extra5      | Alphanumeric | Extra data sent by merchant. Will be received and sent back as received. Will not be displayed in any report.                                                                                                                                                                      | No        | 250     | JohnSmith                                                             |



### Apple Pay

```js

import { ApplePay, ApplePayRequest, RequestObjectApplePay } from 'rn-amazon-payment-services';


try {

    const transactionRequest: RequestObjectApplePay = {
        amount: '',
        command: 'PURCHASE',
        digital_wallet: 'APPLE_PAY',
        merchant_reference: '',
        currency: 'AED',
        language: 'en',
        customer_email: '',
        sdk_token: '',
        customer_ip: '',
        phone_number: '',
    };

    const applePaymentDetails: ApplePayRequest = {
        displayAmount: '',
        environment: 'TEST',
        merchantIdentifier: 'merchant.com.*',
        countryCode: 'AE',
        currencyCode: 'AED',
        supportedNetworks: ['visa', 'mastercard', 'mada', 'amex'],
        transactionDetails: transactionRequest
    };

    let result = await ApplePay.startPayment(applePaymentDetails);

    //handle result

} catch (error: any) {
    // handle error
}


```


### Apple Pay Request props (ApplePayRequest)

| Attribute            | Type         | Description                                                                                                                                                                                                                                                                        | Mandatory | Maximum | Example                                                               |
|----------------------|--------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------|---------|-----------------------------------------------------------------------|
| displayAmount              | Alpha        | The amount to be display on the Apple payment screen                                                                                                                                                                              | Yes       | 10      | 100                                                              |
| environment                              | `'TEST'`, `'PRODUCTION'`     | Parameter used to determine whether the request is going to be submitted to the test or production environment. |      Yes      |
| merchantIdentifier | Alphanumeric    | The apple pay merchant identifier created on the apple developer account |      Yes      | 150  | merchant.com.test.integration|
| countryCode | Alpha | A list of two-letter country codes for limiting payment to cards from specific countries or regions. | Yes | 2 | AE|
| currencyCode | Alpha | The three-letter ISO 4217 currency code for the payment. | Yes | 3 | AED|
| supportedNetworks | `object` | Array value of payment options supported on apple payment | Yes |  | `['visa', 'mastercard', 'mada', 'amex']` |
| transactionDetails | `object` | The request object containing the details for processing the apple payment. | Yes | | `{ amount: '', command: 'PURCHASE', digital_wallet: 'APPLE_PAY', merchant_reference: '', currency: 'AED', language: 'en', customer_email: '', sdk_token: token, customer_ip: '', customer_name: '', phone_number: '', settlement_reference: '', merchant_extra: ''}` |

## License

MIT
