有对接过微信支付的吗?微信支付回调验签怎么才能成功呢?

背景:微信支付成功回调通知,验证通知消息是否来自于微信,一直验证不过去。

代码:

<?php
 $timeStamp = $request->header('Wechatpay-Timestamp');
$wechatNonce = $request->header('Wechatpay-Nonce');
$requestData = file_get_contents('php://input');
$requestData = json_encode(json_decode($requestData));
$signature = $request->header('Wechatpay-Signature');  //微信头部携带的签名值
//验证签名
openssl_verify(Formatter::joinedByLineFeed($timeStamp,$wechatNonce,$requestData),base64_decode($signature), $this->platformPublicKeyInstance, OPENSSL_ALGO_SHA256)
//上文的 $this->platformPublicKeyInstance  是微信平台的公钥

结果:
这个验证结果一直是0,搜了好多教程,也找不出问题,请问大家有成功的吗?可以指点一下吗?

解决了!!!!

困扰了许久的问题,因为保存了支付回调的信息,一直在本地测试都是false,感觉无望了,想着正式环境再测一下,结果就验签过了。
部分代码:

<?php
$timeStamp = $request->header('Wechatpay-Timestamp');
            $wechatNonce = $request->header('Wechatpay-Nonce');
            $requestData = file_get_contents('php://input');
            $signature = $request->header('Wechatpay-Signature');
            // 检查通知时间偏移量,允许5分钟之内的偏移
            $timeOffsetStatus = 300 >= abs(Formatter::timestamp() - (int)$timeStamp);
            $verifiedStatus = Rsa::verify(
                // 构造验签名串
                Formatter::joinedByLineFeed($timeStamp, $wechatNonce,$requestData),
                $signature,
                $this->platformPublicKeyInstance
            );
//重点是这句  $requestData = file_get_contents('php://input');    之前是用了 $request->input()的方式获取的,一直通过不了。本地测试的时候,我也用了 file_get_contents的方法,但也一直过不了。正式支付测试的时候,就过了。可能因为数据不是最新的缘故的吧。
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 33

很久以前用的EasyWeChat,没遇到过这个问题

8个月前 评论

使用easywechat

8个月前 评论
MuBaiYang (楼主) 8个月前
大头 (作者) 8个月前
大头 (作者) 8个月前
ononl 8个月前
nff93

建议直接使用 github.com/yansongda/laravel-pay 这个包,不要自己糊

8个月前 评论
MuBaiYang (楼主) 8个月前

在您提供的代码中,您正在处理微信支付的回调通知,验证签名的正确性。然而,您遇到了验证不通过的问题。这可能是由于几种原因导致的,让我们逐一检查可能的问题:

  1. 公钥的正确性: 确保 $this->platformPublicKeyInstance 中包含了正确的微信平台的公钥。验证签名需要使用正确的公钥,否则验证会失败。

  2. 请求数据的处理: 您通过 file_get_contents('php://input') 获取请求数据,然后对其进行了 JSON 解码和重新编码。请确保这个过程没有造成数据变化,因为签名的验证是基于原始数据的。

  3. 数据格式化: Formatter::joinedByLineFeed() 的实现很重要。确保该方法按照微信支付要求的格式对数据进行正确的拼接。

  4. 签名验证算法: 检查您使用的签名验证算法是否正确。微信支付通常使用 SHA-256 算法进行签名。

  5. 证书验证: 确保您的服务器可以正常访问微信平台的公钥证书。如果访问受到限制或有问题,可能导致验证失败。

  6. 错误信息: 检查验证失败时是否有相关的错误信息或错误代码返回。这可能会提供更多的线索。

如果您仔细检查了上述方面,但仍然无法解决问题,您可以尝试以下步骤:

  • 确保使用了最新的微信支付 API 和文档,以防止因为变更而导致的问题。
  • 在微信支付开发者社区或官方支持渠道寻求帮助,其他开发者可能会遇到类似的问题并分享解决方案。
  • 仔细检查微信支付回调文档和示例代码,确保您的实现与官方要求一致。

总之,请仔细检查您的代码和配置,确保每个步骤都按照微信支付的要求执行,以解决验证签名失败的问题。

8个月前 评论
MuBaiYang (楼主) 8个月前

官方包是这么写的吧。

$inBody = file_get_contents('php://input');// 请根据实际情况获取,例如: file_get_contents('php://input');
// 转换通知的JSON文本消息为PHP Array数组
$inBodyArray = (array)json_decode($inBody, true);
// 使用PHP7的数据解构语法,从Array中解构并赋值变量
['resource' => [
    'ciphertext' => $ciphertext,
    'nonce' => $nonce,
    'associated_data' => $aad
]] = $inBodyArray;
// 加密文本消息解密
$inBodyResource = AesGcm::decrypt($ciphertext, $this->apiV3, $nonce, $aad);
// 把解密后的文本转换为PHP Array数组
$inBodyResourceArray = (array)json_decode($inBodyResource, true);
return $inBodyResourceArray;
8个月前 评论
MuBaiYang (楼主) 8个月前
ononl (作者) 8个月前
MuBaiYang (楼主) 8个月前
ononl (作者) 8个月前
MuBaiYang (楼主) 8个月前

V3版本验签使用的是 微信支付平台证书,不是商户调用API的那套证书。头部信息中返回有证书序列号,可以确认一下使用的证书的序列号是不是头部返回的证书序列号,如果不是就要实时调用接口获取平台证书。参考官方文档:pay.weixin.qq.com/wiki/doc/apiv3/w...

8个月前 评论
MuBaiYang (楼主) 8个月前

esaywechat真实个好东西啊

8个月前 评论
MuBaiYang (楼主) 8个月前
8个月前 评论
MuBaiYang (楼主) 8个月前

用这个 pay.yansongda.cn/ 装多个包又影响 这个很方便

8个月前 评论
MuBaiYang (楼主) 8个月前
DogLoML

用现成的,不然以后微信接口改了还要维护。

8个月前 评论
MuBaiYang (楼主) 8个月前

为什么不用第三方的easywechat,之前项目用的就是官方的SDK,但是一团糕,你可以单独对easywechat包的边界进行封装你只用得到的接口,维护起来也非常方便。
第三方的easy只需要几行代码就能实现下单,或支付回调,查询等功能

8个月前 评论
MuBaiYang (楼主) 8个月前

微信支付有很多包用着都很方便 官方的确实蛮多坑 但是你想找到 问题那就是 打日志就行 一步一打找到那一步出问题就行了 从记录 多调试

8个月前 评论

本地测试,微信回调不到吧?!

8个月前 评论
MuBaiYang (楼主) 8个月前

我现在也遇到了。 还是一直失败。 和你的代码一样, 用的是官方包 平台证书 怎么都不通过 是咋回事。求助

1个月前 评论
php_yt 1个月前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!