---
page_title: Initiating the SDK
product: UPI TPAP SDK
platform: Android
page_source: https://juspay.io/in/docs/upi-tpap-sdk/android/interaction-with-sdk/initiating-the-sdk
llms_txt: https://juspay.io/in/docs/llms.txt
product_llms_txt: https://juspay.io/in/docs/upi-tpap-sdk/llms.txt
---


# Initiating the SDK 



To initialise the SDK, client needs to call the `initiate` SDK API. The initiate api call boots up the SDK and makes it ready for all other operations

Follow the below steps to make an initiate SDK call:


### Step 1 Create an instance of HyperServiceHolder


The SDK exposes the `HyperServiceHolder` class. Create an object of this class for all upcoming operations



#### Code Snippets: -

#### Java Code Snippet:

```java
hyperServicesHolder = new HyperServiceHolder(this);
```

#### Kotlin Code Snippet:

```kotlin
hyperServicesHolder = HyperServiceHolder(this)
```



### Step 2 Create Initiate payload


Initiate API takes a parameter as an input. This parameter is a JSON object referred as `InitiatePayload`. This payload contains certain key value pairs used by the SDK to perform a successful initiate

Refer to the following table for information about the description and sample payload.



#### Code Snippets: -

#### Java Code Snippet:

```java
// This function creates intiate payload.
    private JSONObject createInitiatePayload() {
        JSONObject sdkPayload = new JSONObject();
        JSONObject innerPayload = new JSONObject();
        JSONObject signaturePayload = new JSONObject();
        try {
            signaturePayload.put("merchant_id", "<MERCHANT_ID>");     // Put your Merchant ID here
            signaturePayload.put("customer_id", "<CUSTOMER_ID>");     // Put Customer ID here
            signaturePayload.put("timestamp", "<timestamp>");         // Time when request is created in milliseconds.
            // generating inner payload
            innerPayload.put("action", "initiate");
            innerPayload.put("merchantKeyId", "<MERCHANT_KEY_ID>");   // Put your Merchant ID here
            innerPayload.put("clientId", "CLIENT_ID");                // Put your Client ID here
            innerPayload.put("environment", "production");
            innerPayload.put("issuingPsp", "YES_BIZ");
            innerPayload.put("signature", "....");                    // Generated signature for signature payload
            String stringifiedSignaturePayload = signaturePayload.toString();
            innerPayload.put("signaturePayload", stringifiedSignaturePayload);

            // block:start:generatingRequestId
            sdkPayload.put("requestId",  ""+ UUID.randomUUID());
            // block:end:generatingRequestId
            sdkPayload.put("service", "in.juspay.hyperapi");
            sdkPayload.put("payload", innerPayload);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return sdkPayload;
    }
```

#### Kotlin Code Snippet:

```kotlin
private fun createInitiatePayload(): JSONObject {
        val sdkPayload = JSONObject()
        val innerPayload = JSONObject()
        try {
            // generating inner payload
            innerPayload.put("action", "initiate")
            innerPayload.put("merchantKeyId", "<MERCHANT_KEY_ID>")   // Put your Merchant ID here
            innerPayload.put("clientId", "CLIENT_ID")                // Put your Client ID here
            innerPayload.put("environment", "production")
            innerPayload.put("issuingPsp", "YES_BIZ")
            innerPayload.put("signature", "....")                    // Generated signature for signature payload
            innerPayload.put("signaturePayload", signaturePayload)

            // block:start:generatingRequestId
            sdkPayload.put("requestId",  ""+ UUID.randomUUID())
            // block:end:generatingRequestId
            sdkPayload.put("service", "in.juspay.hyperapi")
            sdkPayload.put("payload", innerPayload)

            signaturePayload.put("merchant_id", "<MERCHANT_ID>")     // Put your Merchant ID here
            signaturePayload.put("customer_id", "<CUSTOMER_ID>")     // Put Customer ID here
            signaturePayload.put("timestamp", "<timestamp>")         // Time when request is created in milliseconds.
        } catch (e: Exception) {
            e.printStackTrace()
        }
        return sdkPayload
    }
```



