thinkphp微信开发:安全模式消息加解密
使用thinkphp官方的WeChat包,使用不同模式可以成功,但是安全模式就是不行,现将分析解决结果做下记录。
分析问题:
解密微信服务器消息老是不成功,下载下微信公众平台官方给出的解密文件和WechatCrypt.class.php进行比对发现也没有问题。保存下解密后的文件进行分析。发现解密后有转义符,需要处理一下,所以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;
安全模式就能正常使用了。
thinkphp微信开发:安全模式消息加解密的更多相关文章
- thinkphp微信开发(消息加密解密)
使用thinkphp官方的WeChat包,使用不同模式可以成功,但是安全模式就是不行,现将分析解决结果做下记录. 分析问题: 解密微信服务器消息老是不成功,下载下微信公众平台官方给出的解密文件和Wec ...
- 使用delphi+intraweb进行微信开发4—微信消息加解密
示例代码已经放出!请移步使用delphi+intraweb进行微信开发1~4代码示例进行下载,虽为示例代码但是是从我项目中移出来的,封装很完备适于自行扩展和修改. 在上一讲当中我做了个简单的微信文本消 ...
- 微信公众号开发--.Net Core实现微信消息加解密
1:准备工作 进入微信公众号后台设置微信服务器配置参数(注意:Token和EncodingAESKey必须和微信服务器验证参数保持一致,不然验证不会通过). 2:基本配置 设置为安全模式 3.代码实现 ...
- 微信公众号开发--用.Net Core实现微信消息加解密
1.进入微信公众号后台设置微信服务器配置参数(注意:Token和EncodingAESKey必须和微信服务器验证参数保持一致,不然验证不会通过). 2.设置为安全模式 3.代码实现(主要分为验证接口和 ...
- Java企业微信开发_05_消息推送之被动回复消息
一.本节要点 1.消息的加解密 微信加解密包 下载地址:http://qydev.weixin.qq.com/java.zip ,此包中封装好了AES加解密方法,直接调用方法即可. 其中,解 ...
- Java企业微信开发_05_消息推送之发送消息(主动)
一.本节要点 1.发送消息与被动回复消息 (1)流程不同:发送消息是第三方服务器主动通知微信服务器向用户发消息.而被动回复消息是 用户发送消息之后,微信服务器将消息传递给 第三方服务器,第三方服务器接 ...
- Java企业微信开发_04_消息推送之发送消息(主动)
源码请见: Java企业微信开发_00_源码及资源汇总贴 一.本节要点 1.发送消息与被动回复消息 (1)流程不同:发送消息是第三方服务器主动通知微信服务器向用户发消息.而被动回复消息是 用户发送消息 ...
- 微信开发之消息接收与回复--weixin-java-tools
一.前言 在上一篇文章<微信开发之如何使用开发工具--weixin-java-tools>中我给各位介绍了weixin-java-tools,并且介绍了如何使用weixin-java-to ...
- 微信公众号-加解密数据demo坑
demo里面的MsgSignature作为url参数一部分了,demo也不更新下 坑爹的微信! 解密信息部分 include_once "wxBizMsgCrypt.php"; $ ...
随机推荐
- No1_4.数组的基本操作_Java学习笔记
import java.util.Arrays; public class HelloArrayOp { public static void main(String[] args) { // TOD ...
- 为js数组扩展方法
(function(global,undefined){ //javascript冒泡排序,直接添加到基础类型Array的原型上 Function.prototype.method = functio ...
- Linux系统的命令别名功能
命令别名功能在管理和维护Linux系统的过程中,将会使用到大量命令,有一些很长的命令或用法经常被用到,重复而频繁地输入某个很长命令或用法是不可取的.这时可以使用命令别名功能将这个过程简单化. 1.系统 ...
- python3.4+pyspider爬58同城(二)
之前使用python3.4+selenium实现了爬58同城的详细信息,这次用pyspider实现,网上搜了下,目前比较流行的爬虫框架就是pyspider和scrapy,但是scrapy不支持pyth ...
- 重读LPTHW-Lesson1-14
1.python print 可以用"Hello World",也可以用'Hello World',或者”””Hello World ””” 2.要打印在一行,可以在改行后加英文逗 ...
- Python变量和数据类型
十六进制用0x前缀和0-9 a-f表示 字符串是以''或""括起来的任意文本 一个布尔值只有True和False两种值 布尔值可以用and or not运算 空值是 ...
- C语言--关键字 typedef
一.typedef 1.基本使用 1> typedef 在基本数据类型中的使用 typedef int MyInt; // 相当于给 int 起了一个别名 typedef MyInt MyInt ...
- google浏览器翻译失败解决方案
用记事本打开 C:\Windows\System32\drivers\etc下hosts文件 在文件末尾加入如下两行 203.208.46.145 translate.google.com 203.2 ...
- Ubuntu14.0.4 64位 ADT 连接手机调试问题
1:使用 lsusb 命令查看USB 设备 y@y:~$ lsusbBus 001 Device 002: ID 8087:8000 Intel Corp. Bus 001 Device 001: I ...
- Arcgis api For silverlight 加载高德地图
原文 http://www.cnblogs.com/thinkaspx/archive/2012/11/13/2767752.html 地图仅供演示,研究使用.如要商用 请联系厂商. public c ...