一起学微信公众平台开发(零)
写在前面
一个客户需要做微信公众平台开发,而自己以前没有研究过,只做过订阅号,未涉及应用开发,于是简单了解了一下,大概知道,只要会PHP+MYSQL,加上XML、JSON、HTML等等,就能够实现了。
所以我在这里记录下自己的学习过程,给新学习的朋友一个参考,也给自己留个记录。
环境
1、需要一个微信公众平台账号,经过认证的,当然认证之前,可以用测试账号来做,点这里获得测试账号:http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
2、需要一台服务器,能够部署你的WEB应用,我使用的是阿里云服务器
3、需要一个域名(我现在还不确定是不是必须有,但没有的话测试用不了),而且这个域名必须可以访问(也就是备案了的),当然如果你是国外的空间或服务器,可以不备案直接解析。我因为域名还没备案完成,我在一些免费的二级域名网站申请了一个解析到我服务器,速度很快,几乎是瞬间就完成解析了。我用的是这家的(http://dns.c3z.cn/control.php#),不是广告哦。
开始配置
我们以测试账号为例进行配置
关于服务器WEB应用环境如何配置我不说了,可以自己百度。
关于各个参数怎么填写,我且一个一个道来:
1、测试号信息:这里面的东西是随机生成的,不需要我们来填写,后边用得到。
2、接口配置信息:这里需要我们自己填写,在这之前要做一个准备工作,把下面代码复制后,另存为wx_sample.php,
<?php
/**
* wechat php test
*/
//define your token
define("TOKEN", "weixin");
$wechatObj = new wechatCallbackapiTest();
$wechatObj->valid();
class wechatCallbackapiTest
{
public function valid()
{
$echoStr = $_GET["echostr"];
echo $echoStr;
echo "<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>12345678</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[你好]]></Content></xml>";
//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"];
//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 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;
}
}
}
?>
放到你的WEB目录下,确保可以通过公网访问。然后将URL设置如:http://123.123.123.123/wx_sample.php 即可。
TOKEN项请填写“weixin”,这个是可以后期修改的。
然后点击提交。
提示配置成功,表示成功了,但如果提示配置失败,那么你要看一下代码是不是我上面那一串,因为微信配置时需要一个返回值,而如果你的代码没有返回值,微信会提示配置失败,这时候你要加上才行。
我后来就遇到过这个问题,因为换了一个目录,导致配置失败,后来发现我只要在里边加上一句:
$wechatObj = new wechatCallbackapiTest();
$wechatObj->valid();//新增加的这句
就OK了。
当然后期你可以去掉。
JS接口安全域名,填写我们前面申请的免费二级域名(当然你自己有备案好的域名更好啦)
添加测试号二维码,拿你的手机扫码一下,关注即可,这样你就可以在订阅号列表中找到这个测试用的公众号,通过给公众号发送消息,来测试返回的结果。
至此,环境配置基本完毕。
Hello World!
下一步我们尝试向公众号发送任意字符,返回一个"Hello world!"
其实,说简单了,就像一个人抽了你一巴掌(用户在订阅号内向你发送任意内容),你回头踹了他一脚(你的程序回复一个“Hello World!”)
这个工作可以由刚才我们的那个php文件来完成,他会首先接收来自微信的一个XML文件,里面包含了用户发给你的内容、类型等信息,你可以根据内容,回复一个XML给微信,微信将XML解析后发给用户。
相应的源文件如下:
可以点击这里下载:http://pan.baidu.com/s/1pKfkQEZ
<?php
/**
* wechat php test
*/
//define your token
define("TOKEN", "weixin");
$wechatObj = new wechatCallbackapiTest();
$wechatObj->responseMsg();
class wechatCallbackapiTest
{
public function valid()
{
$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"];
//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!";
if($keyword == '1'){
$contentStr = "你输入的是1";
}elseif($keyword == '1'){
$contentStr = "你输入的是2";
}
$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;
}
}
}
?>
测试
这时候我们可以开始测试了,向测试号发送任意字符,将回复“Welcome to wechat world!",发送数字1,回复"你输入的是1"
OK,本节写完了。