收藏
回答

微信支付下单接口,偶发签名错误,不知道什么原因?

在调用:https://pay.weixin.qq.com/doc/v3/merchant/4012791856 接口时,偶发会出现微信支付签名验证失败的错误,但是也会响应prepay_id。

这个一般是什么情况呢?因为是偶发,无从下手,最近这几天比较频繁,影响到业务了。

求微信支付的大佬们帮忙诊断一下,非常感谢 🙏

相关代码:

// 获取支付JSDK Json
    public static function payWeChatServerJson($order, $notify_url = '', $detail = '', $appid = '')
    {

        $params = Yii::$app->params['wechatServerPaymentConfig'];
        $merchantId = $params['sp_mchid'];
        $merchantSerialNumber = $params['merchant_serial_no'];
        $merchantPrivateKey = PemUtil::loadPrivateKey($params['key_path']);
        $wechatpayCertificate = PemUtil::loadCertificate($params['wechatpay_certificate']);
        $wechatpayMiddleware = WechatPayMiddleware::builder()
            ->withMerchant($merchantId, $merchantSerialNumber, $merchantPrivateKey)
            ->withWechatPay([$wechatpayCertificate])
            ->build();
        $stack = \GuzzleHttp\HandlerStack::create();
        $stack->push($wechatpayMiddleware, 'wechatpay');
        $client= new \GuzzleHttp\Client(['handler' => $stack]);
        $sp_appid ='wx1956xxxx';
    
      $jsonData = [
            "sp_appid" => $sp_appid,
            'sp_mchid'=>$params['sp_mchid'],
            "sub_appid" => $order->appid,
            "sub_mchid" => $order->mchid,
            'description' => $detail ? $detail : '订单说明',
            'out_trade_no' => $order->order_no,
            'notify_url' => $notify_url,
            "amount" => [
                "total" => $order->fee,
                "currency" => "CNY"
            ],
            "payer" =>[
                "sub_openid" => $order->openid,
            ],
        ];


        try {
            $resp = $client->request('POST',
                    'https://api.mch.weixin.qq.com/v3/pay/partner/transactions/jsapi',
                    [
                    'json' => $jsonData,
            'http_errors' => false,
                    'headers' => ['Accept' => 'application/json']
                    ]
                    );
        } catch (\GuzzleHttp\Exception\RequestException $e) {
            // 安全获取响应内容
     $responseBody = $e->hasResponse()
                ? $e->getResponse()->getBody()->getContents()
                : 'No response content';

            // 结构化日志记录
            $logData = [
                'request' => $jsonData,
                'response' => $responseBody,
                'error' => $e->getMessage(),
                'trace' => $e->getTraceAsString()
            ];

            // 报警信息优化
            $alertMsg = sprintf(
                    "微信支付服务商接口异常\n请求数据:%s\n响应内容:%s\n错误信息:%s",
                    json_encode($jsonData),
                    $responseBody,
                    $e->getMessage()
                    );

            ToolFun::sendAlterMsg($alertMsg);
            ToolFun::FileLog(json_encode($logData, JSON_UNESCAPED_UNICODE), 'v4pay-error.log');

            return '网络异常';
        }

错误日志:

微信支付服务商接口异常
请求数据:{"sp_appid":"wx9dccec5***","sp_mchid":"1543***","sub_appid":"wx9dcc***","sub_mchid":"1659***","description":"***","out_trade_no":"MJS2502282130238867c0983728149","notify_url":"https://***/xcx/paywechatservercallback","amount":{"total":500,"currency":"CNY"},"payer":{"sub_openid":"ozZkF5hWMB9X3VF0nOvhS45Ds3wY"}}
响应内容:{"prepay_id":"wx2800520749042783303cc29fb09af30000"}
错误信息:应答的微信支付签名验证失败
回答关注问题邀请回答
收藏

2 个回答

  • 支付社区运营
    支付社区运营
    2025-02-28

    返回prepay_id但应答响应报签名错误,说明用【平台证书】或【微信支付公钥】验签时签名没通过,偶发的话可能是证书用错了,如果处于证书切换模式的话,响应的Wechatpay_Serial会受后台灰度设置的影响去返回不同的序列号,系统需要适应对应证书验签。可以先自己检查下响应头的Wechatpay_Serial内容和使用的验签证书信息

    2025-02-28
    有用 1
    回复
  • 北望沣渭
    北望沣渭
    2025-02-28

    建议用 composer require wechatpay/wechatpay

    完整示例: https://wechatpay.im/openapi/v3/pay/partner/transactions/jsapi

    偶发验签失败,可能原因是 https://wechatpay.im/guide/getting-started#cli

    重要提示

    当下载证书后,屏显有几条证书信息,就在应用中配置certs几条,尤其是在新旧平台证书交替灰度时,需要把新旧证书都配上,应用才不会出现事故。


    2025-02-28
    有用 1
    回复 1
    • 神经蛙
      神经蛙
      2025-03-01
      谢谢指点,是旧证书快到期,微信自动启动灰度测试导致了
      2025-03-01
      回复
登录 后发表内容