Laravel中用Guzzle实现Slack订单通知POST请求报400错误求助
问题解决方法
你的问题出在Guzzle请求的参数结构上,Slack Incoming Webhook的请求格式和你当前的代码不匹配:
错误原因
终端curl请求是通过--data-urlencode把payload作为表单字段传递,而你用Guzzle的json选项时,错误地把所有参数嵌套在了payload键下,导致Slack无法识别到text等核心字段,所以返回missing_text_or_fallback_or_attachments错误。
修改方案(二选一)
方案1:直接发送JSON请求体(推荐)
不需要嵌套payload键,直接把参数作为JSON主体发送:
public function slack(Request $request){ try { $client = new \GuzzleHttp\Client(); $response = $client->post('https://hooks.slack.com/services/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', [ 'json' => [ 'channel' => '#new-order', 'username' => 'product-notifier', 'text' => "New Orders:\nhttps://mission-control.airbringr.com/orders/item/411980", 'icon_emoji' => ':smiley:' ] ]); } catch (\Exception $e) { return response()->json($e->getMessage(), 400); } return response()->json(["message" => "notified successfully"], 200); }
注意:这里把\n放在双引号里,PHP才会解析为换行符,单引号里的\n会被当作普通字符串。
方案2:模拟curl的表单编码方式
和curl请求保持一致,用form_params传递payload字段:
public function slack(Request $request){ try { $client = new \GuzzleHttp\Client(); $payload = json_encode([ 'channel' => '#new-order', 'username' => 'product-notifier', 'text' => "New Orders:\nhttps://mission-control.airbringr.com/orders/item/411980", 'icon_emoji' => ':smiley:' ]); $response = $client->post('https://hooks.slack.com/services/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', [ 'form_params' => [ 'payload' => $payload ] ]); } catch (\Exception $e) { return response()->json($e->getMessage(), 400); } return response()->json(["message" => "notified successfully"], 200); }
另外,你代码里重复实例化了Client对象,上述方案已删除冗余的实例化语句。
内容的提问来源于stack exchange,提问作者Mahir Tazwar
相关产品推荐
相关产品推荐

