tarjetas prueba order_not_processed_by_sign php integration payment-gateway payu payumoney

php - prueba - payu signature



''perdón, se produjo un error'' al integrar la pasarela de pago PayUMoney en el modo de prueba (9)

Estoy tratando de integrar la pasarela de pago PayUMoney en el sitio de mi cliente. Mi cliente me proporcionó los detalles de inicio de sesión de PayUMoney . Pude localizar la clave de comerciante pero no puedo encontrar ninguno de los dos:

  1. Sal mercante
  2. Sitio del desarrollador donde puedo crear una cuenta de prueba y realizar una prueba en un sandbox.

PayUMoney me proporcionó un formulario con un valor predeterminado, pero cuando lo pruebo, aparece el mensaje: perdón, se produjo un error.

Aquí está la forma:

<?php // Merchant key here as provided by Payu $MERCHANT_KEY = "JBZaLc"; // Merchant Salt as provided by Payu $SALT = "GQs7yium"; // End point - change to https://secure.payu.in for LIVE mode $PAYU_BASE_URL = "https://test.payu.in"; $action = ''''; $posted = array(); if(!empty($_POST)) { //print_r($_POST); foreach($_POST as $key => $value) { $posted[$key] = $value; } } $formError = 0; if(empty($posted[''txnid''])) { // Generate random transaction id $txnid = substr(hash(''sha256'', mt_rand() . microtime()), 0, 20); } else { $txnid = $posted[''txnid'']; } $hash = ''''; // Hash Sequence $hashSequence = "key|txnid|amount|productinfo|firstname|email|udf1|udf2|udf3|udf4|udf5|udf6|udf7|udf8|udf9|udf10"; if(empty($posted[''hash'']) && sizeof($posted) > 0) { if( empty($posted[''key'']) || empty($posted[''txnid'']) || empty($posted[''amount'']) || empty($posted[''firstname'']) || empty($posted[''email'']) || empty($posted[''phone'']) || empty($posted[''productinfo'']) || empty($posted[''surl'']) || empty($posted[''furl'']) || empty($posted[''service_provider'']) ) { $formError = 1; } else { //$posted[''productinfo''] = json_encode(json_decode(''[{"name":"tutionfee","description":"","value":"500","isRequired":"false"},{"name":"developmentfee","description":"monthly tution fee","value":"1500","isRequired":"false"}]'')); $hashVarsSeq = explode(''|'', $hashSequence); $hash_string = ''''; foreach($hashVarsSeq as $hash_var) { $hash_string .= isset($posted[$hash_var]) ? $posted[$hash_var] : ''''; $hash_string .= ''|''; } $hash_string .= $SALT; $hash = strtolower(hash(''sha512'', $hash_string)); $action = $PAYU_BASE_URL . ''/_payment''; } } elseif(!empty($posted[''hash''])) { $hash = $posted[''hash'']; $action = $PAYU_BASE_URL . ''/_payment''; } ?> <html> <head> <script> var hash = ''<?php echo $hash ?>''; function submitPayuForm() { if(hash == '''') { return; } var payuForm = document.forms.payuForm; payuForm.submit(); } </script> </head> <body onLoad="submitPayuForm()"> <h2>PayU Form</h2> <br/> <?php if($formError) { ?> <span style="color:red">Please fill all mandatory fields.</span> <br/> <br/> <?php } ?> <form action="<?php echo $action; ?>" method="post" name="payuForm"> <input type="hidden" name="key" value="<?php echo $MERCHANT_KEY ?>" /> <input type="hidden" name="hash" value="<?php echo $hash ?>"/> <input type="hidden" name="txnid" value="<?php echo $txnid ?>" /> <table> <tr> <td><b>Mandatory Parameters</b></td> </tr> <tr> <td>Amount: </td> <td><input name="amount" value="<?php echo (empty($posted[''amount''])) ? '''' : $posted[''amount''] ?>" /></td> <td>First Name: </td> <td><input name="firstname" id="firstname" value="<?php echo (empty($posted[''firstname''])) ? '''' : $posted[''firstname'']; ?>" /></td> </tr> <tr> <td>Email: </td> <td><input name="email" id="email" value="<?php echo (empty($posted[''email''])) ? '''' : $posted[''email'']; ?>" /></td> <td>Phone: </td> <td><input name="phone" value="<?php echo (empty($posted[''phone''])) ? '''' : $posted[''phone'']; ?>" /></td> </tr> <tr> <td>Product Info: </td> <td colspan="3"><textarea name="productinfo"><?php echo (empty($posted[''productinfo''])) ? '''' : $posted[''productinfo''] ?></textarea></td> </tr> <tr> <td>Success URI: </td> <td colspan="3"><input name="surl" value="<?php echo (empty($posted[''surl''])) ? '''' : $posted[''surl''] ?>" size="64" /></td> </tr> <tr> <td>Failure URI: </td> <td colspan="3"><input name="furl" value="<?php echo (empty($posted[''furl''])) ? '''' : $posted[''furl''] ?>" size="64" /></td> </tr> <tr> <td>Service Provider: </td> <td colspan="3"><input name="service_provider" value="<?php echo (empty($posted[''service_provider''])) ? '''' : $posted[''service_provider''] ?>" size="64" /></td> </tr> <tr> <td><b>Optional Parameters</b></td> </tr> <tr> <td>Last Name: </td> <td><input name="lastname" id="lastname" value="<?php echo (empty($posted[''lastname''])) ? '''' : $posted[''lastname'']; ?>" /></td> <td>Cancel URI: </td> <td><input name="curl" value="" /></td> </tr> <tr> <td>Address1: </td> <td><input name="address1" value="<?php echo (empty($posted[''address1''])) ? '''' : $posted[''address1'']; ?>" /></td> <td>Address2: </td> <td><input name="address2" value="<?php echo (empty($posted[''address2''])) ? '''' : $posted[''address2'']; ?>" /></td> </tr> <tr> <td>City: </td> <td><input name="city" value="<?php echo (empty($posted[''city''])) ? '''' : $posted[''city'']; ?>" /></td> <td>State: </td> <td><input name="state" value="<?php echo (empty($posted[''state''])) ? '''' : $posted[''state'']; ?>" /></td> </tr> <tr> <td>Country: </td> <td><input name="country" value="<?php echo (empty($posted[''country''])) ? '''' : $posted[''country'']; ?>" /></td> <td>Zipcode: </td> <td><input name="zipcode" value="<?php echo (empty($posted[''zipcode''])) ? '''' : $posted[''zipcode'']; ?>" /></td> </tr> <tr> <td>UDF1: </td> <td><input name="udf1" value="<?php echo (empty($posted[''udf1''])) ? '''' : $posted[''udf1'']; ?>" /></td> <td>UDF2: </td> <td><input name="udf2" value="<?php echo (empty($posted[''udf2''])) ? '''' : $posted[''udf2'']; ?>" /></td> </tr> <tr> <td>UDF3: </td> <td><input name="udf3" value="<?php echo (empty($posted[''udf3''])) ? '''' : $posted[''udf3'']; ?>" /></td> <td>UDF4: </td> <td><input name="udf4" value="<?php echo (empty($posted[''udf4''])) ? '''' : $posted[''udf4'']; ?>" /></td> </tr> <tr> <td>UDF5: </td> <td><input name="udf5" value="<?php echo (empty($posted[''udf5''])) ? '''' : $posted[''udf5'']; ?>" /></td> <td>PG: </td> <td><input name="pg" value="<?php echo (empty($posted[''pg''])) ? '''' : $posted[''pg'']; ?>" /></td> </tr> <tr> <?php if(!$hash) { ?> <td colspan="4"><input type="submit" value="Submit" /></td> <?php } ?> </tr> </table> </form> </body> </html>


