作者:念 | 来源:互联网 | 2023-05-17 20:31
微信Api入口主要负责处理微信公众平台请求微擎系统的关键字、图片、语音等数据,入口文件是“api.php”。此入口只用于公众平台访问。此入口主要完成以下工作:1.初始化当前公众
微信Api入口主要负责处理微信公众平台请求微擎系统的关键字、图片、语音等数据,入 口文件是 “api.php”。此入口只用于公众平台访问。此入口主要完成以下工作:
1. 初始化当前公众号的数据
2.解析公众平台推送过来的数据结构,转化为微擎消息结构
3.根据消息结构中的关键字或是事件匹配到相应的模块
4. 调用模块的processor类返回数据给微信公共平台
/**
* 对消息进行加密,并生成签名,返回签名的函数
*/
public function encrypt() {
global $_W;
if(empty($this->account)) {
exit('Miss Account.');
}
$timestamp = TIMESTAMP; //当前时间戳
//随机数,因为要验证数据的安全性,为了防伪造,防止窃取上次请求的数据
$nOnce= random(5);
$token = $_W['account']['token'];
//(timestamp+token+signkey+nonce可以防止攻击)
$signkey = array($token, TIMESTAMP, $nonce);
//sort()函数对数组进行升序排序,把每一项当字符串来处理
sort($signkey, SORT_STRING);
//implode()返回由数组元素组成的字符串
$signString = implode($signkey);
//对返回的数组元素的字符串进行加密再和signature比较判断是否来自微信服务器请求
$signString = sha1($signString);//shal计算字符串的散列进行加密
$_GET['timestamp'] = $timestamp;
$_GET['nonce'] = $nonce;
$_GET['signature'] = $signString;
//读取的文件的内容
$postStr = file_get_contents('php://input');
//在加密模式中,增加了两个参数:encrypt_type(加密的方式) 和 msg_signature(解密,得到消息的内容)
/*
body体中的内容:
encryptData是加密后的信息
*/
//用EncodingAESKey, Token, 以及自动生成的AppID,通过加密算法,可以验证信息的真实性,并且将真实的信息,解析成如明文的格式的XML
//$_W['setting']['development'] 1为开词开发模式,0为关系,开发模式时会显示系统错误信息
if(!empty($_W['account']['encodingaeskey']) && strlen($_W['account']['encodingaeskey']) == 43 && !empty($_W['account']['key']) && $_W['setting']['development'] !=1) {
//对字符串进行加密
$data = $this->account->encryptMsg($postStr);
$array = array('encrypt_type' => 'aes', 'timestamp' => $timestamp, 'nonce' => $nonce, 'signature' => $signString, 'msg_signature' => $data[0], 'msg' => $data[1]);
} else {
$data = array('', '');
$array = array('encrypt_type' => '', 'timestamp' => $timestamp, 'nonce' => $nonce, 'signature' => $signString, 'msg_signature' => $data[0], 'msg' => $data[1]);
}
exit(json_encode($array));
}
/**
* 对消息进行解密,并验证签名,返回解密后的信息的函数
*/
//解密函数,strlen()返回字符串的长度
public function decrypt() {
global $_W;
if(empty($this->account)) {
exit('Miss Account.');
}
//把文件读入字符串中
$postStr = file_get_contents('php://input');
if(!empty($_W['account']['encodingaeskey']) && strlen($_W['account']['encodingaeskey']) == 43 && !empty($_W['account']['key']) && $_W['setting']['development'] != 1) {
//对字符串进行解密
$resp = $this->account->local_decryptMsg($postStr);
} else {
$resp = $postStr;
}
exit($resp);
}