Generate Static Hash

The static hashes can be passed to SDK during integration and do not change. Unlike dynamic hashing, it is static.

The following table describes all static hashes:

Hash NameDescriptionHash Formula
payment_related_ details_for_mobile_sdkIt is used to fetch enabled payment options. If not passed, checkout screen will not appear.<key>|payment_related_details_for_mobile_sdk|<userCredential>|<salt>
eligibleBinsForEMIIt is used to fetch the eligible bins for EMI when EMI is enabled. If not passed, EMI payment will not work.<key>|eligibleBinsForEMI|default|<salt>
getEmiAmount AccordingToInterestIt is used to fetch EMI details like, amount, interest rate, etc when EMI is enabled. If not passed, EMI payment will not work.<key>|vas_for_mobile_sdk|<amount>|<salt>
PaymentIt is used for making payment. If not passed, payment will not happen.key|txnid|amount|productinfo|firstname|email |udf1|udf2| udf3|udf4|udf5||||||salt
delete_payment_instrumentIt is used to delete the Tokenised card<key>|delete_payment_instrument|<userCredential| <salt>
get_payment_instrumentIt is used to get all stored tokenised cards<key> |get_payment_instrument|<userCredential|<salt>
get_payment_detailsIt is used to get the payment details of an existing card stored on PayU Vault so that you can use it with third-party tokenisation<key>|get_payment_details|<userCredential|<salt>

After setting the values in the above formula, generate sha512 over it and pass the same in additional parameters

Payment Hash

For the Hash required to make payment as described in the above table:

sha512(key|txnid|amount|productinfo|firstname|email|udf1|udf2|udf3|udf4|udf5||||||salt)

The following sample code can be used to integrate:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>



 <%@ page import="java.security.MessageDigest" %>
<%@ page import="java.security.NoSuchAlgorithmException" %> 
 <%@ page import="org.json.simple.JSONObject" %>

<%
//fetch all required params
String txnid=request.getParameter("txnid");
String amount=request.getParameter("amount");
String email=request.getParameter("email");
String productinfo=request.getParameter("productinfo");
String firstname=request.getParameter("firstname");
String udf1=request.getParameter("udf1");
String udf2=request.getParameter("udf2");
String udf3=request.getParameter("udf3");
String udf4=request.getParameter("udf4");
String udf5=request.getParameter("udf5");
String user_credentials=request.getParameter("user_credentials");

response.getWriter().print(getHashes(txnid, amount, productinfo, firstname, email, user_credentials, udf1, udf2, udf3, udf4, udf5));

%>

<%!
              //PUT YOUR LIVE CREDENTIALS HERE          

private final String key = "gtKFFx";      //put your merchant key value 
private final String salt = "eCwWELxi";   //put your merchant salt value 