### Step 2.1 Create Initiate payload For ClientAuthToken


Refer to the following table for information about the description and sample payload.



#### Code Snippets: -

#### Java Code Snippet:

```java
// This function creates intiate payload for ClientAuthToken Support
    private JSONObject createInitiatePayload() {
        JSONObject sdkPayload = new JSONObject();
        JSONObject innerPayload = new JSONObject();
        try {
            // generating inner payload
            innerPayload.put("action", "initiate");
            innerPayload.put("clientId", "CLIENT_ID");                // Put your Client ID here
            innerPayload.put("environment", "production");
            innerPayload.put("issuingPsp", "YES_BIZ");
            innerPayload.put("clientAuthToken", "token");

            // block:start:generatingRequestId
            sdkPayload.put("requestId",  ""+ UUID.randomUUID());
            // block:end:generatingRequestId
            sdkPayload.put("service", "in.juspay.hyperapi");
            sdkPayload.put("payload", innerPayload);

        } catch (Exception e) {
            e.printStackTrace();
        }
        return sdkPayload;
    }
```

#### Kotlin Code Snippet:

```kotlin
private fun createInitiatePayload(): JSONObject {
        val sdkPayload = JSONObject()
        val innerPayload = JSONObject()
        try {
            // generating inner payload
            innerPayload.put("action", "initiate")
            innerPayload.put("clientId", "CLIENT_ID")                // Put your Client ID here
            innerPayload.put("environment", "production")
            innerPayload.put("issuingPsp", "YES_BIZ")
            innerPayload.put("clientAuthToken", "token")                 

            // block:start:generatingRequestId
            sdkPayload.put("requestId",  ""+ UUID.randomUUID())
            // block:end:generatingRequestId
            sdkPayload.put("service", "in.juspay.hyperapi")
            sdkPayload.put("payload", innerPayload)

        } catch (e: Exception) {
            e.printStackTrace()
        }
        return sdkPayload
    }
```



###   Initiate Parameters



## Request Payload
- **RequestId**:
  - Description: Unique uuid-v4 string
  - Value: $requestId
  - Tags: String, Mandatory
- **Service**:
  - Description: Value: in.juspay.hyperapi
  - Tags: String, Mandatory
- **Payload**:
  - Description: Parameters required to call Hyper SDK API
  - Value:
    - **Action**:
      - Description: Operation to be performed in the SDK. Should be initiate for this call.
      - Value: Value: initiate
      - Tags: String, Mandatory
    - **ClientId**:
      - Description: Client Id assigned by juspay. Usual convention is merchant_id
      - Value: Example: stock
      - Tags: String, Mandatory
    - **Environment**:
      - Description: Environment to be used for the session, while in testing it is sandbox and production when we are moving to releasing this app. Accepted values are 'sandbox' or 'production'
      - Value: Example: sandbox
      - Tags: String, Mandatory
    - **IssuingPsp**:
      - Description: Bank on which the merchant has been onboarded.
      - Value: Example: YES_BIZ/AXIS_BIZ
      - Tags: String, Mandatory
    - **MerchantKeyId**:
      - Description: Key ID to identify the public-private key pair used for signature generation.
      - Value: Example: 1234
      - Tags: String, Mandatory
    - **Signature**:
      - Description: Generated signature for signature payload. See signature generation process in pre-requisites section.
      - Tags: String, Mandatory
    - **SignaturePayload**:
      - Description: Signature payload is a stringified JSON of the details mentioned in the below table.
      - Value:
        - **Merchant_id**:
          - Description: Unique identifier associated with an account created by juspay.
          - Value: Example: stock
          - Tags: String, Mandatory
        - **Customer_id**:
          - Description: Any unique reference associated with your customer.
          - Value: Example: abcde12345
          - Tags: String, Mandatory
        - **Timestamp**:
          - Description: Time when request is created in milliseconds.
          - Value: Example: 1665996901100
          - Tags: String, Mandatory
      - Tags: String, Mandatory
    - **ShouldCreateCustomer**:
      - Description: Value: true
      - Tags: Boolean, Mandatory
    - **MerchantLoader**:
      - Description: This key can be passed to so that merchant can show their own loaders and as well get the loader related events from the SDK, by default it’s value is false
      - Value: Value: false
      - Tags: Boolean, Optional
  - Tags: JSON, Mandatory


