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怎样调用MSSQL的存储过程
Oct 09 PHP
用php将任何格式视频转为flv的代码
Sep 03 PHP
解析dedeCMS验证码的实现代码
Jun 07 PHP
php中调用其他系统http接口的方法说明
Feb 28 PHP
PHP生成随机字符串(3种方法)
Sep 25 PHP
php编程每天必学之验证码
Mar 03 PHP
PHP页面输出时js设置input框的选中值
Sep 30 PHP
php实现的http请求封装示例
Nov 08 PHP
在PHP 7下安装Swoole与Yar,Yaf的方法教程
Jun 02 PHP
PHP laravel中的多对多关系实例详解
Jun 07 PHP
Yii框架核心组件类实例详解
Aug 06 PHP
php将xml转化对象的实例详解
Nov 17 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中解析带中文字符的url函数分享
2015/01/20 PHP
Yii实现单用户博客系统文章详情页插入评论表单的方法
2015/12/28 PHP
php和vue配合使用技巧和方法
2019/05/09 PHP
编写可维护面向对象的JavaScript代码[翻译]
2011/02/12 Javascript
javascript五图轮播切换实用版
2012/08/17 Javascript
js获得鼠标的坐标值的方法
2013/03/13 Javascript
收集json解析的四种方法分享
2014/01/17 Javascript
键盘上一张下一张兼容IE/google/firefox等浏览器
2014/01/28 Javascript
使用JavaScript 编写简单计算器
2014/11/24 Javascript
JavaScript设计模式之代理模式介绍
2014/12/28 Javascript
JavaScript 实现 Tab 点击切换实例代码
2017/03/25 Javascript
vue.js使用v-model实现表单元素(input) 双向数据绑定功能示例
2019/03/08 Javascript
Vue使用localStorage存储数据的方法
2019/05/27 Javascript
13 个npm 快速开发技巧(推荐)
2019/07/04 Javascript
ES6之Proxy的get方法详解
2019/10/11 Javascript
vue.js iview打包上线后字体图标不显示解决办法
2020/01/20 Javascript
JavaScript canvas绘制圆弧与圆形
2020/02/18 Javascript
解决vue的router组件component在import时不能使用变量问题
2020/07/26 Javascript
python类装饰器用法实例
2015/06/04 Python
Python for Informatics 第11章之正则表达式(二)
2016/04/21 Python
django自带的server 让外网主机访问方法
2018/05/14 Python
浅谈pytorch和Numpy的区别以及相互转换方法
2018/07/26 Python
Python wxPython库Core组件BoxSizer用法示例
2018/09/03 Python
TensorFlow实现iris数据集线性回归
2018/09/07 Python
pygame游戏之旅 按钮上添加文字的方法
2018/11/21 Python
Python OS模块实例详解
2019/04/15 Python
利用Tensorboard绘制网络识别准确率和loss曲线实例
2020/02/15 Python
CSS3的resize属性使用初探
2015/09/27 HTML / CSS
CSS3 mask 遮罩的具体使用方法
2017/11/03 HTML / CSS
HTML5图片预览实例分享
2014/06/04 HTML / CSS
澳大利亚商务邀请函
2014/01/17 职场文书
推广普通话演讲稿
2014/05/23 职场文书
拓展训练激励口号
2014/06/17 职场文书
2015年感恩父亲节活动策划方案
2015/05/05 职场文书
62句有关感恩节文案(推荐收藏)
2019/11/28 职场文书
解决jupyter notebook启动后没有token的坑
2021/04/24 Python