如何更好地整合第三方卖家的Paypal“立即购买”按钮?

时间:2015-07-24 12:47:24

标签: paypal paypal-ipn payment-gateway payment paypal-adaptive-payments

我正在尝试找到在我的网站中集成 Paypal“立即购买”按钮的最佳方式,但我完全迷失了所有各种Paypal集成技术(托管按钮,动态按钮) ,IPN,PDT和其他各种API)

我想整合更好/最简单的解决方案以满足我的需求,并且还有一个安全一个......

我真的不知道该往哪里去...... 非常感谢您的帮助!

上下文:

我拥有一个旨在成为销售数字商品的“ marketplace ”的网站。

有些人(让我们称之为卖方)在我的网站上注册为“卖家”并上传他们想要出售的一些数字商品。我为他们生成的每个“产品”的在线页面生成。

其他一些人(我们称之为购买者)也只在我的网站上注册为“买家”:他们只想从各个卖家那里购买这些数字商品。

我的需要:

我想在每个产品页面上集成卖方的paypal按钮,这样他就会直接付款。我不想成为付款的中间人。

所以我需要在每个产品页面上集成一个不同的按钮,具体取决于此产品的卖家。

我还需要为每个产品动态指定不同的价格,具体取决于销售的产品(价格将由卖家在我的网站上的后台修复)

交易完成后(买方付款),我需要在产品页面上解锁此买家的产品下载。事实上,我需要更新我的数据库以将产品与该买家联系起来,所以当他以后回到我的网站时,他总是把他买的产品“解锁”。

我对按钮的看法是什么:

1 /动态HTML按钮

<form name="_xclick" action="https://www.paypal.com/fr/cgi-bin/webscr" method="post">
<input type="hidden" name="cmd" value="_xclick">
<input type="hidden" name="item_name" value="Digital good 1">
<input type="hidden" name="amount" value="12.99">
<input type="hidden" name="currency_code" value="USD">
<input type="hidden" name="quantity" value="1">
<input type="hidden" name="item_number" value="internal_user_and_product_id">
<input type="hidden" name="business" value="seller@abusiness.com">
<input type="hidden" name="notify_url" value="https://mywebsite.com/paypal-ipn.php">
<input type="image" src="http://www.paypal.com/fr_FR/i/btn/x-click-but01.gif" border="0" name="submit">
</form>

在这里,我只需要向卖方询问其Paypal业务电子邮件或ID,并为他和他的产品动态生成一个按钮。我还可以提供我的IPN侦听器URL,以便在收到完整交易时使用通过“item_number”传递的数据为我的数据库中的买方解锁产品。很简单。

BUT:
- 这不安全
(任何人都可以在购买前更改HTML中的金额或PayPal ID)
- 如果卖家提供错误的(错误的)电子邮件地址会发生什么? (我尝试使用测试按钮和虚假的电子邮件地址“djfhsgfshdgfsd@dghe.com”购买,我能够处理付款!!这不是一个不正确的商业ID ...)

2 / Paypal托管按钮

<form action="https://www.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="PJM2WY8H648ZK">
<input type="hidden" name="item_name" value="Digital good 2">
<input type="hidden" name="quantity" value="1">
<input type="hidden" name="item_number" value="internal_user_and_product_id">
<input type="hidden" name="notify_url" value="https://mywebsite.com/paypal-ipn.php">
<input type="image" src="http://www.paypal.com/fr_FR/i/btn/x-click-but01.gif" border="0" name="submit">
<input type="image" src="https://www.paypalobjects.com/fr_FR/FR/i/btn/btn_buynow_LG.gif" border="0" name="submit">
<img alt="" border="0" src="https://www.paypalobjects.com/fr_FR/i/scr/pixel.gif" width="1" height="1">
</form>

这可以避免使用Paypal托管的按钮进行欺诈。

BUT:
- 我无法动态生成按钮(如金额和货币) 这意味着我必须要求卖家为他们想要销售的每件商品生成一个托管按钮,并设置正确的价格。
这也意味着我无法在我的网站上显示产品的价格?事实上,如果卖家在他的Paypal托管按钮中设置了2USD但在我的后台设置了1USD,我将在我的网站上显示1USD而实际价格为2美元......

  • 我不确定我可以提供哪些变量来覆盖托管按钮 我至少需要“notify_url”(IPN侦听器URL)和“item_number”(我的产品/买家技术ID)

下一步...

我还有很多接下来步骤的询问,比如IPN / PDT以及我可以用这些来做些什么。但让我们首先回答我可以使用的按钮类型并首先集成!

2 个答案:

答案 0 :(得分:2)

您的最佳解决方案是不使用PayPal按钮。您可能希望使用PayPal Express Checkout解决方案。这里有一个例子:

http://marshalcurrier.com/paypal/ExpressCheckout/SetDo.php

这个过程是一个更多的编程,但它将解决您的所有问题。金额直接从您的服务器传递到PayPal,无法通过HTML进行修改。此外,当您完成付款后,您会立即收到付款确认。这样您就不必依赖IPN。

