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