Subscription Setup


The Subscription Setup process allows you to initiate a subscription. By calling the setup() method, you can create a subscription with either UPI_INTENT or UPI_COLLECT payment methods. The setup requires specific parameters such as the order ID, subscription ID, amount, frequency, and expiration details. The response from the setup contains essential information like the order state and intent URL for further payment processing.

The setup() method is used to initiate the subscription setup with UPI_INTENT. Use the builder PgPaymentRequest.build_subscription_setup_upi_intent() to start the process.

AttributeData TypeMandatoryDescriptionDefault Value
merchant_order_idStringYesUnique order ID generated by the merchant.
merchant_subscription_idStringYesUnique subscription ID generated by the merchant.
amountIntYesAmount in Paisa (FULL auth – first debit amount, PENNY auth – 200).
order_expire_atIntNoEpoch timestamp; the order will automatically fail if not completed within the given time (default is 10 minutes).10 mins
auth_workflow_typeAuthWorkflowTypeYesType of setup workflow (TRANSACTION or PENNY_DROP)
amount_typeAmountTypeYesRedemption amount type (FIXED or VARIABLE).
max_amountIntYesMaximum amount up to which redemptions will be allowed.
frequencyFrequencyYesSubscription frequency (DAILY, WEEKLY, MONTHLY, etc.)
subscription_expire_atIntNoSubscription expiration timestamp (No operations allowed after expiry, default is 30 years).
target_appStringNo
Target app for intent payment mode:
Android – package name
iOS – PHONEPE / GPAY / PAYTM
meta_infoMetaInfoNoUser-defined fields for status checks and callbacks
Code Reference
import com.phonepe.sdk.pg.common.models.response.PgPaymentResponse;
import com.phonepe.sdk.pg.subscription.v2.SubscriptionClient;
import com.phonepe.sdk.pg.subscription.v2.models.request.AmountType;
import com.phonepe.sdk.pg.subscription.v2.models.request.AuthWorkflowType;
import com.phonepe.sdk.pg.subscription.v2.models.request.Frequency;
import java.util.UUID;
 
String clientId = "<clientId>";
String clientSecret = "<clientSecret>";
Integer clientVersion = <clientVersion>;
Env env = Env.SANDBOX;                          //change to Env.PRODUCTION when you go live
 
SubscriptionClient subscriptionClient = SubscriptionClient.getInstance(clientId, clientSecret, clientVersion, env);
 
String merchantOrderId = UUID.randomUUID().toString();
String merchantSubscriptionId = UUID.randomUUID().toString();
long amount = 200;                                                  //In paisa
AuthWorkflowType authWorkFlowType = AuthWorkflowType.TRANSACTION;   //It can also be AuthWorkFlowType.PENNY_DROP
AmountType amountType = AmountType.FIXED;                           //It can also be AmountType.VARIBALE
Frequency frequency = Frequency.ON_DEMAND;
long maxAmount = 200;
 
PgPaymentRequest setupRequest = PgPaymentRequest.SubscriptionSetupUpiIntentBuilder()
        .merchantOrderId(merchantOrderId)
        .merchantSubscriptionId(merchantSubscriptionId)
        .amount(amount)
        .authWorkflowType(authWorkFlowType)
        .amountType(amountType)
        .maxAmount(maxAmount)
        .frequency(frequency)
        .build();
 
 
PgPaymentResponse setupResponse = subscriptionClient.setup(setupRequest);
String intentUrl = setupResponse.getIntentUrl();

The function returns a PgPaymentResponse object with the following properties:

Parameter NameData TypeDescription
order_idStringUnique order ID generated by PhonePe.
stateStringState of the order. Initially it will be PENDING.
expireAtLongOrder expire date in epoch.
intent_urlStringIntent url according to the targetApp mentioned in the request.

The setup() method can also initiate the subscription setup with UPI_COLLECT. Use the builder PgPaymentRequest.build_subscription_setup_upi_collect() to begin.

AttributeData TypeMandatoryDescriptionDefault Value
merchant_order_idStringYesUnique order ID generated by the merchant.
merchant_subscription_idStringYesUnique subscription ID generated by the merchant.
amountIntYesAmount in Paisa (FULL auth – first debit amount, PENNY auth – 200).
order_expire_atIntNoEpoch timestamp; the order will automatically fail if not completed within the given time (default is 10 minutes).10 mins
auth_workflow_typeAuthWorkflowTypeYesType of setup workflow (TRANSACTION or PENNY_DROP)
amount_typeAmountTypeYesRedemption amount type (FIXED or VARIABLE).
max_amountIntYesMaximum amount up to which redemptions will be allowed.
frequencyFrequencyYesSubscription frequency (DAILY, WEEKLY, MONTHLY, etc.)
subscription_expire_atIntNoSubscription expiration timestamp (No operations allowed after expiry, default is 30 years).
target_appStringNo
Target app for intent payment mode:
• Android – package name
• iOS – PHONEPE / GPAY / PAYTM
meta_infoMetaInfoNoUser-defined fields for status checks and callbacks.
vpaStringYesVirtual Payment Address (VPA) for which the collect request will be raised.
Code Reference
import com.phonepe.sdk.pg.common.models.request.PgPaymentRequest;
import com.phonepe.sdk.pg.common.models.response.PgPaymentResponse;
import com.phonepe.sdk.pg.subscription.v2.SubscriptionClient;
import com.phonepe.sdk.pg.subscription.v2.models.request.AmountType;
import com.phonepe.sdk.pg.subscription.v2.models.request.AuthWorkflowType;
import com.phonepe.sdk.pg.subscription.v2.models.request.Frequency;
import java.util.UUID;
 
String clientId = "<clientId>";
String clientSecret = "<clientSecret>";
Integer clientVersion = 1;                      //insert your client version here
Env env = Env.SANDBOX;                          //change to Env.PRODUCTION when you go live
 
SubscriptionClient subscriptionClient = SubscriptionClient.getInstance(clientId, clientSecret, clientVersion, env);
 
String merchantOrderId = UUID.randomUUID().toString();
String merchantSubscriptionId = UUID.randomUUID().toString();
long amount = 200;                                                  //In paisa
AuthWorkflowType authWorkFlowType = AuthWorkflowType.TRANSACTION;   //It can also be AuthWorkFlowType.PENNY_DROP
AmountType amountType = AmountType.FIXED;                           //It can also be AmountType.VARIBALE
Frequency frequency = Frequency.ON_DEMAND;
String vpa = "VALID_VPA";
long maxAmount = 200;
 
PgPaymentRequest setupRequest = PgPaymentRequest.SubscriptionSetupUpiCollectBuilder()
        .merchantOrderId(merchantOrderId)
        .merchantSubscriptionId(merchantSubscriptionId)
        .amount(amount)
        .authWorkflowType(authWorkFlowType)
        .amountType(amountType)
        .maxAmount(maxAmount)
        .frequency(frequency)
        .vpa(vpa)
        .build();
 
PgPaymentResponse setupResponse = subscriptionClient.setup(setupRequest);

The function will raise a collect request to the provided VPA.

The function returns a PgPaymentResponse object with the following properties:

Parameter NameData TypeDescription
order_idStringUnique order ID generated by PhonePe.
stateStringState of the order. Initially it will be PENDING.
expireAtLongOrder expire date in epoch.

After setting up the subscription, the next step is to check the Order Status. Head over to the next section to learn how to check the status of an order.

Is this article helpful?