private final String PAYMENT_HASH = "payment_hash";
private final String GET_MERCHANT_IBIBO_CODES_HASH = "get_merchant_ibibo_codes_hash";
private final String VAS_FOR_MOBILE_SDK_HASH = "vas_for_mobile_sdk_hash";
private final String PAYMENT_RELATED_DETAILS_FOR_MOBILE_SDK_HASH = "payment_related_details_for_mobile_sdk_hash";
private final String DELETE_USER_CARD_HASH = "delete_user_card_hash";
private final String GET_USER_CARDS_HASH = "get_user_cards_hash";
private final String EDIT_USER_CARD_HASH = "edit_user_card_hash";
private final String SAVE_USER_CARD_HASH = "save_user_card_hash";
private final String CHECK_OFFER_STATUS_HASH = "check_offer_status_hash";
private final String CHECK_ISDOMESTIC_HASH = "check_isDomestic_hash";
private final String VERIFY_PAYMENT_HASH = "verify_payment_hash";
/**
* This function generates a JSON String of required mandatory hashes.
*/
public String getHashes(String txnid, String amount, String productInfo, String firstname, String email,
		String user_credentials, String udf1, String udf2, String udf3, String udf4, String udf5 
		) { 
	JSONObject response = new JSONObject();

	String ph = checkNull(key) + "|" + checkNull(txnid) + "|" + checkNull(amount) + "|" + checkNull(productInfo)
			+ "|" + checkNull(firstname) + "|" + checkNull(email) + "|" + checkNull(udf1) + "|" + checkNull(udf2)
			+ "|" + checkNull(udf3) + "|" + checkNull(udf4) + "|" + checkNull(udf5) + "||||||" + salt;
	String paymentHash = getSHA(ph);
	System.out.println("Payment Hash "+paymentHash);
	response.put(PAYMENT_HASH, paymentHash);
	response.put(VAS_FOR_MOBILE_SDK_HASH, generateHashString("vas_for_mobile_sdk", "default"));
			
	//Use var1 as user_credentials if user_credential is not empty
	if (!checkNull(user_credentials).isEmpty()) {
	
		response.put(PAYMENT_RELATED_DETAILS_FOR_MOBILE_SDK_HASH,
				generateHashString("payment_related_details_for_mobile_sdk", user_credentials));
		
		response.put(DELETE_USER_CARD_HASH, generateHashString("delete_user_card", user_credentials));
		response.put(GET_USER_CARDS_HASH, generateHashString("get_user_cards", user_credentials));
		response.put(EDIT_USER_CARD_HASH, generateHashString("edit_user_card", user_credentials));
		response.put(SAVE_USER_CARD_HASH, generateHashString("save_user_card", user_credentials));
	}
	else{
		response.put(PAYMENT_RELATED_DETAILS_FOR_MOBILE_SDK_HASH, 
				generateHashString("payment_related_details_for_mobile_sdk","default")); 
		
	}
	System.out.println("Vas_for _mobile_sdk  "+generateHashString("vas_for_mobile_sdk", "default"));
	System.out.println("payment_related_details_sdk_hash  "+ generateHashString("payment_related_details_for_mobile_sdk", user_credentials));
	
	System.out.println("delete_user_card Hash"+generateHashString("delete_user_card", user_credentials));
	
	
	return response.toJSONString(); 

}

// This method generates hash string 

private String generateHashString(String command, String var1) {
	return getSHA(key + "|" + command + "|" + var1 + "|" + salt);
}

private String checkNull(String value) {
	if (value == null) {
		return "";
	} else {
		return value;
	}
}

private String getSHA(String str) {

	 MessageDigest md;
	String out = "";
	try {
		md = MessageDigest.getInstance("SHA-512");
		md.update(str.getBytes());
		byte[] mb = md.digest();

		for (int i = 0; i < mb.length; i++) {
			byte temp = mb[i];
			String s = Integer.toHexString(new Byte(temp));
			while (s.length() < 2) {
				s = "0" + s;
			}
			s = s.substring(s.length() - 2);
			out += s;
		}

	} catch (NoSuchAlgorithmException e) {
		e.printStackTrace();
	}
	return out; 

}


%>

</body>
</html>



<?php

