WeEngine源码分析(1)

本文介绍了WeEngine框架中的日志系统配置与使用方法,以及全局变量$_W的具体内容,包括公众号信息的获取与处理流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是关于WeEngine的第一篇文章。欲善其事,先利其器,这篇文章先不做源码分析,而是先把一些辅助的结构建立起来。


一,日志系统

data/config.php 
$config['setting']['development'] = 1;

有了日志之后,调试将会事半功倍。打印日志的方法:

source/modules/engine.php
public static function logging($level = 'info', $message = '') 
其中level可以是任意字符串。推荐使用error,warn,info,trace几个字符表示不同级别。例如:
WeUtility::logging('warn', 'Request Failed');
日志输出样例:

2014-04-03 19:57:30 trace :
------------
Array:
from : otP7TjgEgLrOKzp9TGuMx6x;
to : gh_765067e402 ;
time : 1396526250 ;
type : CLICK ;
event : CLICK ;
tousername : gh_765067e402 ;
fromusername : otP7TjgEgLrOKzp9TGuMx6x ;
createtime : 1396526250 ;
msgtype : event ;
eventkey : huodongzhaoji ;

2014-04-03 19:57:30 params :
------------
Array:
module : default ;
rule : -1 ;

2014-04-03 19:57:30 response :
------------
Array:
FromUserName : gh_765067e402 ;
ToUserName : otP7TjgEgLrOKzp9TGuMx6x ;
MsgType : news ;
ArticleCount : 2 ;
Articles : Array ;

调试时,可以用下面的命令持续观察日志最新输出:

tailf data/logs/xxxxxxx.log


二,全局变量

source/bootstarp.api.inc.php 
global $_W; 
此乃WeEngine精华所在。下面分述各个字段。
$_W['account']

$sql = "SELECT * FROM " . tablename('wechats') . " WHERE `hash`=:hash LIMIT 1";
$_W['account'] = pdo_fetch($sql, array(':hash' => $_GPC['hash']));
$_W['account']['default_message'] = iunserializer($_W['account']['default_message']);
$_W['account']['access_token'] = iunserializer($_W['account']['access_token']);
$_W['account']['payment'] = iunserializer($_W['account']['payment']);
wechats表记录的是公众账号信息,如下图所示。WeEngine比较强大的地方之一是可以管理多个公众号。 每个公众号都有一个唯一标示id:weid。下例中只存了一个公众号,weid编号为1.

从上面的代码中可知$_W['account']中保存了公众号的所有信息。其中default_message、access_token、payment三个参数是以 序列化的方式存入到wechats表中,所以读出的时候需要反序列化一下。
对于微信和易信分别使用了不同的序列化类,见source/class/weixin.account.class.php fetch_token():
if (empty($this->account['key']) || empty($this->account['secret'])) {
    message('请填写公众号的appid及appsecret, (需要你的号码为微信服务号)!', create_url('account/post', array('id' => $this->account['weid'])), 'error');
}
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$this->account['key']}&secret={$this->account['secret']}";
$content = ihttp_get($url);
if(is_error($content)) {
    message('获取微信公众号授权失败, 请稍后重试!错误详情: ' . $content['message']);
}
$token = @json_decode($content['content'], true);
if(empty($token) || !is_array($token) || empty($token['access_token']) || empty($token['expires_in'])) {
    message('获取微信公众号授权失败, 请稍后重试! 公众平台返回原始数据为: <br />' . $content['meta']);
}
$record = array();
$record['token'] = $token['access_token'];
$record['expire'] = TIMESTAMP + $token['expires_in'];
$row = array();
// 序列化token,并更新到数据库中
$row['access_token'] = iserializer($record);
pdo_update('wechats', $row, array('weid' => $this->account['weid']));
return $record['token'];

还有几个变量很重要,源码中会经常遇到,用到的时候再详细介绍。
$_W['account']['modules'] = array();
$_W['setting'] = (array)cache_load("setting");
$_W['config']

还有个特别常见的:$_W['fans'],详见source/bootstarp.mobile.inc.php。首先从cookie中读出__msess变量,然后就可以计算出fans的唯一id了。浏览器关闭后这个cookie变量就会自动消失。即使取消了对微信号的关注,只要没有关闭过微信,则一些需要权限的URL还是可以在一段时间内打开。


We7官方关于全局变量有更详细的描述, 详见这里

参考链接

### 实现Laravel Lumen与WeEngine Token交互 为了实现在Laravel Lumen框架中与WeEngine(微擎)框架之间的Token交互,可以遵循以下方法: #### 配置服务提供者 在`bootstrap/app.php`文件内注册一个新的服务提供者用于处理来自WeEngine的请求验证。这一步骤确保了每次HTTP请求都能被适当过滤并校验Token的有效性。 ```php $app->register(App\Providers\AuthServiceProvider::class); ``` #### 创建中间件 定义一个自定义中间件来拦截所有进入API端点之前到达路由层之前的请求,并从中提取出必要的认证信息如Token参数[^1]。 ```php <?php namespace App\Http\Middleware; use Closure; use Illuminate\Support\Facades\Log; class VerifyWeEngineToken { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { // 获取token值 $token = $request->input('access_token'); if (empty($token)) { Log::error("Access denied due to missing or invalid access token."); return response()->json(['message' => 'Invalid credentials'], 401); } try { // 进行实际的token验证逻辑... // 如果成功则继续执行后续操作 return $next($request); } catch (\Exception $e) { Log::error($e->getMessage()); return response()->json(['message' => 'Unauthorized action.'], 403); } } } ``` #### 设置路由保护 通过修改`routes/web.php`或相应的路由配置文件,在特定路径前加上刚才创建好的中间件名称作为前置条件之一,从而强制这些受保护资源仅允许携带有效Token访问。 ```php $router->group(['middleware' => ['verify.weengine.token']], function () use ($router) { // 受保护的API接口列表 }); ``` #### 处理Token交换过程中的异常情况 考虑到网络延迟或其他不可预见因素可能导致临时性的连接失败等问题发生时应给予合理的错误提示给前端开发者以便快速定位问题所在位置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值