以下是介绍页面的直接链接:

https://developer.paypal.com/docs/classic/express-checkout/gs_expresscheckout/

以下是上面的Express Checkout示例链接的代码:

买家邮箱:buyer@clubcovert.com

买方代价:test1234

<a href='http://marshalcurrier.com/paypal/ExpressCheckout/custom/SetDo.php'>RESET</a><br>
<form method='post'><input type="text" name="CHARGE" value="1"/><input type="submit" value="Pay Now"/><form>

<?php
session_start();

$PPUSER = 'marshal_api1.clubcovert.com';
$PPPWD = 'LL6NV7TDRB9RFXQ5';
$PPSIG = 'ANc3YRaMB1Tgm9TediH0gENHB02JAksSKWD08wVNN3w3pwHqdBW8Im6y';
function url(){                 //PayPal Payment URL (TEST or LIVE)
    $url = "https://api-3t.sandbox.paypal.com/nvp"; //Test Server
    //$url = "https://api-3t.paypal.com/nvp"; //Live Server
    return $url;
}
function curlCall($nvp){        // Function for Curl Call to PayPal.
    $url = url();
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_HEADER, FALSE); 
    curl_setopt($ch, CURLOPT_POST, TRUE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($nvp) );
    //echo http_build_query($nvp);  //Print String
    curl_setopt($ch, CURLOPT_URL, $url); 
    $server_output = curl_exec($ch);
    mb_parse_str($server_output, $arr);
    return $arr;
}
if(isset($_POST['CHARGE'])){    // SetExpressCheckout Call
    $_SESSION['AMT'] = $_POST['CHARGE'];
    $nvp = array(
        'USER'    => $PPUSER,
        'PWD'   => $PPPWD,
        'SIGNATURE' => $PPSIG,
        'METHOD' => 'SetExpressCheckout',
        'VERSION' => '123',
        'PAYMENTREQUEST_0_PAYMENTACTION' => 'SALE',
        'PAYMENTREQUEST_0_AMT' => $_POST['CHARGE'],
        'PAYMENTREQUEST_0_CURRENCYCODE' => 'USD',
        'RETURNURL' => 'http://marshalcurrier.com/paypal/ExpressCheckout/SetDo.php',
        'CANCELURL' => 'http://marshalcurrier.com/paypal/ExpressCheckout/SetDo.php',
    );
    $arr = curlCall($nvp);
    echo '<br><br>SetExpressCheckout Call to PayPal:<br><pre>';
    print_r ($nvp);
    echo '</pre>';
    echo 'SetExpressCheckout Server Response:<br><pre>';
    print_r ($arr);
    echo '</pre>';
    echo '<a href="https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token='.($arr['TOKEN']).'">Go To PayPal</a>';
}
if(isset($_GET['PayerID'])){    // DoExpressCheckoutPayment Call
    if (isset($_SESSION['AMT'])){
        $AMT = $_SESSION['AMT'];
    }else{
        $AMT = null;
    }
    $nvp = array(
        'METHOD' => 'DoExpressCheckoutPayment',
        'VERSION' => '123',
        'USER'    => $PPUSER,
        'PWD'   => $PPPWD,
        'SIGNATURE' => $PPSIG,
        'PAYERID' => $_GET['PayerID'],
        'TOKEN' => $_GET['token'],
        'PAYMENTREQUEST_0_PAYMENTACTION' => 'SALE',
        'PAYMENTREQUEST_0_AMT' => $AMT,
        'PAYMENTREQUEST_0_CURRENCYCODE' => 'USD',
    );
    $arr = curlCall($nvp);
    echo '<br><br>DoExpressCheckoutPayment Call to PayPal:<br><pre>';
    print_r ($nvp);
    echo '</pre>';
    echo 'DoExpressCheckoutPayment Server Response:<br><pre>';
    print_r ($arr);
    echo '</pre>';
    unset($_SESSION['AMT']); 
}
?>

答案 1 :(得分:0)

继续搜索大型Paypal文档后,我想我已经找到了我想要的内容:Paypal Adaptive Payments

根据文档,我可以成为&#34;应用程序所有者&#34; ,它是&#34;付款发件人&#34; 之间的中介(我的一个买家)和一个&#34;付款接收人&#34; (我的一个卖家)。
这完全是我的理由!

enter image description here

您还可以执行更复杂的操作,例如发送到多个接收器或执行&#34;链式支付&#34;并成为主要接收者&#34;这是买方和卖方之间的中介,并且可以选择收取费用。

enter image description here

这看起来非常完整和灵活!

我现在需要更深入地了解如何在技术细节中实现这一点,但是医生说我不需要向付款接收方询问PAypal信息(他甚至不需要拥有Paypal)帐户,看起来很奇怪,但却是真的...)

Note [extract from Paypal's documentation]: 
The application owner must have a PayPal Business account.
Senders and receivers can have any PayPal account type. 
Senders and receivers are not required to have PayPal accounts initially.
PayPal prompts a sender to create an account before a payment can be completed.
A receiver must create an account to receive the funds after the payment completes.