【问题标题】:PayPal REST API - Billing Agreement does not return a tokenPayPal REST API - 计费协议不返回令牌
【发布时间】:2017-07-06 15:10:17
【问题描述】:

我正在尝试使用 REST API 创建 PayPal 定期订阅(信用卡):

创建计费计划 - https://developer.paypal.com/docs/api/quickstart/create-billing-plan/

创建结算协议 - https://developer.paypal.com/docs/api/quickstart/create-billing-agreement/

我正在测试和使用 API,因此我创建了两个文件 plan.php 和 agreement.php。

plan.php 是我生成计划 ID 并在 agreement.php 中静态传递它的地方。

plan.php

<?php

require 'vendor/autoload.php';

$apiContext = new \PayPal\Rest\ApiContext(
  new \PayPal\Auth\OAuthTokenCredential(
    'Application-ID',    
    'Secret-ID'  
  )
);

use PayPal\Api\ChargeModel;
use PayPal\Api\Currency;
use PayPal\Api\MerchantPreferences;
use PayPal\Api\PaymentDefinition;
use PayPal\Api\Plan;
use PayPal\Api\Patch;
use PayPal\Api\PatchRequest;
use PayPal\Common\PayPalModel;

use PayPal\Api\Agreement;
use PayPal\Api\Payer;
use PayPal\Api\ShippingAddress;
use PayPal\Api\CreditCard;
use PayPal\Api\FundingInstrument;

    $plan = new Plan();
    $plan->setName('T-Shirt of the Month Club Plan')
      ->setDescription('Template creation.')
      ->setType('fixed');

    // Set billing plan definitions
    $paymentDefinition = new PaymentDefinition();
    $paymentDefinition->setName('Regular Payments')
      ->setType('REGULAR')
      ->setFrequency('Month')
      ->setFrequencyInterval('2')
      ->setCycles('12')
      ->setAmount(new Currency(array('value' => 100, 'currency' => 'USD')));

// Set charge models
$chargeModel = new ChargeModel();
$chargeModel->setType('SHIPPING')
  ->setAmount(new Currency(array('value' => 10, 'currency' => 'USD')));
$paymentDefinition->setChargeModels(array($chargeModel));

// Set merchant preferences
$merchantPreferences = new MerchantPreferences();
$merchantPreferences->setReturnUrl('http://localhost:3000/processagreement')
  ->setCancelUrl('http://localhost:3000/cancel')
  ->setAutoBillAmount('yes')
  ->setInitialFailAmountAction('CONTINUE')
  ->setMaxFailAttempts('0')
  ->setSetupFee(new Currency(array('value' => 1, 'currency' => 'USD')));

$plan->setPaymentDefinitions(array($paymentDefinition));
$plan->setMerchantPreferences($merchantPreferences);




//create plan
try {
  $createdPlan = $plan->create($apiContext);

  try {
    $patch = new Patch();
    $value = new PayPalModel('{"state":"ACTIVE"}');
    $patch->setOp('replace')
      ->setPath('/')
      ->setValue($value);
    $patchRequest = new PatchRequest();
    $patchRequest->addPatch($patch);
    $createdPlan->update($patchRequest, $apiContext);
    $plan = Plan::get($createdPlan->getId(), $apiContext);

    // Output plan id
    echo $plan->getId();
  } catch (PayPal\Exception\PayPalConnectionException $ex) {
    echo $ex->getCode();
    echo $ex->getData();
    die($ex);
  } catch (Exception $ex) {
    die($ex);
  }
} catch (PayPal\Exception\PayPalConnectionException $ex) {
  echo $ex->getCode();
  echo $ex->getData();
  die($ex);
} catch (Exception $ex) {
  die($ex);
}

agreement.php

// Autoload SDK package for composer based installations
require 'vendor/autoload.php';

$apiContext = new \PayPal\Rest\ApiContext(
  new \PayPal\Auth\OAuthTokenCredential(
    'Application-ID',    
    'Secret-ID'  
  )
);

