在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");
}
}
}