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 EOT定界符的使用详解
Sep 30 PHP
php empty函数 使用说明
Aug 10 PHP
全局记录程序片段的运行时间 正确找到程序逻辑耗时多的断点
Jan 06 PHP
深入php socket的讲解与实例分析
Jun 13 PHP
关于PHP模板Smarty的初级使用方法以及心得分享
Jun 21 PHP
destoon实现不同会员组公司名称显示不同的颜色的方法
Aug 22 PHP
Yii查询生成器(Query Builder)用法实例教程
Sep 04 PHP
discuz目录文件资料汇总
Dec 30 PHP
php使用curl并发减少后端访问时间的方法分析
May 12 PHP
Yii2数据库操作常用方法小结
May 04 PHP
thinkPHP5实现的查询数据库并返回json数据实例
Oct 23 PHP
PHP使用JpGraph绘制折线图操作示例【附源码下载】
Oct 18 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
德生PL990,目前市面上唯一一款便携式插卡蓝牙全波段高性能收音机
2021/03/02 无线电
PHP中for循环语句的几种变型
2006/11/26 PHP
美图秀秀web开放平台--PHP流式上传和表单上传示例分享
2014/06/22 PHP
php设计模式之状态模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
JS date对象的减法处理实现代码
2010/12/28 Javascript
JS实现切换标签页效果实例代码
2013/11/01 Javascript
Jquery Ajax解析XML数据(同步及异步调用)简单实例
2014/02/12 Javascript
jQuery组件easyui对话框实现代码
2016/08/25 Javascript
jQuery html表格排序插件tablesorter使用方法详解
2017/02/10 Javascript
vuejs绑定class和style样式
2017/04/11 Javascript
JavaScript实现省市县三级级联特效
2017/05/16 Javascript
利用yarn代替npm管理前端项目模块依赖的方法详解
2017/09/04 Javascript
关于Vue项目跨平台运行问题的解决方法
2018/09/18 Javascript
JS实现带阴历的日历功能详解
2019/01/24 Javascript
Vue项目接入Paypal实现示例详解
2020/06/04 Javascript
python中ConfigParse模块的用法
2014/09/29 Python
Python实现删除Android工程中的冗余字符串
2015/01/19 Python
Python基于递归算法实现的走迷宫问题
2017/08/04 Python
numpy.array 操作使用简单总结
2019/11/08 Python
Django 自动生成api接口文档教程
2019/11/19 Python
Pytorch中实现只导入部分模型参数的方式
2020/01/02 Python
python使用turtle库绘制奥运五环
2020/02/24 Python
新手学习Python2和Python3中print不同的用法
2020/06/09 Python
python实现批处理文件
2020/07/28 Python
Bugatchi官方网站:男士服装在线
2019/04/10 全球购物
千禧酒店及度假村官方网站:Millennium Hotels and Resorts
2019/05/10 全球购物
请写出 float x 与"零值"比较的 if 语句
2016/01/04 面试题
个人职业生涯规划书1500字
2013/12/31 职场文书
会计学生自我鉴定
2014/02/06 职场文书
高一数学教学反思
2014/02/07 职场文书
《苏珊的帽子》教学反思
2014/04/07 职场文书
爱耳日宣传活动总结
2014/07/05 职场文书
新党章心得体会
2014/09/04 职场文书
房屋所有权证明
2015/06/19 职场文书
父亲节感言
2015/08/03 职场文书
Python装饰器的练习题
2021/11/23 Python