【问题标题】:Paypal curl_setopt($ch, CURLOPT_POSTFIELDS with PHP variables贝宝 curl_setopt($ch, CURLOPT_POSTFIELDS 与 PHP 变量
【发布时间】:2021-12-08 01:51:01
【问题描述】:

早上

尝试使用 PHP 和 PayPal 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    }");

我的连接是错误的还是变量需要先以某种方式进行操作,还是两者都需要??

非常感谢您的帮助

克里斯

【问题讨论】:

  • 你不能只使用json_encode() 而不是使用纯文本 JSON 吗?
  • 并存储在变量中然后使用 ...(CURL_POSTFIELDS, $datas)

标签: php curl paypal-sandbox paypal-subscriptions


【解决方案1】:

不要指定也不要包含start_time,除非您想解决结帐时未显示金额的问题。

您的问题是您没有在变量值周围加上引号,这是 JSON 字符串语法所必需的。观察:

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

使用 json_encode() 从数组对象构造字符串会更好。

【讨论】:

  • 非常感谢....我想知道是否包含引号并进行了实验,但无法正确。我需要一个 start_time,因为我希望订阅从客户定义的日期开始,而不是立即开始。如果不需要此功能,我可以为自己省去很多麻烦并使用 PayPal 按钮。如果有更好的做法,我会尝试构建一个数组。
  • 如果你真的需要,在 JS 按钮 createSubscription 中添加 start_time 会很简单
  • Arr 这将非常有用.....前一周我确实尝试过这个猜测,因为除了 customID createSubscription 之外找不到任何关于向 createSubscription 添加参数的文档:函数(数据,动作){返回actions.subscription.create({'plan_id':'P-25Y56437062492726MFWZ4GI','start_time':'2021-10-22T00:00:00Z'});但它没有工作
  • 不知道是什么让你这么说。它确实有效。
  • DOH - 我将客户端 ID 作为测试而不是我的沙盒客户端 -ID,所以它无法找到它!!!!非常感谢
【解决方案2】:

像这样创建您的 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);

【讨论】:

  • 非常感谢,如果它有更好的做法,我会在之前使用数组 - 如果我把它搞砸了@Preston PHX 已经纠正了我构造不佳的 JSON 字符串!
猜你喜欢
  • 2016-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-21
  • 2013-05-07
  • 2011-09-22
相关资源
最近更新 更多