我正在使用Paypal Sandbox,但我无法在我的应用程序中使用它。我编写了一个脚本来处理IPN并创建发票,向客户和我自己发送电子邮件等。付款总是成功的。我的问题是IPN的无效答案。
当我使用Papyal Sandobx的测试工具向我的脚本网址发送IPN时,一切正常。但是如果我在我的应用程序中进行购买操作,使用我的表单从我的Sandbox帐户付款,我会收到INVALID作为答案。
因此,问题不在脚本中,而是在我的应用程序付款表单中。我已经审查了表格但没有成功。最后,我将表单隔离在一个空白的html文件中,其中包含硬编码的item_name
,amount
和自定义数据。但我仍然收到无效。我不知道还能尝试什么。非常感谢您的帮助。提前谢谢!
这是我的孤立形式:
<!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>Test Form</title>
</head>
<body>
<form action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post">
<input type="hidden" name="cmd" value="_xclick">
<input type="hidden" name="business" value="my_email_sandobx_business_account">
<input type="hidden" name="item_name" value="Item Fake">
<input type="hidden" name="currency_code" value="EUR">
<input type="hidden" name="amount" value="60">
<input type="hidden" name="custom" id="custom" value="my_custom_data" />
<input type="hidden" name="notify_url" id="notify_url" value="my_url" />
<input type="hidden" name="return" id="return" value="my_url" />
<input type="hidden" name="cancel_return" id="cancel_return" value="my_url" />
<input type="submit" name="btnPaypal" value="Pay with Paypal" class="btn"/>
</form>
</body>
</html>
这是脚本。我强调:当我从Sandbox的测试工具发送IPN时,脚本会起作用。
public function ipnProcess()
{
//read the post from PayPal system and add 'cmd'
$req = 'cmd=_notify-validate';
foreach ($_POST as $key => $value)
{
$value = urlencode(stripslashes($value));
$req .= "&$key=$value";
}
// post back to PayPal system to validate
$header = "POST /cgi-bin/webscr HTTP/1.0\r\n";
$header .= "Host: www.sandbox.paypal.com\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n";
$fp = fsockopen('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30);
if(!$fp)
{
//HTTP ERROR
//Send alert email
} else {
fputs($fp, $header . $req);
while(!feof($fp))
{
$res = fgets ($fp, 1024);
if(strcmp($res, "VERIFIED") == 0)
{
// check the payment_status is Completed
if($this->input->post('payment_status') == 'Completed')
{
//Internal operations in my application (…)
}
} else if(strcmp($res, "INVALID") == 0)
{
// PAYMENT INVALID & INVESTIGATE MANUALY!
//EMAIL ME To check manually and contact the buyer
}
}
fclose ($fp);
}
}