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 相关文章推荐
为php4加入动态flash文件的生成的支持
Oct 09 PHP
php array_flip() 删除数组重复元素
Jan 14 PHP
PHP simple_html_dom.php+正则 采集文章代码
Dec 24 PHP
php利用cookie实现访问次数统计代码
May 19 PHP
PHP合并两个数组的两种方式的异同
Sep 14 PHP
php中使用$_REQUEST需要注意的一个问题
May 02 PHP
PHP Cookie的使用教程详解
Jun 03 PHP
PHP限制页面只能在微信自带浏览器访问的代码
Jan 15 PHP
php过滤表单提交的html等危险代码
Nov 03 PHP
Yii框架中memcache用法实例
Dec 03 PHP
TP3.2批量上传文件或图片 同名冲突问题的解决方法
Aug 01 PHP
thinkphp框架无限级栏目的排序功能实现方法示例
Mar 29 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
MySQL相关说明
2007/01/15 PHP
php 动态执行带有参数的类方法
2009/04/10 PHP
php 分页函数multi() discuz
2009/06/21 PHP
PHP date函数常用时间处理方法
2015/05/11 PHP
详解WordPress开发中过滤属性以及Sql语句的函数使用
2015/12/25 PHP
PHP使用curl制作简易百度搜索
2016/11/03 PHP
PHP生成图片验证码功能示例
2017/01/12 PHP
解决Yii2邮件发送结果返回成功,但接收不到邮件的问题
2017/05/23 PHP
PHP面向对象五大原则之依赖倒置原则(DIP)详解
2018/04/08 PHP
PHP实现微信提现功能(微信商城)
2019/11/21 PHP
javascript事件模型代码
2007/07/01 Javascript
node.js中的定时器nextTick()和setImmediate()区别分析
2014/11/26 Javascript
AngularJS实现ajax请求的方法
2016/11/22 Javascript
JavaScript数组和对象的复制
2017/03/21 Javascript
JS实现图片旋转动画效果封装与使用示例
2018/07/09 Javascript
JavaScript使用indexOf()实现数组去重的方法分析
2018/09/04 Javascript
分享5个顶级的JavaScript Ajax组件库
2018/09/16 Javascript
vue中使用protobuf的过程记录
2018/10/26 Javascript
JavaScript实现简单音乐播放器
2020/04/17 Javascript
jQuery实现弹幕特效
2019/11/29 jQuery
最全vue的vue-amap使用高德地图插件画多边形范围的示例代码
2020/07/17 Javascript
vue element和nuxt的使用技巧分享
2021/01/14 Vue.js
[01:27]DOTA2电竞之夜 今夜共饮庆功酒
2014/08/02 DOTA
[05:36]DOTA2 2015国际邀请赛中国区预选赛第四日TOP10
2015/05/29 DOTA
[01:06:26]全国守擂赛第二周 Team Coach vs DeMonsTer
2020/04/28 DOTA
python爬虫入门教程之点点美女图片爬虫代码分享
2014/09/02 Python
利用python如何处理百万条数据(适用java新手)
2018/06/06 Python
在VS2017中用C#调用python脚本的实现
2019/07/31 Python
基于spring boot 日志(logback)报错的解决方式
2020/02/20 Python
python+requests实现接口测试的完整步骤
2020/10/27 Python
个人遵守党的政治纪律情况对照检查材料思想汇报
2014/09/25 职场文书
2015年实习班主任工作总结
2015/04/23 职场文书
2015年幼儿园保育员工作总结
2015/04/23 职场文书
导游词之河北野三坡
2019/12/11 职场文书
微信小程序实现聊天室功能
2021/06/14 Javascript
Elasticsearch 基本查询和组合查询
2022/04/19 Python