Paypal curl_setopt ($ ch, CURLOPT_POSTFIELDS с переменными PHP

php #curl #paypal-sandbox #paypal-subscriptions

#php #curl #paypal- песочница #paypal-подписки

Вопрос:

Утро

Пытаюсь добавить пользовательскую подписку PayPal на мой сайт, используя PHP и API PayPal. Я на самом деле не использовал PHP или Curl раньше, поэтому это заняло некоторое время, но мне удалось написать скрипт для получения токена доступа из изолированной среды и ссылки на существующий план подписки, на который вы можете подписаться. Приведенный ниже код работает…

 curl_setopt($ch, CURLOPT_POSTFIELDS, "n  {n   "plan_id":$planID,n   "start_time":$startTime,n      "application_context": {n        "brand_name": "Sleep Happy Mattress",n        "locale": "en-US",n        "shipping_preference": "SET_PROVIDED_ADDRESS",n        "user_action": "SUBSCRIBE_NOW",n        "payment_method": {n          "payer_selected": "PAYPAL",n          "payee_preferred": "IMMEDIATE_PAYMENT_REQUIRED"n        },n        "return_url": "https://example.com/returnUrl",n        "cancel_url": "https://example.com/cancelUrl"n      }n    }");
 

Однако всякий раз, когда я пытаюсь включить PlanID и start_time в качестве переменных php в curl_setopt($ ch, CURLOPT_POSTFIELDS, я получаю сообщение «Запрос неправильно сформирован, синтаксически неверен или нарушает схему». ошибка.

 $planID = 'P-25Y56437062492726MFWZ4GI';
$startTime = '2021-10-22T00:00:00Z';
 

// Генерируется curl-to-PHP: http://incarnate.github.io/curl-to-php /

 $ch = curl_init();

curl_setopt($ch, CURLOPT_URL, 'https://api-m.sandbox.paypal.com/v1/billing/subscriptions');

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
//curl_setopt($ch, CURLOPT_POSTFIELDS, "n  {n   "plan_id": "P-25Y56437062492726MFWZ4GI",n   "start_time": "2021-10-22T00:00:00Z",n      "application_context": {n        "brand_name": "Sleep Happy Mattress",n        "locale": "en-UK",n        "shipping_preference": "SET_PROVIDED_ADDRESS",n        "user_action": "SUBSCRIBE_NOW",n        "payment_method": {n          "payer_selected": "PAYPAL",n          "payee_preferred": "IMMEDIATE_PAYMENT_REQUIRED"n        },n        "return_url": "https://example.com/returnUrl",n        "cancel_url": "https://example.com/cancelUrl"n      }n    }");
curl_setopt($ch, CURLOPT_POSTFIELDS, "n  {n   "plan_id":$planID,n   "start_time":$startTime,n      "application_context": {n        "brand_name": "Sleep Happy Mattress",n        "locale": "en-US",n        "shipping_preference": "SET_PROVIDED_ADDRESS",n        "user_action": "SUBSCRIBE_NOW",n        "payment_method": {n          "payer_selected": "PAYPAL",n          "payee_preferred": "IMMEDIATE_PAYMENT_REQUIRED"n        },n        "return_url": "https://example.com/returnUrl",n        "cancel_url": "https://example.com/cancelUrl"n      }n    }");
 

Является ли моя конкатенация неправильной или сначала нужно каким-то образом манипулировать переменными или обоими??

Большое спасибо за помощь

Крис

Комментарии:

1. Разве вы не можете просто использовать json_encode() вместо обычного текста JSON?

2. И сохранить в переменной, а затем использовать… (CURL_POSTFIELDS, $datas)

Ответ №1:

Создайте свою строку JSON следующим образом:

 $data = [
    'plan_id' => $planID,
    'start_time' => $startTime,
    'application_context' => [
        'brand_name' => 'Sleep Happy Mattress',
        'locale' => 'en-US',
        'shipping_preference' => 'SET_PROVIDED_ADDRESS',
        'user_action' => 'SUBSCRIBE_NOW',
        'payment_method' => [
            'payer_selected' => 'PAYPAL',
            'payee_preferred' => 'IMMEDIATE_PAYMENT_REQUIRED'
        ],
        'return_url' => 'https://example.com/returnUrl',
        'cancel_url' => 'https://example.com/cancelUrl'
    ],    
];
 

Затем вы можете проверить правильность вложенности и т. Д. (Пожалуйста, обратите внимание, что я не знаю, верно ли приведенное выше, я просто скопировал его из вашего вопроса), и если вы json_encode это сделаете, вы создадите правильно сформированный JSON.

 $jsonEncoded = json_encode($data);
 

Комментарии:

1. Большое спасибо, я передам, используя массив назад, если это лучшая практика — если я все испорчу @Preston PHX исправил мою плохо сконструированную строку JSON!

Ответ №2:

Не указывайте и не включайте a start_time , если вы не хотите проблем с суммами, не отображаемыми при оформлении заказа.

Ваша проблема в том, что вы не заключили значения переменных в кавычки, что необходимо для синтаксиса строки JSON. Обратите внимание:

 "plan_id": "$planID",
 

Было бы лучше использовать json_encode() для построения вашей строки из объекта массива.

Комментарии:

1. Большое спасибо…. Я задавался вопросом о включении кавычек и провел эксперимент, но не смог его исправить. Мне нужно start_time, так как я хочу, чтобы подписка начиналась с определенной клиентом даты, а не сразу. Если бы мне не нужна была эта функция, я мог бы сэкономить много хлопот и использовать кнопки PayPal. Я попробую создать массив, если это лучшая практика.

2. Было бы просто добавить start_time в кнопку JS createSubscription , если она вам действительно нужна

3. Arr это было бы очень полезно….. На прошлой неделе я попробовал использовать это как предположение, поскольку не смог найти никакой документации о добавлении параметров в createSubscription, отличных от пользовательского идентификатора createSubscription: function(data, actions) { return actions.subscription.create({ ‘plan_id’: ‘P-25Y56437062492726MFWZ4GI’, ‘start_time’: ‘2021-10-22T00:00:00Z’ }); Но это не сработало

4. Не знаю, что заставляет вас так говорить. Это действительно работает.

5. DOH — у меня был идентификатор клиента в качестве теста, а не мой идентификатор клиента в песочнице, поэтому он не смог бы его найти!!!! Большое спасибо