Deje el campo Proveedor de servicios en blanco. Eso debería funcionar.


Esto es confuso para los novatos. La key predeterminada y la salt suministradas no funcionarán de inmediato.

Para probar la puerta de enlace con una clave de prueba y sal, siga estos pasos:

  1. Ir a test.payumoney.com
  2. Regístrese como comerciante: use cualquiera de sus identificaciones de correo electrónico válidas, por favor no use una identificación de correo electrónico aleatoria.
  3. Complete los "Detalles del negocio" - puede usar PAN no. ABCDE1234F y fecha de nacimiento - 01/04/1990
  4. Complete "Detalles de la cuenta bancaria" (puede usar IFSC-ALLA0212632)
  5. No tiene que preocuparse por el paso de verificación del Banco ni por ningún otro paso después de eso.
  6. Vaya a la ubicación mencionada a continuación para obtener la ID del comerciante de prueba: Panel del vendedor -> Configuración -> Mi cuenta -> Configuración de perfil

  7. Luego, envíe su identificación de comerciante de prueba al equipo técnico utilizando el formulario de contacto y ellos lo aprobarán.

  8. Una vez aprobado, puede encontrar su clave de prueba y sal en: Panel del vendedor -> Configuración -> Mi cuenta -> Clave comercial - Sal.
  9. Reemplace la key y salt predeterminadas con la key prueba y salt recién generadas. Después de esto no debería ver el error, Lo sentimos, ocurrió algún problema.

