Home > Blockchain >  Paypal curl_setopt($ch, CURLOPT_POSTFIELDS with PHP variables
Paypal curl_setopt($ch, CURLOPT_POSTFIELDS with PHP variables

Time:10-22

Morning

Having a go at adding a custom PayPal Subscription to my website using PHP and the PayPal API. I have not really used PHP, or Curl before so its taking a while but I have managed to write a script to get an access token from the sandbox and link to an existing subscription plan which you you can subscribe to. The code below works...

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    }");

However whenever I try to include the planID and start_time as php variables within curl_setopt($ch, CURLOPT_POSTFIELDS I get a "Request is not well-formed, syntactically incorrect, or violates schema." error.

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

// Generated by 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    }");

Is my concatenation wrong or do the variables need manipulating in someway first, or both??

Many thanks for the help

Chris

CodePudding user response:

Create your JSON string like this:

$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'
    ],    
];

Then you can check that the nesting etc is correct (please note I don't know if the above is correct, I just copied it from your question), and if you json_encode it you will create well-formed JSON.

$jsonEncoded = json_encode($data);

CodePudding user response:

Do not specify nor include a start_time, unless you want problems with amounts not showing in checkout.

Your problem is you did not keep quotes around the variable values, which is necessary for JSON string syntax. Observe:

\"plan_id\": \"$planID\",

Using json_encode() to construct your string from an array object would be better.

  • Related