thinkphp微信开之安全模式消息加密解密不成功的解决办法


Posted in PHP onDecember 02, 2015

 ThinkPHP框架是国内比较流行的PHP框架之一,虽然跟国外的那些框架没法比,但优点在于,恩,中文手册很全面,在此不多说了。

使用thinkphp官方的WeChat包,使用不同模式可以成功,但是安全模式就是不行,现将分析解决结果做下记录。

 分析问题:

          解密微信服务器消息老是不成功,下载下微信公众平台官方给出的解密文件和WechatCrypt.class.php进行比对发现也没有问题。用file_put_contents函数保存下解密后的文件进行分析。发现官方包解密的xml不是标准的xml格式,所以simplexml_load_string函数无法处理。

/**
   * 对密文进行解密
   * @param string $encrypt 密文
   * @return string     明文
   */
  public function decrypt($encrypt){
    //BASE64解码
    $encrypt = base64_decode($encrypt);
    //打开加密算法模块
    $td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');
    //初始化加密算法模块
    mcrypt_generic_init($td, $this->cyptKey, substr($this->cyptKey, 0, 16));
    //执行解密
    $decrypt = mdecrypt_generic($td, $encrypt);
    //去除PKCS7补位
    $decrypt = self::PKCS7Decode($decrypt, mcrypt_enc_get_key_size($td));
    //关闭加密算法模块
    mcrypt_generic_deinit($td);
    mcrypt_module_close($td);
    if(strlen($decrypt) < 16){
      throw new \Exception("非法密文字符串!");
    }
    //去除随机字符串
    $decrypt = substr($decrypt, 16);
    //获取网络字节序
    $size = unpack("N", substr($decrypt, 0, 4));
    $size = $size[1];
    //APP_ID
    $appid = substr($decrypt, $size + 4);
    //验证APP_ID
    if($appid !== $this->appId){
      throw new \Exception("非法APP_ID!");
    }
    //明文内容
    $text = substr($decrypt, 4, $size);
    return $text;
  }
  /**
   * PKCS7填充字符
   * @param string $text 被填充字符
   * @param integer $size Block长度
   */
  private static function PKCS7Encode($text, $size){
    //字符串长度
    $str_size = strlen($text);
    //填充长度
    $pad_size = $size - ($str_size % $size);
    $pad_size = $pad_size ? : $size;
    //填充的字符
    $pad_chr = chr($pad_size);
    //执行填充
    $text = str_pad($text, $str_size + $pad_size, $pad_chr, STR_PAD_RIGHT);
    return $text;
  }
  /**
   * 删除PKCS7填充的字符
   * @param string $text 已填充的字符
   * @param integer $size Block长度
   */
  private static function PKCS7Decode($text, $size){
    //获取补位字符
    $pad_str = ord(substr($text, -1));
    if ($pad_str < 1 || $pad_str > $size) {
      $pad_str= 0;
    } 
      return substr($text, 0, strlen($text) - $pad_str);
  }

解决方法:

          输出的xml文件是这样的

<xml>
 <ToUserName><![CDATA[gh_aebd]]><\/ToUserName>\n
 <FromUserName><![CDATA[oopVmxHZaeQkDPsRcbpwXKkH-JQ]]><\/FromUserName>\n
 <CreateTime><\/CreateTime>\n
 <MsgType><![CDATA[text]]><\/MsgType>\n
 <Content><![CDATA[\uecf\u]]><\/Content>\n
 <MsgId><\/MsgId>\n
 <\/xml>

       所以需要进行处理才能让simplexml_load_string处理

在输出的明文内容后面加上

//明文内容
     $text = substr($decrypt, , $size);
 //去掉多余的内容
     $text=str_replace('<\/','</', $text);   
     $text=str_replace('>\n','>', $text);
     return $text;

安全模式就能正常使用了。

以上内容是小编给大家介绍的关于thinkphp微信开之安全模式消息加密解密不成功的解决办法,希望大家喜欢。

