在调用: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"}
错误信息:应答的微信支付签名验证失败

返回prepay_id但应答响应报签名错误,说明用【平台证书】或【微信支付公钥】验签时签名没通过,偶发的话可能是证书用错了,如果处于证书切换模式的话,响应的Wechatpay_Serial会受后台灰度设置的影响去返回不同的序列号,系统需要适应对应证书验签。可以先自己检查下响应头的Wechatpay_Serial内容和使用的验签证书信息
建议用 composer require wechatpay/wechatpay
完整示例: https://wechatpay.im/openapi/v3/pay/partner/transactions/jsapi
偶发验签失败,可能原因是 https://wechatpay.im/guide/getting-started#cli:
重要提示
当下载证书后,屏显有几条证书信息,就在应用中配置certs几条,尤其是在新旧平台证书交替灰度时,需要把新旧证书都配上,应用才不会出现事故。