thinkphp微信开发(消息加密解密)


Posted in PHP onDecember 02, 2015

使用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_249aeb986d99]]><\/ToUserName>\n
<FromUserName><![CDATA[oopVmxHZaeQkDPsRcbpwXKkH-J2Q]]><\/FromUserName>\n
<CreateTime>1448944621<\/CreateTime>\n
<MsgType><![CDATA[text]]><\/MsgType>\n
<Content><![CDATA[\u7ecf\u7406]]><\/Content>\n
<MsgId>6223169761311044588<\/MsgId>\n
<\/xml>

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

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

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

以上就是在安全模式下对消息的加密解密方法,希望对大家的学习有所帮助。

PHP 相关文章推荐
使用数据库保存session的方法
Oct 09 PHP
PHP下编码转换函数mb_convert_encoding与iconv的使用说明
Dec 16 PHP
php+ajax做仿百度搜索下拉自动提示框(有实例)
Aug 21 PHP
初步介绍PHP扩展开发经验分享
Sep 06 PHP
Smarty模板学习笔记之Smarty简介
May 20 PHP
Codeigniter实现发送带附件的邮件
Mar 19 PHP
PHP性能分析工具XHProf安装使用教程
May 13 PHP
以文件形式缓存php变量的方法
Jun 26 PHP
PHP超全局数组(Superglobals)介绍
Jul 01 PHP
php提交过来的数据生成为txt文件
Apr 28 PHP
php版微信公众账号第三方管理工具开发简明教程
Sep 23 PHP
thinkPHP框架动态配置用法实例分析
Jun 14 PHP
thinkphp微信开之安全模式消息加密解密不成功的解决办法
Dec 02 #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
You might like
PHP 高手之路(二)
2006/10/09 PHP
php skymvc 一款轻量、简单的php
2011/06/28 PHP
PHP关联数组实现根据元素值删除元素的方法
2015/06/26 PHP
PHP购物车类Cart.class.php定义与用法示例
2016/07/20 PHP
PHP PDOStatement::getAttribute讲解
2019/02/01 PHP
php redis setnx分布式锁简单原理解析
2020/10/23 PHP
基于PHP实现生成随机水印图片
2020/12/09 PHP
prototype class详解
2006/09/07 Javascript
js+html+css实现鼠标移动div实例
2013/01/30 Javascript
JS定时刷新页面及跳转页面的方法
2013/07/04 Javascript
jQuery插件实现表格隔行换色且感应鼠标高亮行变色
2013/09/22 Javascript
javascript间隔刷新的简单实例
2013/11/14 Javascript
js控制浏览器全屏示例代码
2014/02/20 Javascript
js确认删除对话框适用于a标签及submit
2014/07/10 Javascript
使用命令对象代替switch语句的写法示例
2015/02/28 Javascript
JavaScript获取页面中表单(form)数量的方法
2015/04/03 Javascript
jQuery 3.0 的变化及使用方法
2016/02/01 Javascript
判断输入的字符串是否是日期格式的简单方法
2016/07/11 Javascript
javascript实现复选框全选或反选
2017/02/04 Javascript
jQuery实现简单的滑动导航代码(移动端)
2017/05/22 jQuery
JS实现评价的星星功能
2017/08/20 Javascript
bootstrap3-dialog-master模态框使用详解
2017/08/22 Javascript
小程序中this.setData的使用和注意事项
2019/08/28 Javascript
js点击事件的执行过程实例分析【冒泡与捕获】
2020/04/11 Javascript
js+canvas实现转盘效果(两个版本)
2020/09/13 Javascript
[01:28:44]DOTA2-DPC中国联赛定级赛 RNG vs iG BO3第一场 1月10日
2021/03/11 DOTA
PyQt5每天必学之工具提示功能
2018/04/19 Python
python 函数中的内置函数及用法详解
2019/07/02 Python
Python实现栈的方法详解【基于数组和单链表两种方法】
2020/02/22 Python
HTML5实现预览本地图片
2016/02/17 HTML / CSS
Foot Locker英国官网:美国知名运动产品零售商
2019/02/21 全球购物
The Hut美国/加拿大:英国领先的豪华在线百货商店
2019/03/26 全球购物
岗位职责定义及内容
2013/11/08 职场文书
课程设计心得体会
2013/12/28 职场文书
普通话宣传标语
2014/06/26 职场文书
校园之声广播稿
2015/08/18 职场文书