根据出现的标题建议,我正在用一根旧棍子打死马,但现在已经卡了几天了:
情况: 向我的用户展示一个 paypal 按钮,该按钮将他们的购物车 + 税款的总和传递给 paypal,以便他们可以在使用我的自定义购物车结账后使用信用卡付款。
问题: Paypal 采用带有 value 和 item_number 和帐号参数的 post 表单。如何创建“表单”以便在发布之前设置表单的值?
首先我从这里开始: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);
}
希望这对其他人有帮助...