Paypal立即购买按钮快递结账

时间:2011-09-20 07:59:10

标签: c# asp.net asp.net-mvc paypal

我想使用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就像魅力一样;)。

3 个答案:

答案 0 :(得分:1)

这是因为他们为该网址创建了自己的HTTPRequest,而且它不属于您的会话。

他们会尝试从他们的服务器联系您的localhost:9000,并且此URL不存在。

您需要输入一些日志记录来检查他们与此网址对话时会发生什么,例如:记录他们已到达页面,以及代码中发生了什么。然后把这个页面“Live”放在某处,让PayPal与之交谈。

答案 1 :(得分:1)

在通常情况下,在这种情况下你的断点永远不会被击中,这是正常的,因为:

如果您没有“直接”外部IP地址(并且您将至少拥有路由器)或者您已配置了所有内容以执行正确的NAT端口转发,则PayPal IPN将转至:

1)Nirvana,因为您没有正确配置IP地址

OR

2)向您的Testserver / Production服务器提供您实际配置的IP地址的IP地址。

更新:

有两种解决方案:

  1. PayPal IPN listener 设置为您的外部地址(可能是您的homerouter或您的公司路由器)并配置NAT或要求您的管理员执行此操作
  2. OR

    1. 使用您的实时/测试系统上的Remote debugger,附加到iis-process并点击断点。
    2. 我个人倾向于解决方案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
    }
}

我希望这会有所帮助。