生活百科
leo




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

二、编写后端接收与处理程序(以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>
提示:以上代码中的<>使用了全角符号代替,使用时,自行替换为半角符号。
致于别的脚本语言的后端,就由你们自己去写了。

查看移动版
← 扫码查看移动版【转发给朋友】或【分享到朋友圈】
1、查看方法:使用手机微信扫描二维码,打开本页移动端页面。
2、分享方法:在打开的本页移动端页面,点击右上角的“...”,选择【转发给朋友】或【分享到朋友圈】即可。
2、分享方法:在打开的本页移动端页面,点击右上角的“...”,选择【转发给朋友】或【分享到朋友圈】即可。

关注公众号