PHP 相关文章推荐
Mysql的常用命令
Oct 09 PHP
PHP 表单提交给自己
Jul 24 PHP
php+MySQL判断update语句是否执行成功的方法
Aug 28 PHP
php的sso单点登录实现方法
Jan 08 PHP
简单谈谈PHP vs Node.js
Jul 17 PHP
PHP十六进制颜色随机生成器功能示例
Jul 24 PHP
windows下的WAMP环境搭建图文教程(推荐)
Jul 27 PHP
PhpStorm 如何优雅的调试Hyperf的方法步骤
Nov 24 PHP
Laravel Eloquent分表方法并使用模型关联的实现
Nov 25 PHP
Laravel等框架模型关联的可用性浅析
Dec 15 PHP
通过实例解析PHP数据类型转换方法
Jul 11 PHP
PHP控制循环操作的时间
Apr 01 PHP
PHP接收json 并将接收数据插入数据库的实现代码
Dec 01 #PHP
实例讲解yii2.0在php命令行中运行的步骤
Dec 01 #PHP
PHP简单的MVC框架实现方法
Dec 01 #PHP
分享PHP源码批量抓取远程网页图片并保存到本地的实现方法
Dec 01 #PHP
基于php实现七牛抓取远程图片
Dec 01 #PHP
使用Huagepage和PGO来提升PHP7的执行性能
Nov 30 #PHP
深入解析PHP中foreach语句控制数组循环的用法
Nov 30 #PHP
You might like
php中simplexml_load_file函数用法实例
2014/11/12 PHP
codeigniter发送邮件并打印调试信息的方法
2015/03/21 PHP
PHP实现支持加盐的图片加密解密
2016/09/09 PHP
jQuery一步一步实现跨浏览器的可编辑表格,支持IE、Firefox、Safari、Chrome、Opera
2009/08/28 Javascript
jquery获取input表单值的代码
2010/04/19 Javascript
非常有用的40款jQuery 插件推荐(系列二)
2011/12/25 Javascript
密码强度检测效果实现原理与代码
2013/01/04 Javascript
得到jQuery detach()后节点中的某个值实现代码
2013/02/05 Javascript
js实现内容显示并使用json传输数据
2016/03/16 Javascript
Bootstrap Navbar Component实现响应式导航
2016/10/08 Javascript
浅谈使用splice函数对数组中的元素进行删除时的注意事项
2016/12/04 Javascript
canvas的神奇用法
2017/02/03 Javascript
几行js代码实现自适应
2017/02/24 Javascript
jQuery实现简单弹窗遮罩效果
2017/02/27 Javascript
JavaScript 中Date对象的格式化代码方法汇总
2017/09/06 Javascript
layui实现左侧菜单点击右侧内容区显示
2019/07/26 Javascript
小程序实现录音上传功能
2019/11/22 Javascript
JavaScript实现与web通信的方法详解
2020/08/07 Javascript
js实现移动端图片滑块验证功能
2020/09/29 Javascript
小程序组件传值和引入sass的方法(使用vant Weapp组件库)
2020/11/24 Javascript
python将.ppm格式图片转换成.jpg格式文件的方法
2018/10/27 Python
Python发送邮件功能示例【使用QQ邮箱】
2018/12/04 Python
python判断自身是否正在运行的方法
2019/08/08 Python
python支持多线程的爬虫实例
2019/12/21 Python
使用Python内置模块与函数进行不同进制的数的转换
2020/04/26 Python
Python调用shell cmd方法代码示例解析
2020/06/18 Python
python中@property的作用和getter setter的解释
2020/12/22 Python
HTML5+CSS3实现拖放(Drag and Drop)示例
2014/07/07 HTML / CSS
基于HTML5的WebGL实现json和echarts图表展现在同一个界面
2017/10/26 HTML / CSS
怎样自定义一个异常类
2016/09/27 面试题
奖励通知
2015/04/22 职场文书
2015年办公室文秘工作总结
2015/04/30 职场文书
酒店圣诞节活动总结
2015/05/06 职场文书
军事理论课感想
2015/08/11 职场文书
2016春季幼儿园大班开学寄语
2015/12/03 职场文书
解决Pytorch修改预训练模型时遇到key不匹配的情况
2021/06/05 Python