在SAE搭建微信公众账号服务
让我们回到2014年11月,从公司请假回成都,在天府软件园B区旁边的小区里,那个10多平米的出租屋里,闲来无事,我想找个事情做一做,好让我这漂浮的心静下来。大约在半年前就申请了微信的一个公众账号,一直闲置着,终于决定再次着手搭建一个微信公众账号。SAE(Sina App Engine)是国内最早开始提供云服务的平台之一,而且几乎是免费的。所以希望能够通过SAE平台快速的搭建好一个微信公众账号,花了小半天就搭好了一个简易的微信公众平台。今天,就利用SAE搭建微信公众平台的过程和大家一起分享。
一、注册微信公众账号
首先注册微信公众账号:http://mp.weixin.qq.com,点击注册,通过很简单的几步就能快速注册好公众账号,需要注意的是这里是需要注册一个新的微信号,而不是通过已有的私人微信号绑定。可能需要注册一个专用的邮箱。注册过程很简单,不赘述。
二、注册新浪SAE服务
注册SAE,访问http://sae.sina.com.cn,SAE整个的文档都比较完整,很好上手。注册完成后会送500云豆,合人民币5元。再申请实名认证,送云豆2000。对于一个刚上手的开发者来说完全够了。等应用开发好后,还可以申请开发者认证。每月有固定额度的云豆赠送,基本就不用花钱了。另外还有教育机构认证,公益组织认证等。同样十分简单,不赘述。
三、开启微信开发模式
登录公众平台后,点击高级功能。首先要关闭编辑模式,才能进入开发模式。我们需要一个网址作为接口,Token呢,就是相当于我们和微信之间约定的“密码”,以验证是微信平台的访问。
网址接入
公众平台用户提交信息后,微信服务器将发送GET请求到填写的URL上,并且带上四个参数:
| 参数 | 描述 |
|---|---|
| signature | 微信加密签名 |
| timestamp | 时间戳 |
| nonce | 随机数 |
| echostr | 随机字符串 |
开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,否则接入失败。signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数:
加密/校验流程:
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()
{}
}
?>
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搭建微信公众账号服务的更多相关文章
- 从Python爬虫到SAE云和微信公众号:二、新浪SAE上搭建微信服务
目的:用PHP在SAE上搭建一个微信公众号的服务器. 1.申请一个SAE云账号 SAE申请地址:http://sae.sina.com.cn/ 可以使用微博账号登陆,SAE是新浪的云服务,时间也比较 ...
- 在新浪SAE上搭建微信公众号的python应用
微信公众平台的开发者文档https://www.w3cschool.cn/weixinkaifawendang/ python,flask,SAE(新浪云),搭建开发微信公众账号http://www. ...
- 微信公众账号开发教程(二) 基础框架搭建——转自http://www.cnblogs.com/yank/p/3392394.html
上一章,我们已经初步讲解了微信公众账号开发的基本原理,今天我们来探索设计实现. 首先我们设计了模块层次图,当然图中只是给出一种实现方式,不局限于此.具体见下图. 主要功能介绍如下: 1)请求接口层.处 ...
- linux+apache+mod_python+wechat_sdk搭建微信公共账号服务器
linux+apache+mod_python+wechat_sdk搭建微信公共账号服务器 转载请注明本文原作者:FignerLiu PRE 最近尝试了下使用python搭建微信公共账号服务器,实现了 ...
- 微信公众账号开发教程(三) 实例入门:机器人(附源码) ——转自http://www.cnblogs.com/yank/p/3409308.html
一.功能介绍 通过微信公众平台实现在线客服机器人功能.主要的功能包括:简单对话.查询天气等服务. 这里只是提供比较简单的功能,重在通过此实例来说明公众平台的具体研发过程.只是一个简单DEMO,如果需要 ...
- C# asp.net 搭建微信公众平台(可实现关注消息与消息自动回复)的代码以及我所遇到的问题
[引言] 利用asp.net搭建微信公众平台的案例并不多,微信官方给的案例是用PHP的,网上能找到的代码很多也是存在着这样那样的问题或者缺少部分方法,无法使用,下面是我依照官方文档写的基于.net 搭 ...
- 使用 Fiddler 上传微信公众账号 自定义菜单
0.你必须有微信公众账号的服务号.成为开发者之后.... 1.得到你的 appid (xxxxxxoooo)和 secret (oooooooxxxxxxx) 2.用这个链接得到你的 access_t ...
- 微信公众账号 Senparc.Weixin.MP SDK 开发教程 索引
Senparc.Weixin.MP SDK从一开始就坚持开源的状态,这个过程中得到了许多朋友的认可和支持. 目前SDK已经达到比较稳定的版本,这个过程中我觉得有必要整理一些思路和经验,和大家一起分享. ...
- 【转】微信公众账号 Senparc.Weixin.MP SDK 开发教程 索引
微信公众账号 Senparc.Weixin.MP SDK 开发教程 索引 Senparc.Weixin.MP SDK从一开始就坚持开源的状态,这个过程中得到了许多朋友的认可和支持. 目前SDK已经达到 ...
随机推荐
- Android(java)学习笔记124:利用Service在后台播放背景音乐
1. 在android应用程序里,有一种没有UI的类(android.app.Service)——Service.简单来说,Service是一个 background process(背景程序),通过 ...
- spring-data-JPA源码解读
spring-data-JPA源码部分有两个很重要的部分:1.识别repositories接口 2.将接口添加代理实现类并托管spring管理 JpaRepositoriesRegistrar 目的是 ...
- LiteIDE 错误: go build xxxxxx: no non-test Go files in xxxx
问题 c:/go/bin/go.exe build [C:/Users/Administrator/Desktop/go] go build _/C_/Users/Administrator/Desk ...
- 使用vs2013打开VS2015的工程文件的解决方案(适用于大多数vs低版本打开高版本)
前言:重装系统前我使用的是vs2015(有点装*),由于使用2015实在在班上太另类了, 导致我想在其他同学的vs下看一看我写的代码都无法达成! 而且最关键的是交作业的时候,老师的2013也没有办法打 ...
- Caesars Cipher-freecodecamp算法题目
Caesars Cipher(凯撒密码.移位密码) 要求 字母会按照指定的数量来做移位. 一个常见的案例就是ROT13密码,字母会移位13个位置.由'A' ↔ 'N', 'B' ↔ 'O',以此类推. ...
- matplotlib subplot 子图
总括 MATLAB和pyplot有当前的图形(figure)和当前的轴(axes)的概念,所有的作图命令都是对当前的对象作用.可以通过gca()获得当前的axes(轴),通过gcf()获得当前的图形( ...
- R,RJAVA 安装配置 详细版
准备工作 系统必须已经安装JDK 并配置好了环境变量. 注:安装的jdk r 以及系统 尽量保持位数一致 1.下载 R https://mirrors.tuna.tsinghua.edu.cn ...
- linux文件属性软硬链接知识
链接的概念 在linux系统中,链接可分为两种:一种为硬链接,另一种为软链接或符号链接.在默认不带参数的情况下,执行ln命令创建的链接是硬链接. 如果使用ln -s创建链接则为软链接,前面文件类型为 ...
- url,href,src区别
URL(Uniform Resource Locator) 统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址.互联网上的每个文件都有一个唯一的URL ...
- 8.Yii2.0框架控制器接收get.post数据
8.Yii2.0框架控制器接收get.post数据 一.get传参 <?php /** * Created by Haima. * Author:Haima * QQ:228654416 * D ...