PHP解析Ko-fi Webhook的x-www-form-urlencoded数据无法取值问题
问题解决指南
错误原因1:Postman请求配置错误
你当前返回的解析结果里JSON结构被拆成多个独立键,是Postman配置错误导致:
- 你错误将JSON的每个字段单独作为
application/x-www-form-urlencoded的参数提交,而非按官方要求将完整JSON作为data参数的值提交 - 你使用的测试JSON本身存在语法错误,
url字段、is_subscription_payment字段后均缺少英文逗号,会导致JSON解析失败
正确Postman配置步骤
- 请求方法选POST,请求体类型选择
x-www-form-urlencoded - 仅添加1个参数:键为
data,值为补全后的完整JSON字符串:
{"message_id":"3a1fac0c-f960-4506-a60e-824979a74e74","kofi_transaction_id":"0a1fac0c-f960-4506-a60e-824979a74e71","timestamp":"2022-08-21T13:04:30Z","type":"Donation","from_name":"Ko-fi Team","message":"Good luck with the integration!","amount":"3.00","currency":"USD","url":"https://ko-fi.com","is_subscription_payment":false,"is_first_subscription_payment":false}
错误原因2:PHP解析逻辑错误
你原来的代码存在多余的转码操作,且混淆了数组和对象的访问语法:
- 官方规则为
data字段存储完整JSON字符串,无需对解析后的表单数组做json_encode再json_decode的冗余操作 - 若
json_decode第二个参数传true会返回关联数组,不能用->对象语法访问字段,需用数组下标语法
正确PHP代码示例
// 解析x-www-form-urlencoded格式的请求体 parse_str(file_get_contents("php://input"), $formData); // 直接解析data字段内的JSON字符串,返回关联数组 $paymentInfo = json_decode($formData['data'], true); // 字段取值示例 var_dump($paymentInfo); error_log($paymentInfo['message_id']); error_log($paymentInfo['amount']); // 若偏好对象访问语法,去掉json_decode的第二个参数即可: // $paymentInfo = json_decode($formData['data']); // error_log($paymentInfo->message_id);
入库注意事项
提取到对应字段值后,使用PDO或MySQLi的预处理语句执行数据库写入操作,避免SQL注入风险。
内容的提问来源于stack exchange,提问作者TheMonk300
相关产品推荐
相关产品推荐

