在第一部分介绍了编辑模式,但是编辑模式有较大局限性,下面主要开始介绍开发模式,这一部门先简单介绍下开发模式的环境搭建和关键词回复。
开发模式首先要有一个虚拟主机,本人使用的是新浪开发者平台的虚拟主机,使用云豆计算流量,若成为新浪开发者用户基本上就可以免费使用了,本人注册用户所赠送的云豆不知道能用多久。当然国内比较大还有就是百度开发者平台,注册后发现部署还没有新浪的方便,并且在BAE3.0以后好像也是要收费的。有兴趣的朋友可以研究下google的开发者平台,不知道是否要收费。
在注册新浪开发者平台用户后,创建一个相关应用,之后把微信的DEMO代码上传后即可,在操作中即能上传和编辑代码,还是十分方便的。
之后回到微信公众平台主页,填写url地址和Token,并开启开发模式
当出现上面步骤时,表示你已经完成开发模式的部署,但是开发模式和编辑模式只能二选一。
下面对微信的DEMO程序作详细的解释。DEMO程序可以在微信公众平台开发者文档中-》接入指南-》PHP示例代码下载中找到。
<?php
/**
* wechat php test
*/
//define your token
define("TOKEN", "weixin");//与微信公众平台一直,更改后微信公众平台也要随之更改
$wechatObj = new wechatCallbackapiTest();
//$wechatObj->valid();//验证开发模式接口
$wechatObj->responseMsg();//调用回复信息方法
class wechatCallbackapiTest
{
public function valid()//若此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效
{
$echoStr = $_GET["echostr"];
//valid signature , option
if($this->checkSignature()){
echo $echoStr;
exit;
}
}
public function responseMsg()//回复微信的关键
{
//get post data, May be due to the different environments
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];//保存微信端发送的变量,由于发送的是XML格式,使用$_POST无法解析,所以使用$GLOBALS
//extract post data
if (!empty($postStr)){
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);//解析XML格式数据
$fromUsername = $postObj->FromUserName;//微信用户端的用户名
$toUsername = $postObj->ToUserName;//你的公众账号ID
$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";//回复文本信息类型为text文本
//$contentStr = "Welcome to wechat world!";
$contentStr = "欢迎关注微信!";//回复的信息内容,微信文本格式最多支持682个汉字
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);//对XML格式中的变量进行赋值
echo $resultStr;//输出回复信息,即发送微信
}else{
echo "Input something...";
}
}else {
echo "";
exit;
}
}
//开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。
//加密/校验流程如下:
//1. 将token、timestamp、nonce三个参数进行字典序排序
//2. 将三个参数字符串拼接成一个字符串进行sha1加密
//3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
private function checkSignature()
{
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];
$token = TOKEN;
$tmpArr = array($token, $timestamp, $nonce);
sort($tmpArr, SORT_STRING);
$tmpStr = implode( $tmpArr );
$tmpStr = sha1( $tmpStr );
if( $tmpStr == $signature ){
return true;
}else{
return false;
}
}
}
?>
//$wechatObj->valid();//验证开发模式接口
$wechatObj->responseMsg();//调用回复信息方法
对于示例的代码的注释已经在代码中,这里要注意的是,若要自动回复消息,将验证函数注释,并且调用回复信息函数即可。
针对关键词的自动回复,只需要修改responseMsg()函数即可。
public function responseMsg()//回复微信的关键
{
//get post data, May be due to the different environments
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];//保存微信端发送的变量,由于发送的是XML格式,使用$_POST无法解析,所以使用$GLOBALS
//extract post data
if (!empty($postStr)){
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);//解析XML格式数据
$fromUsername = $postObj->FromUserName;//微信用户端的用户名
$toUsername = $postObj->ToUserName;//你的公众账号ID
$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";//回复文本信息类型为text文本
//$contentStr = "Welcome to wechat world!";
//$contentStr = "欢迎关注微信!";//回复的信息内容,微信文本格式最多支持682个汉字
if($keyword == "1"){
$contentStr = "你输入的是1!";
}
else if($keyword == "2"){
$contentStr = "你输入的是2!";
}else{
$contentStr = "你输入的是其他!";
}
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);//对XML格式中的变量进行赋值
echo $resultStr;//输出回复信息,即发生微信
}else{
echo "Input something...";
}
}else {
echo "";
exit;
}
}
sprintf(format,arg1,arg2,arg++)参数 描述
format 必需。转换格式。
arg1 必需。规定插到 format 字符串中第一个 % 符号处的参数。
arg2 可选。规定插到 format 字符串中第二个 % 符号处的参数。
arg++ 可选。规定插到 format 字符串中第三、四等等 % 符号处的参数。