零基础基于PHP搭建推送服务函数,轻松推送消息至个人(团队)微信

在编写项目,“灾难级”错误日志,还是以邮箱形式提醒开发团队?试试搭建APi接口,直接微信告诉开发团队吧~

推送服务函数

推送服务函数,或者说推送服务器功能。有些抽象,一些人可能并不知道具体含义。其实,本篇文章,是基于方糖推送生态下的开源项目,搭建自己的推送服务。

Server酱

Server酱,英文名「ServerChan」,是一款「手机」和「服务器」、「智能设备」之间的通信软件。

通俗地说:就是从服务器、路由器等设备上推消息到手机的工具

零基础基于PHP搭建推送服务函数,轻松推送消息至个人(团队)微信
Server酱

自建推送

Server酱,作为一款推送服务,因为其易于使用、部署简单,用户数也越来越多,甚至有时候服务器奔溃维护。所以,自建推送也就有其必要,这个自建推送项目,本身也是基于方糖推送生态下的开源项目:

  • 向个人微信、团队企业微信推送消息
  • 无API响应次数限制(Server酱免费版本开始限制单日响应次数)
零基础基于PHP搭建推送服务函数,轻松推送消息至个人(团队)微信
工作原理

本身这个推送,不受限于任何语言,只是:本次图文使用PHP在腾讯云轻量应用服务器上搭建推送API。

效果演示

场景1:评论回复通知

在我们搭建Hexo静态博客过程中,使用自己的推送服务(搭建在腾讯云轻量应用服务器上的PHP应用)在其他用户评论时,对博主进行提醒。实际效果:

零基础基于PHP搭建推送服务函数,轻松推送消息至个人(团队)微信
使用效果

场景2:服务告罄通知

一般,我们开发项目,比如:图形识别、文字识别等,都是使用第三方平台提供的API接口,比如:腾讯云人工智能-图像识别,可以直接使用其API放到我们的项目中:

零基础基于PHP搭建推送服务函数,轻松推送消息至个人(团队)微信
腾讯云API接口实现

当我们API使用次数用完,我们也可以使用我们的推送服务,推送到我们自己的微信,提醒我们及时续费。

前期准备

前期准备很简单,在硬件层面,我们需要一台服务器:

其软件层面,我们需要:

  • PHP7或PHP7以上版本
  • Nginx(用于配合PHP,完成WEB服务)

宝塔安装

个人推荐使用宝塔来完成LENP的环境部署,先到宝塔官网注册账号,然后你可以在腾讯云轻量应用服务器内,直接选择宝塔镜像:

零基础基于PHP搭建推送服务函数,轻松推送消息至个人(团队)微信
选择宝塔镜像

也可以,自己选择应用镜像后,使用宝塔官网提供的一键脚本进行安装。

最后,到软件商店安装PHP和Nginx即可:

零基础基于PHP搭建推送服务函数,轻松推送消息至个人(团队)微信
安装PHP和Nginx

手动安装

当然,你也可以自己安装Nginx和PHP:

1. Nginx安装

Nginx的安装,我在另外一篇文章有详细介绍:

2. PHP安装

这个过于复杂,且我还没有出文章教程细说,建议参考PHP官网和Nginx官网:

申请微信接口

轻量应用服务器上部署Nginx和PHP即可,用于提供平台支持,同时我们还需要申请微信接口,也就是API,用于对个人(团队)微信进行推送,注意:

  • 微信接口申请,实际上是申请企业微信的接口。但是个人也可以申请。
  • 后期可以选择微信接收推送,实际使用不需要多下载安装一个企业微信在手机上。

1. 应用创建

进入企业微信官网,注册一个企业微信。创建好后。我们选择应用管理,并创建一个应用:

零基础基于PHP搭建推送服务函数,轻松推送消息至个人(团队)微信
创建应用

2. 获取AgentId和Secret

创建好后,我们获取应用AgentId和Secret:

零基础基于PHP搭建推送服务函数,轻松推送消息至个人(团队)微信
获取AgentId和Secret

3. 获取企业ID

进入我的企业页面,拉到最下边,可以看到企业ID:

零基础基于PHP搭建推送服务函数,轻松推送消息至个人(团队)微信
企业ID

4. 绑定个人微信

如果你并不想保留企业微信在手机上,想直接推送消息到自己的个人微信,可以进入「我的企业」 → 「微信插件」,拉到下边扫描二维码,关注以后即可收到推送的消息:

零基础基于PHP搭建推送服务函数,轻松推送消息至个人(团队)微信
绑定个人微信

5. 小结

通过以上过程,你将获得的参数:

  • WECOM_CID:步骤3中获取的企业ID
  • WECOM_SECRET:步骤2中获取的应用Secret
  • WECOM_AID:步骤2中获取的应用AgentId

这些参数将在下文使用到。

编辑PHP函数

现在,我们开始编辑PHP函数,考虑到大部分人使用宝塔面板,本次在轻量应用服务器上也使用宝塔面板

