如何使用C#将用户重定向到PayPal并传递参数

3
如果我有像下面这样的简单表单,我可以使用它将用户重定向到PayPal完成付款:
<form action="https://www.paypal.com/cgi-bin/webscr" method="post">
    <input type="hidden" name="cmd" value="_xclick" />
    <input type="hidden" ...
    <input type="hidden" name="custom" value="<%= someVariable %>" />
    <input type="submit" value="ok" />
</form>

由于我需要在将用户重定向到PayPal之前执行一些操作,因此我需要制作一个正常的asp按钮,在重定向用户到PayPal之前执行一些操作。
我的问题是如何从C#代码后台执行此操作?
重要的是,我可以传递来自上面表单的所有必需的隐藏字段,例如'custom'。


有点棘手,因为ASP.NET表单不允许其他/第二个表单运行...就像PayPal的一个表单一样。 - Aristos
实际上,我知道Web表单只是一个表单。但我也发现,如果你添加<form></form><form action="...</form>它也可以工作。 - 1110
是的,您可以在此之前渲染 </form>,然后添加参数,但在添加最后一个表单后,请不要添加其他会进行 post back 的 asp.net 控件,因为 asp.net 的表单将被破坏。 - Aristos
3个回答

3

传统的ASP.Net不允许使用多个form标签。

下面这段示例代码将让你可以在后台代码中将form提交到PayPal

protected void BuyButton_Click(object sender, EventArgs e)
{
   string url = TestMode ? 
      "https://www.sandbox.paypal.com/us/cgi-bin/webscr" : 
      "https://www.paypal.com/us/cgi-bin/webscr";

   var builder = new StringBuilder();
   builder.Append(url);
   builder.AppendFormat("?cmd=_xclick&business={0}", HttpUtility.UrlEncode(Email));
   builder.Append("&lc=US&no_note=0&currency_code=USD");
   builder.AppendFormat("&item_name={0}", HttpUtility.UrlEncode(ItemName));
   builder.AppendFormat("&invoice={0}", TransactionId);
   builder.AppendFormat("&amount={0}", Amount);
   builder.AppendFormat("&return={0}", HttpUtility.UrlEncode(ReturnUrl));
   builder.AppendFormat("&cancel_return={0}", HttpUtility.UrlEncode(CancelUrl));
   builder.AppendFormat("&undefined_quantity={0}", Quantity);
   builder.AppendFormat("&item_number={0}", HttpUtility.UrlEncode(ItemNumber));

   Response.Redirect(builder.ToString());
}

这里有关于PayPal标准字段的更多信息 - PayPal支付标准的HTML变量

真的只是简单的 Response.Redirect :) 测试通过后我会接受答案... 谢谢 - 1110

0
你可以使用C#动态地创建一个表单并提交它。以下代码可以实现这个功能 -
 protected void Pay()
 {
    RemotePost myremotepost = new RemotePost();
    myremotepost.Url = "https://www.paypal.com/cgi-bin/webscr";
    myremotepost.Add("business", "merchantemail@gmail.com");
    myremotepost.Add("cmd", "_xclick");
    myremotepost.Add("item_name", "Hot Sauce-12oz Bottle");
    myremotepost.Add("amount","5.95");
    myremotepost.Add("currency_code","USD");
    myremotepost.Post();
 }

public class RemotePost
{
    private System.Collections.Specialized.NameValueCollection Inputs = new System.Collections.Specialized.NameValueCollection();
    public string Url = "";
    public string Method = "post";
    public string FormName = "form1";

    public void Add(string name, string value)
    {
        Inputs.Add(name, value);
    }

    public void Post()
    {
        System.Web.HttpContext.Current.Response.Clear();
        System.Web.HttpContext.Current.Response.Write("<html><head>");
        System.Web.HttpContext.Current.Response.Write(string.Format("</head><body onload=\"document.{0}.submit()\">", FormName));
        System.Web.HttpContext.Current.Response.Write(string.Format("<form name=\"{0}\" method=\"{1}\" action=\"{2}\" >", FormName, Method, Url));
        for (int i = 0; i < Inputs.Keys.Count; i++)
        {
            System.Web.HttpContext.Current.Response.Write(string.Format("<input name=\"{0}\" type=\"hidden\" value=\"{1}\">", Inputs.Keys[i], Inputs[Inputs.Keys[i]]));
        }
        System.Web.HttpContext.Current.Response.Write("</form>");
        System.Web.HttpContext.Current.Response.Write("</body></html>");
        System.Web.HttpContext.Current.Response.End();
    }
}

已经全面测试并且正常工作!


-1

你可以构建一个长URL,并将所有这些内容作为URL参数放在那里。但由于你正在使用C#,我建议使用API。在这种情况下,我会看一下快速结账


这就是为什么我建议使用API!否定一个好答案。祝你将来找到帮助。 - Drew Angell
再说一遍,这就是为什么我推荐使用API!你不明白吗?我给了你一个快速简单的解决方案,但它确实有缺点。使用API才是正确的做法。 - Drew Angell
但我知道ASP.NET非常容易处理Web服务API。您需要摆脱基本的HTML表单POST并直接开始使用API。您可以使用NVP字符串和HTTP POST,也可以使用SOAP和PayPal的WSDL。非常安全,并提供比您在此处尝试的更多灵活性。 - Drew Angell
我问了如何通过代码而非 API 发布的问题。我感觉你对某些事情很生气... 顺便说一下,我没有给你的答案点踩。 - 1110
我不确定你的意思。API将来自代码。你看到的那个response.redirect答案基本上就是我关于URL参数所说的。这实际上只是一个问题,即您是使用Payments Standard还是类似Express Checkout的东西。从c#应用程序来看,EC将是推荐的方法,但如果您以其他方式使其工作并且您对此感到满意,那就是最重要的。 - Drew Angell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接