今天我一朋友问我一个技术上的问题,通过PHP cURL来请求外部接口,接口返回的是一个JSON的字符串,但如果把字符串copy下来然后赋值 给一个变量再将它json_decode是OK的不会有错,可以正常的得到对应的数组。但如果直接返cURL返回的字符串json_decode返回的居 然是NULL,他试了N多办法最终没有搞定,如是就问我要怎么处理。我当时也想了很多办法,后来发现是编码的问题,改成UTF-8的编码就OK了。
这中间不可避免的谈到了他们的应用场景和需求,发现原来是在做一个微信公众平台的开发,我说你怎么不早找我啊,免得你纠结这么久,好歹我也是在腾讯做架 构师啊,尽管不是在微信部门(我是在上海漕河泾的腾讯,这里没有微信的部门),他说原先他们是找了一家公司做的,后来完成后,想新增一个功能,但那家公司 就狮子大开口增一个功能要4W......我去试了下他们的所谓开发,其实也没什么功能就是做个了用HTML5做的手机站,然后把手机站跟微信公众平台对 接下,然后定制了几个功能,他们就花了8W,我跟我朋友说你们真有钱!你给我做,功能完全一样,我只要一半就够了...微信公众平台开发其实最主要的费用 无非就是服务器费用,域名费用,程序开发,页面设计费用等除了这些费用外,我真想不出其它的费用了,因为申请微信服务号是免费的,只要有一丁点技术基础就 能对接上,所以基本上不会产生其它的费用,总体来说微信公众平台开发的成本其实并不高。
其实我是想说微信公众平台开发,其实成本真的不高,如果你有一些好的想法,想结合微信公众平台开发出来,你又没技术基础,所以千万不要去找那些所谓的专业微信公众平台开发的公司,90%都是大萝卜坑,不是漫天要价就是夸大微信公众平台开发的难度。
为了让大家对微信公众平台开发进一步的了解,我写个教程,废话不多说了,请往下看:
微信公众平台开发的消息流程如下图
(注:用户使用微信发送消息 -> 微信将数据发送给开发者 -> 开发者处理消息并返回数据至微信 -> 微信把返回数据发送给用户,期间数据交互通过XML完成)
看了以后是不是觉得很简单啊?那接着往下看
第一步,去微信公众平台上申请公众账号,地址是:https://mp.weixin.qq.com/
按上面的要求填写好然后注册
去你填写的那个邮箱里验证一下,完全邮箱验证过程,成功后然后下一步
这里注意下,这里要选组织,在为个人的只能申请订阅号,只有组织的才能申请服务号,订阅号是不能拿到用户发的消息的。你可会有很多疑问,比如为什么要拿到用户的消息啊...后面我们会讲到,所以这里你只要按这个选就好了。
之后就是按要求一一填写,然后等待微信平台审核了。
审核通过后,登录进去你就能看到下面这样的界面
当然这个审核过程可能会要花些时间,所以请稍安勿燥,耐心等候(我是通过内部工牌申请的,所以比较快)。
其它的你先不要管,都比较简单,点点就都能明白了,最主要的就是高级功能这个选项,点进去后
选开发模式,这上面有解释两种模式的差别,所以就不多啰嗦了。进入开发模式后
首先,你要确认开发模式已开启,就是上面图片右上角的开关
其次,你要保证你的接口配置信息的里的URL必须是外网地址,也就是说外网是可以正常访问的。好了,上面的信息都OK后,那你的微信公众平台开发的任务就完成了一大半了。
接着就是对用户发的消息进行解释与回应了,这里你首先要认真的仔细的看下微信公众平台里的消息接口,详见http://mp.weixin.qq.com/wiki/index.php?title=%E6%B6%88%E6%81%AF%E6%8E%A5...。这里面有你需要的POST到你接口的消息数据格式,以及你回应的数据格式。
同样是在“高级功能”菜单中配置,需要配置两项参数:
URL: 开发者应用访问地址,目前仅支持80端口
TOKEN: 随意填写,用于生成签名,以“xxxx”为例。
填写完把下面代码保存为你上面填写的URL对应的程序文件中,最后点击“提交”完成验证。(我这里用PHP做例子,实际情况请遵行你自己的程序)
<?php
define("TOKEN", "xxxx"); //TOKEN值
$wechatObj = new wechat();
$wechatObj->valid();
class wechat {
public function valid() {
$echoStr = $_GET["echostr"];
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 );
if( $tmpStr == $signature ) {
return true;
} else {
return false;
}
}
}
?>
这就是微信公众平台校验URL是否正确接入,研究代码没有实质性意义,验证完即可删除文件,就不详细说明了
微信公众平台与开发者之间的数据交互是通过XML完成的,既然用到XML,当然得遵循规范,所以在着手开发之前先看看官方接口文档提供的XML规范,以文本消息为例:
当用户向微信公众账号发送消息时,微信服务器会POST给开发者一些数据:
<xml>
<!--开发者微信号-->
<ToUserName><![CDATA[toUser]]></ToUserName>
<!--发送方帐号(OpenID)-->
<FromUserName><![CDATA[fromUser]]></FromUserName>
<!--消息创建时间 (整型)-->
<CreateTime>12345678</CreateTime>
<!--消息类别 (text文本消息)-->
<MsgType><![CDATA[text]]></MsgType>
<!--消息内容-->
<Content><![CDATA[content]]></Content>
<!--消息ID (64位整型)-->
<MsgId>1234567890123456</MsgId>
</xml>
开发者在处理完消息后需要返回数据给微信服务器:
<xml>
<!--接收方帐号(OpenID)-->
<ToUserName><![CDATA[toUser]]></ToUserName>
<!--开发者微信号-->
<FromUserName><![CDATA[fromUser]]></FromUserName>
<!--消息创建时间 (整型)-->
<CreateTime>12345678</CreateTime>
<!--消息类别 (text文本消息)-->
<MsgType><![CDATA[text]]></MsgType>
<!--回复消息内容-->
<Content><![CDATA[content]]></Content>
<!--星标操作(位0x0001被标志时 星标刚收到的消息)-->
<FuncFlag>0</FuncFlag>
</xml>
除文本消息外,微信公众平台还支持用户发送图片消息、地理位置消息、链接消息、事件推送,而开发者还可以向微信公众平台回复音乐消息和图文消息,各类消息XML规范也可以参见官方文档。
来看看官方提供的一个PHP示例,我做了一些精简:
<?php
$wechatObj = new wechat();
$wechatObj->responseMsg();
class wechat {
public function responseMsg() {
//---------- 接 收 数 据 ---------- //
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; //获取POST数据
//用SimpleXML解析POST过来的XML数据
$postObj = simplexml_load_string($postStr,'SimpleXMLElement',LIBXML_NOCDATA);
$fromUsername = $postObj->FromUserName; //获取发送方帐号(OpenID)
$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>";
$msgType = "text"; //消息类型
$contentStr = 'hello world~ http://blog.shanglema.com'; //返回消息内容
//格式化消息模板
$resultStr = sprintf($textTpl,$fromUsername,$toUsername,
$time,$msgType,$contentStr);
echo $resultStr; //输出结果
}
}
把上面的代码上传到接口配置信息的URL对应的程序文件上,一个微信公众平台自动回复消息的功能就完成了。是不是觉得特没技术含量,是不是觉得特简单?事实就是这样,只要你了解了一切就是这么水到渠成。
好了,微信公众平台开发的简单教程就写到这里吧,我这里有一个PHP的收发消息的类,如果有需要的朋友可以邮件我,我可以发你参考下。地址是:peng.zhan##qq.com (## -> @),当然有任何问题,你也可以不耻下问,我很乐意跟大家一起分享。
本文原创,如想转载请注明出处。
本文链接地址为:http://blog.shanglema.com/open-weixin-platform-development