Paypal的IPN使用测试工具,但从我的表单返回无效

时间:2012-09-06 17:03:47

标签: paypal sandbox paypal-ipn

我正在使用Paypal Sandbox,但我无法在我的应用程序中使用它。我编写了一个脚本来处理IPN并创建发票,向客户和我自己发送电子邮件等。付款总是成功的。我的问题是IPN的无效答案。

当我使用Papyal Sandobx的测试工具向我的脚本网址发送IPN时,一切正常。但是如果我在我的应用程序中进行购买操作,使用我的表单从我的Sandbox帐户付款,我会收到INVALID作为答案。

因此,问题不在脚本中,而是在我的应用程序付款表单中。我已经审查了表格但没有成功。最后,我将表单隔离在一个空白的html文件中,其中包含硬编码的item_nameamount和自定义数据。但我仍然收到无效。我不知道还能尝试什么。非常感谢您的帮助。提前谢谢!

这是我的孤立形式:

<!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);
    }
}

0 个答案:

没有答案