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

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

我想为我的需求整合更好/最简单的解决方案,也是一个安全的解决方案……

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

上下文 :

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

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

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

我的需要:

我想在每个产品页面上集成卖方的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”传递的数据为我的数据库中的买方解锁产品.非常简单.

但:
– 这不安全
(任何人都可以在购买前更改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托管的按钮进行欺诈.

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

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

下一个…

我还有许多下一步的审讯,比如IPN / PDT以及我可以用这些来做些什么.但我们首先回答我可以使用的按钮类型并首先集成!

最佳答案 对此最好的解决方案是不使用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

买方pwd: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']); 
}
?>
点赞