我一直在尝试准备一些 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,但电子邮件和日期会被发送过来。
我似乎找不到数据转换过程中发生的事情。
请帮我解决这个问题。
抱歉这么久了。
主要问题是我们没有正确处理数据类型(例如转换数字),并且在不需要时使用
utf8_encode
,这最终会在 JSON 负载中发送 null 或错误值。
utf8_encode
:你并不真的需要
utf8_encode
,除非你确定输入已经不是 UTF-8 格式了。 PHP 字符串通常是 UTF-8,因此重新编码可能会造成混乱。摆脱它吧。
当您处理像
mrc_c3
这样的数字时,请使用 floatval()
确保它们正确转换为浮点数。这样,您就可以将它们作为实际数字发送。
在尝试访问有效负载中的值之前,请使用
isset()
查看它们是否存在。这样,您就不会遇到空值问题。
确保您的数组设置正确,并使用
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);
?>