## Response Payload
- **RequestId**:
  - Description: Unique uuid-v4 string
  - Value: $requestId
  - Tags: String, Mandatory
- **Service**:
  - Description: Value: in.juspay.hyperapi
  - Tags: String, Mandatory
- **Payload**:
  - Description: Parameters required to call Hyper SDK API
  - Value:
    - **Action**:
      - Description: Operation performed in the SDK.
      - Value: Value: initiate
      - Tags: String
    - **Status**:
      - Description: Status of the Operation.
      - Value: Possible values : SUCCESS / FAILURE
      - Tags: String
  - Tags: JSON, Mandatory



> **Note**
> [Click here](../miscellaneous/additional-parameters) for additional initiate parameters





#### Code Snippets: -

#### Java Code Snippet:

```java
{
  "requestId": "8cbc3fad-8b3f-40c0-ae93-2d7e75a8624a",
  "service": "in.juspay.hyperapi",
  "payload": {
    "action": "initiate",
    "merchantKeyId": "<Merchant Key Id>",
    "clientId": "<Client Id>",
    "merchantLoader": false,
    "signature": "<Generated signature for signature payload>",
    "signaturePayload": "<Stringified signature payload>",
    "environment": "sandbox",
    "upiEnvironment": "sandbox"
    "issuingPsp": "YES_BIZ",
    "shouldCreateCustomer": true,
    "logLevel": 1
  }
}

"signaturePayload": {
  "merchant_id": "stock",
  "customer_id": "abcde12345",
  "timestamp": "1668389349848"
}
```

#### Kotlin Code Snippet:

```kotlin
{
  "requestId": "8cbc3fad-8b3f-40c0-ae93-2d7e75a8624a",
  "service": "in.juspay.hyperapi",
  "payload": {
    "action": "initiate",
    "merchantKeyId": "<Merchant Key Id>",
    "clientId": "<Client Id>",
    "merchantLoader": false,
    "signature": "<Generated signature for signature payload>",
    "signaturePayload": "<Stringified signature payload>",
    "environment": "sandbox",
    "upiEnvironment": "sandbox"
    "issuingPsp": "YES_BIZ",
    "shouldCreateCustomer": true,
    "logLevel": 1
  }
}

"signaturePayload": {
  "merchant_id": "stock",
  "customer_id": "abcde12345",
  "timestamp": "1668389349848"
}
```



### Step 3 Create CallbackHandler


During its lifecycle, SDK emits multiple events to communicate about the transaction status. All of these events are received by an instance of `HyperPaymentsCallbackAdapter`.



#### Code Snippets: -

#### Java Code Snippet:

```java
private HyperPaymentsCallbackAdapter createHyperPaymentsCallbackAdapter() {
        return new HyperPaymentsCallbackAdapter() {
            @Override
            public void onEvent(JSONObject data, JuspayResponseHandler handler) {
                try {
                  // block:start:handle-sdk-response
                  String event = data.getString("event");
    
                  // block:start:show-loader
                  if (event.equals("show_loader")) {
                    // Show some loader here
                  }
                  // block:end:show-loader
    
                  // block:start:hide-loader
                  else if (event.equals("hide_loader")) {
                    // Hide Loader
                  }
                  // block:end:hide-loader
    
                  // block:start:initiate-result
                  else if (event.equals("initiate_result")) {
                    // Get the response
                    JSONObject response = data.optJSONObject("payload");
                  }
                  // block:end:initiate-result
    
                  // block:start:process-result
                  else if (event.equals("process_result")) {
                    // Get the response
                    JSONObject response = data.optJSONObject("payload");
                    //Merchant handling
                  }
                  // block:end:process-result
    
                  // block:start:log-stream
                  else if (event.equals("log_stream")){
                    Log.i("=>Clickstream", data.toString());
                  }
                  // block:end:log-stream
    
                  // block:start:session-expiry
                  else if (event.equals("session_expired")){
                    // Handle Session Expiry
                  }
                  // block:end:session-expiry
    
                } catch (Exception e) {
                  // merchant code...
                }
                // block:end:handle-sdk-response
            }
        };
    }
```

