Paypal Checkout - don't ask for delivery address for non-members?

て烟熏妆下的殇ゞ 提交于 2021-01-28 03:47:48

问题


I've just started playing with this module:

https://github.com/paypal/paypal-checkout

I'm trying to work out how to can turn off the shipping address for clients. I know in order versions you could do &NOSHIPPING=1 in the URL, but I can't find anything about the API 4 version. My code is:

paypal.Button.render({

    // Pass the client ids to use to create your transaction on sandbox and production environments
    locale: 'fr_FR',

    //env: 'production',
    env: 'sandbox',

    client: {
        sandbox: "...",
        production: "..."
    },

    // Pass the payment details for your transaction
    // See https://developer.paypal.com/docs/api/payments/#payment_create for the expected json parameters

    payment: function() {
        return paypal.rest.payment.create(this.props.env, this.props.client, {
            transactions: [
                {
                    amount: {
                        total:    window.my_config.grand_total,
                        currency: 'EUR',
                        details: {
                              "subtotal": window.my_config.price,
                              "tax": window.my_config.vat_amount
                        }
                    },
                }
            ]
        });
    },

    // Display a "Pay Now" button rather than a "Continue" button

    commit: true,

    // Pass a function to be called when the customer completes the payment

    onAuthorize: function(data, actions) {
        return actions.payment.execute().then(function() {
            console.log('The payment was completed!');
            console.log(data, actions)

            if (error === 'INSTRUMENT_DECLINED') {
                actions.restart();
            }

        });
    },

    // Pass a function to be called when the customer cancels the payment

    onCancel: function(data) {
        console.log('The payment was cancelled!');
    },
    style: {
      shape:  'rect',
      size: "medium"
    }

}, '#paypalContainerEl');

回答1:


You need to pass the no_shipping option under experience in the payment function, like so:

return actions.payment.create(
{
    payment:
    {
        transactions: [
        {
            amount:
            {
                total: "10",
                currency: 'EUR'
            }
        }]
    },
    experience:
    {
        input_fields:
        {
            no_shipping: 1
        }
    }
});

In the docs, here and here. A quick note though, guests will still be asked for their billing address, even though their shipping address will no longer be asked.




回答2:


Use "shipping_preference: 'NO_SHIPPING'."

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

    });
},



回答3:


For the unlucky lads integrating this via PayPal REST API, using C#, this is a bit trickier.

You create a WebProfile as in the Paypal Repo Example.

    var experienceProfile = new WebProfile()
    {
        name = Guid.NewGuid().ToString(), // required field
        input_fields = new InputFields()
        {
            no_shipping = 1
        }
    };

    var experienceId = experienceProfile .Create(_apiContext).id;

    new Payment
        {
            intent = "sale",
            payer = new Payer
            {
                payment_method = "paypal"
            },
            transactions = new List<Transaction>
            {
              // ...
            },
            redirect_urls = new RedirectUrls
            {
                return_url = "..",
                cancel_url = ".."
            },
            experience_profile_id = experienceId
        };



回答4:


For those of you integrating via PayPal REST API in PHP, to set the no_shipping attribute:

          apiContext = $this->apiContext;

          $payer = new \PayPal\Api\Payer();
          $payer->setPaymentMethod('paypal');

          $inputFields = new \PayPal\Api\InputFields();
          $inputFields->setNoShipping(1); //<-- NO SHIPPING!!!!!!!!!!

          $webProfile = new \PayPal\Api\WebProfile();
          $webProfile->setName($uid); // <-- UNIQUE NAME FOR THE TRANSACTION
          $webProfile->setInputFields($inputFields);

          $createProfileResponse = $webProfile->create($apiContext);
          $webProfile = \PayPal\Api\WebProfile::get($createProfileResponse->getId(), $apiContext);

          $amount = new \PayPal\Api\Amount();
          $amount->setCurrency('EUR')
            ->setTotal($this->deposit_eur);

          $transaction = new \PayPal\Api\Transaction();
          $transaction->setAmount($amount);


          $redirectUrls = new \PayPal\Api\RedirectUrls();
          $redirectUrls->setReturnUrl($this->return_url)
          ->setCancelUrl($this->cancel_url);


          $payment = new \PayPal\Api\Payment();
          $payment->setIntent('sale')
            ->setPayer($payer)
            ->setRedirectUrls($redirectUrls)
            ->setTransactions(array($transaction))
            ->setExperienceProfileId($webProfile->getId()); //<-- SET EXPERIENCE PROFILE

          try{
            $payment->create($apiContext);
          } catch (\Exception $ex) {
            debug($ex);
            exit;
          }

          $approvalUrl = $payment->getApprovalLink();



回答5:


For the new API you need to set the parameter no_shipping=1

https://developer.paypal.com/docs/classic/paypal-payments-standard/integration-guide/Appx_websitestandard_htmlvariables/



来源:https://stackoverflow.com/questions/42160816/paypal-checkout-dont-ask-for-delivery-address-for-non-members

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!