微信公众平台-发送被动响应消息-PHP示例
<?php $testObj = new Test(); if(!empty($_GET['echostr'])){ $testObj->valid(); }else{ $testObj->responseMsg(); } exit; class Test { /** * 绑定url、token信息 */ public function valid(){ $echoStr = $_GET["echostr"]; if ($this->checkSignature()) { echo $echoStr; } exit(); } /** * 检查签名,确保请求是从微信发过来的 */ private function checkSignature() { $signature = $_GET["signature"]; $timestamp = $_GET["timestamp"]; $nonce = $_GET["nonce"]; $token = "test123";//与在微信配置的token一致,不可泄露 $tmpArr = array($token, $timestamp, $nonce); sort($tmpArr); $tmpStr = implode( $tmpArr ); $tmpStr = sha1( $tmpStr ); if( $tmpStr == $signature ){ return true; }else{ return false; } } /** * 接收消息,并自动发送响应信息 */ public function responseMsg(){ //验证签名 if ($this->checkSignature()){ $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; $this->log_request_info(); //提取post数据 if (!empty($postStr)){ $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); $fromUsername = $postObj->FromUserName;//发送人 $toUsername = $postObj->ToUserName;//接收人 $MsgType = $postObj->MsgType;//消息类型 $MsgId = $postObj->MsgId;//消息id $time = time();//当前时间做为回复时间 //如果是文本消息(表情属于文本信息) if($MsgType == 'text'){ $content = trim($postObj->Content);//消息内容 if(!empty( $content )){ //如果文本内容是图文,则回复图文信息,否则回复文本信息 if($content == "图文"){ //回复图文消息,ArticleCount图文消息个数,多条图文消息信息,默认第一个item为大图 $ArticleCount = 2; $newsTpl = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[%s]]></MsgType> <ArticleCount>%s</ArticleCount> <Articles> <item> <Title><![CDATA[%s]]></Title> <Description><![CDATA[%s]]></Description> <PicUrl><![CDATA[%s]]></PicUrl> <Url><![CDATA[%s]]></Url> </item> <item> <Title><![CDATA[%s]]></Title> <Description><![CDATA[%s]]></Description> <PicUrl><![CDATA[%s]]></PicUrl> <Url><![CDATA[%s]]></Url> </item> </Articles> </xml>"; $resultStr = sprintf($newsTpl, $fromUsername, $toUsername, $time, 'news', $ArticleCount,'我是图文信息','我是描述信息','http://www.test.com/DocCenterService/image?photo_id=236', 'http://www.test.com','爱城市网正式开通上线','描述2','http://jn.test.com/ac/skins/img/upload/img/20131116/48171384568991509.png', 'http://www.test.com'); echo $resultStr; $this->log($resultStr); }else{ //回复文本信息 $textTpl = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[%s]]></MsgType> <Content><![CDATA[%s]]></Content> <FuncFlag>0</FuncFlag> </xml>"; $contentStr = '你发送的信息是:接收人:'.$toUsername.',发送人:'.$fromUsername.',消息类型:'.$MsgType.',消息内容:'.$content.' www.icity365.com'; $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, 'text', $contentStr); echo $resultStr; $this->log($resultStr); } }else{ echo "Input something..."; $this->log($resultStr); } //如果是图片消息 }elseif ($MsgType == 'image'){ $MediaId = $postObj->MediaId;//图片消息媒体id,可以调用多媒体文件下载接口拉取数据。 $imageTpl = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[%s]]></MsgType> <Image> <MediaId><![CDATA[%s]]></MediaId> </Image> </xml>"; $resultStr = sprintf($imageTpl, $fromUsername, $toUsername, $time, $MsgType, $MediaId); echo $resultStr; $this->log("自动响应图片信息"); $this->log($resultStr); //如果是视频 }else if($MsgType == 'video'){ $MediaId = $postObj->MediaId;//视频消息媒体id,可以调用多媒体文件下载接口拉取数据。 $ThumbMediaId = $postObj->ThumbMediaId;//视频消息缩略图的媒体id,可以调用多媒体文件下载接口拉取数据。 $videoTpl = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[%s]]></MsgType> <Video> <MediaId><![CDATA[%s]]></MediaId> <ThumbMediaId><![CDATA[%s]]></ThumbMediaId> <Title><![CDATA[%s]]></Title> <Description><![CDATA[%s]]></Description> </Video> </xml>"; $resultStr = sprintf($videoTpl, $fromUsername, $toUsername, $time, $MsgType, $MediaId,$ThumbMediaId,'我是标题','我是描述'); echo $resultStr; $this->log("自动响应视频信息".$ThumbMediaId); $this->log($resultStr); //如果是地理位置 }else if($MsgType == 'location'){ $Location_X = $postObj->Location_X;//维度 $Location_Y = $postObj->Location_Y;//经度 $Scale = $postObj->Scale;//地图缩放大小 $Label = $postObj->Label;//地里位置信息 //回复文本信息 $textTpl = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[%s]]></MsgType> <Content><![CDATA[%s]]></Content> <FuncFlag>0</FuncFlag> </xml>"; $msgType = "text"; $contentStr = '经度:'.$Location_Y.',维度:'.$Location_X.',地图缩放大小'.$Scale.',地理位置信息:'.$Label; $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr); echo $resultStr; $this->log($resultStr); //如果是事件 }else if($MsgType == 'event'){ $Event = $postObj->Event; //subscribe(关注,也叫订阅) if($Event == 'subscribe'){ $EventKey = $postObj->EventKey;//事件KEY值,qrscene_为前缀,后面为二维码的参数值 //未关注时,扫描二维码 if(!empty($EventKey)){ $Ticket = $postObj->Ticket;//二维码的ticket,可用来换取二维码图片 $this->log($fromUsername.'扫描二维码关注!EventKey='.$EventKey.',Ticket='.$Ticket); }else{ $this->log($fromUsername.'关注我了!'); } //unsubscribe(取消关注) }elseif ($Event == 'unsubscribe'){ $this->log($fromUsername.'取消关注我了!'); //已关注时,扫描二维码事件 }elseif($Event == 'SCAN' || $Event == 'scan'){ $EventKey = $postObj->EventKey;//事件KEY值,是一个32位无符号整数,即创建二维码时的二维码scene_id $Ticket = $postObj->Ticket;//二维码的ticket,可用来换取二维码图片 $this->log($fromUsername.'关注我了!EventKey='.$EventKey.',Ticket='.$Ticket); //菜单点击事件 }elseif($Event == 'CLICK'){ $EventKey = $postObj->EventKey;//事件KEY值,与自定义菜单接口中KEY值对应 //回复文本信息 $textTpl = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[%s]]></MsgType> <Content><![CDATA[%s]]></Content> <FuncFlag>0</FuncFlag> </xml>"; $contentStr = '你点击了菜单,菜单项key='.$EventKey; $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, 'text', $contentStr); echo $resultStr; $this->log($resultStr); //其他事件类型 }else{ $this->log('事件类型:'.$Event); } //其他消息类型,链接、语音等 }else{ //回复文本信息 $textTpl = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[%s]]></MsgType> <Content><![CDATA[%s]]></Content> <FuncFlag>0</FuncFlag> </xml>"; $contentStr = '消息类型:'.$MsgType.'我们还没做处理。。。。【爱城市网】'; $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, 'text', $contentStr); echo $resultStr; $this->log($resultStr); } }else { echo ""; exit; } }else{ $this->log("验证签名未通过!"); } } /** * 记录请求信息 */ function log_request_info() { $post = ''; foreach($_POST as $key => $value) { $post = $post.$key.' : '.$value.' , '; } $get = ''; foreach($_GET as $key => $value) { $get = $get.$key.' : '.$value.' , '; } $this->log("get信息:".$get); $this->log("post信息:".$post); } /** * 记录日志 * @param $str * @param $mode */ function log($str){ $mode='a';//追加方式写 $file = "log.txt"; $oldmask = @umask(0); $fp = @fopen($file,$mode); @flock($fp, 3); if(!$fp) { Return false; } else { @fwrite($fp,$str); @fclose($fp); @umask($oldmask); Return true; } } } ?>

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

感谢网友情切琛思、HH_KK、石原里美幸福、华南吴彦祖的线索投递!9月2日消息,近期有传言称“iPhone16可能不支持微信”,对此贝壳财经记者致电苹果官方热线,苹果中国区技术顾问回应称,关于iOS系统或苹果设备能否继续使用微信,以及微信能否继续在苹果应用商店上架和下载的问题,需要苹果公司与腾讯之间进行沟通和探讨,才能确定之后的情况。软件应用商店及微信问题说明软件应用商店技术顾问指出,软件在苹果商店上架可能需要开发者支付费用。达到一定下载量后,后续下载需向苹果支付相应费用。苹果正与腾讯积极沟通,

DeepSeek:强大的AI图像生成利器!DeepSeek本身并非图像生成工具,但其强大的核心技术为众多AI绘画工具提供了底层支持。想知道如何利用DeepSeek间接生成图片吗?请继续阅读!利用基于DeepSeek的AI工具生成图像:以下步骤将引导您使用这些工具:启动AI绘画工具:在您的电脑、手机浏览器或微信小程序中搜索并打开一个基于DeepSeek的AI绘画工具(例如,搜索“简单AI”)。选择绘画模式:选择“AI绘图”或类似功能,并根据您的需求选择图片类型,例如“动漫头像”、“风景

微信支持iPhone16谣言被辟谣感谢网友西窗旧事、HH_KK的线索投递!9月2日消息,今日有传言称,微信可能不支持iPhone16,iPhone一旦升级到iOS18.2系统将无法使用微信。据《每日经济新闻》从知情人士处获悉,此传言为谣言。苹果回应另据贝壳财经报道,苹果中国区技术顾问回应称,关于iOS系统或苹果设备能否继续使用微信,以及微信能否继续在苹果应用商店上架和下载的问题,需要苹果公司与腾讯之间进行沟通和探讨,才能确定之后的情况。目前,苹果正与腾讯积极沟通,以确认腾讯是否会继续向苹果应用商

Gate.io,一家创立于 2013 年的领先加密货币交易平台,为中国用户提供了完整的中文官方网站。该网站提供广泛的服务,包括现货交易、期货交易和借贷,并提供中文界面、丰富的资源和社区支持等特色功能。

OKX 交易平台提供了各种类型的费率,包括交易费用、提款费用和融资费用。对于现货交易,交易费用根据交易量和 VIP 等级而有所不同,采取“做市商模式”,即市场每笔交易收取较低的手续费。此外,OKX 还提供了多种类型的期货合约,包括币本位合约、USDT 合约和交割合约,每种合约的费用结构也有所不同。

Gate.io(芝麻开门)是全球领先的加密货币交易平台,本文提供Gate.io现货交易完整教程。教程涵盖账户注册登录、KYC认证、法币及数字货币充值、交易对选择、限价/市价交易下单以及订单和交易记录查看等步骤,助您快速上手Gate.io平台进行加密货币交易。 无论是新手还是老手,都能从本教程中获益,轻松掌握Gate.io交易技巧。

Gateio 交易所 app 老版本下载渠道,涵盖官方、第三方应用市场、论坛社区等途径,还给出下载注意事项,帮你轻松获取老版本,解决新版本使用不适或设备兼容问题。

本文提供国内安全下载欧易OKX App的详细指南。由于国内应用商店限制,建议用户通过欧易OKX官方网站下载App,或使用官网提供的二维码扫描下载。下载过程中,务必核实官网地址,检查应用权限,安装后进行安全扫描,并启用双重验证。 使用过程中,请遵守当地法律法规,使用安全网络环境,保护账户安全,警惕诈骗,理性投资。 本文仅供参考,不构成投资建议,数字资产交易风险自负。