use PayPal\Api\ChargeModel;
use PayPal\Api\Currency;
use PayPal\Api\MerchantPreferences;
use PayPal\Api\PaymentDefinition;
use PayPal\Api\Plan;
use PayPal\Api\Patch;
use PayPal\Api\PatchRequest;
use PayPal\Common\PayPalModel;

use PayPal\Api\Agreement;
use PayPal\Api\Payer;
use PayPal\Api\ShippingAddress;
use PayPal\Api\CreditCard;
use PayPal\Api\FundingInstrument;


// Create new agreement
// $agreement = new Agreement();
// $agreement->setName('Base Agreement')
//   ->setDescription('Basic Agreement')
//   ->setStartDate('2017-02-17T9:45:04Z');

// // Set plan id
// $plan = new Plan();
// $plan->setId('P-1CD306827C2019339JKC6JDY');
// $agreement->setPlan($plan);

// // Add payer type
// $payer = new Payer();
// $payer->setPaymentMethod('paypal');
// $agreement->setPayer($payer);

// // Adding shipping details
// $shippingAddress = new ShippingAddress();
// $shippingAddress->setLine1('111 First Street')
//   ->setCity('Saratoga')
//   ->setState('CA')
//   ->setPostalCode('95070')
//   ->setCountryCode('US');
// $agreement->setShippingAddress($shippingAddress);




//create new agreement
$agreement = new Agreement();
$agreement->setName('Base Agreement')
  ->setDescription('Basic Agreement')
  ->setStartDate('2017-02-17T9:45:04Z');

// Set plan id
$plan = new Plan();
$plan->setId('P-1CD306827C2019339JKC6JDY');
$agreement->setPlan($plan);

// Create credit card object and set funding instrument
$card = new CreditCard();
$card->setType("visa")
  ->setNumber("4250448816997456")
  ->setExpireMonth("06")
  ->setExpireYear("2018")
  ->setCvv2("012")
  ->setFirstName("Joe")
  ->setLastName("Shopper");

$fi = new FundingInstrument();
$fi->setCreditCard($card);

// Set payer to process credit card
$payer = new Payer();
$payer->setPaymentMethod("credit_card")
  ->setFundingInstruments(array($fi));
$agreement->setPayer($payer);

// Adding shipping details
$shippingAddress = new ShippingAddress();
$shippingAddress->setLine1('111 First Street')
  ->setCity('Saratoga')
  ->setState('CA')
  ->setPostalCode('95070')
  ->setCountryCode('US');
$agreement->setShippingAddress($shippingAddress);

$agreement = $agreement->create($apiContext);
// print_r($agreement); exit();


if (isset($_GET['success']) && $_GET['success'] == 'true') {
  $token = $_GET['token'];
  $agreement = new \PayPal\Api\Agreement();

  try {
    // Execute agreement
    $agreement->execute($token, $apiContext);
  } catch (PayPal\Exception\PayPalConnectionException $ex) {
    echo $ex->getCode();
    echo $ex->getData();
    die($ex);
  } catch (Exception $ex) {
    die($ex);
  }
} else {
    echo "user canceled agreement";
}

但是它没有返回一个令牌并且没有设置成功变量。我已经打印了 $agreement 变量,下面是响应:

