php 微信消息解密,thinkphp微信开发(消息加密解密)

使用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) 

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  $size) {

$pad_str= 0;

}

return substr($text, 0, strlen($text) - $pad_str);

}

解决方法:输出的xml文件是这样的

\n

\n

1448944621\n

\n

\n

6223169761311044588\n

所以需要进行处理才能让simplexml_load_string处理

在输出的明文内容后面加上

//明文内容

$text = substr($decrypt, 4, $size);

//去掉多余的内容

$text=str_replace('

$text=str_replace('>\n','>', $text);

return $text;

顶一下

(0)

100%订阅

回复

踩一下

(0)

100%

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/507149.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

模型预测控制_模型预测控制(MPC)算法之一MAC算法

引言随着自动驾驶技术以及机器人控制技术的不断发展及逐渐火热,模型预测控制(MPC)算法作为一种先进的控制算法,其应用范围与领域得到了进一步拓展与延伸。目前提出的模型预测控制算法主要有基于非参数模型的模型算法控制(MAC)和动态矩阵控制(DMC)&#x…

基于dde的vb和matlab,基于VB和DDE技术的组态王通信协议转换

组态王是一种通用的工业监控上位机软件,它界面友好、易学易用、即便是不懂编程的工程人员也能在短时时间内开发出界面精美,符合行业标准且高效的上位机监控程序,因此深受工程师们的喜爱,然而组态王软件的上下位机通信协议是固定的切不可改变,这就给一些使用“自拟定协议”和“非…

pythonjava解释xml_Python解析XML文档

解析XML主要用到pytohn自带的XML库,其次还是lxml库XML结构,先以一个相对简单但功能比较全的XML文档为例dive into markcurrently between addictionstag:diveintomark.org,2001-07-29:/2009-03-27T21:56:07ZMarkhttp://diveintomark.org/Dive into histo…

红旗linux安装oracle,Redflag Linux安装Oracle 10gR2 RAC记事

Redflag Linux安装Oracle 10gR2 RAC记事Kamus遇到过:SQL> startup nomountORA-27102: out of memoryLinux-x86_64 Error: 28: No space LEFT ON device这和内核参数 shmall 有关,修改设置 kernel.shmall 16475728 。后来离开没多久,客户打…

springboot开启debug日志_SpringBoot 如何优雅的打印日志?

一、打印日志注意事项1、使用 Slf4j 注解这个代码相信大家都很熟悉,你是否曾经看到或者自己因 copy 而 没有改变“当前类名”?如果你们项目用到 lombok ,可以在类上使用 Slf4j 注解,省去手动写这行代码。2、不建议使用的输出为什么…

oracle导出表中某天数据命令,Oracle数据库使用命令行导入导出数据表及数据内容(本地、远程)...

一、本机导入导出1、数据库导出命令,导出用户userA下的表结构和数据:exp 用户名/密码服务名 owner用户名 file导出文件指定存储路径 fully2、数据库导入命令,将userA用户下的表结构和数据导入到用户userB下:imp 用户名/密码服务名 fromuser导…

python手机话费_查询话费订单详情示例代码

#!/usr/bin/python# encoding:utf-8import urllib2, json, urllib, hashlib# 3、获取订单详情data {}data["appkey"] "your_appkey_here"data["orderno"] "201605250929585085725"data["outorderno"] "77888855888…

windows 映射文件会释放内存吗_Windows系统共享内存管理

一 进程逻辑空间 物理空间​如上图所示,每个进程都有自己的逻辑空间,这些逻辑空间,会被映射到具体的物理空间中。每个进程的逻辑空间都是彼此隔离,相互独立不受干扰的。但是他们都会被映射到同一个物理空间去,当其所映…

linux 文件的组织,Linux文件组织和目录结构

资料:https://www.shiyanlou.com/courses/running1 Linux目录结构说明可以使用tree来查看目录结构sudo apt-get install tree 安装treetree / 查看根目录的结构将目录定义为四种交互作使用的形态:2 路径. 表示当前目录.. 表示上一级目录 - 表示上一次所在…

python 将列表中的字符串转为数字_python 将列表中的字符串转为数字

本文实例讲述了python中列表元素转为数字的方法。分享给大家供大家参考,具体如下:有一个数字字符的列表:numbers [1, 5, 10, 8]想要把每个元素转换为数字:numbers [1, 5, 10, 8]用一个循环来解决:new_numbers [];fo…

linux perl 安装目录,linux-将Perl模块安装到特定位置

我有几台运行Perl程序以及其他程序和工具的Linux机器.我想使所有机器之间的所有工具保持同步,因此我已经在一台机器(主)和另一台机器之间共享了/usr/local目录.现在,我想在/usr/local /< modules的路径>中使所有Perl模块及其依赖项保持同步.我已经找到了local::lib模块,但…

python 降维lda算法的使用_sklearn LDA降维算法

sklearn LDA降维算法LDA(Linear Discriminant Analysis)线性判断别分析&#xff0c;可以用于降维和分类。其基本思想是类内散度尽可能小&#xff0c;类间散度尽可能大&#xff0c;是一种经典的监督式降维/分类技术。sklearn代码实现#codingutf-8import pandas as pdimport matp…

linux 命令 语法,linux常用命令及语法

mkdir、rmdirmkdir命令用来建立新的目mkdir命令用来建立新的目录&#xff0c;rmdir用来删除已建立的目录。rm这个命令是用来删除文件的。rm命令常用的参数有三个&#xff1a;-i,-r,-f。删除既有文件或目录之前先询问用户&#xff0c;删除一个名字为test的一个文件&#xff1a;r…

jeecg 导出的excel不能使用公式_微软:Excel公式是世界上使用最广泛的编程语言...

喜欢就关注我们吧&#xff01;文|一君微软近日推出了一项 Excel 公式构建的新功能 LAMBDA&#xff0c;正则测试阶段。LAMBDA 允许使用 Excel 自身的公式语言自定义功能&#xff0c;而过去&#xff0c;Excel 中需要通过 JS 等语言编写自定义函数。同时&#xff0c;LAMBDA 还可以…

linux 查找tomcat目录,linux下通过tomcat访问某路径下的文件

背景&#xff1a;linux服务器上有个日志目录&#xff0c;要通过界面访问。之前用Apache实现的&#xff0c;现在安全漏洞检查需要升级Apache&#xff0c;但是安装之路犹如西天取经&#xff0c;各种缺文件&#xff0c;各种报错&#xff0c;一直没搞定。然后决定用tomcat实现该功能…

python中的画布控制_使按钮在画布上工作(tkinter)

你的代码需要认真的重组。在这里有一些东西可以用来添加矩形。你不需要在cd2>中创建一个cd2>的集合&#xff0c;这样你就不需要在cd2>中创建一个的集合。在from tkinter import *import randomroot Tk()class Recta:def __init__(self, height60, width80):self.heig…

voip 音频采集时间_蓝牙音频续航监测系统展会现场演示

|点击【美格信】关注☝大家好&#xff0c;我是美格信公众号主编&#xff1a;小M&#xff0c;今天的2020(秋季)亚洲蓝牙耳机展上&#xff0c;我们美格信现场展示了发布的新品-MAGNUM麦金纳蓝牙音频续航监测系统。不过有很多小伙伴因为时间问题&#xff0c;没机会来现场参观&…

linux 运行scrapy,python 文件 运行 scrapy

写了一个scrapy&#xff0c;程序可以跑&#xff0c;没有任何问题。爬下30个网站的body存入json文件&#xff0c;并且保存为test.json如果test.json存在就保存到一个新建的test1.json新建了一个python文件叫check.py&#xff0c;对比两个文件的hash值&#xff0c;如果有不一样&a…

linux的硬件系统管理,Linux 系统硬件管理的基础知识(四)

以下主要介绍我的***次安装Linux系统遭遇&#xff0c;以及怎么度过这个遭遇的&#xff0c;希望对大家有所帮助。不喜欢的可以略过。以下接《Linux 系统硬件管理的基础知识(三)》。四、关于存储设备的不同的表示方法的应用&#xff1b;1、/dev/hd[a-z] 表示方法的应用1)用于moun…

大整数减法c语言_3.2 C语言运算符和表达式

01基本的算术运算符1、正号运算符2、-负号运算符3、*乘法运算符4、/除法运算符5、%求余运算符6、加法运算符7、-减法运算符读者应该特别注意和-在不同情况下的含义02自增、自减运算符1、i&#xff0c;--i在使用i之前&#xff0c;先是i的值加&#xff08;减&#xff09;12、i&am…