微信接口(一)创建菜单自动回复

news/2024/7/7 19:18:16 标签: 数据库, php

刚划拉完微信。做一个笔记这里的数据是写死的,还有一份是通过查询数据库进行自动回复,自定义菜单设置的。不过因为使用到数据库,最好在网站后台吧微信平台开发集成进去。所以代码较多就先不放了。有问题的地方请留言,我也学习一下。

 

<?php
/*
* @author;dou
*/
//token值(令牌),与公众平台设置一致
define("TOKEN", "dou");
$wechatObj = new wechatCallbackapiTest();
if (!isset($_GET['echostr'])) {
$wechatObj->responseMsg();
}else{
$wechatObj->valid();
}
class wechatCallbackapiTest
{
//验证签名
public function valid()
{
$echoStr = $_GET["echostr"];
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];
$token = TOKEN;
$tmpArr = array($token, $timestamp, $nonce);
sort($tmpArr, SORT_STRING);
$tmpStr = implode($tmpArr);
$tmpStr = sha1($tmpStr);
if($tmpStr == $signature){
echo $echoStr;
exit;
}
}

//响应消息
public function responseMsg()
{
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
if (!empty($postStr)){
//$access_token = $this->get_access_token();//获取access_token
//$this->logger("getmenu \r\n".$this->getmenu($access_token));
$this->createmenu($access_token);//创建菜单
//获得菜单
//$this->logger("getmenu \r\n".$this->getmenu($access_token));
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$RX_TYPE = trim($postObj->MsgType);
if (($postObj->MsgType == "event") && ($postObj->Event == "subscribe" || $postObj->Event == "unsubscribe")){
//过滤关注和取消关注事件
}else{
}

//消息类型分离
switch ($RX_TYPE)
{
case "event":
$result = $this->receiveEvent($postObj);
break;
case "text":
$result = $this->receiveText($postObj);
break;
default:
$result = "unknown msg type: ".$RX_TYPE;
break;
}
echo $result;
}else {
echo "";
exit;
}
}

//接收事件消息
private function receiveEvent($object)
{
$content = "";
switch ($object->Event)
{
case "subscribe":
$content = "测试内容:欢迎关注";
break;
case "unsubscribe":
$content = "取消关注";
break;
default:
$content = "no message!!!";
break;
}

if(is_array($content)){
if (isset($content[0]['PicUrl'])){
$result = $this->transmitNews($object, $content);
}
}else{
$result = $this->transmitText($object, $content);
}
return $result;
}

//接收文本消息
private function receiveText($object)
{
$keyword = trim($object->Content);
if (strstr($keyword, "1")||strstr($keyword, "2")||strstr($keyword, "3")||strstr($keyword, "4")||strstr($keyword, "5")||strstr($keyword, "6")){
$content = "测试内容:[文字信息]自动回复";
}
else if (strstr($keyword, "11") || strstr($keyword, "22") ){
$content = array();
$content[] = array("Title"=>"[图文消息]标题", "Description"=>"详情信息", "PicUrl"=>"demo.jpg", "Url" =>"http://mp.weixin.qq.com/s");
}else{
$content="";
$content = date("Y-m-d H:i:s",time())."\nOpenID:".$object->FromUserName."\ndou";
}
if(is_array($content)){
if (isset($content[0])){
$result = $this->transmitNews($object, $content);
}
}else{
$result = $this->transmitText($object, $content);
}
return $result;
}


//回复文本消息
private function transmitText($object, $content)
{
if (!isset($content) || empty($content)){
return "";
}
$xmlTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>";
$result = sprintf($xmlTpl, $object->FromUserName, $object->ToUserName, time(), $content);

return $result;
}

//回复图文消息
private function transmitNews($object, $newsArray)
{
if(!is_array($newsArray)){
return "";
}
$itemTpl = " <item>
<Title><![CDATA[%s]]></Title>
<Description><![CDATA[%s]]></Description>
<PicUrl><![CDATA[%s]]></PicUrl>
<Url><![CDATA[%s]]></Url>
</item>
";
$item_str = "";
foreach ($newsArray as $item){
$item_str .= sprintf($itemTpl, $item['Title'], $item['Description'], $item['PicUrl'], $item['Url']);
}
$xmlTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<ArticleCount>%s</ArticleCount>
<Articles>
$item_str </Articles>
</xml>";

$result = sprintf($xmlTpl, $object->FromUserName, $object->ToUserName, time(), count($newsArray));
return $result;
}


