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 相关文章推荐
Windows下PHP的任意文件执行漏洞
Oct 09 PHP
PHP脚本的10个技巧(1)
Oct 09 PHP
攻克CakePHP系列一 连接MySQL数据库
Oct 22 PHP
php中的观察者模式
Mar 24 PHP
PHP中开发XML应用程序之基础篇 添加节点 删除节点 查询节点 查询节
Jul 09 PHP
按上下级层次关系输出内容的PHP代码
Jul 17 PHP
thinkphp 一个页面使用2次分页的实现方法
Jul 15 PHP
浅谈php冒泡排序
Dec 30 PHP
高质量PHP代码的50个实用技巧必备(上)
Jan 22 PHP
PHP框架性能测试报告
May 08 PHP
smarty自定义函数用法示例
May 20 PHP
微信公众平台开发(五) 天气预报功能开发
Dec 03 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
mysql5写入和读出乱码解决
2006/11/25 PHP
VIM中设置php自动缩进为4个空格的方法详解
2013/06/14 PHP
php实现微信扫码自动登陆与注册功能
2016/09/22 PHP
php实现数字补零的方法总结
2018/09/12 PHP
PHP论坛实现积分系统的思路代码详解
2020/06/01 PHP
ejs v9 javascript模板系统
2012/03/21 Javascript
使用JavaScript获取电池状态的方法
2014/05/03 Javascript
javascript结合Canvas 实现简易的圆形时钟
2015/03/11 Javascript
jQuery实现Flash效果上下翻动的中英文导航菜单代码
2015/09/22 Javascript
JSONObject使用方法详解
2015/12/17 Javascript
js实现C#的StringBuilder效果完整实例
2015/12/22 Javascript
canvas实现绘制吃豆鱼效果
2017/01/12 Javascript
ES6(ECMAScript 6)新特性之模板字符串用法分析
2017/04/01 Javascript
JavaScript数据结构之广义表的定义与表示方法详解
2017/04/12 Javascript
React Native 使用Fetch发送网络请求的示例代码
2017/12/02 Javascript
快速解决vue在ios端下点击响应延时的问题
2018/08/27 Javascript
JS实现获取自定义属性data值的方法示例
2018/12/19 Javascript
利用Dectorator分模块存储Vuex状态的实现
2019/02/05 Javascript
微信小程序页面上下滚动效果
2020/11/18 Javascript
layui 数据表格 根据值(1=业务,2=机构)显示中文名称示例
2019/10/26 Javascript
Python高级应用实例对比:高效计算大文件中的最长行的长度
2014/06/08 Python
Python 多线程实例详解
2017/03/25 Python
使用Pyinstaller的最新踩坑实战记录
2017/11/08 Python
python如何修改装饰器中参数
2018/03/20 Python
浅谈pandas中DataFrame关于显示值省略的解决方法
2018/04/08 Python
python实现内存监控系统
2021/03/07 Python
Python函数返回不定数量的值方法
2019/01/22 Python
Python抓包程序mitmproxy安装和使用过程图解
2020/03/02 Python
用python监控服务器的cpu,磁盘空间,内存,超过邮件报警
2021/01/29 Python
CSS3属性使网站设计增强同时不消弱可用性
2009/08/29 HTML / CSS
CSS3制作炫酷带方向感应的鼠标滑过图片3D动画
2016/03/16 HTML / CSS
Flesh Beauty官网:露华浓集团旗下彩妆品牌
2021/02/15 全球购物
Cecil Mode法国在线商店:女性时尚
2021/01/08 全球购物
自我评价中英文语句
2013/11/30 职场文书
淘宝客服专员岗位职责
2015/04/07 职场文书
SQL CASE 表达式的具体使用
2022/03/21 SQL Server