微信支付回调必须用file_get_contents('php://input')读取原始XML,经simplexml_load_string转数组后按字典序拼接非空非sign字段+密钥MD5验签,成功后立即返回纯文本success。
php://input 读取原始 XML 数据微信服务器发起的异步通知是 POST 请求,但**不带 Content-Type: application/x-www-form-urlencoded**,也不走 PHP 的 $_POST。它发的是纯 XML(Content-Type: text/xml),且不附带任何 URL 编码参数。直接读 $_POST 或 $_REQUEST 一定是空的。
正确做法是:
file_get_contents('php://input') 获取原始请求体$HTTP_RAW_POST_DATA(PHP 7.0+ 已废弃,且默认关闭)php://input 会返回空$xml = file_get_contents('php://input');
if (empty($xml)) {
// 微信可能没发数据,或被中间件/代理截断
exit('fail');
}
simplexml_load_string() 解析并转成数组微信返回的 XML 结构固定,但字段名大小写敏感、存在嵌套(如 在根节点),直接用 DOM 或正则解析容易出错。推荐用 simplexml_load_string() + json_decode(json_encode(...), true) 转为关联数组。
注意两点:
会被自动剥离,内容直接作为字符串值simplexml_load_string() 会返回 false,必须判空并返回 fail
$data = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
if ($data === false) {
exit('fail');
}
$notify = json_decode(json_encode($data), true);
sign + 签名密钥末尾加微信签名规则不是简单地把所有字段连起来,而是有严格顺序和过滤条件:
$notify 中值非空、且 key 不是 sign 的字段key=value 用 & 连接,末尾**不加 &**&key=YOUR_MCH_KEY(你的商户平台「API 密钥」,32 位)常见翻车点:
trade_type 或 bank_type 等可选字段导致签名不一致total_fee 当整数参与拼接(实际要原样字符串,如 
"100")md5() 但没转大写(微信要求大写 HEX)$params = [];
foreach ($notify as $k => $v) {
if ($k !== 'sign' && $v !== '' && !is_array($v)) {
$params[$k] = $v;
}
}
ksort($params);
$string = http_build_query($params, '', '&', PHP_QUERY_RFC3986);
$string .= '&key=your_32bit_mch_key';
$localSign = strtoupper(md5($string));
if ($localSign !== $notify['sign']) {
exit('fail');
}
success 纯文本,且 HTTP 状态码为 200微信服务器收到非 success(比如 FAIL、空响应、HTML 页面、JSON 字符串)或超时(>5 秒)、状态码非 200,就会持续重试(最多 10 次,间隔不断拉长)。你不能在返回前查数据库、发邮件、调第三方 API——这些必须异步做。
安全建议:
$notify['result_code'] === 'SUCCESS' 和 $notify['return_code'] === 'SUCCESS'
$notify['out_trade_no'] 查询本地订单是否存在且未支付,避免重复处理success;哪怕 DB 写失败,也应记录日志并返回 fail 触发重试if ($notify['result_code'] === 'SUCCESS' && $notify['return_code'] === 'SUCCESS') {
// 查单、更新、发消息等业务逻辑(建议丢进队列)
updateOrderStatus($notify['out_trade_no'], $notify['transaction_id']);
}
// 必须无任何输出、无换行、纯文本
echo 'success';
微信回调最常卡在「以为能读 $_POST」和「签名字符串拼错顺序或漏字段」,这两处多打几个 var_dump() 对比微信文档里的示例签名,基本就能定位。
# php
# html
# js
# json
# 微信
# 编码
# app
# 微信支付
# ai
# 状态码
# 关联数组
# xml
# 字符串
# dom
# 异步
# input
# ASCII
# 数据库
# http
# 升序
# 回调
# 重试
# 的是
# 字段名
# 几个
# 就会
# 文档
# 是有
# 就能
相关文章:
哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?
怎么将XML数据可视化 D3.js加载XML
高端建站如何打造兼具美学与转化的品牌官网?
建站10G流量真的够用吗?如何应对访问高峰?
建站中国必看指南:CMS建站系统+手机网站搭建核心技巧解析
唐山网站制作公司有哪些,唐山找工作哪个网站最靠谱?
广州网站制作的公司,现在专门做网站的公司有没有哪几家是比较好的,性价比高,模板也多的?
C++如何使用std::optional?(处理可选值)
网站制作培训多少钱一个月,网站优化seo培训课程有哪些?
如何选择可靠的免备案建站服务器?
移民网站制作流程,怎么看加拿大移民官网?
内部网站制作流程,如何建立公司内部网站?
建站之星安装后如何自定义网站颜色与字体?
西安大型网站制作公司,西安招聘网站最好的是哪个?
邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?
如何在云主机上快速搭建多站点网站?
如何挑选优质建站一级代理提升网站排名?
官网网站制作腾讯审核要多久,联想路由器newifi官网
桂林网站制作公司有哪些,桂林马拉松怎么报名?
如何在宝塔面板中创建新站点?
制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?
如何在万网主机上快速搭建网站?
如何在宝塔面板中修改默认建站目录?
宿州网站制作公司兴策,安徽省低保查询网站?
建站之星图片链接生成指南:自助建站与智能设计教程
常州企业网站制作公司,全国继续教育网怎么登录?
制作网站外包平台,自动化接单网站有哪些?
制作网站的过程怎么写,用凡科建站如何制作自己的网站?
c# 服务器GC和工作站GC的区别和设置
怎么用手机制作网站链接,dw怎么把手机适应页面变成网页?
实例解析angularjs的filter过滤器
C++如何将C风格字符串(char*)转换为std::string?(代码示例)
电商平台网站制作流程,电商网站如何制作?
如何高效配置香港服务器实现快速建站?
专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?
代刷网站制作软件,别人代刷火车票靠谱吗?
C++时间戳转换成日期时间的步骤和示例代码
外汇网站制作流程,如何在工商银行网站上做外汇买卖?
nginx修改上传文件大小限制的方法
制作网站建设的公司有哪些,网站建设比较好的公司都有哪些?
GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?
北京的网站制作公司有哪些,哪个视频网站最好?
python的本地网站制作,如何创建本地站点?
网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?
建站OpenVZ教程与优化策略:配置指南与性能提升
C++中引用和指针有什么区别?(代码说明)
中山网站推广排名,中山信息港登录入口?
网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?
广州网站设计制作一条龙,广州巨网网络科技有限公司是干什么的?
制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。