收藏
回答

微信公众号支付jsapi 回调 签名正确,解密失败?

   /**
     * 解密微信支付回调中的加密数据
     */
    private function decryptResource($resource)
    {
        $ciphertext = base64_decode($resource['ciphertext']);
        $associatedData = $resource['associated_data'];
        $nonce = $resource['nonce'];
    
        // 请确保这里的API V3密钥是正确的,需要在微信商户平台设置
        // 请登录微信商户平台(pay.weixin.qq.com)-> 账户中心 -> API安全 -> 设置APIv3密钥
        $apiKeyV3 = '1234567890abcdefgh888888888888'; // 请替换为真实的API V3密钥
    
        // 检查密钥长度是否为32字节
        if (strlen($apiKeyV3) !== 32) {
            pr_log('API V3密钥长度错误,必须为32位: ' . strlen($apiKeyV3), 3);
            return false;
        }
         // 检查参数完整性
        if (empty($ciphertext) || empty($associatedData) || empty($nonce)) {
            pr_log('解密参数不完整', 3);
            return false;
        }
        $decrypted = openssl_decrypt($ciphertext, 'aes-256-gcm', $apiKeyV3, OPENSSL_RAW_DATA, $nonce, $associatedData);
        if ($decrypted === false) {
           // 获取所有错误信息
            $errors = [];
            while ($error = openssl_error_string()) {
                $errors[] = $error;
            }


            pr_log('解密失败 - 所有错误信息: ' . implode('|', $errors), 3);
            pr_log('解密失败 - ciphertext长度: ' . strlen($ciphertext), 3);
            pr_log('解密失败 - associated_data: ' . $associatedData, 3);
            pr_log('解密失败 - nonce: ' . $nonce, 3);
            pr_log('解密失败 - API V3密钥: ' . $apiKeyV3, 3);
            pr_log('解密失败 - API V3密钥长度: ' . strlen($apiKeyV3), 3);


            // 重新检查API V3密钥
            pr_log('请确认API V3密钥设置正确:登录微信商户平台 -> 账户中心 -> API安全 -> 设置APIv3密钥', 3);
            return false;
        }
        pr_log('解密成功: ' . $decrypted, 3);
        return json_decode($decrypted, true);
    }
  截取到的错误:error:0909006C:PEM routines:get_name:no start line , 不知道是什么引起的?
    秘钥我打码了, 我重置了4回,apiv3的秘钥 ,   签名过了,解密一直不过, 我测试了openssl是支持aes-256-gcm加密方式,解密一直失败

回答关注问题邀请回答
收藏

1 个回答

  • Memory (私信不回复)
    Memory (私信不回复)
    05-16

    来这里验证一下V3key对不对 https://tools.aifuwu.net/wechat-pay-tools/apiv3-key-validator

    05-16
    有用
    回复 6
    • 逢
      05-16
      解密成功了, 但是我本地代码 解不出来.....
      05-16
      回复
    • 逢
      05-16
      $decrypted = openssl_decrypt($ciphertext, 'aes-256-gcm', $apiKeyV3, OPENSSL_RAW_DATA, $nonce, $associatedData); 只有可能是这句有误?
      05-16
      回复
    • Memory (私信不回复)
      Memory (私信不回复)
      05-16回复
      有用三方sdk么?
      05-16
      回复
    • 逢
      05-16回复Memory (私信不回复)
      用wechatpay了,下单用的, 解密回调没找到示例代码......就自己用ai 跟百度 结合了一版
      05-16
      回复
    • 逢
      05-16
      刚又找了一版,解出来了, 上下版本 缺少了一个参数.......
      05-16
      回复
    查看更多(1)
登录 后发表内容