• 微信公众号开发 该公众号提供的服务出现故障,请稍后再试


    最近写了个微信公众号,遇到不少坑,第一个坑就是 提供的 消息回复的 php sdk 有几个方法过时了,当然,这个也不能怪微信,主要是我用的php版是7.1的,不过好像5.4还是几都废了

    pkcs7Encoder.php 首页是这个文件里面的
    /**
         * 对明文进行加密
         * @param string $text 需要加密的明文
         * @return string 加密后的密文
         */
        public function encrypt($text, $appid)
        {
    
            try {
                //获得16位随机字符串,填充到明文之前
                $random = $this->getRandomStr();
                $text = $random . pack("N", strlen($text)) . $text . $appid;
                // 网络字节序
                $size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
                $module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');
                $iv = substr($this->key, 0, 16);
                //使用自定义的填充方式对明文进行补位填充
                $pkc_encoder = new PKCS7Encoder;
                $text = $pkc_encoder->encode($text);
                mcrypt_generic_init($module, $this->key, $iv);
                //加密
                $encrypted = mcrypt_generic($module, $text);
                mcrypt_generic_deinit($module);
                mcrypt_module_close($module);
    
                //print(base64_encode($encrypted));
                //使用BASE64对加密后的字符串进行编码
                return array(ErrorCode::$OK, base64_encode($encrypted));
            } catch (Exception $e) {
                //print $e;
                return array(ErrorCode::$EncryptAESError, null);
            }
        }
    
        /**
         * 对密文进行解密
         * @param string $encrypted 需要解密的密文
         * @return string 解密得到的明文
         */
        public function decrypt($encrypted, $appid)
        {
    
            try {
                //使用BASE64对需要解密的字符串进行解码
                $ciphertext_dec = base64_decode($encrypted);
                $module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');
                $iv = substr($this->key, 0, 16);
                mcrypt_generic_init($module, $this->key, $iv);
    
                //解密
                $decrypted = mdecrypt_generic($module, $ciphertext_dec);
                mcrypt_generic_deinit($module);
                mcrypt_module_close($module);
            } catch (Exception $e) {
                return array(ErrorCode::$DecryptAESError, null);
            }
    
    
            try {
                //去除补位字符
                $pkc_encoder = new PKCS7Encoder;
                $result = $pkc_encoder->decode($decrypted);
                //去除16位随机字符串,网络字节序和AppId
                if (strlen($result) < 16)
                    return "";
                $content = substr($result, 16, strlen($result));
                $len_list = unpack("N", substr($content, 0, 4));
                $xml_len = $len_list[1];
                $xml_content = substr($content, 4, $xml_len);
                $from_appid = substr($content, $xml_len + 4);
            } catch (Exception $e) {
                //print $e;
                return array(ErrorCode::$IllegalBuffer, null);
            }
            if ($from_appid != $appid)
                return array(ErrorCode::$ValidateAppidError, null);
            return array(0, $xml_content);
    
        }
    这个里面的mcrypt_get_block_size这个方法过期了,重新在网上找了个,把下面的替换掉能用
    /**
         * 对明文进行加密
         * @param string $text 需要加密的明文
         * @return string 加密后的密文
         */
        public function encrypt($text, $appid)
        {
            try {
                //获得16位随机字符串,填充到明文之前
                $random = $this->getRandomStr();
                $text = $random . pack("N", strlen($text)) . $text . $appid;
                $iv = substr($this->key, 0, 16);
                $pkc_encoder = new PKCS7Encoder;
                $text = $pkc_encoder->encode($text);
                $encrypted = openssl_encrypt($text,'AES-256-CBC',substr($this->key, 0, 32),OPENSSL_ZERO_PADDING,$iv);
                return array(ErrorCode::$OK, $encrypted);
            } catch (Exception $e) {
                //print $e;
                return array(ErrorCode::$EncryptAESError, null);
            }
        }
    
        /**
         * 对密文进行解密
         * @param string $encrypted 需要解密的密文
         * @return string 解密得到的明文
         */
        public function decrypt($encrypted, $appid)
        {
            try {
                $iv = substr($this->key, 0, 16);
                $decrypted = openssl_decrypt($encrypted,'AES-256-CBC',substr($this->key, 0, 32),OPENSSL_ZERO_PADDING,$iv);
            } catch (Exception $e) {
                return array(ErrorCode::$DecryptAESError, null);
            }
            try {
                //去除补位字符
                $pkc_encoder = new PKCS7Encoder;
                $result = $pkc_encoder->decode($decrypted);
                //去除16位随机字符串,网络字节序和AppId
                if (strlen($result) < 16)
                    return "";
                $content = substr($result, 16, strlen($result));
                $len_list = unpack("N", substr($content, 0, 4));
                $xml_len = $len_list[1];
                $xml_content = substr($content, 4, $xml_len);
                $from_appid = substr($content, $xml_len + 4);
                if (!$appid)
                    $appid = $from_appid;
                //如果传入的appid是空的,则认为是订阅号,使用数据中提取出来的appid
            } catch (Exception $e) {
                //print $e;
                return array(ErrorCode::$IllegalBuffer, null);
            }
            if ($from_appid != $appid)
                return array(ErrorCode::$ValidateAppidError, null);
            //不注释上边两行,避免传入appid是错误的情况
            return array(0, $xml_content, $from_appid);
            //增加appid,为了解决后面加密回复消息的时候没有appid的订阅号会无法回复
        }

    就可以了,接着就开始用 微信提供的网页工具开始测试 使用网页调试工具调试该接口 https://mp.weixin.qq.com/debug 这个是地址
    请求的结果都是sccuess了。

    以为没有问题了,结果是这样。

    
    

    然后就不知道所以然了,测试接口都测过了没有问题,还报这个,然后给微信客服 提反馈,果然是没有luan用的.居然这样回复

    真的就跪了,后面在google 里搜,发现也有哥们和我的情况一样,然后 在 运维中心 把数据监控 开通,然后居然就可以了,然后就没有然后了
     
  • 相关阅读:
    magento 产品目录全部修改 :
    zencart 支付流程总结
    去掉 power by ecshop的方法
    ECSHOP实现收货国家省市由选择下拉菜单改为手动
    MYSQL的随机抽取实现方法
    Ecshop中导航栏中使用二级菜单显示并调用子分类
    打包遇到的问题
    jQuery is not defined问题
    实现表格中每行展开收起内容
    jQuery对象与DOM对象的相互转化
  • 原文地址:https://www.cnblogs.com/jackluo/p/8779343.html
Copyright © 2020-2023  润新知