Espero que esto ayude.


Finalmente llegué a saber que no han activado la cuenta de prueba.


Hay un campo "Proveedor de servicios" en el formulario (el nombre del parámetro es - service_provider). El valor de este campo debe ser ''payu_paisa''. Si completa algo más en este campo en el formulario, obtendrá un error.


La clave y la sal proporcionadas por payumoney no son válidas, utilice lo siguiente para realizar pruebas:

// Merchant key here as provided by Payu $MERCHANT_KEY = "gtKFFx"; // Merchant Salt as provided by Payu $SALT = "eCwWELxi";

Y asegúrese de dejar en blanco el campo del proveedor de servicios.


Payumoney ha cambiado su TEST KEY y TEST SALT.

para que el modo de prueba funcione, use estas credenciales con la url de prueba

Test Key - rjQUPktU Test Salt - e5iIg1jwi8

Aún enfrentando problemas, intente los siguientes pasos

¿Está utilizando la clave de comerciante correcta? En muchos carritos de compras, el nombre de campo utilizado es "ID de comerciante" se usa incorrectamente en lugar de la clave de comerciante. Sin embargo, lo que realmente se debe ingresar es la "clave del comerciante" suministrada por PayUmoney. Tenga en cuenta que le enviamos un correo electrónico con los siguientes 3 detalles:

(1) ID de comerciante
(2) clave de comerciante
(3) sal mercante

La ID de comerciante enviada por PayUmoney no se requiere en la integración de PayUmoney con su sitio web. Es sólo su número de registro con PayUmoney. Por lo tanto, la única información utilizada en la integración es Merchant Key & Merchant Salt. ¿Está utilizando las credenciales de prueba en modo en vivo o las credenciales en vivo en modo de prueba? En caso afirmativo, asegúrese de usar las credenciales de prueba en el modo de prueba y las credenciales en vivo en el modo en vivo. Asegúrese de que en el Modo de prueba, está utilizando únicamente las credenciales de prueba mencionadas a continuación:

Clave de prueba - rjQUPktU
Sal de prueba - e5iIg1jwi8

¿Tienes todas las aprobaciones?

Si sus aprobaciones están pendientes, es muy posible que obtenga este error aunque esté haciendo todo correctamente. Póngase en contacto con el equipo de asistencia para obtener ayuda mediante la programación de una llamada utilizando el siguiente enlace: https://calendly.com/payumoney-integration/30_minutes


Prueba esto:

