大家好。
很抱歉,如果这个问题看起来很愚蠢,我使用Javascript / HTML时相当新...
我面临Paypal集成的问题。我以前做过,但只有一个独特的价格比我的新需求更简单。
现在我必须计算一个取决于用户输入的价格(选择选项1/2/3 /等......)。
所以我尝试修改表单的数据,然后再发送给PayPal。
这是一些代码: 表格:
<form action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post" target='_new' id='paypalForm'>
<input name="submit" type="image" src="paypal__secure_logo.jpg" alt="PayPal Secured Paiement" align="middle" border="0" onClick="compute()" />
<!--- <input type='hidden' value="3" name="amount" id= "000" /> --->
<input type="radio" name="custom" value="60" >One Hour<br>
<input type="radio" name="custom" value="1400">1 Day<br>
<input type="radio" name="custom" value="10800">1 Week<br>
<input name="currency_code" type="hidden" value="<?php echo "EUR"; ?>" />
<input name="shipping" type="hidden" value="<?php echo "00.00"; ?>" />
<input name="tax" type="hidden" value="00.20" />
<input name="return" type="hidden" value="<?php echo "http://www.web.com/login.php"; ?>" />
<input name="cancel_return" type="hidden" value="<?php echo "http://www.web.com/cancel.php"; ?>" />
<input name="notify_url" type="hidden" value="<?php echo "http://www.web.com/ipn.php"; ?>" />
<input name="cmd" type="hidden" value="_xclick" />
<input name="business" type="hidden" value="<?php echo "XXXXXXXXXXX"; ?>" />
<input name="item_name" type="hidden" value="camp" />
<input name="no_note" type="hidden" value="1" />
<input name="lc" type="hidden" value="EN" />
<input name="bn" type="hidden" value="PP-BuyNowBF" />
</form>
和javascript部分:
<script >
function compute(){
var formToSubmit = document.getElementsByName('paypalForm');
var radios = document.getElementsByName('custom');
var price = 0;
for (var i = 0, length = radios.length; i < length; i++) {
if (radios[i].checked) {
if (radios[i] = "60"){
///document.getElementsByName("amount").value = "4";
price = "4";
///alert(document.getElementsByName("amount").value);
}else if (radios[i] = "1400"){
price = "10";
///document.getElementsByName("amount").value = "10";
}else if (radios[i] = "10800"){
///document.getElementsByName("amount").value = "25";
price = "25";
}
alert('Submitted')
formToSubmit.append('<input type="hidden" name="amount" value="'+price+'" />');
formToSubmit.submit();
// only one radio can be logically checked, don't check the rest
break;
}
}
};
</script>
我确实看到 javascript已执行,因为已显示已注释的提醒。
但我无法获得更新金额(我尝试先使用“document.getElementsByName(”amount“)更新金额.value =”25“;”在尝试添加之前整个表单元素通过javascript与“formToSubmit.append('
使用“document.getElementsByName(”amount“)。value =”25“;”价格显然已经改变,因为我在警告对话框中看到它,但是对于PayPal的POST数据表示没有采用新的变量集。
无论如何,如果您对保证PayPal表格有任何建议,我会采取,因为我担心有人可能会更改POST变量来改变价格,例如或任何类似的攻击,现在我只是计划检查paypal返回的自定义值,如果发现差异,请不要提供产品(并邮寄给用户)。
我已经看到有关于贝宝和表格的其他问题,但是尽管工作了很长时间,我仍然没有让它发挥作用。
感谢您阅读我,问候。
[编辑] 另一种解决方案是使用HTML的选项输入:
<select single="single" name="amount">
<option value="1">1 Heure - 1 Hour -> 1€</option>
<option value="2">2 Heures - 2 Hours -> 2€</option>
<option value="4">4 Heures - 4 Hours -> 4€</option>
<option value="10">1 Jour - 1 Day -> 10€</option>
<option value="15">2 Jours - 2 Days -> 15€</option>
<option value="25">1 Semaine - 1 Week -> 25€</option>
</select>
对于税务计算,使用taxe_rate(百分比)而不是税:
<input name="tax_rate" type="hidden" value="20" />
而不是:
<input name="tax" type="hidden" value="20" />
并且
for (var i = 0; i < radios.length; i++)
而不是:
for (var i = 0, length = radios.length; i < length; i++)
问候!
答案 0 :(得分:2)
你在循环中休息一下:
// only one radio can be logically checked, don't check the rest
break;
我认为这不会起作用。如果用户点击第二个单选按钮;代码运行;只检查循环中的第一个单选按钮;然后代码停止。代码永远不会检查第二个单选按钮。您需要删除break;
。
或者给每个单选按钮一个唯一的ID,并使用三个If,Then,else语句来检查按钮。
我看到三个单选按钮:
<input type="radio" name="custom" value="60" >One Hour<br>
<input type="radio" name="custom" value="1400">1 Day<br>
<input type="radio" name="custom" value="10800">1 Week<br>
他们都有相同的名字。这意味着,要获取所有值,您需要获取该名称的所有元素,并循环遍历数组,检查数组中的每个元素。如果其中一个元素具有值,那么此时您可以中断。现在,代码在第一次迭代时中断。您的代码应如下所示:
if (radios[i] = "60") {
///document.getElementsByName("amount").value = "4";
price = "4";
///alert(document.getElementsByName("amount").value);
break;
} else if (radios[i] = "1400") {
price = "10";
///document.getElementsByName("amount").value = "10";
break;
} else if (radios[i] = "10800") {
///document.getElementsByName("amount").value = "25";
price = "25";
break;
}
在每个IF检查中放置break;
,不在IF检查之外。
另一种方法是不使用任何for循环,并为每个INPUT元素赋予一个id。
<input type="radio" id="idOneHrBttn" value="60" >One Hour<br>
<input type="radio" id="idOneDayBttn value="1400">1 Day<br>
<input type="radio" id="idOneWeekBttn value="10800">1 Week<br>
然后明确检查每个ID:
if (document.getElementsById("idOneHrBttn").checked) {
price = "4";
///alert(document.getElementsById("amount").value);
} else if (document.getElementsById("idOneDayBttn").checked) {
price = "10";
///document.getElementsById("amount").value = "10";
} else if (document.getElementsById("idOneWeekBttn").checked) {
///document.getElementsById("amount").value = "25";
price = "25";
}
这样,您不需要循环。
答案 1 :(得分:1)
您的循环条件是否正确配置?:
for (var i = 0, length = radios.length; i < length; i++) {
i = 0
之后应该有一个分号:
for (var i = 0;
不应该看起来像这样吗?:
for (var i = 0; i < radios.length; i++) {
看起来你试图在变量部分声明两个变量。我不确定这是否有效。