全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

微信支付回调PHP怎么接收_处理微信异步通知数据教程【说明】

微信支付回调必须用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) 转为关联数组。

注意两点:

  • XML 中的 会被自动剥离,内容直接作为字符串值
  • 如果 XML 格式非法(比如微信重试时传了乱码),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 按字典序(ASCII 升序)排序,不是中文拼音,也不是 PHP 数组键顺序
  • 每个 key=value& 连接,末尾**不加 &**
  • 最后拼上 &key=YOUR_MCH_KEY(你的商户平台「API 密钥」,32 位)

常见翻车点:

  • 漏掉 trade_typebank_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  # 升序  # 回调  # 重试  # 的是  # 字段名  # 几个  # 就会  # 文档  # 是有  # 就能 


相关文章: 建站之星后台密码遗忘或太弱?如何重置与强化?  如何确保西部建站助手FTP传输的安全性?  如何用PHP快速搭建CMS系统?  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  建站之星北京办公室:智能建站系统与小程序生成方案解析  宝塔面板创建网站无法访问?如何快速排查修复?  如何通过VPS搭建网站快速盈利?  建站之星伪静态规则如何正确配置?  网站制作公司排行榜,四大门户网站排名?  实现点击下箭头变上箭头来回切换的两种方法【推荐】  建站之星如何防范黑客攻击与数据泄露?  制作网站的过程怎么写,用凡科建站如何制作自己的网站?  IOS倒计时设置UIButton标题title的抖动问题  如何在Tomcat中配置并部署网站项目?  C++如何编写函数模板?(泛型编程入门)  ,如何利用word制作宣传手册?  如何通过可视化优化提升建站效果?  做企业网站制作流程,企业网站制作基本流程有哪些?  桂林网站制作公司有哪些,桂林马拉松怎么报名?  代购小票制作网站有哪些,购物小票的简要说明?  如何高效完成自助建站业务培训?  如何用景安虚拟主机手机版绑定域名建站?  宝塔建站助手安装配置与建站模板使用全流程解析  洛阳网站制作公司有哪些,洛阳的招聘网站都有哪些?  C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)  如何通过老薛主机一键快速建站?  小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  建站之星在线客服如何快速接入解答?  网站网页制作电话怎么打,怎样安装和使用钉钉软件免费打电话?  建站主机类型有哪些?如何正确选型  建站之星后台密码遗忘如何找回?  如何选择CMS系统实现快速建站与SEO优化?  江苏网站制作公司有哪些,江苏书法考级官方网站?  建站之星免费模板:自助建站系统与智能响应式一键生成  已有域名如何快速搭建专属网站?  专业制作网站的公司哪家好,建立一个公司网站的费用.有哪些部分,分别要多少钱?  学校建站服务器如何选型才能满足性能需求?  安徽网站建设与外贸建站服务专业定制方案  代刷网站制作软件,别人代刷火车票靠谱吗?  Android自定义listview布局实现上拉加载下拉刷新功能  建站之星IIS配置教程:代码生成技巧与站点搭建指南  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  大连网站设计制作招聘信息,大连投诉网站有哪些?  已有域名如何免费搭建网站?  交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?  建站主机是否等同于虚拟主机?  如何选择高效响应式自助建站源码系统?  网站海报制作教学视频教程,有什么免费的高清可商用图片网站,用于海报设计?  如何选购建站域名与空间?自助平台全解析 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。