paypal - 如何更好地为 3rd 方卖家集成 Paypal "Buy Now"按钮?

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

我正在努力寻找在我的网站中集成 Paypal“立即购买”按钮 的最佳方式,但我对所有各种 Paypal 集成技术(托管按钮、动态按钮, IPN, PDT, 等各种API)

我想集成满足我需要的更好/最简单的解决方案,以及一个安全的解决方案...

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

上下文:

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

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

其他一些人(我们称他们为BUYERS)也仅作为“买家”注册到我的网站:他们只是想从不同的卖家那里购买这些数字商品。

我的需求:

我想在每个产品页面上集成卖家的 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 托管按钮中设置 2 美元,但在我的后台设置 1 美元,我将在我的网站上显示 1 美元,而实际价格是 2 美元......

  • 我不确定我可以提供哪些变量来覆盖托管按钮。
    我至少需要“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

买家密码: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']); 
}
?>

关于paypal - 如何更好地为 3rd 方卖家集成 Paypal "Buy Now"按钮?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31610932/

相关文章:

android - paypal android sdk 货币错误错误

php - 我如何强制隐藏页面以防止直接访问并且只能从 Paypal 重定向访问?

php - 如何使用 PHP 在 facebook 应用程序 Canvas 中实现 paypal?

c# - 如何处理paypal电子支票

php - 上线时 Paypal 客户端身份验证失败

php - 尝试使用 cURL 提交 Paypal 表单...

php - PayPal Sandbox 返回无效 - IPN 验证

PHP7 SoapClient verify_peer_name : SOAP Error: Could not connect to host

php - PayPal IPN 再次使用 PHP 生成 HTTP 302 错误

php - Paypal 沙盒 IPN 模拟器 - 未收到响应