前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用WordPress作为小程序后端——小程序请求前置检查

使用WordPress作为小程序后端——小程序请求前置检查

作者头像
ianzhi
发布2023-10-19 10:18:02
1580
发布2023-10-19 10:18:02
举报
文章被收录于专栏:LNMP开发那些事LNMP开发那些事

使用WordPress作为小程序后端——小程序请求前置检查

小程序默认提供了一个固定格式的referer格式,具体可以参考官方文档:网络请求。如下:

https://servicewechat.com/{appid}/{version}/page-frame.html

由于这个referer是不可以手动设置的,因此透过这个referer,我们可以对请求进行一个简单的前置检查,过滤一些简单的脚本。同时,我们也能通过这个前置检查来了解请求的身份,即小程序APPID,当需要同时支持多个小程序时,这一点还是很有意义的。

一个简单实现

代码语言:javascript
复制
/**
 * 小程序请求通用前置检查
 */
function precheck($referer) {
    $result = preg_match("/^https:\/\/servicewechat\.com\/(.*?)\/(.*?)\/page-frame\.html$/", $referer, $matches);
    if (!$result || empty($matches) || !isset($matches[1]) || !isset($matches[2])) {
        return false;
    }

    return true;
}

在Wordpress中的使用

通过这个简单的函数,我们可以对小程序发起的请求进行一个简单的前置检查。那么如何应用到Wordpress中呢?

通过阅读Wordpress的文档,可以了解注册rest路由的函数是register_rest_route,具体参考文档:register_rest_route。注册路由可以配置三个回调函数,分别是permission_callback,validate_callback和callback。我觉得这个检查更适合用在permission_callback,即当无法通过检查的时候,我们实际上可以认为这是一个非法请求,我们对之前的实现进行一些修改:

代码语言:javascript
复制
/**
 * 小程序请求通用前置检查
 */
function precheck(WP_REST_Request $request) {
    $referer = $request->get_header('referer');
    $result = preg_match("/^https:\/\/servicewechat\.com\/(.*?)\/(.*?)\/page-frame\.html$/", $referer, $matches);
    if (!$result || empty($matches) || !isset($matches[1]) || !isset($matches[2])) {
        return false;
    }

    return true;
}

暂存获取到的APPID和VERSION,方便之后使用

在前面的代码里,我们通过一个简单的正则,对referer进行了一个简单的检查,但是匹配的一些结果我们没有暂存下来,为了方便之后获取APPID和VERSION信息,我们再次扩展一下:

代码语言:javascript
复制
/**
 * 小程序请求通用前置检查
 */
function precheck(WP_REST_Request $request) {
    $referer = $request->get_header('referer');
    $result = preg_match("/^https:\/\/servicewechat\.com\/(.*?)\/(.*?)\/page-frame\.html$/", $referer, $matches);
    if (!$result || empty($matches) || !isset($matches[1]) || !isset($matches[2])) {
        return false;
    }

    $request->set_attributes([
        'app_id' => $matches[1],
        'version' => $matches[2]
    ]);

    return true;
}

封装

为了更方便使用,我们再次进行一点简单的封装。

代码语言:javascript
复制
/**
 * 给所有的路由添加默认的前置检查钩子
 */
function register_wechat_mp_rest_route($route_namespace, $route, $args = [], $override = false) {
    add_filter( 'wechat_mp_permission_callback', precheck, 10, 2 );

    if (isset($args['permission_callback'])) {
        if (!is_array($args['permission_callback'])) {
            $args['permission_callback'] = [ $args['permission_callback'] ];
        }

        foreach ($args['permission_callback'] as $callback) {
            add_filter( 'wechat_mp_permission_callback', $callback, 10 , 2 );
        } 
    }
    $args['permission_callback'] = function (WP_REST_Request $request) {
        return apply_filters( 'wechat_mp_permission_callback', true, $request );
    };
    return register_rest_route($route_namespace, $route, $args, $override);
}

/**
 * 小程序请求通用前置检查
 */
function precheck($permission, WP_REST_Request $request) {
    if ($permission === false) {
        return false;
    }

    $referer = $request->get_header('referer');
    $result = preg_match("/^https:\/\/servicewechat\.com\/(.*?)\/(.*?)\/page-frame\.html$/", $referer, $matches);
    if (!$result || empty($matches) || !isset($matches[1]) || !isset($matches[2])) {
        return false;
    }

    $request->set_attributes([
        'app_id' => $matches[1],
        'version' => $matches[2]
    ]);

    return true;
}

好,到这里,我们的前置检查相关的代码就完成了。下一篇的时候我们来实现一下用户认证。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用WordPress作为小程序后端——小程序请求前置检查
  • 一个简单实现
  • 在Wordpress中的使用
  • 暂存获取到的APPID和VERSION,方便之后使用
  • 封装
相关产品与服务
云开发 CloudBase
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档