/


private function get_access_token()
{
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=*&secret=*";
$data = json_decode(file_get_contents($url),true);
if($data['access_token']){
return $data['access_token'];
}else{
return "获取access_token错误";
}
}

 

//自定义菜单
public function createmenu($access_token)
{
$url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=".$access_token;
$arr = array(
'button' =>array(
array(
'name'=>urlencode("菜单1"),
'sub_button'=>array(
array(
'name'=>urlencode("子菜单1"),
'type'=>'view',
'url'=>'http://www.baidu.com'
),
)),
)
);


$jsondata = urldecode(json_encode($arr));

$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$jsondata);
curl_exec($ch);
curl_close($ch);
}


private function getmenu($access_token)
{
$url = "https://api.weixin.qq.com/cgi-bin/menu/get?access_token=".$access_token;
$data = file_get_contents($url);
return $data;
}

}
?>

 

<--------个人原创|转载注明逗子|新手适用|大手勿喷|--------->

转载于:https://www.cnblogs.com/douz/p/7098700.html


http://www.niftyadmin.cn/n/1124557.html

相关文章

CBWFQ

为f0/0进入的流量&#xff0c;分配4M带宽送出到f0/1-------f0/0--R1---f0/1-----------> ------>R1:ip cefclass-map match-all bb2inmatch input-interface f0/0policy-map limit4mclass bb2inpolice 4000000 750000 1500000 conform-action transmit exce…

在ASP.NET中支持断点续传下载大文件(ZT)

IE的自带下载功能中没有断点续传功能&#xff0c;要实现断点续传功能&#xff0c;需要用到HTTP协议中鲜为人知的几个响应头和请求头。 一. 两个必要响应头Accept-Ranges、ETag 客户端每次提交下载请求时&#xff0c;服务端都要添加这两个响应头&#xff0c;以保证客户端…

Unix整理笔记-超级无敌常用命令杂谈1-里程碑M6

1 Unix命令可以分成两部分&#xff1a;命令本身和追加给它的参数。在使用一个命令时&#xff0c;必须了解该命令的默认行为。 2 无论一个命令的参数是合并还是独立添加&#xff0c;该命令都产生相同的输出。 3 man,info,apropos 帮助命令 4 apropos检查是否安装了某个软件包&am…

windows命令行下用netsh实现端口转发(端口映射)

为什么80%的码农都做不了架构师&#xff1f;>>> 微软Windows的netsh是一个命令行脚本实用工具。使用netsh工具 &#xff0c;可以查看或更改本地计算机或远程计算机的网络配置。不仅可以在本地计算机上运行这些命令&#xff0c;而且可以在网络上的远程计算机上运行。…

二叉查找树实现源码

看了《算法导论》上的第12章二叉查找树&#xff0c;现把对二叉树的几种操作罗列如下&#xff0c;实现的描述见代码注释。#include <iostream>usingnamespacestd;classNode{public:intkey; Node*left; Node*right; Node*parent; Node(intk);};classBinarySearchTree{publi…

php 同类标签用颜色区分,JavaScript随机生成颜色标签,要怎么避免出现相近的颜色以及灰色?...

实际需求是生成随机颜色的标签&#xff0c;但是要求颜色较为鲜艳&#xff0c;不要出现黑色灰色 以及太接近背景颜色的白色。我刚用vue写了一个demo&#xff1a;new Vue({el: #app,methods: {randomRgb: function () {var R Math.floor(Math.random() * 255);var G Math.floor…

国人对国产软件的几个误区[转载]

前日&#xff0c;与一位在软件业做事的朋友聊天&#xff0c;说到国人对国产软件的一些认识和看法&#xff0c;以及国产软件面临的诸多困难&#xff0c;本人亦颇为感慨。不能说所有人对国产软件都有微词&#xff0c;这里仅就某一些人某一些误区谈些看法。 一、外国软件比国产软件…

P1314 聪明的质监员

题目描述 小T 是一名质量监督员&#xff0c;最近负责检验一批矿产的质量。这批矿产共有 n 个矿石&#xff0c;从 1到n 逐一编号&#xff0c;每个矿石都有自己的重量 wi 以及价值vi 。检验矿产的流程是&#xff1a; 1 、给定m 个区间[Li,Ri]&#xff1b; 2 、选出一个参数 W&…