function getHashes($txnid, $amount, $productinfo, $firstname, $email, $user_credentials, $udf1, $udf2, $udf3, $udf4, $udf5,$offerKey,$cardBin)
{
      // $firstname, $email can be "", i.e empty string if needed. Same should be sent to PayU server (in request params) also.
      $key = 'XXXXXX';
      $salt = 'YYYYY';

      $payhash_str = $key . '|' . checkNull($txnid) . '|' .checkNull($amount)  . '|' .checkNull($productinfo)  . '|' . checkNull($firstname) . '|' . checkNull($email) . '|' . checkNull($udf1) . '|' . checkNull($udf2) . '|' . checkNull($udf3) . '|' . checkNull($udf4) . '|' . checkNull($udf5) . '||||||' . $salt;
      $paymentHash = strtolower(hash('sha512', $payhash_str));
      $arr['payment_hash'] = $paymentHash;

      $cmnNameMerchantCodes = 'get_merchant_ibibo_codes';
      $merchantCodesHash_str = $key . '|' . $cmnNameMerchantCodes . '|default|' . $salt ;
      $merchantCodesHash = strtolower(hash('sha512', $merchantCodesHash_str));
      $arr['get_merchant_ibibo_codes_hash'] = $merchantCodesHash;

      $cmnMobileSdk = 'vas_for_mobile_sdk';
      $mobileSdk_str = $key . '|' . $cmnMobileSdk . '|default|' . $salt;
      $mobileSdk = strtolower(hash('sha512', $mobileSdk_str));
      $arr['vas_for_mobile_sdk_hash'] = $mobileSdk;

// added code for EMI hash
      $cmnEmiAmountAccordingToInterest= 'getEmiAmountAccordingToInterest';
      $emi_str = $key . '|' . $cmnEmiAmountAccordingToInterest . '|'.checkNull($amount).'|' . $salt;
      $mobileEmiString = strtolower(hash('sha512', $emi_str));
     $arr['emi_hash'] = $mobileEmiString;


      $cmnPaymentRelatedDetailsForMobileSdk1 = 'payment_related_details_for_mobile_sdk';
      $detailsForMobileSdk_str1 = $key  . '|' . $cmnPaymentRelatedDetailsForMobileSdk1 . '|default|' . $salt ;
      $detailsForMobileSdk1 = strtolower(hash('sha512', $detailsForMobileSdk_str1));
      $arr['payment_related_details_for_mobile_sdk_hash'] = $detailsForMobileSdk1;

      //used for verifying payment(optional)
      $cmnVerifyPayment = 'verify_payment';
      $verifyPayment_str = $key . '|' . $cmnVerifyPayment . '|'.$txnid .'|' . $salt;
      $verifyPayment = strtolower(hash('sha512', $verifyPayment_str));
      $arr['verify_payment_hash'] = $verifyPayment;

      if($user_credentials != NULL && $user_credentials != '')
      {
            $cmnNameDeleteCard = 'delete_user_card';
            $deleteHash_str = $key  . '|' . $cmnNameDeleteCard . '|' . $user_credentials . '|' . $salt ;
            $deleteHash = strtolower(hash('sha512', $deleteHash_str));
            $arr['delete_user_card_hash'] = $deleteHash;

            $cmnNameGetUserCard = 'get_user_cards';
            $getUserCardHash_str = $key  . '|' . $cmnNameGetUserCard . '|' . $user_credentials . '|' . $salt ;
            $getUserCardHash = strtolower(hash('sha512', $getUserCardHash_str));
            $arr['get_user_cards_hash'] = $getUserCardHash;

            $cmnNameEditUserCard = 'edit_user_card';
            $editUserCardHash_str = $key  . '|' . $cmnNameEditUserCard . '|' . $user_credentials . '|' . $salt ;
            $editUserCardHash = strtolower(hash('sha512', $editUserCardHash_str));
            $arr['edit_user_card_hash'] = $editUserCardHash;

            $cmnNameSaveUserCard = 'save_user_card';
            $saveUserCardHash_str = $key  . '|' . $cmnNameSaveUserCard . '|' . $user_credentials . '|' . $salt ;
            $saveUserCardHash = strtolower(hash('sha512', $saveUserCardHash_str));
            $arr['save_user_card_hash'] = $saveUserCardHash;

            $cmnPaymentRelatedDetailsForMobileSdk = 'payment_related_details_for_mobile_sdk';
            $detailsForMobileSdk_str = $key  . '|' . $cmnPaymentRelatedDetailsForMobileSdk . '|' . $user_credentials . '|' . $salt ;
            $detailsForMobileSdk = strtolower(hash('sha512', $detailsForMobileSdk_str));
            $arr['payment_related_details_for_mobile_sdk_hash'] = $detailsForMobileSdk;
      }


      // if($udf3!=NULL && !empty($udf3)){
            $cmnSend_Sms='send_sms';
            $sendsms_str=$key . '|' . $cmnSend_Sms . '|' . $udf3 . '|' . $salt;
            $send_sms = strtolower(hash('sha512',$sendsms_str));
            $arr['send_sms_hash']=$send_sms;
      // }


      if ($offerKey!=NULL && !empty($offerKey)) {
                  $cmnCheckOfferStatus = 'check_offer_status';
                        $checkOfferStatus_str = $key  . '|' . $cmnCheckOfferStatus . '|' . $offerKey . '|' . $salt ;
                  $checkOfferStatus = strtolower(hash('sha512', $checkOfferStatus_str));
                  $arr['check_offer_status_hash']=$checkOfferStatus;
            }


            if ($cardBin!=NULL && !empty($cardBin)) {
                  $cmnCheckIsDomestic = 'check_isDomestic';
                        $checkIsDomestic_str = $key  . '|' . $cmnCheckIsDomestic . '|' . $cardBin . '|' . $salt ;
                  $checkIsDomestic = strtolower(hash('sha512', $checkIsDomestic_str));
                  $arr['check_isDomestic_hash']=$checkIsDomestic;
            }



    return $arr;
}

