微信开发基础①搭建开发环境
最近一个月都在写Android NDK开发之旅 , 从C语言基础到JNI再到NDK , 一路写下来 , 都是在写C代码 , 有些枯燥乏味 , 故新开一个系列微信开发系列 。
前言
微信是一个非常好的产品 , 几亿人用的产品 , 依托于微信的产品更加多 , 如多如牛毛的微信公众号 , 有各类公众号应用 , O2O 、外卖、企业官网 等等 。微信开发主要由后端与前端组合开发, 本系列使用到的技术栈是,html5 + css + javascript + php 。
微信开发模式
做微信开发的时候 , 需要一个公众号帐号 , 个人的话 , 目前只能申请订阅号 ,需要实名认证 。
基本配置
注册完微信公众平台帐号,在微信公众平台左下角 , 找到开发,进行基本配置
base configconfig server配置服务器环境
点击修改配置
在修改配置页面 ,可以看到接入指南
接入指南进入接入指南
Paste_Image.png
下载PHP示例代码
示例代码修改代码
配置Token修改完之后 , 上传到服务器。
服务器配置微信公众平台,服务器配置
配置完成 , 点击启用
启用服务器配置启动成功之后 , 这样我们的微信配置服务器就完成了 。
修改服务器端代码
将.php文件中的验证代码注释掉 , 调用responseMsg()方法
//define your token
define("TOKEN", "zenoWecaht");
$wechatObj = new wechatCallbackapiTest();
//$wechatObj->valid();
$wechatObj->responseMsg();
Paste_Image.png微信消息响应机制
响应代码分析
从responseMsg()
这个方法名称就可以看出 , 这个是响应消息的一个方法 , 将微信服务器传递过来的消息进行解析 , 并进行处理 , 然后按照一定的格式返回 。
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!";
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
echo $resultStr;
}else{
echo "Input something...";
}
}else {
echo "";
exit;
}
}
从上述代码可以看出 , $keyword
这个变量就是微信服务器传给我们用户输入的内容的值了 。我们可以将他进行一些改造 。
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 ))
{
if($keyword == "zeno"){
$contentStr = "简单的微信开发";
}else{
$contentStr = "sorry ! 未能识别您的指令";
}
$msgType = "text";
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
echo $resultStr;
}else{
echo "Input something...";
}
}else {
echo "";
exit;
}
}
我们自定义了一个指令消息 , 当用户在聊天界面输入zeno
就会返回简单的微信开发
, 我们通过简单的字符指令进行判断 , 然后返回响应的结果 。
响应代码分析
得到微信传递过来的消息对象,解析xml格式。
libxml_disable_entity_loader(true);
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
得到消息解析的内容。
$fromUsername = $postObj->FromUserName;
$toUsername = $postObj->ToUserName;
$keyword = trim($postObj->Content);
构建响应消息的模版,$textTpl
是微信消息响应的消息格式 , 按照这个模版 , 然后将
$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 ))
{
if($keyword == "zeno"){
$contentStr = "简单的微信开发";
}else{
$contentStr = "sorry ! 未能识别您的指令";
}
$msgType = "text";
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
echo $resultStr;
}else{
echo "Input something...";
}
结语
微信开发结合了服务器端开发前端开发 , 微信开发本身比较简单 , 就是微信提供的一些接口的调用 , 复杂之处在于 , 在微信外部 , 也就是我们服务器上搭建的web系统 , 和一般的web应用开发没什么区别 。 微信开发系列 , 属于闲暇之作 , 不定期更新 。