19

我正在尝试将PayUMoney支付网关集成到我的客户站点中。我的客户向我提供了PayUMoney的登录详细信息。我能够找到商家密钥,但找不到两者中的任何一个:

  1. 商盐
  2. 开发人员站点,我可以在其中创建测试帐户并在沙盒上进行测试

PayUMoney为我提供了一个带有一些默认值的表单,但是当我测试时,它给出的信息是:抱歉,发生了一些错误。

这是表格:

<?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>
4

10 回答 10

31

这对于初学者来说是令人困惑的。提供默认值keysalt不会立即工作。

为了使用测试密钥和盐测试网关,请按照以下步骤操作:

  1. 继续 test.payumoney.com
  2. 注册为商家 - 使用您的任何有效电子邮件 ID - 请不要使用随机电子邮件 ID。
  3. 填写“业务详细信息” - 您可以使用 PAN 号。ABCDE1234F 和出生日期 - 01/04/1990
  4. 填写“银行账户详细信息”(您可以使用 IFSC-ALLA0212632)
  5. 您不必担心银行验证步骤或之后的任何其他步骤。
  6. 转到下面提到的位置以获取测试商家 ID:卖家仪表板 -> 设置 -> 我的帐户 -> 个人资料设置

  7. 之后,使用联系我们表格将您的测试商家 ID 发送给技术团队,他们会批准。

  8. 一旦获得批准,您可以在以下位置找到您的测试密钥和盐:卖家仪表板 -> 设置 -> 我的帐户 -> 商家密钥 - Salt。
  9. 用新生成的测试和替换默认值key和。在此之后您应该不会看到错误,抱歉,出现了一些问题。saltkeysalt

我希望这有帮助。

于 2015-08-10T06:33:48.527 回答
13

payumoney提供的Key和salt无效,使用如下测试:

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

// Merchant Salt as provided by Payu
$SALT = "eCwWELxi";

并确保将服务提供商字段留空。

于 2015-11-26T17:06:29.960 回答
9

表单中有一个字段“服务提供者”(参数名称为 - service_provider)。该字段的值应为“payu_paisa”。如果您在表单的此字段中填写其他任何内容,您将收到错误消息。

于 2014-06-12T06:37:36.270 回答
9

将服务提供者字段留空。那应该行得通。

于 2015-08-12T17:02:03.493 回答
7

最后我才知道他们没有激活测试帐户。

于 2015-02-09T13:49:55.297 回答
1

试试这个:

<?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' => 'animesh.kundu@payu.in', 'phone' => '1234567890','productinfo' => 'This is shit', 'surl' => 'payment_success', 'furl' => 'payment_failure'), '200' );

?>
于 2015-02-03T12:03:43.487 回答
1

如果您使用默认表单并且它要求Product Info. 在他们的 PDF 文档中,他们为这样的产品信息提供了 json 格式 -

{“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"
}]}

将此 json 插入Product Infotextarea 可能会帮助您解决问题。

于 2016-08-21T14:55:35.947 回答
1

Payumoney 更改了他们的 TEST KEY 和 TEST SALT

为了使测试模式正常工作,请使用这些凭据和测试 url

Test Key - rjQUPktU 
Test Salt - e5iIg1jwi8

仍然面临问题然后尝试以下步骤

您是否使用了正确的商家密钥?在许多购物车中,使用的字段名称为“Merchant ID”被错误地用于代替 Merchant Key。然而,真正需要输入的是PayUmoney提供的“Merchant Key”。请注意,我们会向您发送一封包含以下 3 个详细信息的电子邮件:

(1) 商户 ID
(2) 商户密钥
(3) 商户盐

PayUmoney 发送的商户 ID 在 PayUmoney 与您网站的集成中不需要。这只是您在 PayUmoney 的注册号。因此,集成中使用的唯一 2 个信息是 Merchant Key 和 Merchant Salt。您是在实时模式下使用测试凭据还是在测试模式下使用实时凭据?如果是,请确保您在测试模式下使用测试凭据,在实时模式下使用实时凭据。请确保在测试模式下,您仅使用下面提到的测试凭据 -

测试密钥 - rjQUPktU
测试盐 - e5iIg1jwi8

您获得所有批准了吗?

如果您的批准处于待处理状态,即使您做对了所有事情,您也很可能会收到此错误。请通过以下链接安排电话联系支持团队寻求帮助: https ://calendly.com/payumoney-integration/30_minutes

于 2017-12-13T14:25:46.053 回答
0

最近,PayUMoney 对测试环境进行了一些修改,导致测试密钥-JBZaLc 和 salt-GQs7yium 不再起作用。

为了使用测试密钥和盐测试网关,您必须访问 test.payumoney.com 并注册为商家。因此您将获得商家 ID 和 Salt ID。

于 2015-08-12T07:19:16.347 回答
0

对于 PayU APIs Asp per doc 和其他参考 API 参考:https ://www.payumoney.com/dev-guide/apireference.html

初始启用测试模式,可以使用沙盒 URL 测试 API 测试模式:https ://developer.payumoney.com/test-mode/ 在测试模式下测试 API 您可以在测试模式下测试 PayUmoney 提供的所有 API使用您的测试凭据。要在沙盒中测试 API,请在您正在调用的 API 的相对 URL 的开头添加 /sandbox,并确保您在 API 请求中传递了测试授权标头。

例如,要测试检查商户交易状态 API:

生产 URL 是

https://www.payumoney.com/payment/payment/chkMerchantTxnStatus

在测试模式下:

https://www.payumoney.com/sandbox/payment/payment/chkMerchantTxnStatus

于 2020-12-22T11:12:39.740 回答