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

使用thinkphp官方的WeChat包,使用不同模式可以成功,但是安全模式就是不行,现将分析解决结果做下记录。

分析问题:

解密微信服务器消息老是不成功,下载下微信公众平台官方给出的解密文件和WechatCrypt.class.php进行比对发现也没有问题。用file_put_contents函数保存下解密后的文件进行分析。发现官方包解密的xml不是标准的xml格式,所以simplexml_load_string函数无法处理。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

/**

* 对密文进行解密

* @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文件是这样的

1

2

3

4

5

6

7

8

\n

\n

1448944621\n

\n

\n

6223169761311044588\n

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

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

1

2

3

4

5

6

//明文内容

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

//去掉多余的内容

$text=str_replace('

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

return $text;

以上就是在安全模式下对消息的加密解密方法,希望对大家的学习有所帮助。

thinkphp微信开发:安全模式消息加解密

使用thinkphp官方的WeChat包,使用不同模式可以成功,但是安全模式就是不行,现将分析解决结果做下记录. TRight 分析问题: 解密微信服务器消息老是不成功,下载下微信公众平台官方给出的解 ...

thinkphp 导入微信小程序加密解密库

第三方类库 第三方类库指除了 ThinkPHP 框架.应用项目类库之外的其他类库,一般由第三方系统或产品提供,如 Smarty.Zend 等系统的类库等. 前面使用自动加载或 import 方法导入的 ...

微信小程序加密解密 C&num; 以及 填充无效&comma;无法被移除错误的解决方案 Padding is invalid and cannot be removed

解密加密源码 using System; using System.Security.Cryptography; using System.Text; namespace Wechat { publi ...

使用delphi&plus;intraweb进行微信开发4—微信消息加解密

示例代码已经放出!请移步使用delphi+intraweb进行微信开发1~4代码示例进行下载,虽为示例代码但是是从我项目中移出来的,封装很完备适于自行扩展和修改. 在上一讲当中我做了个简单的微信文本消 ...

Senparc&period;Weixin&period;MP SDK 微信公众平台开发教程(十五):消息加密

前不久,微信的企业号使用了强制的消息加密方式,随后公众号也加入了可选的消息加密选项.目前企业号和公众号的加密方式是一致的(格式会有少许差别). 加密设置 进入公众号后台的“开发者中心”,我们可以看到U ...

微信公众号开发--&period;Net Core实现微信消息加解密

1:准备工作 进入微信公众号后台设置微信服务器配置参数(注意:Token和EncodingAESKey必须和微信服务器验证参数保持一致,不然验证不会通过). 2:基本配置 设置为安全模式 3.代码实现 ...

微信公众号开发--用&period;Net Core实现微信消息加解密

1.进入微信公众号后台设置微信服务器配置参数(注意:Token和EncodingAESKey必须和微信服务器验证参数保持一致,不然验证不会通过). 2.设置为安全模式 3.代码实现(主要分为验证接口和 ...

微信小程序&comma;开发中几个重要的知识点&lpar;加密解密&comma;转发&comma;进入场景&comma;session&lowbar;key&rpar;

小程序的授权信息:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/authorize.html 小程序的 ...

随机推荐

bootstrap插件思路整理

知识有时也需温故知新嘛,本次做一次bs插件梳理. $.support.transition 通过判断自定义元素是否支持WebkitTransition.MozTransition.OTransitio ...

&lpar;转&rpar;使用Custom Draw实现ListCtrl的重绘

使用Custom Draw实现ListCtrl的重绘   common control 4.7版本介绍了一个新的特性叫做Custom Draw,这个名字显得模糊不清,让人有点摸不着头脑,而且MSDN里 ...

ASP&period;NET MVC 的URL路由介绍

在这个教程中,向你介绍每个ASP.NET MVC一个重要的特点叫做URL路由.URL路由模块是负责映射从浏览器请求到特定的控制器动作. 在教程的第一部分,你将学习标准路由表如何映射到控制器的动作.在教 ...

mesos资源动态分配测试

测试集群配置 60CPU,320G RAM 测试内容:先运行一个需要60CPU的Application1,再运行一个需要50CPU的Application2. 结果分析 如果要等Application ...

python对json的相关操作

什么是json: JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.易于人阅读和编写.同时也易于机器解析和生成.它基于JavaScript Programm ...

NET5 Web应用程序

ASP.NET5 Web应用程序结构 本文参考ASP.NET5 官方文档 Understanding ASP.NET 5 Web Apps,加入了一些个人理解,理解不对的地方希望大家能指出,互相学习. ...

Oracle 使用

Oracle 日志文件 摘要: 本篇博文呢主要是介绍 Oracle 日志文件的管理, 对 Oracle 日志文件呢,有两个比较关键的名词, 即日志文件组 LogFileGroup 和日志文件 LogF ...

H5C3动画

1 渐变 /* 渐变:不同颜色之间的柔和过渡 线性渐变:沿着某条直线发生渐变效果 注意:渐变准备来说是一张背景图 语法:linear-gradient */ background-image: lin ...

通过递增快照备份 Azure 非托管 VM 磁盘

概述 Azure 存储提供创建 Blob 快照的功能. 快照将捕获该时间点的 Blob 状态. 本文介绍有关如何使用快照维护虚拟机磁盘备份的方案. 如果选择不使用 Azure 备份和恢复服务,但想要为 ...

Android UiAutomator UiDevice API

UiDevice为单例模式 1.获取设备 static UiDevice getInstance() This method is deprecated. Should use getInstance ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值