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 相关文章推荐
PHP5.2中date()函数显示时间与北京时间相差8小时的解决办法
May 28 PHP
php empty函数 使用说明
Aug 10 PHP
比file_get_contents稳定的curl_get_contents分享
Jan 11 PHP
新手菜鸟必读:session与cookie的区别
Aug 22 PHP
PHP用身份证号获取星座和生肖的方法
Nov 07 PHP
PHP两种去掉数组重复值的方法比较
Jun 19 PHP
ThinkPHP权限认证Auth实例详解
Jul 22 PHP
php验证session无效的解决方法
Nov 04 PHP
详解Window7 下开发php扩展
Dec 31 PHP
PHP邮件群发机实现代码
Feb 16 PHP
php类的自动加载操作实例详解
Sep 28 PHP
PHP用mysql_insert_id()函数获得刚插入数据或当前发布文章的ID
Nov 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
PHP新手上路(十一)
2006/10/09 PHP
函数中使用require_once问题深入探讨 优雅的配置文件定义方法推荐
2014/07/02 PHP
PHP+Ajax+JS实现多图上传
2016/05/07 PHP
JavaScript 模仿vbs中的 DateAdd() 函数的代码
2007/08/13 Javascript
复制本贴标题和地址的js代码
2008/07/01 Javascript
JS合并数组的几种方法及优劣比较
2014/09/19 Javascript
深入浅析AngularJS和DataModel
2016/02/16 Javascript
举例说明JavaScript中的实例对象与原型对象
2016/03/11 Javascript
原生js编写2048小游戏
2017/03/17 Javascript
Angular2开发——组件规划篇
2017/03/28 Javascript
200行代码实现blockchain 区块链实例详解
2018/03/14 Javascript
React中嵌套组件与被嵌套组件的通信过程
2018/07/11 Javascript
Element-UI踩坑之Pagination组件的使用
2018/10/29 Javascript
React中this丢失的四种解决方法
2019/03/12 Javascript
JS手写一个自定义Promise操作示例
2020/03/16 Javascript
深度解读vue-resize的具体用法
2020/07/08 Javascript
JS时间戳与日期格式互相转换的简单方法示例
2021/01/30 Javascript
利用Python破解验证码实例详解
2016/12/08 Python
Python实现抢购IPhone手机
2018/02/07 Python
Python+pyplot绘制带文本标注的柱状图方法
2019/07/08 Python
python os.path.isfile()因参数问题判断错误的解决
2019/11/29 Python
python分布式计算dispy的使用详解
2019/12/22 Python
Django中从mysql数据库中获取数据传到echarts方式
2020/04/07 Python
简单聊聊H5的pushState与replaceState的用法
2018/04/03 HTML / CSS
美国紧身牛仔裤品牌:NYDJ
2017/05/24 全球购物
10条PHP编程习惯
2014/05/26 面试题
写出程序把一个链表中的接点顺序倒排
2014/04/28 面试题
工程招投标邀请书
2014/01/30 职场文书
乡镇庆八一活动方案
2014/02/02 职场文书
《雨点儿》教学反思
2014/04/14 职场文书
小学生国庆演讲稿
2014/09/05 职场文书
技术负责人岗位职责
2015/02/10 职场文书
2015年医院护理部工作总结
2015/04/23 职场文书
学雷锋感言
2015/08/03 职场文书
2016幼儿园新学期寄语
2015/12/03 职场文书
服务器nginx权限被拒绝解决案例
2022/09/23 Servers