PHP对接微信公众号实现简单自动回复
今天早上花了点时间去网上抄了点代码,功能比较简单,当用户在公众号下留言,将留言的关键词带到数据库查询并返回查询结果。反正是以比较简单的代码做的,代码运行环境随便可以运行PHP就行。
<!DOCTYPE html>
<html>
<body>
<head>
<meta charset="utf-8">
</head>
<?php
require_once "defs.php";
function index()
{
$timestamp = $_GET['timestamp'];
$nonce = $_GET['nonce'];
$token = 'hongming'; //公众号里面配置的token
$signature = $_GET['signature'];
$echostr = $_GET['echostr']; //每一次都要验证, 只有第一次验证才会有 echostr
$array = array( $timestamp, $nonce, $token);
sort( $array );
//2.将排序后的三个参数拼接之后用sha1加密
$tempstr = implode('', $array);
$tempstr = sha1( $tempstr );
//3.将加密后的字符串与signature进行对比,判断该请求是否来自微信
if( $tempstr == $signature && $echostr){ //启动服务器配置 会进入到这里
echo $_GET['echostr'];
exit();
}else{
reponseMsg(); //这里是 启用成功后, 接受事件用的
}
}
function reponseMsg(){
$postStr = file_get_contents("php://input");
//根据事件,进行自己的逻辑代码吧 请开始你的表演
if (!empty($postStr)){
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$fromUsername = $postObj->FromUserName;
$toUsername = $postObj->ToUserName;
$msgtype = $postObj->MsgType;
$keyword = trim($postObj->Content);
$time = time();
$textTpl = "<xml>
<ToUserName><!]></ToUserName>
<FromUserName><!]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><!]></MsgType>
<Content><!]></Content>
<FuncFlag>0<FuncFlag>
</xml>";
if(!empty( $keyword ) & $msgtype == "text") //文本判断
{
$msgType = "text";
$contentStr = sousuo($keyword);
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
echo $resultStr;
}
if($msgtype=='event'){ // 关注判断
$msgType = "text";
$contentStr = "感谢您的关注!";
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
echo $resultStr;
}
else // 其他类型消息判断
{
$msgType = "text";
$contentStr = "回复关键词可以查询影视资源哦!";
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
echo $resultStr;
}
}
}
index();
?>
</body
</html>
其他的可以去看看官方的开发文档。
<?php
//-----可配置区域开始-------------
//微信令牌,请与微信公众号后台同步
define("TOKEN", "weixin");
//解析地址
define("API", "你的解析地址");
//显示数量
define("NUM", "5");
//公众号名称
define("TITLE", "橙子影视");
//默认图片
define("PIC", "默认图片地址");
//留言本地址
define("BOOK", "留言本地址");
//-----可配置区域结束-------------
$wechatObj = new wechatCallbackapiTest();
$wechatObj->valid();
class wechatCallbackapiTest
{
public function CheckUrl($url)
{
return preg_match('/(http|https|ftp):\/\/[\w.]+[\w\/]*[\w.]*\??[\w=&\+\%]*/is',$url);
}
public function valid()
{
$echoStr = $_GET["echostr"];
if($echoStr==""){
$this->responseMsg();
}elseif($this->checkSignature()){
echo $echoStr;
exit;
}
}
public function responseMsg(){
$postStr = addslashes(file_get_contents('php://input')); if (empty($postStr)){exit("你好!请关注【".TITLE."】微信公众号获取服务");}
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$fromUsername = $postObj->FromUserName;
$toUsername = $postObj->ToUserName;
$time=$postObj->CreateTime;
$keyword = trim($postObj->Content);
$event = $postObj->Event;
$textTpl = "<xml><ToUserName><!]></ToUserName><FromUserName><!]></FromUserName><CreateTime>%s</CreateTime><MsgType><!]></MsgType><Content><!]></Content></xml>";
$newsTpl = "<xml><ToUserName><!]></ToUserName><FromUserName><!]></FromUserName><CreateTime>%s</CreateTime> <MsgType><!]></MsgType> <ArticleCount>1</ArticleCount><Articles><item><Title><!]></Title> <Description><!]></Description><PicUrl><!]></PicUrl><Url><!]></Url></item></Articles></xml>";
switch($postObj->MsgType){
case 'event':
if($event == 'subscribe'){
//关注后的回复
$contentStr = "欢迎关注".TITLE."\r\n本公众号提供在线影视观看,免广告看VIP视频,持续关注,精彩多多。\r\n输入格式:\r\n 1.输入电影名,如: 西游记 即可在线观看!\r\n2.输入视频网址,支持爱奇艺,优酷,腾讯等主流视频网站免VIP播放。\r\n3.回复数字:\r\n 【0】 显示帮助\r\n 【1】打开留言板";
$msgType = 'text';
$textTpl = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
echo $textTpl;
break;
}
case 'text':
//输入文字
if(preg_match('/[\x{4e00}-\x{9fa5}]+/u',$keyword))
{
$result = file_get_contents(API."/api.php?tp=json&wd=".$keyword);
$result= json_decode($result,true);
if($result &&$result["success"]){
$txt .="恭喜,成功找到视频,请点击播放:\r\n\n";
$i=1;
foreach( $result["info"] as $row){
$title = $row['title'];
$url=API."/?wd=".urlencode($title)."&id=".$row['id']."&flag=".$row['flag']."&type=".$row['type'];
$url=self::getContentLink($url);
$pic= $row['pic'];
$txt .= "<a href='".$url."'>·".urldecode($title)."</a>\r\n\n";
$i++;
if($i>NUM){break;}
}
$contentStr = $txt.'<a href="'.API."/?wd=".$keyword.'">【更多】...</a>';
$msgType = 'text';
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
echo $resultStr;
} else{
//没有查找到的时候的回复
$title = "资源未找到,点击图片留言反馈! ";
$des1 ="";
//图片地址
$picUrl1 =PIC;
//跳转链接
$url=self::getContentLink(BOOK);
$resultStr= sprintf($newsTpl, $fromUsername, $toUsername, $time, $title, $des1, $picUrl1, $url) ;
echo $resultStr;
}
//其他
}else if($this->CheckUrl($keyword)){
$title = '点击开始播放';
$des1 ="";
//图片地址
$picUrl1 =PIC;
//跳转链接
$url=API."/?url=".$keyword."";
$url=self::getContentLink($url);
$resultStr= sprintf($newsTpl, $fromUsername, $toUsername, $time, $title, $des1, $picUrl1, $url) ;
echo $resultStr;
}else if($keyword=="0"){
$contentStr = "欢迎关注".TITLE."\r\n本公众号提供在线影视观看,免广告看VIP视频,持续关注,精彩多多。\r\n输入格式:\r\n 1.输入电影名,如: 西游记 即可在线观看!\r\n2.输入视频网址,支持爱奇艺,优酷,腾讯等主流视频网站免VIP播放。\r\n3.回复数字:\r\n 【0】 显示帮助\r\n 【1】打开留言板";
$msgType = 'text';
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
echo $resultStr;
}else if($keyword=="1" ){
$title = '点击打开留言板';
$des1 ="";
//图片地址
$picUrl1 =PIC;
//跳转链接
$url=self::getContentLink(BOOK);
$resultStr= sprintf($newsTpl, $fromUsername, $toUsername, $time, $title, $des1, $picUrl1, $url) ;
echo $resultStr;
}else{
$contentStr = "输入格式:\r\n 1.输入电影名,如: 西游记 即可在线观看!\r\n2.输入视频网址,支持爱奇艺,优酷,腾讯等主流视频网站免VIP播放。\r\n 3.回复数字:\r\n 【0】 显示帮助\r\n 【1】打开留言板";
$msgType = 'text';
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
echo $resultStr;
};
break;
default:
break;
}// switch end
}
private function checkSignature(){
// you must define TOKEN by yourself
if (!defined("TOKEN")) {
throw new Exception('TOKEN is not defined!');
}
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];
$token = TOKEN;
$tmpArr = array($token, $timestamp, $nonce);
// use SORT_STRING rule
sort($tmpArr, SORT_STRING);
$tmpStr = implode( $tmpArr );
$tmpStr = sha1( $tmpStr );
if( $tmpStr == $signature ){
return true;
}else{
return false;
}
}
private function getContentLink($url){
$api="http://api.t.sina.com.cn/short_url/shorten.json?source=2815391962&url_long=";
$result = file_get_contents($api.$url);
$result= json_decode($result,true);
return $result["url_short"];
}
} hlwdsg 发表于 2020-3-2 23:58
请教楼主,我把他复制到新浪云index.php了,为什么一直都说token验证失败呢?token也改的一样,require_onc ...
这个验证好像我当时写出问题了,你可以去看看微信官方那里是这么验证的 谢谢分享哈 谢谢分享哈{:1_887:} 没有defs.php 可以跑起来? 公众号本身不是有设置自动回复的吗 感谢分享! hsx778899 发表于 2019-12-15 15:51
公众号本身不是有设置自动回复的吗
我数据库里有一万条数据,我们总不能一个个设置回复吧 ajal 发表于 2019-12-15 15:43
没有defs.php 可以跑起来?
那是文件是我放数据库查询函数的,可以删了 楼主,请问有简易的教程吗?:loveliness: 像使用下 小白表示不懂怎么用