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版自动生成文章摘要
Jul 23 PHP
php下连接mssql2005的代码
Jan 17 PHP
PHP管理内存函数 memory_get_usage()使用介绍
Sep 23 PHP
php时区转换转换函数
Jan 07 PHP
实现在同一方法中获取当前方法中新赋值的session值解决方法
Jun 26 PHP
什么情况下可以不写PHP的闭合标签“?&gt;”
Aug 28 PHP
yii实现model添加默认值的方法(2种方法)
Jan 06 PHP
人脸识别测颜值、测脸龄、测相似度微信接口
Apr 07 PHP
PHP实现的进度条效果详解
May 03 PHP
Yii中的cookie的发送和读取
Jul 27 PHP
thinkphp5实现微信扫码支付
Dec 23 PHP
PHP设计模式之 策略模式Strategy详解【对象行为型】
May 01 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开发工具ZendStudio下Xdebug工具使用说明详解
2013/11/11 PHP
PHP针对伪静态的注入总结【附asp与Python相关代码】
2017/08/01 PHP
ThinkPHP框架实现的邮箱激活功能示例
2018/06/15 PHP
javascript 进阶篇2 CSS XML学习
2012/03/14 Javascript
jquery实现漂浮在网页右侧的qq在线客服插件示例
2013/05/13 Javascript
jQuery中add()方法用法实例
2015/01/08 Javascript
JQuery通过AJAX从后台获取信息显示在表格上并支持行选中
2015/09/15 Javascript
jQuery插件zTree实现单独选中根节点中第一个节点示例
2017/03/08 Javascript
vue-router中的hash和history两种模式的区别
2018/07/17 Javascript
浅析Vue.js中v-bind v-model的使用和区别
2018/12/04 Javascript
微信小程序自定义顶部组件customHeader的示例代码
2020/06/03 Javascript
JQuery通过键盘控制键盘按下与松开触发事件
2020/08/07 jQuery
Vue路由 重定向和别名的区别说明
2020/09/09 Javascript
浅谈javascript事件环微任务和宏任务队列原理
2020/09/12 Javascript
在vue项目中引用Antv G2,以饼图为例讲解
2020/10/28 Javascript
简介Django框架中可使用的各类缓存
2015/07/23 Python
Python之ReportLab绘制条形码和二维码的实例
2018/01/15 Python
python TKinter获取文本框内容的方法
2018/10/11 Python
python从入门到精通 windows安装python图文教程
2019/05/18 Python
详解python实现小波变换的一个简单例子
2019/07/18 Python
Python turtle库的画笔控制说明
2020/06/28 Python
python db类用法说明
2020/07/07 Python
python按照list中字典的某key去重的示例代码
2020/10/13 Python
Vita Fede官网:在意大利手工制作,在纽约市设计
2019/10/25 全球购物
波兰快递服务:Globkurier.pl
2019/11/08 全球购物
会计毕业生自荐信
2013/11/21 职场文书
记帐员岗位责任制
2014/02/08 职场文书
应届生求职自荐信范文
2015/03/04 职场文书
中学生综合素质自我评价
2015/03/06 职场文书
护理专业自我评价
2015/03/11 职场文书
家庭聚会祝酒词
2015/08/11 职场文书
2016年春季运动会通讯稿
2015/11/25 职场文书
初中地理教学反思
2016/02/19 职场文书
golang中的struct操作
2021/11/11 Golang
Python Pandas 删除列操作
2022/03/16 Python
MySQL一劳永逸永久支持输入中文的方法实例
2022/08/05 MySQL