微信支付回调必须用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
网站app免费制作软件,能免费看各大网站视频的手机app?
赚钱网站制作软件,建一个网站怎样才能赚钱?是如何盈利的?
早安海报制作网站推荐大全,企业早安海报怎么每天更换?
网站海报制作教学视频教程,有什么免费的高清可商用图片网站,用于海报设计?
建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略
高性能网站服务器配置指南:安全稳定与高效建站核心方案
如何快速搭建二级域名独立网站?
如何在企业微信快速生成手机电脑官网?
如何在云指建站中生成FTP站点?
广德云建站网站建设方案与建站流程优化指南
如何在沈阳梯子盘古建站优化SEO排名与功能模块?
成都网站制作报价公司,成都工业用气开户费用?
PHP正则匹配日期和时间(时间戳转换)的实例代码
如何在景安云服务器上绑定域名并配置虚拟主机?
建站IDE高效指南:快速搭建+SEO优化+自适应模板全解析
小型网站制作HTML,*游戏网站怎么搭建?
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
兔展官网 在线制作,怎样制作微信请帖?
北京的网站制作公司有哪些,哪个视频网站最好?
制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站?
如何在腾讯云服务器快速搭建个人网站?
高端企业智能建站程序:SEO优化与响应式模板定制开发
建站之星与建站宝盒如何选择最佳方案?
建站之星导航如何优化提升用户体验?
SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?
品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?
如何通过PHP快速构建高效问答网站功能?
北京网站制作的公司有哪些,北京白云观官方网站?
建站主机默认首页配置指南:核心功能与访问路径优化
如何通过VPS搭建网站快速盈利?
制作农业网站的软件,比较好的农业网站推荐一下?
如何基于PHP生成高效IDC网络公司建站源码?
香港服务器租用费用高吗?如何避免常见误区?
如何续费美橙建站之星域名及服务?
Java解压缩zip - 解压缩多个文件或文件夹实例
济南专业网站制作公司,济南信息工程学校怎么样?
建站之星如何取消后台验证码生成?
网站制作软件免费下载安装,有哪些免费下载的软件网站?
制作网页的网站有哪些,电脑上怎么做网页?
如何快速登录WAP自助建站平台?
制作充值网站的软件,做人力招聘为什么要自己交端口钱?
如何选择PHP开源工具快速搭建网站?
头像制作网站在线制作软件,dw网页背景图像怎么设置?
如何配置WinSCP新建站点的密钥验证步骤?
制作证书网站有哪些,全国城建培训中心证书查询官网?
网站建设设计制作营销公司南阳,如何策划设计和建设网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。