ThinkPHP微信支付_V3版接口签名与回调通知处理【指南】

陌墨小哥_1962

陌墨小哥_1962

2026-06-20

970人浏览

原创

微信支付v3在thinkphp中签名失败、验签不过、解密报invalid aead tag,主因是证书路径配置错误、验签顺序颠倒(须先平台证书验签再解密)、gcm参数未正确base64_decode且tag长度不为16字节。

thinkphp微信支付_v3版接口签名与回调通知处理【指南】

微信支付V3在ThinkPHP里签名失败、回调验签不过、解密报Invalid AEAD tag——基本都是证书路径、验签顺序、GCM参数拆分这三处出问题,不是SDK写得烂,是你没踩对点。

ThinkPHP里加载apiclient_cert.pem和apiclient_key.pem总报file_get_contents() failed

证书不能放public/或runtime/下被Web服务器拦截;也不能用__DIR__ . '/../cert/'这种硬编码路径,Docker或宝塔部署时绝对路径一变就崩。

  • 把证书放进config/cert/(推荐)或runtime/cert/(确保目录可写)
  • 在config/wechat.php里统一配置:'cert_path' => app()->getRuntimePath() . 'cert/'
  • 加载前必须显式校验:is_readable($certPath . 'apiclient_cert.pem') 和 is_readable($certPath . 'apiclient_key.pem')
  • apiclient_key.pem必须带密码(微信后台导出时设的),调用openssl_pkey_get_private()时第2个参数不能传空

wechatpay-php SDK回调验签总提示Invalid signature

不是私钥错了,是验签顺序反了:微信要求「先用平台证书验签成功,再解密」。你要是跳过验签直接解密,哪怕密文是对的,也白忙活。

微信创作
微信创作

自动将 Markdown 文章转为适配微信公众号格式的 HTML,并批量发布至公众号草稿箱,支持封面图生成与专题管理。

下载
  • 从Wechatpay-Serial请求头取序列号,匹配你本地缓存的平台证书(不是商户证书)
  • 用该平台证书公钥 + Wechatpay-Signature + Wechatpay-Timestamp + 原始JSON体,调openssl_verify()验签
  • 验签失败直接return response('', 401),别往下走
  • 验签通过后,才提取resource.nonce、resource.ciphertext、resource.associated_data、resource.tag四部分

PHP openssl_decrypt()解密微信AES-GCM总抛Invalid AEAD tag

微信的ciphertext和tag都是base64编码过的,但openssl_decrypt()第5个参数$tag要的是原始二进制,且长度必须严格为16字节——少一个字节、多一个空格都不行。

  • 必须分别对ciphertext和tag做base64_decode(),不能只解ciphertext
  • $tag = base64_decode($rawTag)之后,立刻检查strlen($tag) === 16,不等就拒收
  • openssl_decrypt()第4个参数是$iv(即nonce),第5个是$tag,第6个是OPENSSL_ZERO_PADDING(GCM固定)
  • 别漏掉associated_data,它要作为第7个参数传入,值是base64_decode($rawAssociatedData)

回调控制器里混写验签+业务逻辑导致难维护

微信回调不是普通接口,它是外部系统主动推数据,字段结构、签名规则、响应格式全由微信定死。你把验签、解密、查库、改状态全塞进一个notify()方法里,下次加支付宝回调就得复制粘贴再改一堆if。

  • 定义适配器接口PaymentNotifyAdapter,强制实现verify()、getOrderId()、buildSuccessResponse()
  • 微信V3实现类只管:从php://input读原始JSON、验签、解密、提取resource.original_type === 'transaction'字段
  • 控制器只做三件事:$adapter->verify() → 查订单是否存在 → $adapter->buildSuccessResponse()
  • buildSuccessResponse()必须返回纯字符串'success',不能带\n、\r、BOM头,否则微信会重试

最常被忽略的其实是幂等控制——resource.id才是微信回调唯一ID,不是订单号,也不是out_trade_no。你拿它去查是否已处理,比任何时间戳或随机串都可靠。

php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2023.09.01

10864

6

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

6341

5

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

2135

5

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

2023.10.23

4008

4

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

2023.10.23

4714

6

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.03

3711

9

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.09

5297

8

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.13

4162

8

sprintf函数用法详解
sprintf函数用法详解

sprintf函数的用法:1、格式化字符串;2、指定输出宽度和精度;3、返回值。更多关于sprintf函数用法详解的内容,大家可以阅读下面的文章。

2023.11.27

12062

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程