微信支付 api v3 支付通知 异步 验签失败 PHP

微信支付v3 异步验签失败

此处我们接收参数(报文主体)一般是通过框架 自带的request接收。
例如TP6:$this->request->param();
这里如果使用此接收方式在进行json转换验签会失败。

我们需要用原生的接收方式:file_get_contents(‘php://input’);
接收到之后直接拿此数据进行签名验证。
附以下代码:

public function verifySign()
    {
        $timestamp = "header头中的时间戳";
        $nonce = "header头中的随机串";
        $signature = "header头中的签名";
        $certZs = "平台证书";

//        $data = $this->request->param();
        $data = file_get_contents('php://input');

        $message = "$timestamp\n$nonce\n$data\n";

        //校验签名

        if (!$this->verify($message, $signature, $certZs)) {
            throw new \Exception('验签失败', 123456);
        }
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个 Java 版本的微信 H5 支付 V3 API 异步通知的示例代码: ```java import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import java.util.Base64; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; public class WeChatH5NotifyHandler { private static final String WECHAT_API_CERT_SERIAL_NUMBER = "YOUR_WECHAT_API_CERT_SERIAL_NUMBER"; private static final String WECHAT_API_CERTIFICATE = "YOUR_WECHAT_API_CERTIFICATE"; private static final String WECHAT_API_CERTIFICATE_PRIVATE_KEY = "YOUR_WECHAT_API_CERTIFICATE_PRIVATE_KEY"; public static void handleNotify(HttpServletRequest request, HttpServletResponse response) throws IOException { try { InputStream inputStream = request.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); StringBuilder requestBody = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { requestBody.append(line); } // 验证通知的签名 String wechatSerialNumber = request.getHeader("Wechatpay-Serial"); String wechatSignature = request.getHeader("Wechatpay-Signature"); String wechatTimestamp = request.getHeader("Wechatpay-Timestamp"); String wechatNonce = request.getHeader("Wechatpay-Nonce"); if (verifySignature(wechatSerialNumber, wechatSignature, wechatTimestamp, wechatNonce, requestBody.toString())) { // 验证签名成功 // 处理支付成功的逻辑 // ... // 返回成功响应给微信服务器 response.setStatus(HttpServletResponse.SC_OK); response.getWriter().write("OK"); } else { // 验证签名失败,返回失败响应给微信服务器 response.setStatus(HttpServletResponse.SC_BAD_REQUEST); response.getWriter().write("Signature verification failed."); } } catch (Exception e) { e.printStackTrace(); // 返回失败响应给微信服务器 response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); response.getWriter().write("Internal Server Error"); } } private static boolean verifySignature(String wechatSerialNumber, String wechatSignature, String wechatTimestamp, String wechatNonce, String requestBody) throws Exception { String message = wechatTimestamp + "\n" + wechatNonce + "\n" + requestBody + "\n"; String signature = "SHA256withRSA"; X509Certificate certificate = getCertificate(); certificate.checkValidity(); certificate.verify(certificate.getPublicKey()); return true; // 假设签名验证成功 } private static X509Certificate getCertificate() throws CertificateException { byte[] certBytes = Base64.getDecoder().decode(WECHAT_API_CERTIFICATE.getBytes(StandardCharsets.UTF_8)); CertificateFactory certificateFactory = CertificateFactory.getInstance("X509"); InputStream inputStream = new ByteArrayInputStream(certBytes); return (X509Certificate) certificateFactory.generateCertificate(inputStream); } } ``` 在上述代码中,我们创建了一个名为 `WeChatH5NotifyHandler` 的类,其中的 `handleNotify` 方法用于处理微信 H5 支付 V3 API异步通知。该方法接收 `HttpServletRequest` 和 `HttpServletResponse` 对象作为参数,从请求中获取异步通知的数据,并进行相应的处理逻辑。 在 `handleNotify` 方法中,我们首先获取请求中的数据,并从请求头中获取签名相关信息(`Wechatpay-Serial`、`Wechatpay-Signature`、`Wechatpay-Timestamp`、`Wechatpay-Nonce`)。然后,我们使用 `verifySignature` 方法验证通知的签名是否正确。在示例代码中,我们假设签名验证成功。 如果签名验证成功,则表示支付成功,可以进行相应的处理逻辑,并返回成功响应给微信服务器。如果签名验证失败,则返回失败响应给微信服务器。 请注意,真实的微信 H5 支付 V3 API异步通知处理可能涉及到与微信服务器的交互、密钥管理、验签等复杂操作,需要仔细阅读微信支付文档,并使用微信提供的 SDK 或工具类来简化开发。以上示例代码仅供参考,需要根据实际情况进行修改和完善。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值