PayPal\Api\Agreement Object
(
    [_propMap:PayPal\Common\PayPalModel:private] => Array
        (
            [name] => Base Agreement
            [description] => Basic Agreement
            [start_date] => 2017-02-17T17:45:04Z
            [plan] => PayPal\Api\Plan Object
                (
                    [_propMap:PayPal\Common\PayPalModel:private] => Array
                        (
                            [payment_definitions] => Array
                                (
                                    [0] => PayPal\Api\PaymentDefinition Object
                                        (
                                            [_propMap:PayPal\Common\PayPalModel:private] => Array
                                                (
                                                    [type] => REGULAR
                                                    [frequency] => Month
                                                    [amount] => PayPal\Api\Currency Object
                                                        (
                                                            [_propMap:PayPal\Common\PayPalModel:private] => Array
                                                                (
                                                                    [value] => 100.00
                                                                )

                                                        )

                                                    [cycles] => 12
                                                    [charge_models] => Array
                                                        (
                                                            [0] => PayPal\Api\ChargeModel Object
                                                                (
                                                                    [_propMap:PayPal\Common\PayPalModel:private] => Array
                                                                        (
                                                                            [type] => TAX
                                                                            [amount] => PayPal\Api\Currency Object
                                                                                (
                                                                                    [_propMap:PayPal\Common\PayPalModel:private] => Array
                                                                                        (
                                                                                            [value] => 0.00
                                                                                        )

                                                                                )

                                                                        )

                                                                )

                                                            [1] => PayPal\Api\ChargeModel Object
                                                                (
                                                                    [_propMap:PayPal\Common\PayPalModel:private] => Array
                                                                        (
                                                                            [type] => SHIPPING
                                                                            [amount] => PayPal\Api\Currency Object
                                                                                (
                                                                                    [_propMap:PayPal\Common\PayPalModel:private] => Array
                                                                                        (
                                                                                            [value] => 10.00
                                                                                        )

                                                                                )

                                                                        )

                                                                )

                                                        )

                                                    [frequency_interval] => 2
                                                )

                                        )

                                )

                            [merchant_preferences] => PayPal\Api\MerchantPreferences Object
                                (
                                    [_propMap:PayPal\Common\PayPalModel:private] => Array
                                        (
                                            [setup_fee] => PayPal\Api\Currency Object
                                                (
                                                    [_propMap:PayPal\Common\PayPalModel:private] => Array
                                                        (
                                                            [value] => 1.00
                                                        )

                                                )

                                            [max_fail_attempts] => 0
                                            [auto_bill_amount] => YES
                                        )

                                )

                            [links] => Array
                                (
                                )

                            [currency_code] => USD
                        )

                )

            [payer] => PayPal\Api\Payer Object
                (
                    [_propMap:PayPal\Common\PayPalModel:private] => Array
                        (
                            [payment_method] => credit_card
                            [payer_info] => PayPal\Api\PayerInfo Object
                                (
                                    [_propMap:PayPal\Common\PayPalModel:private] => Array
                                        (
                                        )

                                )

                            [funding_instruments] => Array
                                (
                                    [0] => PayPal\Api\FundingInstrument Object
                                        (
                                            [_propMap:PayPal\Common\PayPalModel:private] => Array
                                                (
                                                    [credit_card] => PayPal\Api\CreditCard Object
                                                        (
                                                            [_propMap:PayPal\Common\PayPalModel:private] => Array
                                                                (
                                                                    [type] => visa
                                                                    [number] => 7456
                                                                    [expire_month] => 06
                                                                    [expire_year] => 2018
                                                                    [first_name] => Edford Patrick
                                                                    [last_name] => Bedia
                                                                )

                                                        )

                                                )

                                        )

                                )

                        )

                )

            [shipping_address] => PayPal\Api\ShippingAddress Object
                (
                    [_propMap:PayPal\Common\PayPalModel:private] => Array
                        (
                            [line1] => 111 First Street
                            [city] => Saratoga
                            [state] => CA
                            [postal_code] => 95070
                            [country_code] => US
                        )

                )

            [id] => I-9107LMJ0351R
            [state] => Active
            [links] => Array
                (
                    [0] => PayPal\Api\Links Object
                        (
                            [_propMap:PayPal\Common\PayPalModel:private] => Array
                                (
                                    [href] => https://api.sandbox.paypal.com/v1/payments/billing-agreements/I-9107LMJ0351R
                                    [rel] => self
                                    [method] => GET
                                )

                        )

                )

            [agreement_details] => PayPal\Api\AgreementDetails Object
                (
                    [_propMap:PayPal\Common\PayPalModel:private] => Array
                        (
                            [outstanding_balance] => PayPal\Api\Currency Object
                                (
                                    [_propMap:PayPal\Common\PayPalModel:private] => Array
                                        (
                                            [value] => 0.00
                                        )

                                )

                            [cycles_remaining] => 12
                            [cycles_completed] => 0
                            [next_billing_date] => 2017-02-17T10:00:00Z
                            [last_payment_date] => 2017-02-17T05:46:56Z
                            [last_payment_amount] => PayPal\Api\Currency Object
                                (
                                    [_propMap:PayPal\Common\PayPalModel:private] => Array
                                        (
                                            [value] => 1.00
                                        )

                                )

                            [final_payment_date] => 2018-12-17T10:00:00Z
                            [failed_payment_count] => 0
                        )

                )

        )

)

