Отключить адрес доставки в PayPal Express Checkout

Работа с API PayPal и использование исходных кодов PHP интерфейса пары имя-значение из Пакеты SDK и загружаемые материалы: упростите интеграцию с помощью загрузок и пакетов SDK.

Мой вопрос похож на «Удаление (или предварительное заполнение) адресные данные для PayPal Express Checkout ", но мне вообще не нужна стоимость / адрес доставки или что-либо, связанное с доставкой.

Я храню всю информацию о доставке в своей системе (даже иногда доставка даже не применяется и за нее не взимается плата), и я просто хочу, чтобы пользователь платил через PayPal без адреса доставки и стоимости доставки.

Как я могу отключить доставку при оформлении заказа?


person Ergec    schedule 26.11.2010    source источник


Ответы (7)


Если вы используете более новый API, вы также можете передать NOSHIPPING = 1 (не no_shipping)

Более подробная информация обо всех возможных параметрах SetExpressCheckout здесь:

https://developer.paypal.com/webapps/developer/docs/classic/api/merchant/SetExpressCheckout_API_Operation_NVP/

Или поищите способ оплаты в новом REST API.

person jbx    schedule 09.12.2010
comment
Я добавил сюда полные примеры запросов, чтобы начать транзакцию, зафиксировать и прочитать детали платежа, с отображением деталей товара на сайте PayPal и истории транзакций продавца. stackoverflow.com/a/16638936/185565 - person Whome; 20.05.2013
comment
Похоже, что это работает и со старым api, по крайней мере, так себя ведет в песочнице. - person John; 23.10.2014

Привет, Эргек, просто передай параметр no_shipping со значением 1.

Из документации PayPal:

no_shipping

Do not prompt payers for shipping address. Allowable values:
0 – prompt for an address, but do not require one
1 – do not prompt for an address
2 – prompt for an address, and require one
The default is 0.
person James Skidmore    schedule 26.11.2010
comment
Я ввел no_shipping = 1 в $ nvpstr, но он все равно запрашивает доставку. И я только что заметил, что это тоже добавляет налог. Все цены уже включают налог, поэтому мне также нужно избавиться от поля налога. Пожалуйста помоги!! - person Ergec; 26.11.2010
comment
хорошо, вот что я делал и работал. Он больше не добавляет стоимость доставки и налог. Просто закомментировал текущую переменную $ nvpstr в ReviewOrder и поместил эту строку $ nvpstr = & AMT =. Сумма $. & ReturnUrl =. $ ReturnURL. & CANCELURL =. $ CancelURL. & CURRENCYCODE =. $ currencyCodeType; Сумма $ отправляется из модифицированного SetExpressCheckout.php. Убраны все поля ввода и оставлены только paymentType, currencyCodeType и сумма. - person Ergec; 26.11.2010
comment
да. 7 лет спустя попробовал новый NOSHIPPING = 1, не сработало. Пробовал no_shipping = 1, заработало. Август 2017 г. - person JustJohn; 18.08.2017
comment
В сентябре 2017 года что-то изменилось в этом месяце в PayPal, некоторые из моих платежей перестали указывать неверный адрес, но с адресом все в порядке, поэтому я попробовал & address_override = 1 & no_shipping = 1, это сработало! да, я использую более старую версию API по адресу paypal.com/cgi-bin/webscr? - person hamish; 19.09.2017
comment
Указанная ссылка устарела - person Eugen Konkov; 16.11.2017

Для тех, кто ищет это, потому что документация PayPals настолько ВЕЛИКАЯ (кашель, кашель).

НЕ ТРЕБУЕТСЯ профиль для работы в Интернете!

Используя REST API V2 с Javascript / JQuery и отключив параметр «Отправить» для ЗАКАЗА, вот правильный пример кода:

    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'
            }

        });
    },
person Dave Nugent    schedule 20.05.2020
comment
Большое вам спасибо за это! спас мой день! есть ли шанс указать мне, где вы это взяли? - person OverMars; 22.12.2020
comment
Я написал это, блестя от их ужасных документов - person Dave Nugent; 19.04.2021
comment
Спасибо, что поделились! Я застрял в этом на долгое время. Практически невозможно не попасть на неработающие документы с пометкой «Legacy». Я определенно не заметил application_context. Спас мой день. - person Chuck Taylor; 12.07.2021

Текущий правильный ответ - испорченный. Чтобы устранить проблему в новом 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

person Akmal    schedule 01.12.2017
comment
Да, работает отлично. К вашему сведению, вы также можете один раз создать веб-профиль и использовать тот же идентификатор для будущих платежей: stackoverflow.com/questions/32734909/ - person JCarlosR; 08.06.2020

Чтобы решить эту проблему из текущего (2019) веб-клиента .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');

Благодаря приведенному здесь примеру кода:

Вот где перечислены перечисления полей:

person Gene Bo    schedule 25.08.2019
comment
для createOrder () не отображаются поля адреса, но транзакция не выполняется - person Raj; 13.03.2020
comment
На самом деле я не пробовал это с createOrder(), поэтому не имею никакого представления о реализации с этим вызовом; или если это действительно возможно с решением, которое я описываю здесь. Я бы поделился вашей проблемой в новом сообщении, где вы можете предоставить фрагменты кода, которые вы пытаетесь реализовать, вместе с любыми соответствующими примечаниями. stackoverflow.com/help/minimal-reproducible-example - person Gene Bo; 13.03.2020
comment
Я пытаюсь написать код для реализации смарт-кнопки PayPal с отключенным адресом. developer.paypal.com/demo/checkout/#/pattern/client вот точный код, в котором я пытаюсь отключить адрес при нажатии кредитной карты - person Raj; 13.03.2020
comment
то же решение приводится здесь: stackoverflow.com/questions/55631779/, но опять же проблема в том, что платеж отклонен без адреса. - person Raj; 13.03.2020

Создайте веб-профиль на основе примера, найденного в API: CreateWebProfile.php.

$createProfileResponse = require  __DIR__ . '/CreateWebProfile.php';
$payment = new Payment(); 
$payment->setExperienceProfileId($createProfileResponse->getId());

Путь к файлу: paypal/rest-api-sdk-php/sample/payment-experience/CreateWebProfile.php

person elkrari    schedule 16.09.2015

@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;

Оно работает. Здесь мы также можем использовать адрес доставки, даже если мы не взимаем никакой суммы.

person user869379    schedule 17.08.2011
comment
я думаю, будет нормально, если мы не будем устанавливать аргумент paymentType - person user869379; 17.08.2011