
已有的ThinkWechat.class.php的类中有如下的代码:
/**
* * 响应微信发送的信息(自动回复)
* @param string $to 接收用户名
* @param string $from 发送者用户名
* @param array $content 回复信息,文本信息为string类型
* @param string $type 消息类型
* @param string $flag 是否新标刚接受到的信息
* @return string XML字符串
*/
public function response($content, $type = 'text', $flag = 0){
/* 基础数据 */
$this->data = array(
'ToUserName' => $this->data['FromUserName'],
'FromUserName' => $this->data['ToUserName'],
'CreateTime' => NOW_TIME,
'MsgType' => $type,
);
/* 添加类型数据 */
$this->$type($content);
/* 添加状态 */
$this->data['FuncFlag'] = $flag;
/* 转换数据为XML */
$xml = new SimpleXMLElement('<xml></xml>');
$this->data2xml($xml, $this->data);
exit($xml->asXML());
}
/**
* 回复文本信息
* @param string $content 要回复的信息
*/
private function text($content){
$this->data['Content'] = $content;
}
/**
* 回复音乐信息
* @param string $content 要回复的音乐
*/
private function music($music){
list(
$music['Title'],
$music['Description'],
$music['MusicUrl'],
$music['HQMusicUrl']
) = $music;
$this->data['Music'] = $music;
}
/**
* 回复图文信息
* @param string $news 要回复的图文内容
*/
private function news($news){
$articles = array();
foreach ($news as $key => $value) {
list(
$articles[$key]['Title'],
$articles[$key]['Description'],
$articles[$key]['PicUrl'],
$articles[$key]['Url']
) = $value;
if($key >= 9) { break; } //最多只允许10调新闻
}
$this->data['ArticleCount'] = count($articles);
$this->data['Articles'] = $articles;
}
/**
* 数据XML编码
* @param object $xml XML对象
* @param mixed $data 数据
* @param string $item 数字索引时的节点名称
* @return string
*/
private function data2xml($xml, $data, $item = 'item') {
foreach ($data as $key => $value) {
/* 指定默认的数字key */
is_numeric($key) && $key = $item;
/* 添加子元素 */
if(is_array($value) || is_object($value)){
$child = $xml->addChild($key);
$this->data2xml($child, $value, $item);
} else {
if(is_numeric($value)){
$child = $xml->addChild($key, $value);
} else {
$child = $xml->addChild($key);
$node = dom_import_simplexml($child);
$node->appendChild($node->ownerDocument->createCDATASection($value));
}
}
}
}
/**
* 对数据进行签名认证,确保是微信发送的数据
* @param string $token 微信开放平台设置的TOKEN
* @return boolean true-签名正确,false-签名错误
*/
private function auth($token){
/* 获取数据 */
$data = array($_GET['timestamp'], $_GET['nonce'], $token);
$sign = $_GET['signature'];
/* 对数据进行字典排序 */
sort($data);
/* 生成签名 */
$signature = sha1(implode($data));
return $signature === $sign;
}
}WeixinAction的部分代码如下: public function index(){
/* 加载微信SDK */
import('@.Action.ThinkWechat');
$weixin = new ThinkWechat('hoshn');
/* 获取请求信息 */
$data = $weixin->request();
/* 获取回复信息 */
// 这里的回复信息是通过判断请求内容+自行定制的, 不在 SDK范围内,请自行完成
list($content, $type) = $this->reply($data);
$arr=M('info')->data($data)->add();
//天气
if(substr($data['Content'],0,6) == '天气'){
$content = _getWeather($data['Content']);
$type = 'text';
//翻译
}else if(substr($data['Content'],0,6) == '翻译'){
$content = _fanyi($data['Content']);
$type = 'text';
//快递
}else if(substr($data['Content'],0,6) == '快递'){
$content = _getDindan($data['Content']);
$type = 'text';
//小黄鸡
}else if(substr($data['Content'],0,1) == '@'){
$content = _xiaohuangji($data['Content']);
$type = 'text';
//帮助
}else {
$content="";
}
/* 响应当前请求 */
$weixin->response($content, $type);
}
private function reply($data){
if('text' == $data['MsgType']){
$reply = array($data['Content'], 'text');
} elseif('event' == $data['MsgType'] && 'subscribe' == $data['Event']){
$reply = array('欢迎您关注...!', 'text');
} else {
exit;
}
return $reply;
}求达人帮忙指点改成可以回复成图文(如上图)的代码,我改了很多次都没成功,头都大了。另外,谢谢以上代码的提供者~
最佳答案