1. 新建网站

我们以网站的形式,去实现我们的函数功能,新建一个基于PHP的网站:

零基础基于PHP搭建推送服务函数,轻松推送消息至个人(团队)微信
新建网站

其中:

  • 域名:有域名解析到服务器则填域名,否则填服务器IP即可
  • PHP版本:使用PHP7以上版本的PHP

2. 新建函数

打开网站的根目录

零基础基于PHP搭建推送服务函数,轻松推送消息至个人(团队)微信
打开网站根目录

之后,新建index.php:

零基础基于PHP搭建推送服务函数,轻松推送消息至个人(团队)微信
新建index.php

3. 编辑函数

更具wecomchan项目,我们编辑函数index.php函数:

<?php
// config
// ======================================
define('SENDKEY', 'set_a_sendkey');
define('WECOM_CID', '企业微信公司ID');
define('WECOM_SECRET', '企业微信应用Secret');
define('WECOM_AID', '企业微信应用ID');
define('WECOM_TOUID', '@all');

// 以下配置需要有 redis 服务和 phpredis 扩展
define('REDIS_ON', false);
define('REDIS_HOST', '127.0.0.1');
define('REDIS_PORT', '6379');
define('REDIS_EXPIRED', '7000');
define('REDIS_KEY', 'wecom_access_token');

// code
// ======================================

if (strlen(@$_REQUEST['sendkey'])  < 1
    || strlen(@$_REQUEST['text'])  < 1 || @$_REQUEST['sendkey'] != SENDKEY
) {
    die('bad params');
}

header("Content-Type: application/json; charset=UTF-8");
echo send_to_wecom(@$_REQUEST['text'], WECOM_CID, WECOM_SECRET, WECOM_AID, WECOM_TOUID);


function redis()
{
    if (!isset($GLOBALS['REDIS_INSTANCE']) || !$GLOBALS['REDIS_INSTANCE']) {
        $GLOBALS['REDIS_INSTANCE'] = new Redis();
        $GLOBALS['REDIS_INSTANCE']->connect(REDIS_HOST, REDIS_PORT);
    }

    return $GLOBALS['REDIS_INSTANCE'];
}

function send_to_wecom($text, $wecom_cid, $wecom_secret, $wecom_aid, $wecom_touid = '@all')
{
    $access_token = false;
    // 如果启用redis作为缓存
    if (REDIS_ON) {
        $access_token = redis()->get(REDIS_KEY);
    }

    if (!$access_token) {
        $info = @json_decode(file_get_contents("https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=".urlencode($wecom_cid)."&corpsecret=".urlencode($wecom_secret)), true);
                
        if ($info && isset($info['access_token']) && strlen($info['access_token']) > 0) {
            $access_token = $info['access_token'];
        }
    }
    
    if ($access_token) {
        $url = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token='.urlencode($access_token);
        $data = new \stdClass();
        $data->touser = $wecom_touid;
        $data->agentid = $wecom_aid;
        $data->msgtype = "text";
        $data->text = ["content"=> $text];
        $data->duplicate_check_interval = 600;

        $data_json = json_encode($data);
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        @curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_TIMEOUT, 5);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data_json);

        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        
        $response = curl_exec($ch);
        if ($response !== false && REDIS_ON) {
            redis()->set(REDIS_KEY, $access_token, ['nx', 'ex'=>REDIS_EXPIRED]);
        }
        return $response;
    }
    
    
    return false;
}
零基础基于PHP搭建推送服务函数,轻松推送消息至个人(团队)微信
编辑函数

其中,注意修改题头:

  • SENDKEY:自定义内容,类似token验证
  • WECOM_CID:上文步骤中获取的企业ID
  • WECOM_SECRET:上文步骤中获取的应用Secret
  • WECOM_AID:上文步骤中获取的应用AgentId

更更改好参数,即可使用。

测试使用

因为PHP是JIT语言,所以我们保持之后即可使用,正常情况下,应该是代码工程内对我们搭建的这个API接口进行Get、Post操作,而我们这次测试使用,就直接使用浏览器对API接口进行Get操作:

零基础基于PHP搭建推送服务函数,轻松推送消息至个人(团队)微信
浏览器测试

其中:

  • SENDKEY:为上文定义内容,类似于token
  • text:为要推送的消息
零基础基于PHP搭建推送服务函数,轻松推送消息至个人(团队)微信
效果

END

这样,我们的腾讯云轻量应用服务器又多了一个新功能,但是这样的操作,并不是最佳的。因为,我们还可以使用Redis去存Token,进而加快接口响应时间,不过这都是后话了。有机会给大家分享。

PS:大家搭建这个推送服务,会用于自己的什么项目里呢?

作者:Mintimate

Mintimate’s Blog:https://www.mintimate.cn

本文来自腾讯云计算社区,转载请注明出处:https://computeinit.com/archives/3959

发表评论

登录后才能评论
交流群