禁用PayPal Express Checkout中的运送地址选项

32

通过使用SDK和下载: 简化集成和下载中提供的PayPal API和Name-Value Pair接口PHP源代码,处理PayPal API相关技术。

我的问题与“删除(或预填)PayPal Express Checkout的地址详细信息”类似,但我不想涉及任何有关运输的费用、地址或任何相关的内容。

我将所有运输细节保存在我的系统上(有时甚至不需要运输,也没有任何费用),我只希望用户通过PayPal支付而无需提供运输地址和运输费用。

如何禁用结账过程中的运输部分?

8个回答

32

我在这里添加了完整的请求示例,以开始事务、提交和读取付款详细信息,并在PayPal网站上显示项目详细信息和商家交易历史记录。https://dev59.com/tGsy5IYBdhLWcg3w9Srk#16638936 - Whome
看起来这也适用于旧的API,至少在沙盒中是这样的。 - John

21

对于其他需要此信息的人,因为PayPal的文档非常好(咳咳)。

不需要网络经验档案!

使用JavaScript/JQuery的REST API V2,并在订单中关闭“Ship To”,以下是正确的代码示例:

    createOrder: function(data, actions) {
        $('#paypalmsg').html('<b>' + 'WAITING ON AUTHORIZATION TO RETURN...' + '</b>');
        $('#chkoutmsg').hide()
        return actions.order.create({
            purchase_units: [{
                description: 'GnG Order',
                amount: {
                    value: cartTotal
                }
            }],
            application_context: {
              shipping_preference: 'NO_SHIPPING'
            }

        });
    },

2
非常感谢您!这救了我的一天!您能告诉我您从哪里得到的吗? - OverMars
2
我写了它,从他们可怕的文档中梳理出来。 - Dave Nugent
谢谢分享!我卡在这里好一段时间了。几乎不可能不落在标记为“Legacy”的文档上,而这些文档并不起作用。我当然没有注意到application_context。救了我的一天。 - Chuck Taylor
用于为客户端集成创建订单。接受与 /v2/checkout/orders api 请求正文相同的选项。 - Andreas

15

嘿,Ergec,只需传递带有no_shipping参数,并将值设置为1

来自PayPal的文档

no_shipping
不要提示付款人输入送货地址。可接受的值: 0-提示输入地址,但不需要 1-不提示输入地址 2-提示输入地址,并要求输入 默认值为0。

我在$nvpstr中加入了no_shipping=1,但仍然要求运费。我刚刚注意到它还添加了税费。所有价格已经包括税费,所以我也需要去掉税费字段。请帮忙! - Ergec
好的,这是我所做的并且有效。现在不再添加运费和税费。只需在ReviewOrder中注释掉当前的$nvpstr变量,并放置以下代码:$nvpstr = "&AMT=" . $amount . "&ReturnUrl=".$returnURL."&CANCELURL=".$cancelURL ."&CURRENCYCODE=" . $currencyCodeType;$amount是从修改后的SetExpressCheckout.php发送的。已删除所有输入框,仅保留paymentType、currencyCodeType和amount。 - Ergec
是的。7年后,尝试了新的NOSHIPPING =1,但没有起作用。尝试no_shipping = 1,它起作用了。2017年8月。 - JustJohn
2017年9月,PayPal发生了一些变化,我的一些付款开始失败,显示地址无效,但地址是正确的,所以我尝试使用&address_override=1&no_shipping=1,它起作用了!是的,我正在使用旧版API https://www.paypal.com/cgi-bin/webscr? - hamish
提供的链接已过时。 - Eugen Konkov

8

当前正确的答案已经过时。为了在新的API中修复这个问题,我们应该创建一个带有必要参数的支付网页体验配置文件资源并将其附加到支付请求中。

PHP示例:

/** Note: Define some variables yourself. */

$inputFields = new InputFields();
$inputFields->setAllowNote(true)
    ->setNoShipping(1) // Important step
    ->setAddressOverride(0);

$webProfile = new WebProfile();
$webProfile->setName(uniqid())
    ->setInputFields($inputFields)
    ->setTemporary(true);

$createProfile = $webProfile->create($apiContext);

$payment = new Payment();

$payment->setPayer($payer);
$payment->setIntent($intent);
$payment->setRedirectUrls($redirectUrls)
$payment->setTransactions(array($transaction));
$payment->setExperienceProfileId($createProfile->getId()); // Important step.

$payment->create($apiContext);

if ($payment->getState() === "created") {
    $approvalLink = $payment->getApprovalLink()

    header("Location: $approvalLink"); // Redirects user to PayPal page.
}

