我正在尝试让 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 value
thendb.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 验证实际上按预期工作 - 如果没有正确的调试消息,我无法判断。
感谢您的时间。