<?php /** * Returns the pay page url or the merchant js file. * * @param unknown $params * @param unknown $salt * @throws Exception * @return Ambigous <multitype:number string , multitype:number Ambigous <boolean, string> > */ function pay ( $params, $salt ) { if ( ! is_array( $params ) ) throw new Exception( ''Pay params is empty'' ); if ( empty( $salt ) ) throw new Exception( ''Salt is empty'' ); $payment = new Payment( $salt ); $result = $payment->pay( $params ); unset( $payment ); return $result; } /** * Displays the pay page. * * @param unknown $params * @param unknown $salt * @throws Exception */ function pay_page ( $params, $salt ) { if ( count( $_POST ) && isset( $_POST[''mihpayid''] ) && ! empty( $_POST[''mihpayid''] ) ) { $_POST[''surl''] = $params[''surl'']; $_POST[''furl''] = $params[''furl'']; $result = response( $_POST, $salt ); Misc::show_reponse( $result ); } else { $host = (isset( $_SERVER[''https''] ) ? ''https://'' : ''http://'') . $_SERVER[''HTTP_HOST''] . $_SERVER[''REQUEST_URI'']; if ( isset( $_SERVER[''REQUEST_URI''] ) && ! empty( $_SERVER[''REQUEST_URI''] ) ) $params[''surl''] = $host; if ( isset( $_SERVER[''REQUEST_URI''] ) && ! empty( $_SERVER[''REQUEST_URI''] ) ) $params[''furl''] = $host; $result = pay( $params, $salt ); Misc::show_page( $result ); } } /** * Returns the response object. * * @param unknown $params * @param unknown $salt * @throws Exception * @return number */ function response ( $params, $salt ) { if ( ! is_array( $params ) ) throw new Exception( ''PayU response params is empty'' ); if ( empty( $salt ) ) throw new Exception( ''Salt is empty'' ); if ( empty( $params[''status''] ) ) throw new Exception( ''Status is empty'' ); $response = new Response( $salt ); $result = $response->get_response( $_POST ); unset( $response ); return $result; } /** * Basic autoloader * * @param classname $file * define( ''INCLUDE_PATH'', dirname( __FILE__ ) . ''/src/'' ); function __autoload ( $file ) { require_once INCLUDE_PATH . $file . ''.php''; } */ /* Should libcurl or curl.so be absent. */ if ( ! function_exists( ''curl_init'' ) ) : define( ''CURLOPT_URL'', 1 ); define( ''CURLOPT_USERAGENT'', 2 ); define( ''CURLOPT_POST'', 3 ); define( ''CURLOPT_POSTFIELDS'', 4 ); define( ''CURLOPT_RETURNTRANSFER'', 5 ); define( ''CURLOPT_REFERER'', 6 ); define( ''CURLOPT_HEADER'', 7 ); define( ''CURLOPT_TIMEOUT'', 8 ); define( ''CURLOPT_CONNECTTIMEOUT'', 9 ); define( ''CURLOPT_FOLLOWLOCATION'', 10 ); define( ''CURLOPT_AUTOREFERER'', 11 ); define( ''CURLOPT_PROXY'', 12 ); define( ''CURLOPT_PORT'', 13 ); define( ''CURLOPT_HTTPHEADER'', 14 ); define( ''CURLOPT_SSL_VERIFYHOST'', 15 ); define( ''CURLOPT_SSL_VERIFYPEER'', 16 ); function curl_init ( $url = false ) { return new Curl( $url ); } function curl_setopt ( &$ch, $name, $value ) { $ch->setopt( $name, $value ); } function curl_exec ( $ch ) { return $ch->exec(); } function curl_close ( &$ch ) { unset( $ch ); } function curl_errno ( $ch ) { return $ch->error; } function curl_error ( $ch_error ) { return "Could not open socket"; } function curl_getinfo ( $ch, $opt = NULL ) { return $ch->info; } function curl_setopt_array ( &$ch, $opt ) { $ch->setoptArray( $opt ); } endif; class Curl { private $url = ""; private $user_agent = "libCurl"; private $return_result = false; private $referrer = false; private $cookies_on = false; private $proxy = array (); private $timeout = 30; private $cookies; private $headers; private $method = "GET"; private $httpHeader = "application/x-www-form-urlencoded"; public $error = 0; public $info = array (); function __construct ( $url = false ) { $this->cookies = new Cookies(); $this->url = $url; $this->info[''total_time''] = time(); } function __destruct () {} private function getHost ( $url ) { $url = str_replace( array ( "http://", "https://" ), "", $url ); $tmp = explode( "/", $url ); return $tmp[0]; } private function getQuery ( $url ) { $url = str_replace( array ( "http://", "https://" ), "", $url ); $tmp = explode( "/", $url, 2 ); return "/" . $tmp[1]; } private function _parseRawData ( $rawData ) { $array = explode( "/r/n/r/n", $rawData, 2 ); $this->header_data = $array[0]; $this->content = $array[1]; $this->_parseHeaders( $array[0] ); } private function _parseHeaders ( $rawHeaders ) { $rawHeaders = trim( $rawHeaders ); $headers = explode( "/r/n", $rawHeaders ); foreach ( $headers as $header ) { if ( preg_match( "|http/1/.. (/d+)|i", $header, $match ) ) { $this->status_code = $match[1]; continue; } $headerArray = explode( ":", $header ); $headerName = trim( $headerArray[0] ); $headerValue = trim( $headerArray[1] ); if ( preg_match( "|set-cookie2?|i", $headerName ) ) $this->cookies->add( $headerValue ); if ( isset( $headerName ) ) $this->headers[strtolower( $headerName )] = $headerValue; } if ( isset( $this->headers["location"] ) ) { $this->url = $this->headers["location"]; $this->exec(); } } public function setopt ( $name, $value = false ) { switch ( $name ) { case CURLOPT_URL : $this->url = $value; $this->proxy["port"] = substr( $this->url, 0, 5 ) === ''https'' ? 443 : 80; break; case CURLOPT_USERAGENT : $this->user_agent = $value; break; case CURLOPT_POST : $this->method = ($value == true) ? "POST" : "GET"; break; case CURLOPT_POSTFIELDS : $this->post_data = $value; break; case CURLOPT_RETURNTRANSFER : $this->return_result = ($value == true); break; case CURLOPT_REFERER : $this->referrer = $value; break; case CURLOPT_HEADER : $this->options["header"] = ($value == true); break; case CURLOPT_PROXY : list ( $this->proxy["host"], $this->proxy["port"] ) = explode( ":", $value ); break; case CURLOPT_CONNECTTIMEOUT : /* Fall through. */ case CURLOPT_TIMEOUT : $this->timeout = ($value >= 0) ? $value : 30; break; case CURLOPT_PORT : $this->proxy["port"] = $value ? $value : (substr( $this->url, 0, 5 ) === ''https'' ? 443 : 80); break; case CURLOPT_HTTPHEADER : $this->httpHeader = substr( implode( ";", $value ), 0, - 1 ); break; } } public function setoptArray ( $options ) { foreach ( $options as $name => $value ) $this->setopt( $name, $value ); } public function exec () { $errno = false; $errstr = false; $url = $this->url; $host = $this->getHost( $url ); $query = $this->getQuery( $url ); $this->proxy["host"] = $host; if ( isset( $this->proxy["port"] ) ) { $this->proxy["host"] = (443 === $this->proxy["port"]) ? "ssl://$host" : $host; $fp = pfsockopen( $this->proxy["host"], $this->proxy["port"], $errno, $errstr, $this->timeout ); $request = $query; } else { $fp = pfsockopen( $host, 80, $errno, $errstr, $this->timeout ); $request = $query; } if ( ! $fp ) { /*trigger_error($errstr, E_WARNING);*/ $this->error = 1; return; } $headers = $this->method . " $request HTTP/1.0 /r/nHost: $host /r/n"; if ( $this->user_agent ) $headers .= "User-Agent: " . $this->user_agent . "/r/n"; if ( $this->referrer ) $headers .= "Referer: " . $this->referrer . "/r/n"; if ( $this->method == "POST" ) { $headers .= "Content-Type: " . $this->httpHeader . "/r/n"; $headers .= "Content-Length: " . strlen( $this->post_data ) . "/r/n"; } if ( $this->cookies_on ) $headers .= $this->cookies->createHeader(); $headers .= "Connection: Close/r/n/r/n"; if ( "POST" == $this->method ) $headers .= $this->post_data; $headers .= "/r/n/r/n"; fwrite( $fp, $headers ); $rawData = ""; while ( ! feof( $fp ) ) $rawData .= fread( $fp, 512 ); /* fclose($fp); /* Too lazy to read the docs.*/ $this->info[''total_time''] = time() - $this->info[''total_time'']; $this->_parseRawData( $rawData ); if ( $this->options["header"] ) $this->content = $rawData; if ( $this->return_result ) return $this->content; echo $this->content; } } class Cookies { private $cookies; function __construct () {} function __destruct () {} public function add ( $cookie ) { list ( $data, $etc ) = explode( ";", $cookie, 2 ); list ( $name, $value ) = explode( "=", $data ); $this->cookies[trim( $name )] = trim( $value ); } public function createHeader () { if ( 0 == count( $this->cookies ) || ! is_array( $this->cookies ) ) return ""; $output = ""; foreach ( $this->cookies as $name => $value ) $output .= "$name=$value; "; return "Cookies: $output/r/n"; } } class Misc { const SUCCESS = 1; const FAILURE = 0; public static function get_hash ( $params, $salt ) { $posted = array (); if ( ! empty( $params ) ) foreach ( $params as $key => $value ) $posted[$key] = htmlentities( $value, ENT_QUOTES ); $hash_sequence = "key|txnid|amount|productinfo|firstname|email|udf1|udf2|udf3|udf4|udf5|udf6|udf7|udf8|udf9|udf10"; $hash_vars_seq = explode( ''|'', $hash_sequence ); $hash_string = null; foreach ( $hash_vars_seq as $hash_var ) { $hash_string .= isset( $posted[$hash_var] ) ? $posted[$hash_var] : ''''; $hash_string .= ''|''; } $hash_string .= $salt; return strtolower( hash( ''sha512'', $hash_string ) ); } public static function reverse_hash ( $params, $salt, $status ) { $posted = array (); $hash_string = null; if ( ! empty( $params ) ) foreach ( $params as $key => $value ) $posted[$key] = htmlentities( $value, ENT_QUOTES ); $additional_hash_sequence = ''base_merchantid|base_payuid|miles|additional_charges''; $hash_vars_seq = explode( ''|'', $additional_hash_sequence ); foreach ( $hash_vars_seq as $hash_var ) $hash_string .= isset( $posted[$hash_var] ) ? $posted[$hash_var] . ''|'' : ''''; $hash_sequence = "udf10|udf9|udf8|udf7|udf6|udf5|udf4|udf3|udf2|udf1|email|firstname|productinfo|amount|txnid|key"; $hash_vars_seq = explode( ''|'', $hash_sequence ); $hash_string .= $salt . ''|'' . $status; foreach ( $hash_vars_seq as $hash_var ) { $hash_string .= ''|''; $hash_string .= isset( $posted[$hash_var] ) ? $posted[$hash_var] : ''''; } return strtolower( hash( ''sha512'', $hash_string ) ); } public static function curl_call ( $url, $data ) { $ch = curl_init(); curl_setopt_array( $ch, array ( CURLOPT_URL => $url, CURLOPT_POSTFIELDS => $data, CURLOPT_FOLLOWLOCATION => true, CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_USERAGENT => ''Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36'', CURLOPT_SSL_VERIFYHOST => 0, CURLOPT_SSL_VERIFYPEER => 0 ) ); $o = curl_exec( $ch ); if ( curl_errno( $ch ) ) { $c_error = curl_error( $ch ); if ( empty( $c_error ) ) $c_error = ''Server Error''; return array ( ''curl_status'' => Misc::FAILURE, ''error'' => $c_error ); } $o = trim( $o ); return array ( ''curl_status'' => Misc::SUCCESS, ''result'' => $o ); } public static function show_page ( $result ) { if ( $result[''status''] === Misc::SUCCESS ) header( ''Location:'' . $result[''data''] ); else throw new Exception( $result[''data''] ); } public static function show_reponse ( $result ) { if ( $result[''status''] === Misc::SUCCESS ) $result[''data''](); else return $result[''data'']; } } class Payment { private $url; private $salt; private $params = array (); public function __construct ( $salt, $env = ''test'' ) { $this->salt = $salt; switch ( $env ) { case ''test'' : $this->url = ''https://test.payu.in/''; break; case ''prod'' : $this->url = ''https://secure.payu.in/''; break; default : $this->url = ''https://test.payu.in/''; } } public function __destruct () { unset( $this->url ); unset( $this->salt ); unset( $this->params ); } public function __set ( $key, $value ) { $this->params[$key] = $value; } public function __get ( $key ) { return $this->params[$key]; } public function pay ( $params = null ) { if ( is_array( $params ) ) foreach ( $params as $key => $value ) $this->params[$key] = $value; $error = $this->check_params(); if ( $error === true ) { $this->params[''hash''] = Misc::get_hash( $this->params, $this->salt ); $result = Misc::curl_call( $this->url . ''_payment?type=merchant_txn'', http_build_query( $this->params ) ); $transaction_id = ($result[''curl_status''] === Misc::SUCCESS) ? $result[''result''] : null; if ( empty( $transaction_id ) ) return array ( ''status'' => Misc::FAILURE, ''data'' => $result[''error''] ); return array ( ''status'' => Misc::SUCCESS, ''data'' => $this->url . ''_payment_options?mihpayid='' . $transaction_id ); } else { return array ( ''status'' => Misc::FAILURE, ''data'' => $error ); } } private function check_params () { if ( empty( $this->params[''key''] ) ) return $this->error( ''key'' ); if ( empty( $this->params[''txnid''] ) ) return $this->error( ''txnid'' ); if ( empty( $this->params[''amount''] ) ) return $this->error( ''amount'' ); if ( empty( $this->params[''firstname''] ) ) return $this->error( ''firstname'' ); if ( empty( $this->params[''email''] ) ) return $this->error( ''email'' ); if ( empty( $this->params[''phone''] ) ) return $this->error( ''phone'' ); if ( empty( $this->params[''productinfo''] ) ) return $this->error( ''productinfo'' ); if ( empty( $this->params[''surl''] ) ) return $this->error( ''surl'' ); if ( empty( $this->params[''furl''] ) ) return $this->error( ''furl'' ); return true; } private function error ( $key ) { return ''Mandatory parameter '' . $key . '' is empty''; } } class Response { private $salt; private $params = array (); public function __construct ( $salt ) { $this->salt = $salt; } public function __destruct () { unset( $this->salt ); unset( $this->params ); } public function __set ( $key, $value ) { $this->params[$key] = $value; } public function __get ( $key ) { return $this->params[$key]; } public function get_response ( $params = null ) { $this->params = (is_array( $params ) && count( $params )) ? $params : $_POST; $error = $this->check_params(); if ( $error === true ) { if ( Misc::reverse_hash( $this->params, $this->salt, $this->params[''status''] ) === $this->params[''hash''] ) { switch ( $this->params[''status''] ) { case ''success'' : return array ( ''status'' => Misc::SUCCESS, ''data'' => $this->params[''surl''] ); break; case ''failure'' : return array ( ''status'' => Misc::SUCCESS, ''data'' => $this->params[''furl''] ); break; default : return array ( ''status'' => Misc::FAILURE, ''data'' => ''Unmapped status'' ); } } else { return array ( ''status'' => Misc::FAILURE, ''data'' => ''Hash Mismatch'' ); } } else { return array ( ''status'' => Misc::FAILURE, ''data'' => $error ); } } private function check_params () { if ( empty( $this->params[''key''] ) ) return $this->error( ''key'' ); if ( empty( $this->params[''txnid''] ) ) return $this->error( ''txnid'' ); if ( empty( $this->params[''amount''] ) ) return $this->error( ''amount'' ); if ( empty( $this->params[''firstname''] ) ) return $this->error( ''firstname'' ); if ( empty( $this->params[''email''] ) ) return $this->error( ''email'' ); if ( empty( $this->params[''phone''] ) ) return $this->error( ''phone'' ); if ( empty( $this->params[''productinfo''] ) ) return $this->error( ''productinfo'' ); if ( empty( $this->params[''surl''] ) ) return $this->error( ''surl'' ); if ( empty( $this->params[''furl''] ) ) return $this->error( ''furl'' ); return true; } private function error ( $key ) { return ''Mandatory parameter '' . $key . '' is empty''; } } $txnid = uniqid(); $response = pay_page( array (''key'' => ''tradus'', ''txnid'' => uniqid( ''animesh_'' ), ''amount'' => rand( 0, 100 ),''firstname'' => ''animesh'', ''email'' => ''[email protected]'', ''phone'' => ''1234567890'',''productinfo'' => ''This is shit'', ''surl'' => ''payment_success'', ''furl'' => ''payment_failure''), ''200'' ); ?>


Recientemente, PayUMoney realizó algunas modificaciones en el entorno de prueba debido a las cuales key-JBZaLc y salt-GQs7yium ya no funcionarán.

Para probar la puerta de enlace con una clave de prueba y salt, debe ir a test.payumoney.com y registrarse como comerciante. Así obtendrá la identificación del comerciante y la identificación de Salt.


También causa problemas si está utilizando el formulario predeterminado y solicita Product Info . En su documento PDF, han dado un formato json para información de productos como este:

{“paymentParts”:[{ "name":"abc", "description":"abcd", "value":"500", "isRequired":"true", “settlementEvent” : “EmailConfirmation” }, { "name":"xyz", "description":"wxyz", "value":"1500", "isRequired":"false", “settlementEvent”: “EmailConfirmation” }], {“paymentIdentifiers”:[{ "field":"CompletionDate", }, { "value":"31/10/2012” "field":"TxnId", "value":"abced" }]}

Insertar este json en el área de texto de Product Info del Product Info puede ayudarlo a resolver el problema.