在SAE搭建微信公众账号服务
2015-04-15 19:42
246 查看
让我们回到2014年11月,从公司请假回成都,在天府软件园B区旁边的小区里,那个10多平米的出租屋里,闲来无事,我想找个事情做一做,好让我这漂浮的心静下来。大约在半年前就申请了微信的一个公众账号,一直闲置着,终于决定再次着手搭建一个微信公众账号。SAE(Sina App Engine)是国内最早开始提供云服务的平台之一,而且几乎是免费的。所以希望能够通过SAE平台快速的搭建好一个微信公众账号,花了小半天就搭好了一个简易的微信公众平台。今天,就利用SAE搭建微信公众平台的过程和大家一起分享。
网址接入
公众平台用户提交信息后,微信服务器将发送GET请求到填写的URL上,并且带上四个参数:
开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,否则接入失败。signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数:
那么很明确我们接下来需要做的事情了:为微信提供一个接口。
在SAE创建好应用后,需要到微信公众账号开发者中心将应用信息进行授权配置!
假设我创建的应用名称为personal_app,则svn的地址为https://svn.sinaapp.com/personal_app,用户名和密码分别为SAE安全邮箱和安全密码。
responseMsg函数详细如下:
其中mobilephone函数用来完成手机号码归属地查询功能。这是经过精简的一部分代码,目前公众账号已经实现了大大小小6个功能,后续还会继续改进!
感谢大家的阅读,Published by MarsEdit!
一、注册微信公众账号
首先注册微信公众账号:http://mp.weixin.qq.com,点击注册,通过很简单的几步就能快速注册好公众账号,需要注意的是这里是需要注册一个新的微信号,而不是通过已有的私人微信号绑定。可能需要注册一个专用的邮箱。注册过程很简单,不赘述。二、注册新浪SAE服务
注册SAE,访问http://sae.sina.com.cn,SAE整个的文档都比较完整,很好上手。注册完成后会送500云豆,合人民币5元。再申请实名认证,送云豆2000。对于一个刚上手的开发者来说完全够了。等应用开发好后,还可以申请开发者认证。每月有固定额度的云豆赠送,基本就不用花钱了。另外还有教育机构认证,公益组织认证等。同样十分简单,不赘述。三、开启微信开发模式
登录公众平台后,点击高级功能。首先要关闭编辑模式,才能进入开发模式。我们需要一个网址作为接口,Token呢,就是相当于我们和微信之间约定的“密码”,以验证是微信平台的访问。网址接入
公众平台用户提交信息后,微信服务器将发送GET请求到填写的URL上,并且带上四个参数:
参数 | 描述 |
---|---|
signature | 微信加密签名 |
timestamp | 时间戳 |
nonce | 随机数 |
echostr | 随机字符串 |
加密/校验流程: 1. 将token、timestamp、nonce三个参数进行字典序排序 2. 将三个参数字符串拼接成一个字符串进行sha1加密 3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
那么很明确我们接下来需要做的事情了:为微信提供一个接口。
四、在SAE创建应用
填好二级域名和应用名称等,选择好语言。这里我们使用PHP开发选择web应用。创建好应用之后,在代码管理中创建一个新的版本。而后我们可以选择编辑代码。能够实现在线编辑,根据个人喜好,可以通过SVN在本地开发然后CI到SAE服务,我个人就是这样做的。在SAE创建好应用后,需要到微信公众账号开发者中心将应用信息进行授权配置!
假设我创建的应用名称为personal_app,则svn的地址为https://svn.sinaapp.com/personal_app,用户名和密码分别为SAE安全邮箱和安全密码。
五、干货
<?php define("TOKEN", "xxxxxxxx"); $wechatObj = new wechatCallbackapiTest(); if (isset($_GET['echostr'])) { $wechatObj->valid(); }else{ $wechatObj->responseMsg(); } class wechatCallbackapiTest { 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; } }
public function responseMsg() {} } ?>
responseMsg函数详细如下:
function responseMsg() { $postStr = $GLOBALS["HTTP_RAW_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 ($keyword == "date" || $keyword == "时间") { $msgType = "text"; $contentStr = "现在时间是:\n".date("Y-m-d H:i:s", time()); $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr); echo $resultStr; } elseif (preg_match("/^0?(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$/", $keyword)){ $msgType = "text"; $phone_res = $this->mobilephone($keyword); $contentStr = "号码归属地查询结果:" ."\n".$keyword ."\n归属地:".$phone_res->retData->province ."\n运营商:".$phone_res->retData->carrier; $contentStr = $contentStr ."\n-------------------\nProvided by API store."; $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr); echo $resultStr; } else { $msgType = "text"; $contentStr = "感谢您关注【XXXXXXXXXX】"."\n"."微信号:XXXXXX"."\n" ."目前平台功能如下:" ."\n"."1. 当前时间,如输入:时间/date" ."\n"."2. 手机号归属地查询,如输入13800138000" ."\n"."更多内容,敬请期待..."; $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr); echo $resultStr; } }else{ echo ""; exit; } }
其中mobilephone函数用来完成手机号码归属地查询功能。这是经过精简的一部分代码,目前公众账号已经实现了大大小小6个功能,后续还会继续改进!
感谢大家的阅读,Published by MarsEdit!
相关文章推荐
- SAE服务下用java实现微信公众账号图灵机器人
- 微信公众账号:服务号和订阅号的区别详解
- 微信端发消息时而成功时而失败并提示:该公众账号暂时无法提供服务,请稍后再试
- 从Python爬虫到SAE云和微信公众号:二、新浪SAE上搭建微信服务
- 基于SAE搭建python微信公众后台
- 微信平台自动回复asp 解决提示:‘该公众账号暂时无法提供服务,请稍后再试’
- 微信公众账号开发教程(二) 基础框架搭建(转)
- 微信公众账号开发教程(二) 基础框架搭建——转自http://www.cnblogs.com/yank/p/3392394.html
- 微信公众账号服务号自定义菜单配置与实现
- (转)微信公众账号开发教程(二) 基础框架搭建
- 【玩转微信公众平台之六】 搭建新浪SAEserver
- 微信公众账号的订阅号与服务号有什么区别?
- 微信公众账号服务号自定义菜单配置与实现
- 微信公众平台开发教程(一) 微信公众账号注册流程
- .net实现微信公众账号接口开发
- ICCMO微信公众账号开发系列(3)CURL模拟登陆教务系统查成绩
- 微信该公众号提供的服务出现故障
- C#.net 微信公众账号接口开发
- 设计模式 观察者模式 以微信公众服务为例
- java编写微信公众账号收发消息