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中基本符号及使用方法
Mar 23 PHP
php 获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法
Sep 28 PHP
php jsonp单引号转义
Nov 23 PHP
PHP的cURL库简介及使用示例
Feb 06 PHP
PHP自带方法验证邮箱是否存在
Feb 01 PHP
php socket通信(tcp/udp)实例分析
Feb 14 PHP
php使用ffmpeg向视频中添加文字字幕的实现方法
May 23 PHP
php版微信公众平台回复中文出现乱码问题的解决方法
Sep 22 PHP
php版阿里大于(阿里大鱼)短信发送实例详解
Nov 30 PHP
php实现网页端验证码功能
Jul 11 PHP
Yii2.0多文件上传实例说明
Jul 24 PHP
PHPMailer ThinkPHP实现自动发送邮件功能
Jun 10 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实现多级树型菜单
2006/10/09 PHP
用php获取远程图片并把它保存到本地的代码
2008/04/07 PHP
解决ajax+php中文乱码的方法详解
2013/06/09 PHP
php PDO判断连接是否可用的实现方法
2017/04/03 PHP
js 变量类型转换常用函数与代码[比较全]
2009/12/01 Javascript
Jquery ajax不能解析json对象,报Invalid JSON错误的原因和解决方法
2010/03/27 Javascript
jQuery往返城市和日期查询实例讲解
2015/10/09 Javascript
jQuery实现订单提交页发送短信功能前端处理方法
2016/07/04 Javascript
Vue的elementUI实现自定义主题方法
2018/02/23 Javascript
jQuery实现图片简单轮播功能示例
2018/08/13 jQuery
基于JS实现一个随机生成验证码功能
2019/05/29 Javascript
react ant Design手动设置表单的值操作
2020/10/31 Javascript
深入了解Python数据类型之列表
2016/06/24 Python
使用pandas 将DataFrame转化成dict
2019/12/10 Python
tensorflow指定GPU与动态分配GPU memory设置
2020/02/03 Python
Python库skimage绘制二值图像代码实例
2020/04/10 Python
使用python实现时间序列白噪声检验方式
2020/06/03 Python
matplotlib 三维图表绘制方法简介
2020/09/20 Python
python判断元素是否存在的实例方法
2020/09/24 Python
Python系统公网私网流量监控实现流程
2020/11/23 Python
请用用Java代码写一个堆栈
2012/01/26 面试题
Ado与Ado.net的相同与不同
2014/12/08 面试题
解释一下ruby中的特殊方法与特殊类
2013/02/26 面试题
毕业生大学生活自我总结
2014/01/31 职场文书
亲子读书活动方案
2014/02/22 职场文书
党员创先争优公开承诺书
2014/03/28 职场文书
《厄运打不垮的信念》教学反思
2014/04/13 职场文书
环保建议书400字
2014/05/14 职场文书
医院保洁服务方案
2014/06/11 职场文书
司机工作自我鉴定
2014/09/19 职场文书
微笑面对生活演讲稿
2014/09/23 职场文书
教师群众路线剖析材料
2014/09/29 职场文书
党员反对四风思想汇报范文
2014/10/25 职场文书
土地租赁协议书
2015/01/29 职场文书
校园安全主题班会
2015/08/12 职场文书
基于Python实现一个春节倒计时脚本
2022/01/22 Python