diff --git a/server-tp6/app/api/controller/QytNotify.php b/server-tp6/app/api/controller/QytNotify.php index 830eafd..caf0887 100644 --- a/server-tp6/app/api/controller/QytNotify.php +++ b/server-tp6/app/api/controller/QytNotify.php @@ -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 验签(规则待对接人确认) diff --git a/企油通接口对接文档.md b/企油通接口对接文档.md index 81252b9..fcb39bb 100644 --- a/企油通接口对接文档.md +++ b/企油通接口对接文档.md @@ -454,6 +454,11 @@ curl -X POST "https://{接口域名}/enterprise/api/receipt/getPaymentReceipt" \ | oil_price | 是 | number/null | 油品原价(分) | | actual_oil_price | 是 | number/null | 油品实际价格 | +**⚠️ 推送用 `multipart/form-data`,不是 JSON 请求体**:业务参数放在表单字段 `params` 里(JSON 字符串)。 + +- PHP:`php://input` 在这种 Content-Type 下恒为空,必须取 `$_POST['params']` 再 `json_decode` +- Java(Spring):用 `@RequestParam("params") String params`,`@RequestBody` 取不到 + **接入方需返回**:`{"code":"100","msg":"Success"}` > 测试环境可用 **7.23** 模拟一笔平安消费来联调本回调。