1

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

当我使用 Paypal Sandbox IPN Simulator设置为“Web Accept”的交易类型时,Paypal 说消息通过就好了(如果我弄乱了处理 IPN 的操作中的代码,Paypal 说有一个服务器错误,所以这似乎是正确的通信)。

但是,它似乎实际上并没有做任何事情。如果我在浏览器中导航到我的 IPN 操作myapp.com/Paypal/IPN,我会收到来自 paypal 的回复,上面写着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 操作提交请求,我应该收到与Debug.Write我在浏览器中访问 IPN 操作时相同的消息?

在我看来,当 Paypal 将 IPN 模拟消息发送到我的 Web 应用程序时,实际上并没有发生任何事情,但是 Paypal 说一切正常,Paypal 不知何故知道我是否故意让 IPN 操作在引起错误时出现错误(所以它看起来实际上以某种方式调用该操作)。

谁能帮我理解我在这里不理解的东西?

我只希望我的用户能够使用带有“立即购买”按钮的 Paypal 标准付款方式进行付款,并且能够在false确认已收到付款后将数据库值从“真”更改为“真”。

感谢您的时间。

注意:我测试的另一种方法是,如果调用了该操作,则在我的数据库中更改某些内容(我只是做了类似MyEntity.Value = new valuethendb.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

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

更新 3:

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

感谢您的时间。

4

1 回答 1

0

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

感谢您的时间。

于 2012-07-09T00:30:10.403 回答