修改回调接口解析参数的方式

This commit is contained in:
2026-09-20 21:15:35 +08:00
parent 57e0854a0e
commit ae94c1dc00
2 changed files with 29 additions and 7 deletions
+24 -7
View File
@@ -22,15 +22,32 @@ class QytNotify extends Controller
*/
public function consume()
{
$raw = Request::instance()->getContent();
(new QytOil())->saveLog('7.10 消费回调原文:' . $raw);
$request = Request::instance();
// ⚠️ 企油通用 multipart/form-data 推送,业务参数在表单字段 params 里(JSON 字符串)。
// 这种 Content-Type 下 PHP 不会填充 php://input,读请求体恒为空 —— 必须取表单字段。
// 回退读请求体只是为了兼容 JSON 推送与本地测试脚本。
// ⚠️ 这里必须直接读 $_POST:cores\Request 给所有入参挂了全局过滤器
// ['my_trim','my_htmlspecialchars','filter_emoji'],走 $request->post() 取到的 JSON
// 引号会被转义成 ",json_decode 必然失败(回调会被静默当成空明细忽略)
$formParams = isset($_POST['params']) ? trim((string) $_POST['params']) : '';
$raw = $request->getContent();
$body = json_decode($raw, true);
(new QytOil())->saveLog('7.10 消费回调原文[' . $request->contentType() . ']:'
. ($formParams !== '' ? 'params=' . $formParams : $raw));
// 兼容:外层信封 {appId,timestamp,sign,params(JSON字符串)} 或 直接推 body
$params = $body;
if (is_array($body) && isset($body['params'])) {
$params = is_string($body['params']) ? json_decode($body['params'], true) : $body['params'];
if ($formParams !== '') {
$params = json_decode($formParams, true);
// 兜底:若上游或中间层做过 HTML 转义,反转义后再解析一次
if (!is_array($params) && strpos($formParams, '"') !== false) {
$params = json_decode(htmlspecialchars_decode($formParams, ENT_QUOTES), true);
}
} else {
// 兼容:外层信封 {appId,timestamp,sign,params(JSON字符串)} 或 直接推 body
$body = json_decode($raw, true);
$params = $body;
if (is_array($body) && isset($body['params'])) {
$params = is_string($body['params']) ? json_decode($body['params'], true) : $body['params'];
}
}
// TODO 验签(规则待对接人确认)