【发布时间】:2013-08-31 00:31:48
【问题描述】:
根据提出的标题建议,我正在用一根旧棍子打死马,但现在已经卡了几天了:
情况:向我的用户显示一个 paypal 按钮,该按钮将他们的购物车 + 税款的总和传递给 paypal,以便他们在使用我的自定义购物车结账后可以使用信用卡付款.
问题: Paypal 采用带有 value 和 item_number 以及帐号参数的邮寄表单。如何创建“表单”以便在发布之前设置表单的值?
首先我从这里开始:https://www.paypal.com/cgi-bin/webscr?cmd=p/pdn/howto_checkout-outside#methodone
非常基本:它是一种使用 post 将数据提交到 paypal 的表单。然而,第一个问题是表单中的数据是静态的。我无法以编程方式将这些值更改为向每个用户显示带有各自总和购物车 ID 的自定义表单。
我提出的解决方案:
我创建了一个类来收集执行发布所需的信息,然后使用WebClient 对象提交发布请求:
public class PAYPAL
{
public string business { get; set; } //account email
public string item_name { get; set; } //cartname
public string currency_code { get; set; }
public decimal amount { get; set; }
public string URI { get; set; }
public HttpResponse response { get; set; }
public string responseBody { set; get; }
public string ipnUrl { set; get; } //Instant Payment Notification (callback)
public PAYPAL()
{
//Default Values
currency_code = "USD";
URI = "https://www.paypal.com/cgi-bin/webscr";
ipnUrl = URI;
}
public void submit()
{
using (WebClient wc = new WebClient())
{
wc.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
NameValueCollection nvc = new NameValueCollection();
nvc.Add("cmd", "_xclick");
nvc.Add("business", business);
nvc.Add("item_name", item_name); //cartname
nvc.Add("currency_code", currency_code);
nvc.Add("amount", amount.ToString());
byte[] r = wc.UploadValues(URI, nvc);
responseBody = Encoding.UTF8.GetString(r);
}
}
}
这允许我动态地创建对 paypal 的 post 请求,这在理论上解决了我的问题,但当然正如您可能已经猜到的那样,这是提交服务器端的,因此用户不会像他们那样重定向到 paypal 站点如果他们点击了上述贝宝页面上的正常按钮之一。我的页面只是回发,如果我查看来自 WebClient 的响应,我会收到来自贝宝的错误,表明未启用 cookie.... 可能是因为它不是真正的浏览器访问页面。
经过一些其他研究后,我发现这显然是 ASP.NET 开发人员的正常问题。我发现的一个解决方案引用了它是一个很好的解决方案,但无论出于何种原因,我都无法成功实施它:http://jerschneid.blogspot.com/2007/03/hide-form-tag-but-leave-content.html
TL;DR 他们是一种动态创建贝宝表单的方法吗? Pr 强制服务器生成的 WebClient 传输到客户端浏览器,以便他们可以像第一个链接中的静态 paypal 表单按钮一样完成交易?
再次抱歉,这个问题显然是多余的。
使用解决方案编辑:
我更改了我的 PAYAPL 类以返回格式化的 url 字符串,并在代码隐藏中使用“response.redirect()”调用它。
public string submit()
{
//using (WebClient wc = new WebClient())
//{
// wc.Headers[HttpRequestHeader.ContentType] = "appplication/x-www-form urlencoded";
NameValueCollection nvc = new NameValueCollection();
nvc.Add("cmd", "_xclick");
nvc.Add("business", business);
nvc.Add("item_name", item_name); //cartname
nvc.Add("currency_code", currency_code);
nvc.Add("amount", amount.ToString());
StringBuilder sb = new StringBuilder();
foreach (string s in nvc.AllKeys)
{
sb.Append(s + "=" + nvc[s] + "&");
}
return URI + sb.ToString().TrimEnd('&');
// }
}
然后只需从“Response.Redirect()”中的按钮单击事件调用提交方法
PAYPAL pp = new PAYPAL();
protected void img_paywithpaypal_Click(object sender, ImageClickEventArgs e)
{
Response.Redirect(pp.submit(), false);
}
希望这对其他人有所帮助...
【问题讨论】:
-
嗨,jagallout,您能否从您的问题中删除解决方案,并将您认为有用的部分添加到您对问题的回答中?