生成Paypal表格

时间:2013-08-28 04:15:00

标签: c# asp.net paypal

基于提出的标题建议,我用一根旧棍子打死了一匹马,但现在已经卡住了几天:

情况:使用PayPal按钮向我的用户展示他们的购物车总额+税款到PayPal,以便他们可以在使用我的自定义购物车结账后使用信用卡付款

问题: Paypal会使用带有参数值和item_number以及帐号的帖子表单。如何创建“表单”,以便我可以在帖子之前设置表单的值?

首先我从这里开始:https://www.paypal.com/cgi-bin/webscr?cmd=p/pdn/howto_checkout-outside#methodone

非常基本:它是一个使用post将数据提交给paypal的表单。然而,第一个问题是数据在表单中是静态的。我无法以编程方式将值更改为每个用户都使用自定义表单及其各自的总计和购物车ID。

我建议的解决方案: 我创建了一个类来收集执行帖子所需的信息,然后使用WebClient对象提交post请求:

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请求,这在理论上解决了我的问题,但当然你可能已经猜到了,这是提交服务器端的,因此用户不会被重定向到paypals站点,因为他们会如果他们点击了上面提到的paypal页面中的一个正常按钮。我的页面只是回发,如果我查看来自WebClient的响应我收到来自paypal的错误,表明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()'

中的按钮点击事件中调用submit方法
 PAYPAL pp = new PAYPAL();
         protected void img_paywithpaypal_Click(object sender, ImageClickEventArgs e)
    {
        Response.Redirect(pp.submit(), false);

    }

希望这有助于其他人......

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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

    }

  4. 希望这有助于其他任何人......