微信公众号与微信客户端之间的通信机制如下图所示:
公众账号需要根据不同微信用户的不同消息做出不同的响应,所以每一个公众账号需要开发自己独有的系统,这套系统需要运行在公网环境下,但是我们通常普通开发人员没有这个条件,所以我选择了新浪云(天真的我以为是免费的,结果花了10个小洋)。
第一步 注册微信公众账号
我用已有的微信号,扫码即可得到一个
第二步 注册新浪云
微信公众平台提供了一个php示例代码:http://mp.weixin.qq.com/mpres/htmledition/res/wx_sample.zip
下载下来,解压缩,打开编辑。将token值设置为你所需要的值,token可由开发者任意填写,用作生成签名。所以这里我选择PHP,之前我从来没写过PHP。
如上图所示,点击weixin->管理应用,然后点击 应用->代码管理 上传公众号后台系统的代码。(因为我也是刚开始学,所以没有修改示例程序,直接上传wx_sample.zip)
上面的基本上是我从网上搜集到的材料,但是下面这个坑,自己踩了将近3个小时,我看网上很多人也遇到了相同的问题。就是URL和Token都设置好了,而且确认无误,但是点击提交以后,提示配置错误。找了一些材料,首先用记事本把wx_sample.php的编码改成了utf-8,但是有人用BOM头的问题,所以用ultra-edit另存为utf-8无BOM,终于才提交通过。
现在你就可以用你自己的微信号给公众号发消息,并且编写自己的代码做出响应了。
<?php
//define your token
define("TOKEN", "weixin");
$wechatObj = new wechatCallbackapiTest();
//$wechatObj->valid();
$wechatObj->responseMsg();
class wechatCallbackapiTest
{
public function valid()
{
$echoStr = $_GET["echostr"];
//valid signature , option
if($this->checkSignature()){
//如果验证失败,可以加上这一句
header('content-type:text');
echo $echoStr;
exit;
}
else{
echo "error!";
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)){
$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 liudan wechat world!";
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
echo $resultStr;
}else{
echo "Input something...";
}
}else {
echo "";
exit;
}
}
private function checkSignature()
{
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];
$token = TOKEN;
$tmpArr = array($token, $timestamp, $nonce);
sort($tmpArr);
$tmpStr = implode( $tmpArr );
$tmpStr = sha1( $tmpStr );
if( $tmpStr == $signature ){
return true;
}else{
return false;
}
}
}
?>