我想使用Express Checkout和notify_url参数在我的网站中集成Paypal,这将通知我的网站,并且我可以采取行动。
我生成了buynowbuttons。现在购买样品按钮是:
<form action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post">
<input name="notify_url" value='http://localhost:9000/Home/ProcessPayment' type="hidden"/>
<input type="hidden" name="cmd" value="_xclick">
<input type="hidden" name="business" value="something@something.com">
<input type="hidden" name="lc" value="US">
<input type="hidden" name="item_name" value="Basic">
<input type="hidden" name="amount" value="24.99">
<input type="hidden" name="currency_code" value="USD">
<input type="hidden" name="button_subtype" value="services">
<input type="hidden" name="no_note" value="0">
<input type="hidden" name="tax_rate" value="0.000">
<input type="hidden" name="shipping" value="0.00">
<input type="hidden" name="bn" value="PP-BuyNowBF:btn_buynowCC_LG.gif:NonHostedGuest">
<input type="image" src="https://www.sandbox.paypal.com/en_US/i/btn/btn_buynowCC_LG.gif"
border="0" name="submit" alt="PayPal - The safer, easier way to pay online!">
<img alt="" border="0" src="https://www.sandbox.paypal.com/en_US/i/scr/pixel.gif"
width="1" height="1">
</form>
我添加了<input name="notify_url" value='http://localhost:9000/Home/ProcessPayment' type="hidden"/>
,因此它可以在我的控制器中通知我的操作方法以进行调试。但是,它无法正常工作。
我被重定向到Paypal帐户:
https://www.sandbox.paypal.com/us/cgi-bin/webscr?cmd=_flow&SESSION=somesession&dispatch=somedispatch
但是一旦付款完成,它就永远不会在Home控制器的ProcessPayment操作中遇到我的断点。有什么东西我不见了吗?
提前致谢:)
更新: - 我有hidemyass pro帐户,然后我只需要在IIS中设置我的网站,然后我的notify_url就像魅力一样;)。
答案 0 :(得分:1)
这是因为他们为该网址创建了自己的HTTPRequest,而且它不属于您的会话。
他们会尝试从他们的服务器联系您的localhost:9000,并且此URL不存在。
您需要输入一些日志记录来检查他们与此网址对话时会发生什么,例如:记录他们已到达页面,以及代码中发生了什么。然后把这个页面“Live”放在某处,让PayPal与之交谈。
答案 1 :(得分:1)
在通常情况下,在这种情况下你的断点永远不会被击中,这是正常的,因为:
如果您没有“直接”外部IP地址(并且您将至少拥有路由器)或者您已配置了所有内容以执行正确的NAT端口转发,则PayPal IPN将转至:
1)Nirvana,因为您没有正确配置IP地址
OR
2)向您的Testserver / Production服务器提供您实际配置的IP地址的IP地址。
更新:
有两种解决方案:
OR
我个人倾向于解决方案1.因为我从未让远程调试器像我预期的那样工作..
答案 2 :(得分:1)
请参阅下面的一些评论,我相信这些评论可以帮助您解决此问题:
1 - notify_url需要是可以从PayPal访问的网址。它应该是http://www.example.com/path/to/your/script之类的东西。这是PayPal将使用交易结果发布的网址。
2 - 当从PayPal返回时,您需要一种方法来识别交易。我这样做的方法是包括一个字段
<input type="hidden" name="invoice" value=$uniquevaluecreatedbyyourapplication>
Paypal会在回复中发回此字段。
在我的情况下,我将事务添加到MySQL表中,并将唯一记录ID作为发票号传递。当PayPal发回响应时,我会根据我的数据库检查发票号以识别交易。
我希望这会有所帮助。如果没有,请再次发布。
更新以包含有关IPN消息的更多详细信息
基本上,当交易完成时,PayPal将发布到您在notify_url字段中传递的脚本。
Paypal会在该帖子上附加一个令牌(tx)。您的脚本将使用以下内容调用:
http://www.example.com/path/to/your/listener?tx=1234567890099r48&... (PayPal adds also other transaction fields here).
但是,您不应该依赖PayPal添加到第一条消息的交易字段,因为您实际上并不知道它来自PayPal。
因此,为了确认消息来自PayPal,您需要将消息回发给PayPal,包括发送给您的tx_token PayPal;只有你知道一个auth_token(你从PayPal卖家账户中得到这个);和一个告诉PayPal你正在验证交易的cmd变量。
一旦PayPal从您的监听器脚本收到此帖子,它将回复一条确认交易已完成的帖子以及所有详细信息。您可以依赖这第二篇帖子,因为它是您使用独特的auth_token请求Paypal的结果。
PayPal会向您发送一堆包含交易信息的字段,其中包括确认付款是否成功或处于待处理状态的字段。根据客户经常支付的方式,付款可能会暂停一段时间,直到清除为止。付款清算后,PayPal会自动向您发送另一条消息。所以你应该配置你的监听器来处理第二条消息。 PayPal建议您在付款清算之前不要发货。
为了帮助您入门,请参阅下面我用于处理PayPal响应的侦听器脚本的代码。您需要根据自己的需要进行调整,但这对我有用。
$req = 'cmd=_notify-synch';
$tx_token = $_GET['tx'];
$auth_token = "enter your own authorization token";
$req .= "&tx=$tx_token&at=$auth_token";
// post back to PayPal system to validate
$header .= "POST /cgi-bin/webscr HTTP/1.0\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n";
//$fp = fsockopen ('http://www.sandbox.paypal.com', 80, $errno, $errstr, 30);
// If possible, securely post back to paypal using HTTPS
// Your PHP server will need to be SSL enabled
// replace www.sandbox.paypal.com with www.paypal.com when you go live
$fp = fsockopen ('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30);
if (!$fp)
{
// HTTP ERROR
}
else
{
fputs ($fp, $header . $req);
// read the body data
$res = '';
$headerdone = false;
while (!feof($fp))
{
$line = fgets ($fp, 1024);
if (strcmp($line, "\r\n") == 0)
{
// read the header
$headerdone = true;
}
else if ($headerdone)
{
// header has been read. now read the contents
$res .= $line;
}
}
// parse the data
$lines = explode("\n", $res);
$keyarray = array();
if (strcmp ($lines[0], "SUCCESS") == 0)
{
for ($i=1; $i<count($lines);$i++)
{
list($key,$val) = explode("=", $lines[$i]);
$keyarray[urldecode($key)] = urldecode($val);
}
$firstname = $keyarray['first_name'];
$lastname = $keyarray['last_name'];
$itemname = $keyarray['item_name'];
$amount = $keyarray['payment_gross'];
$invoiceid = $keyarray['invoice'];
$profileid = $keyarray['subscr_id'];
// check the payment_status is Completed
// check that txn_id has not been previously processed
// check that receiver_email is your Primary PayPal email
// check that payment_amount/payment_currency are correct
// process payment
// show receipt to client
}
}
我希望这会有所帮助。