如何正确准备要发送到最终端点的 JSON 对象?

问题描述 投票:0回答:1

我一直在尝试准备一些 JSON 发送到要保存的最终端点。

我能够更新一些设置,以便可以看到发送到我的自定义中间件的完整有效负载。 此 JSON 是从捐赠网站发送的。

这就是 JSON 在捐赠网站的请求正文中的样子。 我需要捕获以下 JSON 的片段:

 {
  "event": "donation_completed",
  "payload": {
    "date": "2024-10-21 19:27:05 UTC",
    "name": "John Beasley",
    "email": "[email protected]",
    "phone": "7575551212",
    "donation": {
       "fees": {
         "siteFees": {
         "amount": "0.36"
       },
       "vendorFees": []
     },
     "products": [],
     "donationProject": "",
   },
   "lastName": "Beasley",
   "recurring": "false",
   "createdAt": "2024-10-21 19:27:05 UTC",
   "firstName": "John",
   "eventAmount": "1.55",
   "addressCountry": "US",
   "amountInDollars": "1.55",
 }
}

具体的作品如下:

"event": "donation_completed"
"email": "[email protected]"
"date": "2024-10-21 19:27:05 UTC"
"lastName": "Beasley"
"firstName": "John"
"netAmount": "1.19" or "eventAmount": "1.55"
"addressCountry": "US"

这是我的 PHP 中间件,上面的数据被发送到:

<?php
$payload = json_decode(file_get_contents("php://input"), true); // receive the request
$event = $payload["event"];
$email = $payload['payload']["email"];
$firstName = $payload['payload']['firstName']; 
$lastName = $payload['payload']['lastName'];
$firstNameConverted = utf8_encode($firstName);
$lastNameConverted = utf8_encode($lastName);
$country = $payload['payload']['addressCountry'];
$countryConverted = utf8_encode($country);
$mrc_c3 = $payload['payload']['amountInDollars'];
$number = (float)$mrc_c3;
$mrc_date_c3 = date('m/d/Y', strtotime($payload['payload']['date'], JSON_UNESCAPED_SLASHES));

// building array to be sent to final Endpoint
$arr = [
    'event' => $event,
    'payload' => [
        'email' => $email,
        'fields' => [
            'mrc_c3' => $number,
            'country' => $countryConverted,
            'last_name' => $lastNameConverted,
            'first_name' => $firstNameConverted,
            'mrc_date_c3' => $mrc_date_c3,
        ],
    'overwrite' => true,
    ],
];

$curl = curl_init( "finalendpoint.url" );
curl_setopt( $curl, CURLOPT_HEADER, false );
curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $curl, CURLOPT_HTTPHEADER, array(
     "Content-type: application/json",
    "X_USERNAME: username",
    "X_PASSWORD: password",
    "X_ACCOUNT_CODE: account_code"
) );
curl_setopt( $curl, CURLOPT_POST, true );
curl_setopt( $curl, CURLOPT_POSTFIELDS, json_encode($arr)); // <-- array is sent here
$json_response = curl_exec( $curl );
$status = curl_getinfo( $curl, CURLINFO_HTTP_CODE );

if ( $status != 200 && $status != 201 ) {
    error_log( "Error: call to URL $url failed with status $status, response $json_response, curl_error " . curl_error( $curl ) . ", curl_errno " . curl_errno( $curl ) );
}

print_r(json_encode($arr));
echo "status " .  $status;

curl_close( $curl );
$response = json_decode( $json_response, true );
?>

由于某种原因,当数组发送到最终端点时,数组本身要么将值设置为 null,要么将

$number
发送为 0 或 null。

正如您在 PHP 代码底部附近看到的那样,我正在打印

$arr
,以便我可以在捐赠网站的响应正文部分中看到它,如下所示:

"{
   \"event\":\"donation_completed\",
   \"payload\": {
     \"email\":\"[email protected]\",
     \"fields\":\"mrc_c3\":0,\"country\":\"\",\"last_name\":\"\",\"first_name\":\"\",\"mrc_date_c3\":\"10\\/22\\/2024\"},
\"overwrite\":true}
}

 status 200"

请注意,应为 1.55 的

mrc_c3
显示为 0。

此外,国家/地区、名字和姓氏为空,但电子邮件和日期不是。