任何想法为什么我无法获得令牌?

提前致谢。

【问题讨论】:

标签: paypal-rest-sdk paypal-subscriptions paypal


【解决方案1】:

这是您的解决方案

1) 您需要在创建计划时将 返回 URL 作为 Execute.php。

2) 您将该计划 ID 传递给结算协议

3) 你的协议.php print_r($agreement->toArray());

4) 当买方批准协议时,它将重定向到在创建计划时返回 URL 集的 Execute.php。

5) 在execute.php中你会得到token和success true。

您正在添加执行协议的代码之后 协议创建。这就是为什么你没有获得成功的原因, 在买方批准后,您可以按 ID 执行计费协议。 检查下面的链接。

https://developer.paypal.com/docs/api/payments.billing-agreements

所以现在你应该从agreement.php 中删除执行代码并添加execute.php 有了这个

<?php

// #Execute Agreement
// This is the second part of CreateAgreement Sample.
// Use this call to execute an agreement after the buyer approves it
require __DIR__ . '/../bootstrap.php';

// ## Approval Status
// Determine if the user accepted or denied the request
if (isset($_GET['success']) && $_GET['success'] == 'true') {
    $token = $_GET['token'];
    $agreement = new \PayPal\Api\Agreement();
    try {
        // ## Execute Agreement
        // Execute the agreement by passing in the token
        $agreement->execute($token, $apiContext);
    } catch (Exception $ex) {
        // NOTE: PLEASE DO NOT USE RESULTPRINTER CLASS IN YOUR ORIGINAL CODE. FOR SAMPLE ONLY
        ResultPrinter::printError("Executed an Agreement", "Agreement", $agreement->getId(), $_GET['token'], $ex);
        exit(1);
    }

    // NOTE: PLEASE DO NOT USE RESULTPRINTER CLASS IN YOUR ORIGINAL CODE. FOR SAMPLE ONLY
    ResultPrinter::printResult("Executed an Agreement", "Agreement", $agreement->getId(), $_GET['token'], $agreement);

    // ## Get Agreement
    // Make a get call to retrieve the executed agreement details
    try {
        $agreement = \PayPal\Api\Agreement::get($agreement->getId(), $apiContext);
    } catch (Exception $ex) {
        // NOTE: PLEASE DO NOT USE RESULTPRINTER CLASS IN YOUR ORIGINAL CODE. FOR SAMPLE ONLY
        ResultPrinter::printError("Get Agreement", "Agreement", null, null, $ex);
        exit(1);
    }

    // NOTE: PLEASE DO NOT USE RESULTPRINTER CLASS IN YOUR ORIGINAL CODE. FOR SAMPLE ONLY
    ResultPrinter::printResult("Get Agreement", "Agreement", $agreement->getId(), null, $agreement);
} else {
    // NOTE: PLEASE DO NOT USE RESULTPRINTER CLASS IN YOUR ORIGINAL CODE. FOR SAMPLE ONLY
    ResultPrinter::printResult("User Cancelled the Approval", null);
}

【讨论】:

    猜你喜欢
    • 2015-11-01
    • 2014-12-08
    • 2018-12-01
    • 2014-10-28
    • 2017-06-21
    • 1970-01-01
    • 2020-04-06
    • 2015-03-07
    • 2014-11-09
    相关资源
    最近更新 更多