衡阳28生活网   切换城市   |   您好,欢迎来到衡阳28生活网!
今天是:
 
生活百科
 
 
leo
  12级
帖子:89
精华:0
积分:178
注册:2015-12-14

 

微信公众号机器人如何开发?服务器端以PHP为例

发表于 2025-03-22 17:51   |   浏览:12214 次   |   顺序看帖 楼主    1 楼
微信公众号(服务号)机器人如何开发?服务器端以PHP为例

一,设置微信公众号
1、首先,登录微信公众号(服务号)管理后台
2、选择【设置与开发】》【开发接口管理】》【基本配置】》服务器配置
3、输入“服务器地址(URL)”,即您的后台需要接收与处理公众号用户发送的消息的网址
4、输入“令牌(Token)”,可随意填写,必须为英文或数字,长度为3-32字符
5、输入“消息加解密密钥 (EncodingAESKey)”,可任意输入43位字符,范围为A-Z,a-z,0-9,也可随机生成
6、选择“消息加解密方式”,可选择明文模式、兼容模式、安全模式等三者之一

微信公众号机器人如何开发?服务器端以PHP为例 - 生活百科 - 衡阳生活社区 - 衡阳28生活网 hy.28life.com

二、编写后端接收与处理程序(以PHP为例),直接上代码

<?
//接收用户发送给微信公众号【服务号】的消息
//////////////////////////////////////////////////////////////////////

////用于第一次服务器配置,直接返回echostr
////这个echostr呢  只有说验证的时候才会echo  如果是验证过之后这个echostr是不存在的字段了
// $echoStr = $_GET["echostr"];
// echo $echoStr;

//////////////////////////////////////////////////////////////////////

$str = gmdate("Y-m-d H:i:s", time()+8*3600)."\n";
$str .= '【用户】'.$_GET["openid"]."\n";
$str .= '接收的GET内容:'.json_encode($_REQUEST)."\n";
$getXmlData = file_get_contents('php://input'); //接收微信公众号(服务号)发送过来的XML内容
$str .= '接收的XML内容:'.$getXmlData."\n";

//初始化变量
$toUserName = ""; //公众号:原始ID
$fromUserName = ""; //消息来自用户Openid
$createTime = ""; //时间
$msgType = ""; //消息类型:text
$content = ""; //用户发来的消息内容
$msgId = ""; //消息MsgId

//下面是获取到的相关内容
if (!empty($getXmlData)){
$postObj = simplexml_load_string($getXmlData, 'SimpleXMLElement', LIBXML_NOCDATA);
//$str .= '接收的postObj内容:'.json_encode($postObj)."\n";
$toUserName = trim($postObj->ToUserName); //公众号:原始ID
$fromUserName = trim($postObj->FromUserName); //消息来自用户Openid
$createTime = trim($postObj->CreateTime); //时间
$msgType = trim($postObj->MsgType); //消息类型:text
$content = trim($postObj->Content); //用户发来的消息内容
$msgId = trim($postObj->MsgId); //消息MsgId

$str .= "ToUserName:".$toUserName."\n";
$str .= "FromUserName:".$fromUserName."\n";
$str .= "CreateTime:".$createTime."\n";
$str .= "MsgType:".$msgType."\n";
$str .= "Content:".$content."\n";
$str .= "MsgId:".$msgId."\n";
}

//获取到用户发送的消息后,要做的事情
$msg = "这里是通过获取到用户发来的content内容进行分析,然后要回复给用户的消息";
$str .= "【回复用户消息】".$msg."\n";
$str .= Reply_Msg(trim($fromUserName), $msg);//回复用户消息
Write_Log($str); //写日志,这个只是为了查看获取到的数据,可以省略不要

//////////////////////////////////////////////////////////////////////////////////////////////////////
//获取access_token
function getToken(){
$file = '/wx_gzh/WX_access_token.json';  //保存access_token的文件路径
$token = json_decode(get_file($file),true); //读取access_token文件数据
if ($token['expires_time'] < time()+8*3600) { //如果已过时,则重新获取
$access_token = accessToken(); //重新获取access_token
}else{
$access_token = $token['access_token']; //使用旧的access_token
}
return $access_token;
}

//生成access_token
function accessToken() {
$appid = '******************'; //公众号里面的 AppID 
$appsecret = '******************'; //公众号里面的秘钥 AppSecret
$accessTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appid."&secret=".$appsecret;
$accessTokenData = file_get_contents($accessTokenUrl);  //获取access_token
$accessTokenObj = json_decode($accessTokenData, true); //转换为对象
$accessToken = $accessTokenObj["access_token"];
$file = '/wx_gzh/WX_access_token.json';
     $access_token['access_token'] = $accessToken;
     $access_token['expires_time'] = time()+8*3600 + 7200;
set_file($file, json_encode($access_token)); //写入access_token数据到文件
return $accessToken;
}

//回复用户消息
function Reply_Msg($fromUserName, $msg){
$accessToken = getToken(); //获取access_token
$url = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=".$accessToken;
$data = '{"touser":"'.trim($fromUserName).'","msgtype":"text","text":{"content":"'.$msg.'"}}';
$result = postOpenSSL($url, $data); //回复消息
return '系统回复用户返回的result的内容:'.$result."\n";
}

//写日志
function Write_Log($str){
$file = "get_msg.txt";
$fp = fopen($file,'a+');
$str .= "\n";
fwrite($fp, $str);
fclose($fp);
}

//POST数据
function postOpenSSL($url, $data){
$ch = curl_init();
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, $url);
$headerArr = array('Content-Type: application/json', 'Content-Length: ' . strlen($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, $headerArr);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}

//获取文件内容
function get_file($file) {
return trim(file_get_contents($file));
}

//写入文件内容
function set_file($file, $data){
$fp = fopen($file, 'w');
fwrite($fp, $data);
fclose($fp);
}
?>

获取到的内容大致是:
【用户Openid】oxG9G7L***********JIwEQX8
接收的GET内容:{"signature":"6d409958a*****2307056a70","timestamp":"1742635252","nonce":"1203889189","openid":"oxG9G7L***********JIwEQX8"}
接收的XML内容:
<xml><ToUserName><![CDATA[gh_****63f6]]></ToUserName>
<FromUserName><![CDATA[oxG9G7L***********JIwEQX8]]></FromUserName>
<CreateTime>1742635251</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[用户发送的消息]></Content>
<MsgId>24948****55675</MsgId>
</xml>

提示:以上代码中的<>使用了全角符号代替,使用时,自行替换为半角符号。

致于别的脚本语言的后端,就由你们自己去写了。

 
 
 
|< < >
 
我来回复:
 
您需要登录后才可以回帖 登录注册