Paypal Ipn 与 asp.net MVC 的集成

Posted

技术标签:

【中文标题】Paypal Ipn 与 asp.net MVC 的集成【英文标题】:Paypal Ipn integration with asp.net MVC 【发布时间】:2013-07-28 11:26:03 【问题描述】:

HomeControler/Index.cshtml页面如下

<div id="paypalDiv">

        <form id="paypalForm" action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post">
            <fieldset>
                <p class="inline-small-label" style="padding-top: 7px;">
                    <label for="device-id"><span>User ID</span></label></p>

                <input id="custom" class="full-width" type="text" name="custom" value="">
                <input class="full-width" type="hidden" name="business" value="sampath-facilitator@inexisconsulting.com">
                <input type="hidden" name="cmd" value="_xclick">
                <input type="hidden" name="item_name" value="credits">
                <input type="hidden" name="item_number" value="40">
                <input type="hidden" name="amount" value="2.95">
                <input type="hidden" name="no_shipping" value="1">
                <input type="hidden" name="return" value="http://localhost:13769">
                <input type="hidden" name="notify_url" value="https://localhost:13769/Home/Ipn">
                <button class="btn btn-primary submit-button" type="submit">Pay with PayPal</button>
            </fieldset>

        </form>
    </div>

HomeControler/Ipn Action方法如下

public ActionResult Ipn()

    // Receive IPN request from PayPal and parse all the variables returned
    var formVals = new Dictionary<string, string>();

    formVals.Add("cmd", "_notify-validate");

    // if you want to use the PayPal sandbox change this from false to true
    string response = GetPayPalResponse(formVals, false);

    if (response == "VERIFIED")
    
        string transactionID = Request["txn_id"];
        string sAmountPaid = Request["mc_gross"];
        string deviceID = Request["custom"];

        //validate the order
        Decimal amountPaid = 0;
        Decimal.TryParse(sAmountPaid, out amountPaid);

        if (sAmountPaid == "2.95")
        
            // take the information returned and store this into a subscription table
            // this is where you would update your database with the details of the tran

            return View();

        
        else
        
            // let fail - this is the IPN so there is no viewer
            // you may want to log something here
        
    

    return View();

我的问题是即使付款完成后,上面的 Ipn 操作方法也没有触发。无法调试。我该怎么做?

【问题讨论】:

嗨,我面临同样的问题。如何在本地服务器上测试它。能否请您出示您的 GetPayPalResponse 方法代码? 【参考方案1】:

如果我没记错的话,IPN 是一个异步调用,可以在事务之后的任何时间出现(它通常是“即时的”,有时不是那么多)。但这来自无法访问http://localhost 的 PayPal。要测试 IPN,您需要部署到任何人都可以访问的实际 Internet 站点。自从我与 IPN 合作以来已经有几年了——但那是我的一般经验。在您的应用程序中设置一些日志记录,发布,然后执行您的测试事务。

编辑:

另外 - 我认为你可以给它你的 WAN IP 地址(不是本地),打开路由器中的端口,然后使用该 IP 地址(注意你可能需要启用与 IIS Express 的远程连接 - 请参阅 @987654321 @):

<input type="hidden" name="notify_url" value="https://97.25.43.21:13769/Home/Ipn">

【讨论】:

很好的建议。今晚我会尝试这个解决方案,并会给你一个反馈。非常感谢。 我已通过将我的应用托管在具有可信认证 (https) 的公共访问 IIS 上来解决我的问题。感谢您的想法。 @Ostati 是的,我已成功完成 IPN 集成。如果您需要任何帮助,请告诉我。并且当您为我放置 cmets 时使用“@sampath”,否则 SOF 不会通知我或直接放在我的问题区域,则无需使用“@”标记。 @Sampath ,嗨,sampath,这是 Kishore。我面临着与 ipn 相同的问题。我没有得到任何回复,所以我无法找到解决方案。这是我的代码 sn-p。 ***.com/questions/20607219/… @Kishore 我想和你分享我的工作代码。所以如果你仍然有同样的问题,请告诉我。【参考方案2】:

您可以在本地主机上检查 ipn。您需要设置您的路由器以接受传入呼叫并将其重定向到您的本地主机。然后去paypal.sandbox。使用他们的工具,您可以模拟对本地主机的不同 IPN 响应(当然使用您的外部 IP 地址)。

通过这种方式,沙盒将 tcp/Ip 消息发送到您的机器,您的路由器将其重定向到托管测试网站的机器。

最好不要尝试向沙盒发送消息并期望接收并捕获回复。并不是沙盒工作不正常。它是。

问题是如果沙盒响应速度很快,那么您的测试机器(在调试模式下)可能不够快,无法捕获返回的 tcp/ip 数据包。您可以使用另一台机器在您的本地主机网站上启动交易。即解耦测试交易路径。

希望这会有所帮助。

【讨论】:

让 ngrok 在 Internet 和您的 localhost 之间架起一个通道,它是可以在包括 Windows 在内的所有平台上运行的好工具。

以上是关于Paypal Ipn 与 asp.net MVC 的集成的主要内容,如果未能解决你的问题,请参考以下文章

无法通过Paypal测试工具测试IPN(HTTP错误代码500)_Asp.net

PayPal 即时付款通知 (IPN) 无法正常工作 ASP.NET C#

PayPal IPN 和 ASP.NET - 未正确处理包含 & 符号或版权符号的产品的 IPN 消息

PayPal IPN 通知验证正在返回 ASP.NET 的沙盒登录 HTML

Asp.net MVC - 贝宝 ipn

如何将 asp.net mvc 5 与最新的 Paypal checkout .net sdk v2 集成?