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和ACCESS写聊天室(六)
Oct 09 PHP
木翼下载系统中说明的PHP安全配置方法
Jun 16 PHP
php中使用Akismet防止垃圾评论的代码
Jun 10 PHP
ThinkPHP结合ajax、Mysql实现的客户端通信功能代码示例
Jun 23 PHP
linux下安装php的memcached客户端
Aug 03 PHP
php控制文件下载速度的方法
Mar 24 PHP
php生成图片验证码的实例讲解
Aug 03 PHP
php判断是否连接上网络的方法实例详解
Dec 14 PHP
Yii2学习笔记之汉化yii设置表单的描述(属性标签attributeLabels)
Feb 07 PHP
PHP编程计算日期间隔天数的方法
Apr 26 PHP
php框架CodeIgniter主从数据库配置方法分析
May 25 PHP
PHP使用SOAP调用API操作示例
Dec 25 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
在Ubuntu 14.04上部署 PHP 环境及 WordPress
2014/09/02 PHP
php查询whois信息的方法
2015/06/08 PHP
Jquery ThickBox插件使用心得(不建议使用)
2010/09/08 Javascript
javascript中IE浏览器不支持NEW DATE()带参数的解决方法
2012/03/01 Javascript
JSON序列化与解析原生JS方法且IE6和chrome测试通过
2013/09/05 Javascript
js计算两个时间之间天数差的实例代码
2013/11/19 Javascript
Js表格万条数据瞬间加载实现代码
2014/02/20 Javascript
JS函数定义方式的区别介绍
2016/03/22 Javascript
JavaScript操作选择对象的简单实例
2016/05/16 Javascript
微信小程序使用第三方库Underscore.js步骤详解
2016/09/27 Javascript
vue2之简易的pc端短信验证码的问题及处理方法
2019/06/03 Javascript
LayUi数据表格自定义赋值方式
2019/10/26 Javascript
解决element-ui里的下拉多选框 el-select 时,默认值不可删除问题
2020/08/14 Javascript
关于javascript中的promise的用法和注意事项(推荐)
2021/01/15 Javascript
Python发送form-data请求及拼接form-data内容的方法
2016/03/05 Python
Python3.6日志Logging模块简单用法示例
2018/06/14 Python
Python使用一行代码获取上个月是几月
2018/08/30 Python
python变量赋值方法(可变与不可变)
2019/01/12 Python
python开发之anaconda以及win7下安装gensim的方法
2019/07/05 Python
python中的split()函数和os.path.split()函数使用详解
2019/12/21 Python
python 串口读取+存储+输出处理实例
2019/12/26 Python
Python通过getattr函数获取对象的属性值
2020/10/16 Python
Python jieba结巴分词原理及用法解析
2020/11/05 Python
python中常用的数据结构介绍
2021/01/12 Python
python pygame 愤怒的小鸟游戏示例代码
2021/02/25 Python
利用Bootstrap实现漂亮简洁的CSS3价格表实例源码
2017/03/02 HTML / CSS
阿迪达斯希腊官方网上商店:adidas希腊
2019/04/06 全球购物
Madewell澳大利亚官方网站:美国休闲服饰品牌
2019/07/18 全球购物
Ray-Ban雷朋太阳眼镜英国官网:Ray-Ban UK
2019/11/23 全球购物
公共事业管理本科生求职信
2013/10/07 职场文书
师范应届生教师求职信
2013/11/05 职场文书
天鹅的故事教学反思
2014/02/04 职场文书
领导干部廉政自律承诺书
2014/05/26 职场文书
教师党员批评与自我批评
2014/10/15 职场文书
2015年小学语文工作总结
2015/05/25 职场文书
vue使用watch监听属性变化
2022/04/30 Vue.js