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 网络表单布局 -> 如何解决?