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 — у меня был идентификатор клиента в качестве теста, а не мой идентификатор клиента в песочнице, поэтому он не смог бы его найти!!!! Большое спасибо