1

根据出现的标题建议,我正在用一根旧棍子打死马,但现在已经卡了几天了:

情况: 向我的用户展示一个 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);

    }

希望这对其他人有帮助...

4

1 回答 1

0

在原始问题中编辑的答案。paypal asp.net表单问题的解决方法如下:

  1. 以编程方式生成表单元素和值。(我使用了 NameValueCollection)
  2. 构建你的 url 字符串。例如:

    https://www.paypal.com/cgi-bin/webscr?” +“cmd=_xclick”+“&”+“business=”+yourAccountVariable+“&”+“item_name”(或汇总总计的购物车名称)+yourCartTotalVariable+ETC ETC ETC ETC ETC 用于每个贝宝必需或基于可选参数根据您的要求

  3. 将连接的字符串传递到按钮单击事件中的“Response.Redirect()”中,您希望将用户发送到贝宝网站进行支付:

    PAYPAL pp = 新的 PAYPAL(); protected void img_paywithpaypal_Click(object sender, ImageClickEventArgs e) { Response.Redirect(pp.submit(), false);

    }

希望这对其他人有帮助...

于 2013-08-29T02:56:34.707 回答