php 在测试模式下集成 PayUMoney 支付网关时“很抱歉发生了一些错误”
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/23773892/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
'sorry some error occurred' while integrating PayUMoney payment gateway in Test mode
提问by Ashutosh
I'm trying to integrate PayUMoneypayment gateway in my client site. My client provided me the login details of PayUMoney. I was able to locate the Merchant Keybut cannot find either of the two:
我正在尝试在我的客户站点中集成PayUMoney支付网关。我的客户向我提供了PayUMoney的登录详细信息。我能够找到商家密钥,但找不到两者中的任何一个:
- Merchant Salt
- Developer site where I can create a test account and test on sandbox
- 商人盐
- 开发人员站点,我可以在其中创建测试帐户并在沙箱上进行测试
PayUMoneyprovided me a form with some default value but when I test, it gives the message: sorry some error occurred.
PayUMoney为我提供了一个带有一些默认值的表单,但是当我测试时,它给出了消息:抱歉,发生了一些错误。
Here is the form:
这是表格:
<?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>
采纳答案by Ashutosh
Finally I came to know that they have not activated the test account.
最后我才知道他们没有激活测试帐户。
回答by pinkal vansia
This is confusing for the first timers. Supplied default key
and salt
will not work straight away.
这对于第一次使用的人来说是令人困惑的。提供默认值key
,salt
不会立即工作。
In order to test the gateway using a test key and salt, kindly follow these steps:
为了使用测试密钥和盐测试网关,请按照以下步骤操作:
- Go on test.payumoney.com
- Sign up as a merchant - use any of your valid email ids - kindly do not use a random email id.
- Complete the "Business Details" - you may use PAN no. ABCDE1234F and DOB - 01/04/1990
- Complete "Bank Account Details" (You may use IFSC- ALLA0212632)
- You dont have to worry about Bank verification step or any other step after that.
Go to below mentioned location to get the Test Merchant Id : Seller Dashboard -> Settings -> My account -> Profile Settings
After that send your test merchant id to technical team using contact usform and they will approve.
- Once approved you can find your test key and salt at : Seller Dashboard -> Settings -> My account -> Merchant Key - Salt.
- Replace default
key
andsalt
with newly generated testkey
andsalt
. After this you should not see error, Sorry, Some Problem Occurred.
- 继续 test.payumone.com
- 注册为商家 - 使用您的任何有效电子邮件 ID - 请不要使用随机电子邮件 ID。
- 完成“业务详细信息” - 您可以使用 PAN 号。ABCDE1234F 和 DOB - 01/04/1990
- 填写“银行账户详细信息”(您可以使用 IFSC-ALLA0212632)
- 您不必担心银行验证步骤或之后的任何其他步骤。
转到下面提到的位置以获取测试商家 ID:卖家仪表板 -> 设置 -> 我的帐户 -> 个人资料设置
之后,使用联系我们表格将您的测试商家 ID 发送给技术团队,他们会批准。
- 获得批准后,您可以在以下位置找到您的测试密钥和盐:卖方仪表板 -> 设置 -> 我的帐户 -> 商家密钥 - 盐。
- 替换默认
key
并salt
与新生成的测试key
和salt
。在此之后,您不应看到错误,抱歉,发生了一些问题。
I hope this helps.
我希望这有帮助。
回答by viren Kalkhudiya
The Key and salt provided by payumoney is invalid use the following for testing:
payumoney 提供的 Key 和 salt 是无效的,使用以下进行测试:
// Merchant key here as provided by Payu
$MERCHANT_KEY = "gtKFFx";
// Merchant Salt as provided by Payu
$SALT = "eCwWELxi";
And make sure to leave service provider field blank.
并确保将服务提供商字段留空。
回答by techsupport PayUMoney
There is a field "Service Provider"in the form (param name is - service_provider). The value of this field should be 'payu_paisa'. If you fill anything else in this field in the form, you will get an error.
表单中有一个字段“服务提供者”(参数名称是 - service_provider)。此字段的值应为“payu_paisa”。如果您在表单的此字段中填写其他任何内容,您将收到错误消息。
回答by Aravind NC
Leave the Service Provider field as blank. That should work.
将服务提供商字段留空。那应该工作。
回答by Swaps
It also causes trouble if you are using default form and it asks for Product Info
. In their PDF document they have given a json format for product info like this -
如果您使用默认表单并且它要求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"
}]}
Inserting this json into the Product Info
textarea might help you to solve the problem.
将此 json 插入Product Info
textarea 可能会帮助您解决问题。
回答by Rishabh Gusain
Payumoney has changed their TEST KEY and TEST SALT
Payumoney 更改了他们的 TEST KEY 和 TEST SALT
in order to get test mode working use these credentials with test url
为了使测试模式正常工作,请将这些凭据与测试 url 一起使用
Test Key - rjQUPktU
Test Salt - e5iIg1jwi8
Still facing problems then try following steps
仍然面临问题然后尝试以下步骤
Are you using the correct Merchant Key? In many shopping carts, the field name used is "Merchant ID" is used incorrectly in place of Merchant Key. However, what actually needs to be entered is the "Merchant Key" supplied by PayUmoney. Please notice that we send you an email with the following 3 details:
(1) Merchant ID
(2) Merchant Key
(3) Merchant Salt
The Merchant ID sent by PayUmoney is not required in the PayUmoney integration with your website. It is just your registration number with PayUmoney. So, the only 2 information used in the integration are Merchant Key & Merchant Salt. Are you using Test credentials in Live Mode or Live credentials in Test Mode? If yes, please make sure that you use Test credentials in Test Mode and Live credentials in Live Mode. Please make sure that in Test Mode, you are using the below mentioned test credentials only -
Test Key - rjQUPktU
Test Salt - e5iIg1jwi8
Have you got all the approvals?
If your approvals are pending, it is quite possible that you get this error even though you are doing everything right. Please contact the support team for assistance by scheduling a call using the following link: https://calendly.com/payumoney-integration/30_minutes
您是否使用了正确的商家密钥?在许多购物车中,使用的字段名称是“Merchant ID”,错误地代替了 Merchant Key。但是,实际需要输入的是PayUmoney提供的“商家密钥”。请注意,我们会向您发送一封电子邮件,其中包含以下 3 个详细信息:
(1) 商家 ID
(2) 商家密钥
(3) 商家盐
PayUmoney 发送的商家 ID 在 PayUmoney 与您的网站集成中不需要。这只是您在 PayUmoney 的注册号码。因此,集成中使用的仅有 2 个信息是 Merchant Key 和 Merchant Salt。您是在实时模式下使用测试凭据还是在测试模式下使用实时凭据?如果是,请确保您在测试模式下使用测试凭据,在实时模式下使用实时凭据。请确保在测试模式下,您仅使用下面提到的测试凭据 -
测试密钥 - rjQUPktU
测试盐 - e5iIg1jwi8
您是否获得了所有批准?
如果您的批准正在等待中,即使您做的一切正确,您也很可能会收到此错误。请使用以下链接安排电话联系支持团队寻求帮助:https: //calendly.com/payumoney-integration/30_minutes
回答by satyandera
Try this:
尝试这个:
<?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' );
?>
回答by Jumper Pot
Recently, PayUMoney done some modifications in test environment due to which test key-JBZaLc and salt-GQs7yium will not work anymore.
最近PayUMoney对测试环境做了一些修改,导致测试key-JBZaLc和salt-GQs7yium不能用了。
In order to test the gateway using a test key and salt,you have to Go on test.payumoney.com and Sign up as a merchant .So you will get merchant ID and Salt ID.
为了使用测试密钥和盐测试网关,您必须访问 test.payumoney.com 并注册为商家。因此您将获得商家 ID 和 Salt ID。