用 php 开发微信公众号,这段代码可以实现自动回复吗?

尽头2nxszn98 2016-09-16 10:39:36
我是看网易云课堂讲的,在微信官方提供的测试代码中,把如下代码的第 9 行替换成 10-14 行就可以实现自动回复,
<?php
/**
* wechat php test
*/

//define your token
define("TOKEN", "Akatsuki");
$wechatObj = new wechatCallbackapiTest();
// $wechatObj->valid();
if(isset($_GET["echostr"])){
$wechatObj->valid();
}else{
$wechatObj->responseMsg();
}

class wechatCallbackapiTest
{
public function valid()
{
$echoStr = $_GET["echostr"];

//valid signature , option
if($this->checkSignature()){
// header('content-type:text');
echo $echoStr;
exit;
}
}

public function responseMsg()
{
//get post data, May be due to the different environments
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

//extract post data
if (!empty($postStr)){
/* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection,
the best way is to check the validity of xml by yourself */
libxml_disable_entity_loader(true);
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$fromUsername = $postObj->FromUserName;
$toUsername = $postObj->ToUserName;
$keyword = trim($postObj->Content);
$time = time();
$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>";
if(!empty( $keyword ))
{
$msgType = "text";
$contentStr = "Welcome to wechat world!";
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
echo $resultStr;
}else{
echo "Input something...";
}

}else {
echo "";
exit;
}
}

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;
}
}
}

?>

但我试了试并没有什么效果啊,难道是我哪里写错了吗?
...全文
447 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
lanshs 2016-09-23
  • 打赏
  • 举报
回复
当你在微信平台填写你的资料,包括你的url,进行提交的时候,微信服务器会给你的URL发送一个get请求 get请求包含参数为 signature 微信加密签名 timestamp 时间戳 nonce 随机数 echostr 随机字符串 前三个是加密验证用的,你的对象中checkSignature方法就是用前三个参数来验证。 至于第四个参数echostr,正常使用微信的时候,不会含有这个参数。只有微信进行这个url验证的时候才有这个参数。 这就不难理解10-14行的目的了: 当存在echostr的时候,这是微信在进行url验证,你的url写对了没,token是否正确,确保这是你的东西。 微信服务器要求,验证的时候,也就是存在echostr的时候,请返回echostr,也就是原样输出echostr 那么if判断,存在echostr,调用valid方法,该方法返回echostr。当然,输出之前,要先check一下。 要使得能够自动回复,这时候已经是正在使用当中了,不是验证url而已了,当然参数中不带echostr的。 那么if判断,不存在echostr,调用responseMsg方法,该方法返回信息“Welcome to wechat world!”的微信文本信息,为xml。 第10-14行的作用就是判断现在是在做url验证,还是要回复文本信息。
justS0 2016-09-18
  • 打赏
  • 举报
回复


官网的xml格式 你对比下看看 没有你的 <FuncFlag>0</FuncFlag> 这项 去掉试试

另外 你的url token什么的配置对吗,把你接收到的文本打印下 $postStr 这个参数 你发消息看看有值吗 先定位下为题
鱼在飞哦 2016-09-18
  • 打赏
  • 举报
回复
我也用过这段代码,结果用微信接口测试文本消息,总显示错误原因为not xml format,成功或失败是解密失败。

20,398

社区成员

发帖
与我相关
我的任务
社区描述
“超文本预处理器”,是在服务器端执行的脚本语言,尤其适用于Web开发并可嵌入HTML中。PHP语法利用了C、Java和Perl,该语言的主要目标是允许web开发人员快速编写动态网页。
phpphpstorm 技术论坛(原bbs)
社区管理员
  • 开源资源社区
  • phpstory
  • xuzuning
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