#### Kotlin Code Snippet:

```kotlin
private fun createHyperPaymentsCallbackAdapter(): HyperPaymentsCallbackAdapter {
        return object : HyperPaymentsCallbackAdapter() {
            override fun onEvent(jsonObject: JSONObject, responseHandler: JuspayResponseHandler?) {
                try {
                  // block:start:handle-sdk-response
                    val event = jsonObject.getString("event")

                    // block:start:hide-loader
                    if (event == "hide_loader") {
                        // Hide Loader
                    }
                    // block:end:hide-loader

                    // block:start:show-loader
                    else if (event == "show_loader") {
                        // Show some loader
                    }
                    // block:end:show-loader

                    // block:start:initiate-result
                    else if (event == "initiate_result") {
                        val innerPayload = jsonObject.optJSONObject("payload")
                    }
                    // block:end:initiate-result

                    // block:start:process-result
                    else if (event == "process_result") {
                        val innerPayload = jsonObject.optJSONObject("payload")
                    }
                    // block:end:process-result

                    // block:start:log-stream
                    else if (event == "log_stream") {
                        val innerPayload = jsonObject.optJSONObject("payload")
                    }
                    // block:end:log-stream

                    // block:start:session-expiry
                    else if (event == "session_expired") {
                        // Handle Session Expiry
                    }
                    // block:end:session-expiry

                } catch (e: Exception) {
                    // merchant code...
                }
                // block:end:handle-sdk-response
            }
        }
    }
```



### Step 4 Call initiate


The final step is to call the `Initiate SDK API`.

The initiate method takes the `InitiatePayload` as a parameter. To create the parameter, you can use the createInitiatePayload function in the above steps.

> **Warning**
> Initiate is a fire-and-forget call. For every HyperServiceHolder instance you should **call initiate only once.** 





#### Code Snippets: -

#### Java Code Snippet:

```java
//This function initiate the Juspay SDK
    private void initiateUpiSDK() {
        if(!hyperServicesHolder.isInitialised()){
            initiatePayload = createInitiatePayload();
            hyperServicesHolder.initiate(initiatePayload);
        }
    }
```

#### Kotlin Code Snippet:

```kotlin
private fun initiatePaymentsSDK() {
        if (!hyperServicesHolder!!.isInitiated) {
            initiatePayload = createInitiatePayload()
            hyperServicesHolder!!.initiate(createInitiatePayload())
        }
    }
```


---

## Complete Code Reference

The following code files are referenced in the steps above:

### IntegrationReferenceActivity.java

