PHP异步实现微信公众号模板消息的主动推送

# 安装 Composer
curl -sS https://getcomposer.org/installer | php

使用composer.phar客户端将Guzzle作为依赖添加到项目:

php composer.phar require guzzlehttp/guzzle:~6.0

或者,你可以编辑项目中已存在的composer.json文件,添加Guzzle作为依赖:

 {
   "require": {
      "guzzlehttp/guzzle": "~6.0"
   }
}

安装完毕后,你需要引入Composer的自动加载文件:

require 'vendor/autoload.php';
<?php

use GuzzleHttp\Client;

require 'vendor/autoload.php';

/**
 * 使用 Guzzle 异步实现
 */
function test()
{
    $access_token = curl_get('https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=你的app_id&secret=你的app_secret')['access_token'];

    # --------------------------------------------------------------------
    // 返回结果继续执行代码
    ob_end_clean();
    ob_start();

//    $data['code'] = 1;
//    $data['data'] = '';
//    $data['msg'] = '发送中';
//    $data['url'] = '/wxfs.php/wechatfans.send/add';
//    $data['wait'] = 3;
//    echo json_encode($data); // 返回结果给前端

    $size = ob_get_length();
    header("Content-Length: " . $size);
    header("Connection: close");
    header("HTTP/1.1 200 OK");
    header('Content-Type:application/json; charset=utf-8');
    ob_end_flush();
    if (ob_get_length()) {
        ob_flush();
    }
    flush();
    fastcgi_finish_request(); // 响应完成, 立即返回到前端,关闭连接
    ignore_user_abort(true); // 在关闭连接后,继续运行php脚本
//        set_time_limit(0); // 没有时间限制,不设置超时时间(根据实际情况使用)
    # --------------------------------------------------------------------

    $client = new Client();

    $wxUrlForSendingMessage = 'https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=';

    // 单人
//    $touser_arr = array('openid1', 'openid2');
    // 群发
    $touser_arr = Db::table("wxfs")->column("openid");
    $touser_arr = array_reverse($touser_arr);

    $num = 0;

    @unlink(__DIR__ . '/logs.txt');

    foreach ($touser_arr as $v) {
        $response = $client->post($wxUrlForSendingMessage, [
            'query' => [
                'access_token' => $access_token,
            ],
            'json' => [
                'touser' => $v, // 粉丝的openid
                'template_id' => '微信公众号的模板id',
                'url' => 'www.baidu.com',
                'data' => [
                    'first' => [
                        'value' => '标题',
                        'color' => '#173177',
                    ],
                    'keyword1' => [
                        'value' => '项目名称',
                        'color' => '#CC3399',
                    ],
                    'keyword2' => [
                        'value' => '最新状态',
                        'color' => '#CC3399',
                    ],
                    'keyword3' => [
                        'value' => date('Y年m月d日 H:i:s'),
                        'color' => '#CC3399',
                    ],
                    'remark' => [
                        'value' => 备注,
                        'color' => '#FF0000',
                    ]
                ]
            ]
        ]);

        if (json_decode((string)$response->getBody(), true)['errmsg'] === 'ok') {
            $num += 1;

            // 记录到文件
            logs(date('Y-m-d H:i:s') . " [{$v}] 发送成功\r\n");
        }
    }

}

function curl_get($url)
{
    // 初始化
    $curl = curl_init();
    // 设置抓取的url
    curl_setopt($curl, CURLOPT_URL, $url);
    // 设置头文件的信息作为数据流输出
    curl_setopt($curl, CURLOPT_HEADER, 0);
    // 设置获取的信息以文件流的形式返回,而不是直接输出。
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    // 执行命令
    $data = curl_exec($curl);
    // 关闭URL请求
    curl_close($curl);

    if (isset(json_decode($data, true)['errcode'])) {
        return json_decode($data, true);
    } else {
        // 返回数据
        return json_decode($data, true);
    }
}

function logs($str)
{
    // 记录到文件
    if (($fp = fopen(__DIR__ . '/logs.txt', 'a+')) !== false) {
        fputs($fp, $str);
        fclose($fp);
    }
}

### Vue 实现微信公众号推送消息 在Vue项目中集成微信公众号消息推送功能涉及多个方面的工作。为了成功实现这一目标,开发者需遵循特定流程和技术要点。 #### 准备工作 获取必要的凭证是第一步操作的关键所在。这包括申请一个微信公众号,并从中取得`AppID`和`AppSecret`两个重要参数[^2]。这些信息将在后续开发过程中频繁使用到,因此建议妥善保存。 #### 配置服务器端环境 由于微信官方并不直接支持前端发起请求来发送模板消息,所以通常情况下会采用通过后端服务作为中介的方式来进行处理。这意味着,在Vue应用之外还需要搭建一套能够接收来自前端指令并向微信公众平台发出HTTP POST请求的服务逻辑。可以考虑利用Node.js或其他任何适合构建RESTful API的技术栈来创建这样的中间层。 对于具体的接口设计而言,假设已经有一个基于Spring Boot框架建立起来的后台系统,则可以在其中定义如下形式的方法用于触发向指定用户发送通知: ```java @PostMapping("/sendTemplateMessage") public ResponseEntity<String> sendTemplateMessage(@RequestBody Map<String, String> params){ // 处理业务逻辑... } ``` 此部分的具体编码细节取决于所选用的语言及框架特性,请参照相应文档进行调整优化。 #### 前端调用示例 当上述准备工作完成后,便可在Vue组件内部编写相应的函数用来触发表单提交动作或是其他交互行为之后立即调用刚才提到的那个自定义API路径。下面给出了一段简单的JavaScript代码片段展示如何执行异步POST请求: ```javascript async function sendMessage() { try{ const response = await axios.post('/api/sendTemplateMessage',{ "touser": "OPENID", "template_id":"TEMPLATE_ID" }); console.log(response.data); }catch(error){ console.error('Error:', error); } } ``` 请注意替换实际环境中对应的URL地址以及传递给服务器的数据结构以匹配预期输入格式要求。 #### 关于模板消息本身的内容定制化 最后但同样重要的一步是要熟悉并掌握有关于设置个性化文案、链接跳转等功能的知识点。这部分内容可以直接参阅由腾讯公司提供的《[模板消息推送](https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Service_Center_messages.html)》指南中的说明[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

withoutfear

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值