注意:您可以通过以下链接找到上述使用的所有类: https://github.com/paypal/PayPal-PHP-SDK/tree/master/lib/PayPal/Api


是的,它完美地运行。另外,您也可以创建一个网络档案,并在将来的支付中使用相同的 ID:https://dev59.com/questions/eI_ea4cB1Zd3GeqPNmXu#32758454 - JCarlosR

6
为了解决当前(2019年)Web客户端.js的问题,请将application_context块添加到请求正文中。
以下是createSubscription()调用的示例;我认为这也适用于createOrder()
paypal.Buttons({
          createSubscription: function (data, actions) {

              return actions.subscription.create({

                  'plan_id'            : 'P-123',
                  'application_context': {
                      'shipping_preference': 'NO_SHIPPING'
                  }
              });
          },

          onApprove: function (data, actions) {

              // ...
          }
      })
      .render('#paypal-button-container');

感谢下面这个示例代码:

这里列出了字段枚举:


对于createOrder()函数,它没有显示地址字段,但交易失败了。 - Raj
我实际上没有尝试过在createOrder()中使用这个方法,因此对于使用该调用的实现没有任何见解;或者是否可以使用我在这里描述的解决方案。我建议您通过一个新帖子来分享您的问题,在那里您可以提供您正在尝试实现的代码片段以及任何相关说明。https://stackoverflow.com/help/minimal-reproducible-example - Gene Bo
我正在尝试编写一个代码,用于实现启用地址的Paypal智能按钮。 https://developer.paypal.com/demo/checkout/#/pattern/client以下是我正在尝试在信用卡点击时禁用地址的完整代码: - Raj
相同的解决方案在这里提供:https://dev59.com/WVMI5IYBdhLWcg3wq9aL但问题仍然存在,没有地址支付将被拒绝。 - Raj

2

2022 及以后

PayPal API V2 的文档,目前是最新版本,看起来在过去一年左右得到了很大的改进,文档中列出了以下内容:

shipping_preference

向客户显示送货地址。 使客户可以选择在 PayPal 网站上的地址。 限制客户在付款批准过程中更改地址。

可能的值包括:

GET_FROM_FILE. 使用客户在 PayPal 网站上提供的送货地址。
NO_SHIPPING. 从 PayPal 网站上隐藏送货地址。推荐用于数字商品。
SET_PROVIDED_ADDRESS. 使用卖家提供的地址。客户无法在 PayPal 网站上更改该地址。

因此,仅需添加:

"application_context" => [
    "shipping_preference" => "NO_SHIPPING"
]

或者使用JavaScript:

"application_context": {
    "shipping_preference" => "NO_SHIPPING"
}

如果您创建订单的过程中不想使用任何运输选项,可以将以下内容添加到您的代码中:

例如,使用PayPal标准结帐集成(其又使用智能按钮)创建订单的PHP代码现在如下所示:

$order = $paypal->createOrder([
    "intent"=> "CAPTURE",
    "purchase_units"=> [
         [
            "amount"=> [
                "currency_code" => "GBP",
                "value"=> 4.99
            ],
             'description' => 'My product description',
        ],            
    ],               
    "application_context" => [
        "shipping_preference" => "NO_SHIPPING"
    ]
]);

1
而且...显然现在在2023年2月他们又再次改变了API。现在它说"application_context"已经过时,我们应该使用"experience_context"代替。然而,值得一提的是,"application_context...shipping_preference...NO_SHIPPING"仍然似乎可以工作,至少目前是这样。 - Whitzz

2
根据API中的示例CreateWebProfile.php创建一个基于Web的个人资料。
$createProfileResponse = require  __DIR__ . '/CreateWebProfile.php';
$payment = new Payment(); 
$payment->setExperienceProfileId($createProfileResponse->getId());

文件路径:paypal/rest-api-sdk-php/sample/payment-experience/CreateWebProfile.php

1

@Ergec:我尝试了这个:

$nvpstr = "&ADDRESSOVERRIDE=1".$shiptoAddress."&L_NAME0=".$L_NAME0."&L_NAME1=".$L_NAME1."&L_AMT0=".$L_AMT0."&L_AMT1=".$L_AMT1."&L_QTY0=".$L_QTY0."&L_QTY1=".$L_QTY1."&MAXAMT=".(string)$maxamt."&ITEMAMT=".(string)$itemamt."&AMT=".$itemamt."&ReturnUrl=".$returnURL."&CANCELURL=".$cancelURL."&CURRENCYCODE=".$currencyCodeType;

它可以工作。即使我们没有收取任何费用,我们也可以使用送货地址。


我认为如果我们不设置paymentType参数,这将是可以的。 - user869379

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接