微信物联网开发原理图:
一、微信公众号与用户端的交互
1.你需要的东西
- 申请到一个微信公众号,申请地址点这里,其中,订阅号的申请门槛较低,不需要实名认证,开放给开发者的接口权限也基本够用。
- 自定义HTTP服务器
1.本地服务器 需要申请公网IP和开通80端口,维护方便,但易受外界影响
2.云服务器 由互联网公司提供,学生优惠性价比高
3.Web服务器 例如百度的BAE和新浪的SAE,使用方便,本地需要安装Git或SVN - 开发的技术储备
理论上来说,凡是能开发网站的语言都可以使用,如PHP、ASP、JSP(Java Serve Page)、ASP.NET、Node.JS、Python、Java等。由于PHP在服务器端开发十分普遍,微信官网提供的示例程序也是用PHP作为开发语言来介绍,因此,我选择PHP写代码。
由于微信公众平台开发类似于网站开发,因此,将会使用到网站开发的相关技术知识,如HTTP协议、HTML、XML、JSON、数据库等。
关于代码编辑器,有Sublime Text,Eclipse等。我使用的是Hbuilder。
2.自定义服务器上的部署
3.开发接口验证
微信公众平台技术文档
一个不错的PHP在线执行工具
<?php
define("TOKEN","weixin"); // 定义token
$wechatObj = new wechat_php(); // 生成类实例
$wechatObj->valid(); // 调用类的检验方法
// 定义一个操作微信公众帐号的类
class wechat_php
{
// 定义公用校验方法
public function valid()
{
$echoStr = $_GET["echostr"]; // 获取GET请求的参数echostr
// 校验signature
if($this->checkSignature ()) { // 调用校验方法
echo $echoStr;
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 ); // 对字符串进行SHA-1散列运算
if( $tmpStr == $signature ) { // 计算结果与$signature相等
return true; // 通过验证
} else {
return false; // 未通过验证
}
}
}
?>
4.开始编写代码进行开发
例1:文本消息自动被动回复
<?php
$wechatObj = new wechat_php();
$wechatObj->GetTextMsg();
class wechat_php
{
public function GetTextMsg()
{
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
if (!empty($postStr))
{
$postStr = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$fromUesrname = $postStr->FromUserName;
$toUsername = $postStr->ToUserName;
$msgType = $postStr->MsgType;
$keyword = trim($postStr->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 (strtolower($msgType) != "text")
{
$msgType = "text";
$contentStr = "我只接收文本信息!";
}else{
if(!empty( $keyword ))
{
$msgType = "text";
$contentStr = "消息内容:" . $keyword . "\n";
$contentStr = $contentStr . "ToUserName:" . $toUsername . "\n";
$contentStr = $contentStr . "FromUserName:" . $fromUesrname;
}else{
$contentStr = "请输入关键字...";
}
}
$resultStr = sprintf($textTpl, $fromUesrname, $toUsername, $time, $msgType, $contentStr);
ob_clean();
echo $resultStr;
}else{
echo "";
exit;
}
}
}
?>