ASP.NET 表单内的 Paypal 表单

Posted

技术标签:

【中文标题】ASP.NET 表单内的 Paypal 表单【英文标题】:Paypal Form Inside ASP.NET Form 【发布时间】:2012-01-10 13:30:43 【问题描述】:

干杯,

我在将 Paypal 购物车集成到我的 ASP.NET C# 项目时遇到问题。 问题是 Paypal 购物车在 FORM 标签内,所以如果我把它放在我的服务器表单标签内,它将无法工作。

看起来像这样:

<body>
<form id="form1" runat="server">
<form target="_self" action="https://www.paypal.com/cgi-bin/webscr" method="post">
      <input type="hidden" name="cmd" value="_cart">
      <input type="hidden" name="business" value="MySecretEmail@hidden.com">
      <input type="hidden" name="display" value="1">
      <input type="image" src="https://www.paypalobjects.com/en_US/i/btn/btn_viewcart_LG.gif" border="0" name="submit" >
      <img  border="0" src="https://www.paypalobjects.com/en_US/i/scr/pixel.gif"  >
      </form>
</form>
</body>

有什么办法可以防止这种情况发生吗?我在 google 和 *** 上搜索过这个链接:PayPal Name-Value Pair API Basics,但老实说,这对我来说没有任何意义,因为我不是程序员

谢谢!

【问题讨论】:

您还在寻找合适的答案还是可以接受以下其中一项? 【参考方案1】:

从技术上讲,您的示例不是有效的 html。从长远来看,您最好重构此代码以消除您的“技术债务”。 (参见 XHTML 1.0 的 W3C site 元素禁止下的“不得包含其他表单元素”)

与此同时,您可以尝试使用jQuery 提交嵌套表单。

1。替换提交按钮

<button class="submit-button" id="submit-button">Submit Payment</button>

2。修改表单标签

<form id="nested-form" target="_self" action="https://www.paypal.com/cgi-bin/webscr" method="post"> 

3。使用 jQuery 提交表单

<script type="text/javascript">
$('#submit-button').live('click',function() 
    $('#nested-form').submit();
);
</script>

我还没有机会测试这个,所以请测试一下,让我知道它是否适合你。

【讨论】:

谢谢你的回复伙伴。但是说实话,你的解决方案对我来说有点太复杂了,我没有经验。 @MikeBertelsen 如果您按照上述三个步骤(并在您的 'head' 标签中添加对 jQuery 的引用) - 【参考方案2】:

一个快速的解决方案是将贝宝表单放入iframe

在表单元素上,更改target="_parent",使其回发到父页面。

【讨论】:

我不太喜欢使用 iFrame,我只听说过关于它们的“坏事”。除了 iFrame,还有什么我可以使用的吗? @MikeBertelsen 我的答案和其他答案都非常简单,只要你能得到你的情况。否则,请深入研究 API 并使用它。【参考方案3】:

在发现它是 ASP.NET 问题之前,我发现了 PayPal 按钮问题。 在创建按钮和添加到我的页面的过程中,有时它们会起作用,有时它们不会起作用。然后我会有两个相同的按钮,第二个可以工作,第一个不行。删除第一个,然后工作的按钮不会。如果我在我的 PayPal 按钮之前添加了一个表单标签,那么 Paypal 按钮就可以工作了。

<%-- simple form tag --%>
<form action="">
</form>

<form action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post">
  <input type="hidden" name="cmd" value="_xclick">
  <input type="hidden" name="business" value="hughet_1335403121_biz@yahoo.com">
  <input type="hidden" name="lc" value="US">
  <input id="iptItemName" type="hidden" name="item_name" value="testBuyNow">
  <input type="hidden" name="amount" value="10.00">
  <input type="hidden" name="currency_code" value="USD">
  <input type="hidden" name="button_subtype" value="products">
  <input type="hidden" name="no_note" value="0">
  <input type="hidden" name="cn" value="Add special instructions to the seller">
  <input type="hidden" name="no_shipping" value="2">
  <input type="hidden" name="bn" 
    value="PP-BuyNowBF:btn_buynowCC_LG.gif:NonHosted">
  <input type="image" 
    src="https://www.sandbox.paypal.com/en_US/i/btn/btn_buynowCC_LG.gif"
    border="0" name="submit" >
  <img  border="0" 
    src="https://www.sandbox.paypal.com/en_US/i/scr/pixel.gif"
     >
</form> 

