返回顶部
首页 > 问答 > 后端 > 如何在ThinkPHP中实现微信公众号自定义菜单扫码推事件且弹出“消息接收中”提示框功能?
0
待解决

如何在ThinkPHP中实现微信公众号自定义菜单扫码推事件且弹出“消息接收中”提示框功能?

  • 匿名发布
  • 2023-05-09
  • 发布在 问答/后端
20

其他回答1

小马甲3呀小马甲

2023-06-14

在ThinkPHP中实现微信公众号自定义菜单扫码推事件且弹出“消息接收中”提示框功能,可以按照以下步骤进行:

1.在微信公众平台中,设置自定义菜单,并将菜单中的某个按钮设置为扫码推事件。

2.在ThinkPHP中,创建一个处理微信服务器请求的控制器,并在该控制器中编写处理扫码推事件的代码。

例如,以下是一个处理扫码推事件的方法:

public function scan(){
    // 获取扫描的二维码参数
    $sceneId = $this->request->param("scene_id");
    // 返回“消息接收中”提示框
    echo "<xml><ToUserName><![CDATA[".$this->request->param("openid")."]]></ToUserName><FromUserName><![CDATA[".WECHAT_APPID."]]></FromUserName><CreateTime>".time()."</CreateTime><MsgType><![CDATA[transfer_customer_service]]></MsgType></xml>";
}

在该方法中,我们获取了扫描的二维码参数(即扫描的场景值ID),并返回了一个XML格式的文本,该文本会触发微信客户端显示“消息接收中”提示框,并将消息转发给客服。

3.在微信公众平台中,将扫码推事件的响应动作设置为“接口URL”,并填写该控制器的URL地址。

4.在控制器中,可以根据需要进一步处理用户发送的消息,例如回复文本消息、图文消息等。

参考代码如下:

<?php
namespace appwechatcontroller;

use thinkController;

class Wechat extends Controller
{
    // 处理微信服务器请求
    public function index()
    {
        // 验证消息来源是否合法
        $this->checkSignature();
        // 获取POST数据
        $xml = file_get_contents("php://input");
        // 将XML转换为对象
        $data = simplexml_load_string($xml, "SimpleXMLElement", LIBXML_NOCDATA);
        // 判断消息类型并分发处理
        switch ($data->MsgType) {
            case "event":
                // 处理事件消息
                $this->handleEvent($data);
                break;
            case "text":
                // 处理文本消息
                $this->handleText($data);
                break;
            // 其他类型的消息,可以根据需要进行处理
        }
    }

    // 处理事件消息
    private function handleEvent($data)
    {
        switch ($data->Event) {
            case "subscribe":
                // 用户关注事件
                // 可以回复欢迎消息等
                break;
            case "SCAN":
                // 用户已关注时的扫描事件
                // 可以根据扫描的参数进行相应的处理
                $this->scan();
                break;
            // 其他类型的事件,可以根据需要进行处理
        }
    }

    // 处理文本消息
    private function handleText($data)
    {
        // 可以根据用户发送的文本内容进行相应的处理
        // 例如回复相应的文本消息、图文消息等
    }

    // 处理扫码推事件
    public function scan(){
        // 获取扫描的二维码参数
        $sceneId = $this->request->param("scene_id");
        // 返回“消息接收中”提示框
        echo "<xml><ToUserName><![CDATA[".$this->request->param("openid")."]]></ToUserName><FromUserName><![CDATA[".WECHAT_APPID."]]></FromUserName><CreateTime>".time()."</CreateTime><MsgType><![CDATA[transfer_customer_service]]></MsgType></xml>";
    }

    // 验证消息来源是否合法
    private function checkSignature()
    {
        $signature = $this->request->param("signature");
        $timestamp = $this->request->param("timestamp");
        $nonce = $this->request->param("nonce");
        $token = WECHAT_TOKEN;
        $tmpArr = array($token, $timestamp, $nonce);
        sort($tmpArr, SORT_STRING);
        $tmpStr = implode($tmpArr);
        $tmpStr = sha1($tmpStr);
        if ($tmpStr != $signature) {
            exit("error");
        }
    }
}
相关文章
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作