function checkNull($value) {
            if ($value == null) {
                  return '';
            } else {
                  return $value;
            }
      }

$output=getHashes($_POST["txnid"], $_POST["amount"], $_POST["productinfo"], $_POST["firstname"], $_POST["email"], $_POST["user_credentials"], $_POST["udf1"], $_POST["udf2"], $_POST["udf3"], $_POST["udf4"], $_POST["udf5"],$_POST["offerKey"],$_POST["cardBin"]);

echo json_encode($output);

?>



For SI Payment

Payment hash is calculated with the following formula for SI transaction:

SHA512(key|txnid|amount|productinfo|firstname|email|udf1|udf2|udf3|udf4|udf5||||||si_details|SALT)

Example

SHA512(<Your Test Env. Key>|fa3359f205d621c07383|2|Product Info|Payu-Admin|[email protected]|||||||||||{"billingAmount": "150.00","billingCurrency": "INR","billingCycle": "WEEKLY","billingInterval": 1,"paymentStartDate": "2019-09-18","paymentEndDate": "2020-10-20"}|dEvD9ABD)

Free Trial Transaction

For free trial transactions, free trial value should be used in hash calculation as follows:

SHA512(key|txnid|amount|productinfo|firstname|email|udf1|udf2|udf3|udf4|udf5|udf6|udf7|udf8|udf9|udf10|si_details|free_trial|SALT)

Example

SHA512(<Your Test Env. Key>|fa3359f205d621c07383|2|Product Info|Payu-Admin|[email protected]|||||||||||{"billingAmount": "150.00","billingCurrency": "INR","billingCycle": "WEEKLY","billingInterval": 1,"paymentStartDate": "2019-09-18","paymentEndDate": "2020-10-20"}|1|<Please_add_salt_here>)  

For Split Payment

Payment hash is calculated with the following formula for Split transaction:

sha512(key|txnid|amount|productinfo|firstname|email|udf1|udf2|udf3|udf4|udf5||||||SALT|splitRequest)

Where, splitRequest will be at the end of the hash pattern string.

Example

SHA512(<Your Key>|payment-txnid-1|10|Product Info|Payu-Admin|[email protected]|||||||||||<Your Salt>|{"type":"absolute","splitInfo":{"P41sCY":{"aggregatorSubTxnId":"0e7411799c9f0e96620c11","aggregatorSubAmt":"3","aggregatorCharges":"2"},"P41sCK":{"aggregatorSubTxnId":"0e7411799c9f0e96620c22","aggregatorSubAmt":"5"}}}