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 相关文章推荐
php+dojo 的数据库保存拖动布局的一个方法dojo 这里下载
Mar 07 PHP
收藏的PHP常用函数 推荐收藏保存
Feb 21 PHP
PHP面向对象概念
Nov 06 PHP
php安全开发 添加随机字符串验证,防止伪造跨站请求
Feb 14 PHP
如何用php生成扭曲及旋转的验证码图片
Jun 07 PHP
php接口和抽象类使用示例详解
Mar 02 PHP
PHP使用DOMDocument类生成HTML实例(包含常见标签元素)
Jun 25 PHP
详解PHP中的状态模式编程
Aug 11 PHP
php并发加锁示例
Oct 17 PHP
Python中使用django form表单验证的方法
Jan 16 PHP
PHP实现活动人选抽奖功能
Apr 19 PHP
PHP 年月日的三级联动实例代码
May 24 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 MYSQL乱码问题,使用SET NAMES utf8校正
2009/11/30 PHP
php file_get_contents取文件中数组元素的方法
2017/04/01 PHP
PHP文件管理之实现网盘及压缩包的功能操作
2017/09/20 PHP
File文件控件,选中文件(图片,flash,视频)即立即预览显示
2009/04/09 Javascript
ajax请求get与post的区别总结
2013/11/04 Javascript
jQuery EasyUI实现右键菜单变灰不可用效果
2015/09/24 Javascript
原生JS实现轮播效果+学前端的感受(防止走火入魔)
2016/08/21 Javascript
JS异步文件分片断点上传的实现思路
2016/12/25 Javascript
简单实现js进度条加载效果
2020/03/25 Javascript
微信小程序实现基于三元运算验证手机号/姓名功能示例
2019/01/19 Javascript
详解利用eventemitter2实现Vue组件通信
2019/11/04 Javascript
vue模块移动组件的实现示例
2020/05/20 Javascript
vue实现信息管理系统
2020/05/30 Javascript
jQuery带控制按钮轮播图插件
2020/07/31 jQuery
[02:46]2014DOTA2国际邀请赛 选手为你解读比赛MVP充满梦想
2014/07/09 DOTA
netbeans7安装python插件的方法图解
2013/12/24 Python
Python中生成器和yield语句的用法详解
2015/04/17 Python
利用Python暴力破解zip文件口令的方法详解
2017/12/21 Python
Python元组拆包和具名元组解析实例详解
2018/03/26 Python
python3.4实现邮件发送功能
2018/05/28 Python
django中使用Celery 布式任务队列过程详解
2019/07/29 Python
Python读取yaml文件的详细教程
2020/07/21 Python
Python接口自动化测试框架运行原理及流程
2020/11/30 Python
HTML5 本地存储 LocalStorage详解
2016/06/24 HTML / CSS
HTML5之tabindex属性全面解析
2016/07/07 HTML / CSS
经济与贸易专业应届生求职信
2013/11/19 职场文书
商场端午节活动方案
2014/01/29 职场文书
《走一步再走一步》教学反思
2014/02/15 职场文书
家长写给老师的建议书
2014/03/13 职场文书
卫生巾广告词
2014/03/18 职场文书
运动会口号16字
2014/06/07 职场文书
英文道歉信
2015/01/20 职场文书
房地产财务经理岗位职责
2015/04/08 职场文书
让世界充满爱观后感
2015/06/10 职场文书
Nginx解决前端访问资源跨域问题的方法详解
2021/03/31 Servers
redis哨兵常用命令和监控示例详解
2021/05/27 Redis