难以在MVC3应用程序中确认Paypal的即时支付通知(IPN)



我正在尝试让Paypal的IPN服务在我的应用程序中运行。

当我使用设置为"Web Accept"交易类型的Paypal Sandbox IPN Simulator时,Paypal说消息处理得很好(如果我在处理IPN的Action中把代码搞砸了,Paypal会说存在服务器错误,所以这似乎是正确的通信)。

然而,它似乎实际上并没有做任何事情。如果我在浏览器myapp.com/Paypal/IPN中导航到我的IPN操作,我会从贝宝收到一个响应,上面写着INVALID(正如预期的那样),这将通过Debug.Write写入我的输出。当我在Paypal的模拟器中点击"发送IPN"时,我根本没有收到调试消息,尽管我的IPN操作充满了Debug.Write行。(从本地环境外部进行的呼叫是否根本不允许Debug.Write输出?)

作为参考,以下是我的IPN操作的大部分(为了清晰起见,我删除了各种逻辑):

public ActionResult IPN()
{
    Debug.Write("entering ipn action ");
    var formVals = new Dictionary<string, string>();
    formVals.Add("cmd", "_notify-validate");
    string response = GetPayPalResponse(formVals, true);
    Debug.Write("IPN Response received: " + response + " <-- That was response. . . ");
    if (response == "VALID")
    {
        Debug.Write("Response Was Verified");
    }
    else
    {
        Debug.Write("RESPONSE WAS NOT VERIFIED");
    }
    return this.View();
}

string GetPayPalResponse(Dictionary<string, string> formVals, bool useSandbox)
{
    string paypalUrl = useSandbox
                            ? "https://www.sandbox.paypal.com/cgi-bin/webscr"
                            : "https://www.paypal.com/cgi-bin/webscr";
    HttpWebRequest req = (HttpWebRequest)WebRequest.Create(paypalUrl);
    //Set values for the request back
    req.Method = "POST";
    req.ContentType = "application/x-www-form-urlencoded";
    byte[] param = Request.BinaryRead(Request.ContentLength);
    string strRequest = Encoding.ASCII.GetString(param);
    StringBuilder sb = new StringBuilder();
    sb.Append(strRequest);
    foreach (string key in formVals.Keys)
    {
        sb.AppendFormat("&{0}={1}", key, formVals[key]);
    }
    strRequest += sb.ToString();
    req.ContentLength = strRequest.Length;
    string response = "";
    using (StreamWriter streamOut = new StreamWriter(req.GetRequestStream(), System.Text.Encoding.ASCII))
    {
        streamOut.Write(strRequest);
        streamOut.Close();
        using (StreamReader streamIn = new StreamReader(req.GetResponse().GetResponseStream()))
        {
            response = streamIn.ReadToEnd();
        }
    }
    return response;
}

如果Paypal真的向我的IPN操作提交请求,我应该在浏览器中访问IPN操作时收到相同的Debug.Write消息,我的理解是否正确?

在我看来,当Paypal向我的网络应用程序发送IPN模拟消息时,并没有发生任何实际的事情,但Paypal说一切都很好,Paypal不知何故知道我是否故意让IPN操作在发生错误时出错(所以它似乎真的在以某种方式调用该操作)

有人能帮我理解我在这里不理解的地方吗?

我只想让我的用户能够使用贝宝的标准支付方式和"立即购买"按钮进行支付,并在确认收到付款时将数据库值从false更改为"true"。

谢谢你抽出时间。

注意:我测试这一点的另一种方法是,如果调用了操作,就让操作更改我数据库中的某些内容(我只是做了类似MyEntity.Value = new valuedb.SaveAll();的操作。如果我在浏览器中直接导航到操作,就会对我的数据库进行此更改,但当我让贝宝IPN模拟器"ping"操作时,不会发生任何更改。

更新:

好的,使用trace.axd:运行跟踪

<trace enabled="true" requestLimit="100" pageOutput="false" traceMode="SortByTime" localOnly="false" />

当我运行Paypal IPN模拟器或使用本地网络外的设备浏览网页时,它的行为就像什么都没发生一样。

请注意,当我访问本地计算机上的页面时,我确实看到详细信息发生了变化:

8   7/8/2012 6:25:01 PM paypal/ipn  200 GET View Details
9   7/8/2012 6:25:02 PM paypal/themes/ui-lightness/jquery-ui-1.8.19.custom.css  404 GET View Details
10  7/8/2012 6:25:02 PM favicon.ico 404 GET View Details
11  7/8/2012 6:25:52 PM favicon.ico 404 GET View Details
12  7/8/2012 6:26:09 PM home/paypaltest 200 GET View Details

更新2:

我通过将调试器附加到:w3wp.exe ,使调试器开始调试

当我使用IPN模拟器时,Paypal似乎确实进入了我的页面,并用VERIFIED进行了响应。不确定这对我意味着什么。将更新。

更新3:

通过调试,我能够正确地测试所有内容,IPN验证实际上按预期工作——如果没有正确的调试消息,我就无法判断。

谢谢你抽出时间。

通过调试,我能够正确地测试所有内容,IPN验证实际上按预期工作——如果没有正确的调试消息,我就无法判断。

谢谢你抽出时间。

相关内容

  • 没有找到相关文章

最新更新