PayPal快速结帐返回MVC中的HTML响应.net
我有测试应用程序集成了PayPal快速结帐,它运行良好。但现在看来有些问题。在PayPal成功付款后,当我的IPN处理程序检查响应PayPal时将响应返回为HTML页面而不是“VERIFIED”或“INVALID”,因此我无法验证付款。 PayPal最近是否有任何更改用于快速结账?下面是完整的代码PayPal快速结帐返回MVC中的HTML响应.net
<form id="Paypal" name="Paypal" action="https://www.sandbox.paypal.com/cgi-bin/webscr"
method="post">
@Html.Hidden("cmd", "_xclick")
@Html.Hidden("business", "[email protected]")
@Html.Hidden("item_name", "Payment for course registration")
@Html.Hidden("amount", 100)
@Html.Hidden("no_shipping", "1")
@Html.Hidden("return", "http://localhost:49319/cart/IPN")
@Html.Hidden("rm", "2")
@Html.Hidden("notify_url", "http://localhost:49319/cart/IPN")
@Html.Hidden("cancel_return", "http://localhost:49319/cart/PaymentFailure")
@Html.Hidden("currency_code", "CAD")
@Html.Hidden("tax_cart", "1")
@Html.Hidden("custom", "12")
<div class="checkout-button">
<input type="image" src="https://www.paypal.com/en_US/i/btn/btn_xpressCheckout.gif"
align="left" style="margin-right: 7px;" />
</div>
</form>
IPN处理程序代码:
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;
//for proxy
//WebProxy proxy = new WebProxy(new Uri("http://urlort#");
//req.Proxy = proxy;
//Send the request to PayPal and get the response
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;
编辑: 这里被请求字符串发送到贝宝
CONTEXT = wtgSziM4C5x0SI-9CmKcv2vkSeTLK5P_g6HqzC__YTYkcqziFNcB84p79Ja & myAllTextSubmitID = & CMD = _flow & transaction_subject = 12 & txn_type = web_acce PT & PAYMENT_DATE = 01%3A59%3A21 +月+ 02%2C + 2011 + PDT &姓氏=用户& residence_country = CA & pending_reason = paymentreview & ITEM_NAME =付款为+当然+注册& payment_gross = & mc_currency = CAD &业务+ = pramod_1298956597_biz%40sumerusolutions.com & payment_type =即时& protection_eligibility =不合格的& payer_status =验证& verify_sign = Ag7LtkvrF1u9.1ScLJwRM4btR1G1A16qsCs-xUl6EpI1rE1UWpodXJsc & txn_id = 15Y20623GD922445F & PAYER_EMAIL = pramod_1298961722_per%40sumerusolutions.com &税= 0.00 &的test_ipn = 1 &如first_name =测试& RECEIVER_EMAIL = pramod_1298956597_biz%40sumerusolutions.com &量= 1 & payer_id = Z2MRT3Q9L6E28 & receiver_id = RT3M59WESZHEE & = ITEM_NUMBER & PAYMENT_STATUS =待定& handling_amount = 0.00 &航运= 0.00 & mc_gross = 850.00 &定制= 12 &字符集=窗口1252 & notify_version = 3.1 & merchant_return_link =点击+此处& form_charset = UTF-8CONTEXT = wtgSziM4C5x0SI-9CmKcv2vkSeTLK5P_g6HqzC__YTYkcqziFNcB84p79Ja & myAllTextSubmitID = & CMD = _flow & transaction_subject = 12 & txn_type = web_accept & PAYMENT_DATE = 01%3A59%3A21 +月+ 02%2C + 2011 + PDT &姓氏=用户& residence_country = CA & pending_reason = paymentreview & ITEM_NAME =付款为+当然+注册& payment_gross + = & mc_currency = CAD &业务= pramod_1298956597_biz%40sumerusolutions.com & payment_type =即时& protection_eligibility =不合格的& payer_status =验证& verify_sign = Ag7LtkvrF1u9.1ScLJwRM4btR1G1A16qsCs-xUl6EpI1rE1UWpodXJsc & txn_id = 15Y20623GD922445F & PAYER_EMAIL = pramod_129896172 2_per%40sumerusolutions.com & tax = 0.00 & test_ipn = 1 & first_name =测试& receiver_email = pramod_1298956597_biz%40sumerusolutions。COM &数量= 1 & payer_id = Z2MRT3Q9L6E28 & receiver_id = RT3M59WESZHEE & ITEM_NUMBER = & PAYMENT_STATUS =待定& handling_amount = 0.00 &运费= 0.00 & mc_gross = 850.00 &定制= 12 &的charset =窗口1252 & notify_version = 3.1 & merchant_return_link =点击+ here & form_charset = UTF-8 & cmd = _notify-validate
好的。经过大量的试验和错误,并在贝宝论坛发布这个问题,我得到了我的支付网关工作。虽然我对解决方案并不满意,但解决方案是使用PDT,不使用IPN。我从PayPal支持获得的回复是 “问题是IPN是一个额外的通知系统,它有一点延迟,所以它不是100%完美的自动回复页面的解决方案。”
贝宝建议我使用光动力疗法,它现在工作。我把此处的步骤,以便它可以帮助别人谁也面临着这样的问题:
激活“自动返回”和PDT在您的PayPal帐户功能。步骤: 登录到您的PayPal帐户 点击个人资料 点击网站付款习惯设定 设置自动返回到在 在返回URL文本框中 集付款数据传输上输入一个有效的URL。记下显示的PDT令牌。 滚动到页面底部并单击“保存”
将以下参数传递给paypal cmd,business,item_name,amount,return,currency_code,custom。
-
与PDT代码更改IPN处理程序代码,在我的情况PDT代码为如下─
串的authToken,txToken,查询; string strResponse;
authToken = ConfigurationManager.AppSettings["PDTToken"]; //read in txn token from querystring txToken = Request.QueryString.Get("tx"); query = string.Format("cmd=_notify-synch&tx={0}&at={1}", txToken, authToken); // Create the request back string url = ConfigurationManager.AppSettings["PayPalUrl"]; HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); // Set values for the request back req.Method = "POST"; req.ContentType = "application/x-www-form-urlencoded"; req.ContentLength = query.Length; // Write the request back IPN strings StreamWriter stOut = new StreamWriter(req.GetRequestStream(), System.Text.Encoding.ASCII); stOut.Write(query); stOut.Close(); // Do the request to PayPal and get the response StreamReader stIn = new StreamReader(req.GetResponse().GetResponseStream()); strResponse = stIn.ReadToEnd(); stIn.Close(); // If response was SUCCESS, parse response string and output details if (strResponse.StartsWith("SUCCESS")) { }
您需要显示正在返回的html。您的帐户很有可能被暂停或Paypal正在对您做出回应。你能告诉我们HTML吗?
首先,我建议你去Paypal developer support site。虽然他们可能需要一些时间来回答您的问题,但那里的人员对Paypal非常有经验,我相信他们能够给您一个答案。
在您的特定问题上,我的Paypal体验中的&,我相信有两种类型的贝宝帐户。
第一种类型的帐户允许您的网站作为一个第三方 - 那就是:
- 用户提交您的网站上
- 你的网站贝宝通信,接收响应 付款信息
- 您可以在网站上向用户显示该回复
这显然是您要做的。
不过,我相信还有第二种Paypal账户。这个帐户可能会更便宜,具有较少限制条件或条件限制条件,或只是更简单的集成(否则我不知道为什么会选择它)。我相信这个帐户需要你的网站将用户重定向到PayPal,在那里他们将得到回应。
- 在用户提交付款信息
- 您重定向到贝宝
- 他们看到的付款状态或一些其他的消息,可以点击一个链接,回到你的(供应商)网站。
我可能是错的,但这是我对使用Paypal API的回忆。我强烈建议你去上面链接的Paypal开发者网站。
我有完全相同的问题,试图建立IPN ......我有工作,当我从送它将返回验证了沙箱的“电子支票”,但是当我尝试做一个快递结帐它不会返回验证或无效...它返回的东西完全不同于echeck ...它非常奇怪。
我会试着问技术支持与这两项服务有什么不同。
IPN确实从C#的工作,我也有同样的问题,因为你(得到的是要让我登录的HTML页面),然后我发现我错过了在我的帖子下面的变量回PayPal
cmd=_notify-validate
只要我正确添加,PayPal的请求按预期工作。
另一件需要确认的事情是,当IPN请求中收到变量时,将变量传递回来,只需将上述命令附加到回发的开头即可。
我没有使用MVC,但我正在用WCF做这件事,它的作用就像一个魅力。
希望有所帮助。
嗨nEEbz,请参阅我的文章上面更新以上贝宝的回复。我对此毫无头绪,即使付款成功,也会发生这种情况。 PS - 这是从沙盒,我没有测试实际的PayPal网站上的代码。在进入实际站点之前,我首先要在沙箱上进行确认。 – pramodtech 2011-04-23 08:20:55