```
package in.juspay.devtools;

import androidx.appcompat.app.AppCompatActivity;

import android.content.pm.ApplicationInfo;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebView;
import android.widget.EditText;

import org.json.JSONException;
import org.json.JSONObject;

//HyperServices imports
import in.juspay.hypersdk.data.JuspayResponseHandler;
import in.juspay.hypersdk.ui.HyperPaymentsCallbackAdapter;
import in.juspay.hyperinteg.HyperServiceHolder;

public class IntegrationReferenceActivity extends AppCompatActivity {
	public Helpers helper;
	private JSONObject processData;
	private JSONObject initiateData;
	private JSONObject merchantData;
	private boolean hasProcessInQueue;
	private HyperServiceHolder hyperServicesHolder;

	/*******************Integration reference start*****************************/
	//HyperSDK instance used for all operation on the sdk.
	//code-copy-marker

    @Override
    protected void onStart() {
        super.onStart();
        //block:start:create-hyper-services-instance

        hyperServicesHolder = new HyperServiceHolder(this);

        //block:end:create-hyper-services-instance
        initiateUpiSDK();
        hyperServicesHolder.setCallback(createHyperPaymentsCallbackAdapter());
    }

    //block:start:initiate-sdk
    //This function initiate the Juspay SDK
    private void initiateUpiSDK() {
        if(!hyperServicesHolder.isInitialised()){
            initiatePayload = createInitiatePayload();
            hyperServicesHolder.initiate(initiatePayload);
        }
    }
    //block:end:initiate-sdk

    //block:start:create-initiate-payload
    // This function creates intiate payload.
    private JSONObject createInitiatePayload() {
        JSONObject sdkPayload = new JSONObject();
        JSONObject innerPayload = new JSONObject();
        JSONObject signaturePayload = new JSONObject();
        try {
            signaturePayload.put("merchant_id", "<MERCHANT_ID>");     // Put your Merchant ID here
            signaturePayload.put("customer_id", "<CUSTOMER_ID>");     // Put Customer ID here
            signaturePayload.put("timestamp", "<timestamp>");         // Time when request is created in milliseconds.
            // generating inner payload
            innerPayload.put("action", "initiate");
            innerPayload.put("merchantKeyId", "<MERCHANT_KEY_ID>");   // Put your Merchant ID here
            innerPayload.put("clientId", "CLIENT_ID");                // Put your Client ID here
            innerPayload.put("environment", "production");
            innerPayload.put("issuingPsp", "YES_BIZ");
            innerPayload.put("signature", "....");                    // Generated signature for signature payload
            String stringifiedSignaturePayload = signaturePayload.toString();
            innerPayload.put("signaturePayload", stringifiedSignaturePayload);

            // block:start:generatingRequestId
            sdkPayload.put("requestId",  ""+ UUID.randomUUID());
            // block:end:generatingRequestId
            sdkPayload.put("service", "in.juspay.hyperapi");
            sdkPayload.put("payload", innerPayload);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return sdkPayload;
    }
  //block:end:create-initiate-payload

  //block:start:create-initiate-payload-clientAuthToken
    // This function creates intiate payload for ClientAuthToken Support
    private JSONObject createInitiatePayload() {
        JSONObject sdkPayload = new JSONObject();
        JSONObject innerPayload = new JSONObject();
        try {
            // generating inner payload
            innerPayload.put("action", "initiate");
            innerPayload.put("clientId", "CLIENT_ID");                // Put your Client ID here
            innerPayload.put("environment", "production");
            innerPayload.put("issuingPsp", "YES_BIZ");
            innerPayload.put("clientAuthToken", "token");

            // block:start:generatingRequestId
            sdkPayload.put("requestId",  ""+ UUID.randomUUID());
            // block:end:generatingRequestId
            sdkPayload.put("service", "in.juspay.hyperapi");
            sdkPayload.put("payload", innerPayload);

        } catch (Exception e) {
            e.printStackTrace();
        }
        return sdkPayload;
    }
  //block:end:create-initiate-payload-clientAuthToken

  // block:start:create-hyper-callback
    private HyperPaymentsCallbackAdapter createHyperPaymentsCallbackAdapter() {
        return new HyperPaymentsCallbackAdapter() {
            @Override
            public void onEvent(JSONObject data, JuspayResponseHandler handler) {
                try {
                  // block:start:handle-sdk-response
                  String event = data.getString("event");
    
                  // block:start:show-loader
                  if (event.equals("show_loader")) {
                    // Show some loader here
                  }
                  // block:end:show-loader
    
                  // block:start:hide-loader
                  else if (event.equals("hide_loader")) {
                    // Hide Loader
                  }
                  // block:end:hide-loader
    
                  // block:start:initiate-result
                  else if (event.equals("initiate_result")) {
                    // Get the response
                    JSONObject response = data.optJSONObject("payload");
                  }
                  // block:end:initiate-result
    
                  // block:start:process-result
                  else if (event.equals("process_result")) {
                    // Get the response
                    JSONObject response = data.optJSONObject("payload");
                    //Merchant handling
                  }
                  // block:end:process-result
    
                  // block:start:log-stream
                  else if (event.equals("log_stream")){
                    Log.i("=>Clickstream", data.toString());
                  }
                  // block:end:log-stream
    
                  // block:start:session-expiry
                  else if (event.equals("session_expired")){
                    // Handle Session Expiry
                  }
                  // block:end:session-expiry
    
                } catch (Exception e) {
                  // merchant code...
                }
                // block:end:handle-sdk-response
            }
        };
    }
    // block:end:create-hyper-callback

  public void callProcess() {
    // block:start:process-sdk

    JSONObject processPayload = new JSONObject();
    JSONObject innerPayload = new JSONObject();

    try {
        // generating inner payload
        innerPayload.put("action", "upiCheckPermission");

        processPayload.put("requestId",  ""+ UUID.randomUUID());
        processPayload.put("service", "in.juspay.hyperapi");
        processPayload.put("payload", innerPayload);

    } catch (Exception e) {
        e.printStackTrace();
    }

    if (hyperServicesHolder.isInitialised()) {
      hyperServicesHolder.process(processPayload);
    }
    // block:end:process-sdk
  
  }  
  // block:start:terminate
  public void callTerminate() {
    hyperServicesHolder.terminate();
  }
  // block:start:terminate

  //block:start:onBackPressed
  @Override
  public void onBackPressed() {
      boolean handleBackpress = hyperServicesHolder.onBackPressed();
      if(!handleBackpress) {
          super.onBackPressed();
      }
  }
  //block:end:onBackPressed

  // block:start:onActivityResult
  @Override
  public void onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {

    // If super.onActivityResult is available use following:
    super.onActivityResult(requestCode, resultCode, data);

    // In case super.onActivityResult is NOT available please use following:
    if (data != null) {
        hyperServices.onActivityResult(requestCode, resultCode, data);
    }
  }

  // block:end:onActivityResult

  //block:start:onRequestPermissionsResult
  @Override
  public void onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {

      // If super.onRequestPermissionsResult is available use following:
      super.onRequestPermissionsResult(requestCode, permissions, grantResults);

      // In case super.onActivityResult is NOT available please use following:
      hyperServicesHolder.onRequestPermissionsResult(requestCode, permissions, grantResults);
  }
  //block:end:onRequestPermissionsResult
}
```