(在 PHP 代码中,您看到我使用

utf8_encode
来尝试设置名字和姓氏。我尝试传递
$firstName
$lastName
变量,但它们在响应中也是空白的。同样的事情
$mrc_c3
变量 - 我只得到 0。)

有趣的是......我在 PHP 中做到了这一点:

$number = 1.55; 
$firstName = 'John';
$lastName = 'Beasley';

这是响应正文的样子:

"{\"event\":\"donation_completed\",
  \"payload\":
  {\"email\":\"[email protected]\",\"fields\":{\"mrc_c3\":1.5500000000000000444089209850062616169452667236328125,\"country\":null,\"last_name\":\"Beasley\",\"first_name\":\"John\",\"mrc_date_c3\":\"10\\/22\\/2024\"},\"overwrite\":true}}
status 200"

(上例中我没有手动设置国家)。

我不明白为什么名称和国家/地区会变为空,mrc_c3 编号也会变为 0,但电子邮件和日期会被发送过来。

我似乎找不到数据转换过程中发生的事情。

请帮我解决这个问题。

抱歉这么久了。

php json middleware
1个回答
0
投票

主要问题是我们没有正确处理数据类型(例如转换数字),并且在不需要时使用

utf8_encode
,这最终会在 JSON 负载中发送 null 或错误值。

1.
utf8_encode

你并不真的需要

utf8_encode
,除非你确定输入已经不是 UTF-8 格式了。 PHP 字符串通常是 UTF-8,因此重新编码可能会造成混乱。摆脱它吧。

2. 铸造金额正确

当您处理像

mrc_c3
这样的数字时,请使用
floatval()
确保它们正确转换为浮点数。这样,您就可以将它们作为实际数字发送。

3. 检查 JSON 结构:

在尝试访问有效负载中的值之前,请使用

isset()
查看它们是否存在。这样,您就不会遇到空值问题。

4. 整理数组和 JSON 编码:

确保您的数组设置正确,并使用

json_encode()
检查最终编码的 JSON。添加一些错误日志来捕获任何问题是个好主意。

我已尝试更改您的代码并解决您的问题

<?php
// Receive the request and decode the JSON
$payload = json_decode(file_get_contents("php://input"), true);

// Check and assign values from the payload
$event = $payload["event"];
$email = isset($payload['payload']["email"]) ? $payload['payload']["email"] : '';
$firstName = isset($payload['payload']['firstName']) ? $payload['payload']['firstName'] : ''; 
$lastName = isset($payload['payload']['lastName']) ? $payload['payload']['lastName'] : '';
$country = isset($payload['payload']['addressCountry']) ? $payload['payload']['addressCountry'] : '';
$mrc_c3 = isset($payload['payload']['amountInDollars']) ? floatval($payload['payload']['amountInDollars']) : 0.0;
$mrc_date_c3 = isset($payload['payload']['date']) ? date('m/d/Y', strtotime($payload['payload']['date'])) : '';

// Build array to be sent to final Endpoint
$arr = [
    'event' => $event,
    'payload' => [
        'email' => $email,
        'fields' => [
            'mrc_c3' => $mrc_c3,
            'country' => $country,
            'last_name' => $lastName,
            'first_name' => $firstName,
            'mrc_date_c3' => $mrc_date_c3,
        ],
    'overwrite' => true,
    ],
];

// Debugging: Check the array structure
error_log(print_r($arr, true));

// Initialize cURL and send the data
$curl = curl_init("finalendpoint.url");
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
    "Content-type: application/json",
    "X_USERNAME: username",
    "X_PASSWORD: password",
    "X_ACCOUNT_CODE: account_code"
));
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($arr, JSON_UNESCAPED_SLASHES)); // Ensure proper JSON encoding

$json_response = curl_exec($curl);
$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);

// Error handling
if ($status != 200 && $status != 201) {
    error_log("Error: call to URL failed with status $status, response $json_response, curl_error " . curl_error($curl) . ", curl_errno " . curl_errno($curl));
}

// Close the cURL connection
curl_close($curl);

// Check the response
$response = json_decode($json_response, true);

// Debugging: Log response and status
error_log("Response: " . print_r($response, true));
error_log("Status: " . $status);

?>
© www.soinside.com 2019 - 2024. All rights reserved.