如何创建一个贝宝按钮与可重写的变量


How to create an PayPal button with overwritable variables

你好,我想创建一个paypal购买按钮,其中有一个动态设置金额。我想通过表单中的文本输入字段传递金额,并通过隐藏字段传递item_number。

问题是,无论我做什么,我从paypal网站得到一个加密的s-xclick按钮。此按钮不允许在表单中放置隐藏变量。

我想我需要的是一个xclick按钮。我的目标是让用户增加他们的内部信用我的网站。

编辑(将问题的附加部分从答案移到问题)(从这里@tokam:

为了加入讨论,我想展示一下我目前对这个问题的解决方案:

这里我们有一些Javascript验证来帮助用户输入。认识到它在成功时打开一个灯箱

function validatePaypalForm()
{
    var val = $('#paypalPaymentAmount').val().replace(/'s*$/, "").replace(/,/ , ".").replace(/€$/, "");
    var errormsg = '';
    var ret, amountField;
    if( val==='' || isNaN( parseFloat(val) ) || !isFinite(val) )
    {
        errormsg = 'Bitte geben Sie einen gültigen Betrag an';
}else if( parseFloat( val ) < <?php echo $this->minimum?>  )
{
    errormsg = 'Das Einzahlungsminimum betr&auml;gt <?php echo $this->minimum?>&euro;';
}
ret = ( errormsg === '' );

amountField = $( '#paypalAmountField' );
if( ret )
{
    amountField.removeClass( 'error' );     
    $('#paypalAmountErrorMessage').html( '&nbsp;' );
    $('#paypalPaymentAmount').val( val );
    fb.start( 
        '<p><strong>Sie werden in kürze zur Seite von Paypal weitergeleitet.</strong></p>',
        'width:700 showPrint:false modal:true showClose:false showOuterClose:true showItemNumber:false closeOnNewWindow:false outsideClickCloses:true innerBorder:0 imageClickCloses:false scrolling: no'
    );
}else{
    amountField.addClass( 'error' );
    $('#paypalAmountErrorMessage').html( errormsg );
}
return ret;

}我的纽扣来了。我遇到的问题是,例如,用户很容易设置其他货币代码。我可以通过退款在我的IPN监听器中处理这个问题。没有加密的可变按钮还有其他问题吗?

<form onsubmit="return validatePaypalForm();" class="stn-form" action="https://www.paypal.com/cgi-bin/webscr" method="post">
<fieldset id="fieldset-p"><legend><span>2.</span>myproject Guthaben aufladen per Paypal Zahlung</legend>
<div id='paypalAmountField' class="field">
<label for='paypalPaymentAmount' >Betrag &euro;:</label>
<input id='paypalPaymentAmount' type="text" name='amount' value='' />
<span style='display:block;' id='paypalAmountErrorMessage' class='errorText'>'&nbsp;</span>
</div>
<input type="hidden" name="cmd" value="_xclick">
<input type="hidden" name="business" value="THE_ID_OF_MY_CLIENT">
<input type="hidden" name="lc" value="DE">
<input type="hidden" name="item_name" value="myproject Advertiser Vorkasse">
<input type="hidden" name='item_number' value="11500">
<input type="hidden" name="currency_code" value="EUR">
<input type="hidden" name="button_subtype" value="services">
<input type="hidden" name="no_note" value="1">
<input type="hidden" name="no_shipping" value="1">
<input type="hidden" name="bn" value="PP-BuyNowBF:btn_paynowCC_LG.gif:NonHosted">
<input type="hidden" name="rm" value="1">
<input type="hidden" name='cbt' value="Zu myproject.de zur&uuml;ckkehren">
<input type="hidden" name="currency_code" value="EUR">
<input type="hidden" name="return" value="http://myproject.somedomain.net/advertiser/guthaben-aufladen/ret/success" />
<input type="hidden" name="cancel_ return" value="http://myproject.somedomain.net/advertiser/guthaben-aufladen/ret/canceled" />
<div class="actionrow">
<input type="image" src="https://www.paypalobjects.com/de_DE/DE/i/btn/btn_paynowCC_LG.gif" border="0" name="submit" alt="Jetzt einfach, schnell und sicher online bezahlen – mit PayPal.">
<img alt="" border="0" src="https://www.paypalobjects.com/de_DE/i/scr/pixel.gif" width="1" height="1">
</div>
</fieldset>
</form>

你不能动态覆盖金额的原因,是因为你有一个所谓的'PayPal托管按钮'。
有了托管按钮,金额存储在贝宝这边,不能用"金额"变量覆盖。你可以使用非托管按钮,或者使用BMUpdateButton API调用来动态更新按钮的数量。
要使用非托管按钮,只需在按钮创建工具中找到"步骤2",然后勾选"使用PayPal的主机按钮"。

选项2:仍然使用托管按钮,并使用BMUpdateButton API来更新金额。对BMUpdateButton的请求示例如下:

USER=Your API username
PWD=Your API password
SIGNATURE=Your API signature
VERSION=82.0
HOSTEDUBTTONID=The value of <input type="hidden" name="hosted_button_id" value="">
BUTTONTYPE=The type of button. E.g. BUYNOW
BUTTONCODE=The type of code you want to get back. E.g. HOSTED
L_BUTTONVAR0=amount=The new amount with a period as separator
L_BUTTONVAR1=item_name=Optional: a new item name if you wish

同样,你也可以使用BMCreateButton API来创建一个新的按钮,或者使用BMButtonSearch API来搜索所有存储的托管按钮的列表(例如,自动查找按钮的hosted_button_id)

使用托管按钮的原因是因为它更安全。一个非托管的、未加密的按钮基本上会让金额被操纵。欺诈交易等着发生

你不应该使用未加密的xclick。我解决这个问题的方法是使用paypal按钮api -在客户端使用某种缓存,这样你就不会每次都做整个http请求响应。

请注意,paypal使用了2种类型的api - NVP是restful(也不是真正的)和SOAP(我使用了NVP方法)

你也可以使用openssl在你的服务器上生成加密按钮,但是我遇到了无法解决的问题,无法得到任何帮助,无论是在这里还是在paypal可怕的开发者论坛

edit:未加密按钮的问题是任何人使用firebug(不是更高级的工具)都可以拦截付款并更改成本等。

如果你坚持这个方向,你可以按照简单的html表单从paypal创建这个按钮。你做它在贝宝网站,并创建一个未加密的按钮,然后只需编辑html和更改所需的字段为<?php $variable?>。我强烈反对这种做法。

我想这可能对你有用,如果你更新…"you@yoursite.com"…它是未加密的,似乎仍然托管在paypal的网站上进行清算

drop: value="my_default_price"如果您希望用户将其输入到空白文本框中…对于我的页面,价格与黄金价格挂钩,所以我必须动态更新变量"amount",我只保留value=

<form action="https://www.paypal.com/cgi-bin/webscr" method="post">
<input type="hidden" name="cmd" value="_xclick">
<input type="hidden" name="business" value="you@yoursite.com">
<input type="hidden" name="item_name" value="example description">
<input type="hidden" name="item_number" value="">
<input type="text" name="amount" value="my_default_price">
<input type="hidden" name="no_shipping" value="1">
<input type="hidden" name="return" value="http://www.yoursite.com/returnpage.php">
<input type="hidden" name="currency_code" value="USD">
<input type="hidden" name="lc" value="US">
<input type="hidden" name="bn" value="PP-BuyNowBF">
<input type="image" src="https://www.paypal.com/en_US/i/btn/x-click-but02.gif" border="0" name="submit" alt="Make your payments with PayPal. It is free, secure, effective.">
<img alt="" border="0" src="https://www.paypal.com/it_IT/i/scr/pixel.gif" width="1" height="1">
</form>