### InitiatePayload.txt

```
// block:start:initiate-payload

{
  "requestId": "8cbc3fad-8b3f-40c0-ae93-2d7e75a8624a",
  "service": "in.juspay.hyperapi",
  "payload": {
    "action": "initiate",
    "merchantKeyId": "<Merchant Key Id>",
    "clientId": "<Client Id>",
    "merchantLoader": false,
    "signature": "<Generated signature for signature payload>",
    "signaturePayload": "<Stringified signature payload>",
    "environment": "sandbox",
    "upiEnvironment": "sandbox"
    "issuingPsp": "YES_BIZ",
    "shouldCreateCustomer": true,
    "logLevel": 1
  }
}

"signaturePayload": {
  "merchant_id": "stock",
  "customer_id": "abcde12345",
  "timestamp": "1668389349848"
}

// block:end:initiate-payload

// block:start:initiate-response

{
  "requestId": "<request id passed>",
  "service": "in.juspay.hyperapi",
  "payload": {
    "action": "initiate",
    "status": "SUCCESS/FAILURE",
  },
  "error": false,
  "errorMessage": "",
  "errorCode": "",
  "event": "process_result"
}

// block:end:initiate-response

// block:start:session-expiry-clientAuthToken

{
  "requestId" : "1234567890",
  "service" : "in.juspay.hyperapi",
  "payload" : {
    "action" : "updateAuth",
    "clientAuthToken": "<clientAuthToken>",
    "authExpiry" : "2021-07-19T07:20:53.318Z"
  }
}

// block:end:session-expiry-clientAuthToken

// block:start:session-expiry-signature

{
  "requestId" : "1234567890",
  "service" : "in.juspay.hyperapi",
  "payload" : {
    "action" : "updateAuth",
    "signature": "<Generated signature for signature payload>",
    "signaturePayload": "<Stringified signature payload>",
    "merchantKeyId" : "1234",
    "authExpiry" : "2021-07-19T07:20:53.318Z"
  }
}

"signaturePayload": {
  "merchant_id": "stock",
  "customer_id": "abcde12345",
  "timestamp": "1668389349848"
}

// block:end:session-expiry-signature

// block:start:signaturePayload

{
  "requestId": "8cbc3fad-8b3f-40c0-ae93-2d7e75a8624a",
  "service": "in.juspay.hyperapi",
  "payload": {
    ...
    "merchantKeyId": "<Merchant Key Id>",
    "signature": "<Generated signature for signature payload>",
    "signaturePayload": "<Stringified signature payload>",
    ...
  }
}

"signaturePayload": {
  "merchant_id": "stock",
  "customer_id": "abcde12345",
  "timestamp": "1668389349848"
}

// block:end:signaturePayload

// block:start:clientAuthTokenPayload

{
  "requestId": "8cbc3fad-8b3f-40c0-ae93-2d7e75a8624a",
  "service": "in.juspay.hyperapi",
  "payload": {
    ...
    "clientAuthToken": "<clientAuthToken>"
    ...
  }
}

// block:end:clientAuthTokenPayload
```

