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 相关文章推荐
php的ZipArchive类用法实例
Oct 20 PHP
php实现将任意进制数转换成10进制的方法
Apr 17 PHP
php实现将Session写入数据库
Jul 26 PHP
利用PHP将部分内容用星号替换
Apr 21 PHP
PHP简单判断字符串是否包含另一个字符串的方法
Mar 25 PHP
Yii2主题(Theme)用法详解
Jul 23 PHP
php监测数据是否成功插入到Mysql数据库的方法
Nov 25 PHP
Laravel实现短信注册的示例代码
May 29 PHP
php 根据URL下载远程图片、压缩包、pdf等文件到本地
Jul 26 PHP
分享8个Laravel模型时间戳使用技巧小结
Feb 12 PHP
Laravel框架数据库迁移操作实例详解
Apr 06 PHP
PHP RabbitMQ消息列队
May 11 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
WebQQ最新登陆协议的用法
2014/12/22 PHP
通过PHP简单实例介绍文件上传
2015/12/16 PHP
PHP Imagick完美实现图片裁切、生成缩略图、添加水印
2016/02/22 PHP
thinkphp5框架结合mysql实现微信登录和自定义分享链接与图文功能示例
2019/08/13 PHP
javascript获取下拉列表框当中的文本值示例代码
2013/07/31 Javascript
基于jquery实现图片相关操作(重绘、获取尺寸、调整大小、缩放)
2015/12/25 Javascript
js实现可键盘控制的简单抽奖程序
2016/07/13 Javascript
只要1K 纯JS脚本送你一朵3D红色玫瑰
2016/08/09 Javascript
Vue.js Ajax动态参数与列表显示实现方法
2016/10/20 Javascript
Angular 2父子组件数据传递之局部变量获取子组件其他成员
2017/07/04 Javascript
jQuery实现打开网页自动弹出遮罩层或点击弹出遮罩层功能示例
2017/10/19 jQuery
vue中的provide/inject的学习使用
2018/05/09 Javascript
Vue注册组件命名时不能用大写的原因浅析
2019/04/25 Javascript
Layui动态生成select下拉选择框不显示的解决方法
2019/09/24 Javascript
vue 解除鼠标的监听事件的方法
2019/11/13 Javascript
vue2和vue3的v-if与v-for优先级对比学习
2020/10/10 Javascript
Python 在字符串中加入变量的实例讲解
2018/05/02 Python
解决PyCharm的Python.exe已经停止工作的问题
2018/11/29 Python
Python使用pyserial进行串口通信的实例
2019/07/02 Python
Python爬取视频(其实是一篇福利)过程解析
2019/08/01 Python
python 批量修改 labelImg 生成的xml文件的方法
2019/09/09 Python
wxpython实现按钮切换界面的方法
2019/11/19 Python
pytorch 计算ConvTranspose1d输出特征大小方式
2020/06/23 Python
Python常用base64 md5 aes des crc32加密解密方法汇总
2020/11/06 Python
利物浦足球俱乐部官方商店(美国):Liverpool FC US
2019/10/09 全球购物
Currentbody法国:健康与美容高科技产品
2020/08/16 全球购物
遇到的Mysql的面试题
2014/06/29 面试题
中学生操行评语大全
2014/04/24 职场文书
高中语文课后反思
2014/04/27 职场文书
运动会横幅标语
2014/06/17 职场文书
2014年秋季开学典礼主持词
2014/08/02 职场文书
我的中国梦演讲稿800字
2014/08/19 职场文书
教师师德考核自我评价
2014/09/13 职场文书
MySQL pt-slave-restart工具的使用简介
2021/04/07 MySQL
python opencv常用图形绘制方法(线段、矩形、圆形、椭圆、文本)
2021/04/12 Python
sql中mod()函数取余数的用法
2021/05/29 SQL Server