zoukankan      html  css  js  c++  java
  • 微信支付回调 敏感信息解密 v3 php

    今天博主用了一波微信的v3版本的支付,支付成功后发现回调跟v2的完全不一样,于是去看了了一波v3的文档,发现信息是经过加密的,需要解密才能获取的到

    但是最悲催的是文档上没写怎么解密的,经过了一下午的百度,找论坛,终于找到了文档地址,成功的拿到了我想要的信息,记录分享一波

    1.支付成功,拿到回调信息后,转成数组后信息如下

    $xml = ['id' => 'xxx',
                'create_time' => '2020-08-19T12:16:56+08:00',
                'resource_type' => 'xxx',
                'event_type' => 'TRANSACTION.SUCCESS',
                'summary' => '支付成功',
                'resource' => [
                    'original_type' => 'xxxx',
                    'algorithm' => 'AEAD_AES_256_GCM',
                    'ciphertext' => 'xxx',
                    'associated_data' => 'xxxx',
                    'nonce' => 'xxx',]
            ];

    2.你想要的信息在 resource 里面,但是是经过加密的,接下来需要解密一波

    先创建一个 AesUtil.php,复制以下代码粘进去

    <?php
    
    class AesUtil
    {
        /**
         * AES key
         *
         * @var string
         */
        private $aesKey;
    
        const KEY_LENGTH_BYTE = 32;
        const AUTH_TAG_LENGTH_BYTE = 16;
    
        /**
         * Constructor
         */
        public function __construct($aesKey)
        {
            if (strlen($aesKey) != self::KEY_LENGTH_BYTE) {
                throw new InvalidArgumentException('无效的ApiV3Key,长度应为32个字节');
            }
            $this->aesKey = $aesKey;
        }
    
        /**
         * Decrypt AEAD_AES_256_GCM ciphertext
         *
         * @param string    $associatedData     AES GCM additional authentication data
         * @param string    $nonceStr           AES GCM nonce
         * @param string    $ciphertext         AES GCM cipher text
         *
         * @return string|bool      Decrypted string on success or FALSE on failure
         */
        public function decryptToString($associatedData, $nonceStr, $ciphertext)
        {
            $ciphertext = base64_decode($ciphertext);
            if (strlen($ciphertext) <= self::AUTH_TAG_LENGTH_BYTE) {
                return false;
            }
    
            // ext-sodium (default installed on >= PHP 7.2)
            if (function_exists('sodium_crypto_aead_aes256gcm_is_available') &&
                sodium_crypto_aead_aes256gcm_is_available()) {
                return sodium_crypto_aead_aes256gcm_decrypt($ciphertext, $associatedData, $nonceStr, $this->aesKey);
            }
    
            // ext-libsodium (need install libsodium-php 1.x via pecl)
            if (function_exists('Sodiumcrypto_aead_aes256gcm_is_available') &&
                Sodiumcrypto_aead_aes256gcm_is_available()) {
                return Sodiumcrypto_aead_aes256gcm_decrypt($ciphertext, $associatedData, $nonceStr, $this->aesKey);
            }
    
            // openssl (PHP >= 7.1 support AEAD)
            if (PHP_VERSION_ID >= 70100 && in_array('aes-256-gcm', openssl_get_cipher_methods())) {
                $ctext = substr($ciphertext, 0, -self::AUTH_TAG_LENGTH_BYTE);
                $authTag = substr($ciphertext, -self::AUTH_TAG_LENGTH_BYTE);
    
                return openssl_decrypt($ctext, 'aes-256-gcm', $this->aesKey, OPENSSL_RAW_DATA, $nonceStr,
                    $authTag, $associatedData);
            }
    
            throw new RuntimeException('AEAD_AES_256_GCM需要PHP 7.1以上或者安装libsodium-php');
        }
    }

     3.接下来就是解密了

    var_dump((new AesUtil('你的APIv3秘钥'))->decryptToString($xml['resource']['associated_data'],$xml['resource']['nonce'],$xml['resource']['ciphertext']));

     文档地址:https://wechatpay-api.gitbook.io/wechatpay-api-v3/qian-ming-zhi-nan-1/zheng-shu-he-hui-tiao-bao-wen-jie-mi

     

  • 相关阅读:
    使用keras构建简单的网络分类鸢尾花
    矩阵的秩 rank(A)
    矩阵的迹
    数学符号大全速查表
    迷茫的不是青春,是你们回望青春时失焦的眼神。
    服务器Windows Server 2008 远程控制安全设置技巧
    服务器安全维护配置和优化八大要点
    怎么把html页面中共用的底部代码做成共享模块
    回首2017,展望2018,今后的路我们一起走
    手机端rem如何适配_rem详解及使用方法2
  • 原文地址:https://www.cnblogs.com/junyi-bk/p/13530765.html
Copyright © 2011-2022 走看看