### IntegrationReferenceActivity.kt

```
package `in`.juspay.devtools

import `in`.juspay.hypersdk.data.JuspayResponseHandler;
import `in`.juspay.hypersdk.ui.HyperPaymentsCallbackAdapter;
import `in`.juspay.hyperinteg.HyperServiceHolder;
import android.content.Intent
import android.os.Bundle
import android.view.View
import android.widget.Button
import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.coordinatorlayout.widget.CoordinatorLayout
import com.google.android.material.snackbar.Snackbar
import org.json.JSONObject
import java.util.*

class IntegrationReferenceActivity : AppCompatActivity() {

    var hyperServicesHolder: HyperServiceHolder? = null
    var initiatePayload: JSONObject? = null

    override fun onStart() {
        super.onStart()
        //block:start:create-hyper-services-instance

        hyperServicesHolder = HyperServiceHolder(this)

        //block:end:create-hyper-services-instance

        initiatePaymentsSDK()
        hyperServicesHolder!!.setCallback(createHyperPaymentsCallbackAdapter())
    }
    //block:start:create-initiate-payload
    private fun createInitiatePayload(): JSONObject {
        val sdkPayload = JSONObject()
        val innerPayload = JSONObject()
        try {
            // generating inner payload
            innerPayload.put("action", "initiate")
            innerPayload.put("merchantKeyId", "<MERCHANT_KEY_ID>")   // Put your Merchant ID here
            innerPayload.put("clientId", "CLIENT_ID")                // Put your Client ID here
            innerPayload.put("environment", "production")
            innerPayload.put("issuingPsp", "YES_BIZ")
            innerPayload.put("signature", "....")                    // Generated signature for signature payload
            innerPayload.put("signaturePayload", signaturePayload)

            // block:start:generatingRequestId
            sdkPayload.put("requestId",  ""+ UUID.randomUUID())
            // block:end:generatingRequestId
            sdkPayload.put("service", "in.juspay.hyperapi")
            sdkPayload.put("payload", innerPayload)

            signaturePayload.put("merchant_id", "<MERCHANT_ID>")     // Put your Merchant ID here
            signaturePayload.put("customer_id", "<CUSTOMER_ID>")     // Put Customer ID here
            signaturePayload.put("timestamp", "<timestamp>")         // Time when request is created in milliseconds.
        } catch (e: Exception) {
            e.printStackTrace()
        }
        return sdkPayload
    }
    //block:end:create-initiate-payload


    //block:start:create-initiate-payload-clientAuthToken
    private fun createInitiatePayload(): JSONObject {
        val sdkPayload = JSONObject()
        val innerPayload = JSONObject()
        try {
            // generating inner payload
            innerPayload.put("action", "initiate")
            innerPayload.put("clientId", "CLIENT_ID")                // Put your Client ID here
            innerPayload.put("environment", "production")
            innerPayload.put("issuingPsp", "YES_BIZ")
            innerPayload.put("clientAuthToken", "token")                 

            // block:start:generatingRequestId
            sdkPayload.put("requestId",  ""+ UUID.randomUUID())
            // block:end:generatingRequestId
            sdkPayload.put("service", "in.juspay.hyperapi")
            sdkPayload.put("payload", innerPayload)

        } catch (e: Exception) {
            e.printStackTrace()
        }
        return sdkPayload
    }
    //block:end:create-initiate-payload-clientAuthToken


    //block:start:initiate-sdk
    private fun initiatePaymentsSDK() {
        if (!hyperServicesHolder!!.isInitiated) {
            initiatePayload = createInitiatePayload()
            hyperServicesHolder!!.initiate(createInitiatePayload())
        }
    }
    //block:end:initiate-sdk

    //block:start:create-hyper-callback
    private fun createHyperPaymentsCallbackAdapter(): HyperPaymentsCallbackAdapter {
        return object : HyperPaymentsCallbackAdapter() {
            override fun onEvent(jsonObject: JSONObject, responseHandler: JuspayResponseHandler?) {
                try {
                  // block:start:handle-sdk-response
                    val event = jsonObject.getString("event")

                    // block:start:hide-loader
                    if (event == "hide_loader") {
                        // Hide Loader
                    }
                    // block:end:hide-loader

                    // block:start:show-loader
                    else if (event == "show_loader") {
                        // Show some loader
                    }
                    // block:end:show-loader

                    // block:start:initiate-result
                    else if (event == "initiate_result") {
                        val innerPayload = jsonObject.optJSONObject("payload")
                    }
                    // block:end:initiate-result

                    // block:start:process-result
                    else if (event == "process_result") {
                        val innerPayload = jsonObject.optJSONObject("payload")
                    }
                    // block:end:process-result

                    // block:start:log-stream
                    else if (event == "log_stream") {
                        val innerPayload = jsonObject.optJSONObject("payload")
                    }
                    // block:end:log-stream

                    // block:start:session-expiry
                    else if (event == "session_expired") {
                        // Handle Session Expiry
                    }
                    // block:end:session-expiry

                } catch (e: Exception) {
                    // merchant code...
                }
                // block:end:handle-sdk-response
            }
        }
    }
    //block:end:create-hyper-callback

    // block:start:process-sdk
    fun callProcess(sdk_payload: JSONObject?) {
        val sdkPayload = JSONObject()
        val innerPayload = JSONObject()
        try {
            // generating inner payload
            innerPayload.put("action", "upiCheckPermission")

            sdkPayload.put("requestId",  ""+ UUID.randomUUID())
            sdkPayload.put("service", "in.juspay.hyperapi")
            sdkPayload.put("payload", innerPayload)

        } catch (e: Exception) {
            e.printStackTrace()
        }
        if(hyperServicesHolder!!.isInitiated)
        hyperServicesHolder?.process(sdk_payload)
    }
    // block:end:process-sdk

  // block:start:terminate
  fun callTerminate() {
    hyperServicesHolder?.terminate()
  }
  // block:start:terminate

  //block:start:onBackPressed
    override fun onBackPressed() {
        val handleBackpress: Boolean = hyperServicesHolder?.handleBackPress() == true
        if (handleBackpress) {
            super.onBackPressed()
        }
    }
   //block:end:onBackPressed

    @Override
    public void onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        // block:start:onActivityResult

        // If super.onActivityResult is available use following:
        super.onActivityResult(requestCode, resultCode, data);

        // In case super.onActivityResult is NOT available please use following:
        if (data != null) {
            hyperServices.onActivityResult(requestCode, resultCode, data);
        }

        // block:end:onActivityResult

        // Rest of your code.
    }

    @Override
    public void onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
        // block:start:onRequestPermissionsResult

        //  If super.onRequestPermissionsResult is available use following:
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        // In case super.onActivityResult is NOT available please use following:
        hyperServices.onRequestPermissionsResult(requestCode, permissions, grantResults);

        // block:end:onRequestPermissionsResult
    }

}
```


---

## See Also

- [Installing Assets Plugin](https://juspay.io/in/docs/upi-tpap-sdk/android/getting-the-sdk/adding-plugin)
- [Process](https://juspay.io/in/docs/upi-tpap-sdk/android/interaction-with-sdk/process)
