Paypal Php Sdk - NotifyUrl не является полностью определенным URL-адресом

У меня есть этот код

$product_info = array();
if (isset($cms['site']['url_data']['product_id'])){  
    $product_info = $cms['class']['product']->get($cms['site']['url_data']['product_id']);
}
if (!isset($product_info['id'])){
    /*
    echo 'No product info.';
    exit();
    */
    header_url(SITE_URL.'?subpage=user_subscription#xl_xr_page_my%20account');
}

$fee = $product_info['yearly_price_end'] / 100 * $product_info['fee'];
$yearly_price_end = $product_info['yearly_price_end'] + $fee;

$fee = ($product_info['setup_price_end'] / 100) * $product_info['fee'];
$setup_price_end = $product_info['setup_price_end'] + $fee;
if (isset($_SESSION['discountcode_amount'])){    
    $setup_price_end = $setup_price_end - $_SESSION['discountcode_amount'];
    unset($_SESSION['discountcode_amount']);
}


$error = false;
$plan_id = '';
$approvalUrl = '';
$ReturnUrl = SITE_URL.'payment/?payment_type=paypal&payment_page=process_agreement';
$CancelUrl = SITE_URL.'payment/?payment_type=paypal&payment_page=cancel_agreement';

$now = $cms['date'];
$now->modify('+5 minutes');


$apiContext = new \PayPal\Rest\ApiContext(
    new \PayPal\Auth\OAuthTokenCredential(
        $cms['options']['plugin_paypal_clientid'],     // ClientID
        $cms['options']['plugin_paypal_clientsecret']  // ClientSecret
    )
);

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;

// Create a new instance of Plan object
$plan = new Plan();
// # Basic Information
// Fill up the basic information that is required for the plan
$plan->setName($product_info['name'])
    ->setDescription($product_info['desc_text'])
    ->setType('fixed');
// # Payment definitions for this billing plan.
$paymentDefinition = new PaymentDefinition();
// The possible values for such setters are mentioned in the setter method documentation.
// Just open the class file. e.g. lib/PayPal/Api/PaymentDefinition.php and look for setFrequency method.
// You should be able to see the acceptable values in the comments.
$setFrequency = 'Year';
//$setFrequency = 'Day';
$paymentDefinition->setName('Regular Payments')
    ->setType('REGULAR')
    ->setFrequency($setFrequency)
    ->setFrequencyInterval("1")
    ->setCycles("999")
    ->setAmount(new Currency(array('value' => $yearly_price_end, 'currency' => $cms['session']['client']['currency']['iso_code'])));
// Charge Models
$chargeModel = new ChargeModel();
$chargeModel->setType('SHIPPING')
    ->setAmount(new Currency(array('value' => 0, 'currency' => $cms['session']['client']['currency']['iso_code'])));
$paymentDefinition->setChargeModels(array($chargeModel));
$merchantPreferences = new MerchantPreferences();

// ReturnURL and CancelURL are not required and used when creating billing agreement with payment_method as "credit_card".
// However, it is generally a good idea to set these values, in case you plan to create billing agreements which accepts "paypal" as payment_method.
// This will keep your plan compatible with both the possible scenarios on how it is being used in agreement.
$merchantPreferences->setReturnUrl($ReturnUrl)
    ->setCancelUrl($CancelUrl)
    ->setAutoBillAmount("yes")
    ->setInitialFailAmountAction("CONTINUE")
    ->setMaxFailAttempts("0")
    ->setSetupFee(new Currency(array('value' => $setup_price_end, 'currency' => $cms['session']['client']['currency']['iso_code'])));
$plan->setPaymentDefinitions(array($paymentDefinition));
$plan->setMerchantPreferences($merchantPreferences);

// ### Create Plan
try {
    $output = $plan->create($apiContext);
} catch (Exception $ex){
    die($ex);
}

echo $output->getId().'<br />';
echo $output.'<br />';

Я уже несколько дней работаю с PayPal PHP SDK, и мой код перестал работать. Итак, я вернулся к основному и все еще получаю ту же чертову ошибку.

Я пытаюсь создать план подписки, но получаю следующую ошибку: «NotifyUrl не является полным URL»

Я понятия не имею, как это исправить, поскольку я не использую NotfifyUrl в своем коде?

Было бы здорово, если бы у кого-нибудь была идея, как решить эту проблему :)

Спасибо

