UPI INTENT

Parameter NameData TypeMandatoryDescription
merchantOrderIdStringYesUnique order ID generated by merchant
amountlongYesAmount of order in Paisa
contraintsList<InstrumentConstraint>NoDifferent type of constraints that must be applied to the payment
deviceOSStringNoOperating system of the device. Allowed values are:
1. IOS
2. ANDROID
merchantCallbackSchemeStringNoRequired only in case targetApp = PHONEPE and deviceOS = IOS
targetAppStringNoThe target app identifier for the UPI Intent flow.
For IOS:
PHONEPE,
GPAY,
PAYTM.
For Android: com.phonepe.app, net.one97.paytm
import pkg from '@phonepe-pg/pg-sdk-node';
const { CustomCheckoutClient, Env, MetaInfo, CustomCheckoutPayRequest } = pkg;

import { v4 as uuid } from 'uuid';

const clientId = "<clientId>"; 
const clientSecret = "<clientSecret>"; 
const clientVersion = 1;  //insert your client version here 
const env = Env.SANDBOX;      //change to Env.PRODUCTION when you go live

const client = CustomCheckoutClient.getInstance(clientId, clientSecret, clientVersion, env);

const merchantOrderId = uuid();
const amount = 100;
const deviceOS = 'IOS';
const targetApp = 'PHONEPE';

const metaInfo = MetaInfo.builder()
  .udf1("ext-value-1")
  .udf2("free-text-value-2")
  .udf3("free-text-value-3")
  .udf4("free-text-value-4")
  .udf5("free-text-value-5")
  .udf6("free-text-value-6")
  .udf7("free-text-value-7")
  .udf8("free-text-value-8")
  .udf9("free-text-value-9")
  .udf10("free-text-value-10")
  .udf11("ref_11")
  .udf12("tag-12")
  .udf13("user@13")
  .udf14("code.14")
  .udf15("val+15")
  .build();

  const request = CustomCheckoutPayRequest.UpiIntentPayRequestBuilder()
  .merchantOrderId(merchantOrderId)
  .amount(amount)
  .targetApp(targetApp)
  .deviceOS(deviceOS)
  .metaInfo(metaInfo)
  .build();

client.pay(request).then((response) => {
  const intentUrl = response.intentUrl;
  console.log("Intent URL:", intentUrl);
});

Extract the intentUrl from the response received.

PropertyTypeDescription
orderIdStringOrder Id created by PhonePe
stateStringState of the order. Initially it will be PENDING.
expireAtLongOrder expire date in epoch
IntentUrlStringIntent url according to the targetApp mentioned in the request
Is this article helpful?