我理解这是一个“黑客修复”,但我不确定为什么会这样。好奇这是否适用于其他人。

【讨论】:

【参考方案4】:

解决此问题的最简单方法是使用 asp:button 的 PostBackUrl 属性。使用此方法,ASP 生成您的 JavaScript 来处理外部帖子。

这允许表单的呈现正确发生并且不需要任何解决方法。请记住,由于您的代码已经在表单标签中,因此您的贝宝商品不需要包装在额外的标签中。

例如

<input type='hidden' name='cmd' value='_cart'/>
<input type='hidden' name='upload' value='1'/>
<input type='hidden' name='business' value='business@business.com'/>
<input type='hidden' name='currency_code' value='aud'/>
<input type='hidden' name='item_number_1' value='item number_1'>
<input type='hidden' name='item_name_1' value='16x16 inch square canvas'>
<input type='hidden' name='amount_1' value='70'>
<input type='hidden' name='item_number_2' value='item number_2'>
<input type='hidden' name='item_name_2' value=' 48x20 rectangular canvas'>
<input type='hidden' name='amount_2' value='104'>
<asp:Button ID="Button1" PostBackUrl='https://www.paypal.com/cgi-bin/webscr' runat="server" />

希望这会有所帮助。

【讨论】:

我已经成功使用这种方法多年,直到最近。当在生产环境中单击按钮时(沙盒工作正常),PayPal 可以显示具有 502 状态的空白白页,或显示对象大小为零的消息。这可能是由于传递的额外 .net 表单数据与 PayPal 冲突。我不确定是哪个表单项导致了这种情况,但已经以它自己的形式进行了测试,它可以正常工作。这也可以解释为什么存在或不存在冲突的 .net 表单项时它是间歇性的。如果是这种情况,@SecretaryofRacing 有一个替代解决方案。【参考方案5】:

为什么不让支付表单所在的页面使用已删除标签的 MasterPage。我在所有网站上都这样做,并且没有问题。

【讨论】:

【参考方案6】:

这是一个非常简单的方法。这是我专门使用的,所以我 100% 确定它有效。

    创建一个仅“假”图片的 PayPal 按钮。 用户单击此按钮(它只是一个图像) 此图像有一个 onclick 方法,它调用一个 2 行 javascript 函数(见下文) 将“真正的”PayPal 按钮表单放在页面末尾的关闭表单标记之后。 用 style="display:none;" 将其括在 SPAN 标记中 将 ID="ppsubmit" 添加到“真实”按钮的图像输入

    当用户点击 false 按钮​​时,onclick 方法会调用一个 JavaScript 函数,该函数只做两件事……a) 将 span 显示更改为内联 b) 自动点击真正的 PayPal 按钮。

    <form id="form1" runat="server">
    <!-- Here's the image only "false" paypal button -->
    <input type="image"
    src="https://www.sandbox.paypal.com/en_US/i/btn/btn_subscribeCC_LG.gif"
    border="0" name="submit" 
    onclick="javascript:doPPform();" />
    </form>  <!-- this closes your asp.net form -->
    
    <!-- Here's the hidden span with the real paypal button
         at the bottom of your webpage -->
    <span id="ppform" style="display: none;">
    <form action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post"
     target="_top">
          <input type="hidden" name="cmd" value="_s-xclick">
          <input type="hidden" name="hosted_button_id" value="xxxxx">
          <input id="ppsubmit" type="image" 
              src="https://www.sandbox.paypal.com/en_US/i/btn/btn_subscribeCC_LG.gif"
              border="0" name="submit"
              >
          <img  border="0"
               src="https://www.sandbox.paypal.com/en_US/i/scr/pixel.gif"
                >
    </form>
    </span>
    
    <!-- Here's the 2 line javascript code when the user clicks the "false" button -->
    <script language="javascript" type="text/javascript">
    function doPPform() 
        document.getElementById("ppform").style.display = "inline";
        document.getElementById("ppsubmit").click();
    
    </script>
    

【讨论】:

以上是关于ASP.NET 表单内的 Paypal 表单的主要内容,如果未能解决你的问题,请参考以下文章

Paypal 表单破坏了我的 ASP.NET 网络表单布局 -> 如何解决?

asp.net 中的 Paypal 表单标签问题

如何克服为贝宝按钮 asp.net 嵌入 html 表单

如何使 paypal 按钮在 asp.net webform 中工作

防止 Asp.NET 按钮提交表单

ASP.NET Core MVC:无法在表单标签内呈现字段