ИСПРАВЛЕНИЕ ЗДЕСЬ: github.com/paypal/PayPal-PHP-SDK/pull/1152 Замените lib / PayPal / Api / MerchantPreferences.php на: raw.githubusercontent.com/srjlewis/PayPal-PHP-SDK/…

Ann0yed 19.07.2018 22:20

Спасибо, приятель, использовал то же исправление, что и вы :)

Lasse Bang 20.07.2018 16:49
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
Создание ресурсов API Laravel: Советы по производительности и масштабируемости
Создание ресурсов API Laravel: Советы по производительности и масштабируемости
Создание API-ресурса Laravel может быть непростой задачей. Она требует глубокого понимания возможностей Laravel и лучших практик, чтобы обеспечить...
Как создать простое погодное приложение на Python с API OpenWeatherMap
Как создать простое погодное приложение на Python с API OpenWeatherMap
Этот учебник проведет вас через процесс создания простого погодного приложения с помощью Python и OpenWeatherMap API.
Пакеты Java
Пакеты Java
Пакет java - это группа классов, интерфейсов и подпакетов схожего типа. Думайте об этом как о папке в каталоге файлов. Мы используем пакеты, чтобы...
Как использовать API парсинга квитанций с помощью JavaScript за 5 минут?
Как использовать API парсинга квитанций с помощью JavaScript за 5 минут?
В этом руководстве вы узнаете, как использовать API парсинга квитанций за 5 минут с помощью JavaScript. Eden AI предоставляет простой и удобный для...
5
2
2 359
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Из репозиторий GitHub для PayPal PHP SDK я вижу, что упомянутая вами ошибка возникает, когда MerchantPreferences не получает действительный NotifyUrl. Я вижу, вы устанавливаете CancelUrl и ReturnUrl, но не NotifyUrl. Возможно, вам просто потребуется установить это, то есть:

$NotifyUrl = (some url goes here)
$obj->setNotifyUrl($NotifyUrl);

Спасибо, Ричи Томас. Добавление URL-адреса уведомления не решает проблему :) Спасибо, srjlewis, я подожду, пока PayPal исправит эту проблему.

Lasse Bang 19.07.2018 17:02
Ответ принят как подходящий

Вчера вечером PayPal обновил свой API, что вызвало проблемы в их SDK. В своих ответах они отправляют нулевые значения.

Я ДОЛЖЕН подчеркнуть, что ошибка связана не с отправкой запроса в PayPal, а с обработкой их ответа.

Отчет об ошибке: https://github.com/paypal/PayPal-PHP-SDK/issues/1151

Запрос на вытягивание: https://github.com/paypal/PayPal-PHP-SDK/pull/1152

Надеюсь, это поможет, но их текущий SDK выдает исключения.

Используйте простое исправление ниже.

Замените функцию ниже в vendor \ paypal \ rest-api-sdk-php \ lib \ PayPal \ Api \ MerchantPreferences.php

public function setNotifyUrl($notify_url)
{
    if (!empty($notify_url)){
        UrlValidator::validate($notify_url, "NotifyUrl");
    }

    $this->notify_url = $notify_url;
    return $this;
}

Если вы получите ту же ошибку для return_url / cancel_url, добавьте условие if, как указано выше.

Примечание. Это не постоянное решение, вы можете использовать его, пока не получите обновление от PayPal.

ПричиназаЭто!

ошибка исходит от.

поставщик \ PayPal \ rest-api-sdk-php \ lib \ PayPal \ Validation \ UrlValidator.php

линия.

if (filter_var($url, FILTER_VALIDATE_URL) === false) {
    throw new \InvalidArgumentException("$urlName is not a fully qualified URL");
 }

FILTER_VALIDATE_URL: согласно этой функции php.

НЕВЕРНЫЙ URL: "http://cat_n.domain.net.in/"; // СОДЕРЖИТ _ ПОДПИСАТЬСЯ.

ДЕЙСТВИТЕЛЬНЫЙ URL: "http://cat-n.domain.net.in/"; он разделен - тире

здесь вы можете сбросить свой URL. поставщик \ PayPal \ rest-api-sdk-php \ lib \ PayPal \ Validation \ UrlValidator.php

public static function validate($url, $urlName = null)
{ 
   var_dump($url);
}

А затем проверьте это здесь: https://www.w3schools.com/PHP/phptryit.asp?filename=tryphp_func_validate_url

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

Другие вопросы по теме