一、微信公众平台运行原理
当用户A向自己关注的微信公众号发送一条消息以请求某项服务时,,实质上是用户A将请求的消息发送到微信服务器(即图中的微信公众平台),然后由微信服务器将用户的请求转发到公众账号服务器。当公众账号服务器响应用户A的请求,生成相应的回复消息时,也是将这个消息发送到微信服务器,再由微信服务器转发给用户A。
微信服务器与公众账号服务器之间进行通信时,只要使用http协议传送消息,消息主要使用XML和JSON两种格式进行封装。
二、,使用bluemix作为公众账号服务器
1、申请bluemix账号
(1)在网页浏览器的地址中输入https://new-console.ng.bluemix.net/,将显示如下界面
(2)在图2-1的网页单击右上角的“注册”链接,将显示如下网页,并进行注册。
图2-2
(3)注册后,bluemix会给注册页面中填写的邮箱发送一封激活邮件,登录到邮箱中查看激活邮件,点击激活邮件中的链接即可激活账号。激活后即完成了bluemix的注册过程,接下来就可以创建应用,并将开发的项目上传到应用。
2、下载并安装 Cloud Foundry 程序
1、首先要创建一个新的应用,
(1)登录 https://console.ng.bluemix.net/
(2)点击网页右上角的仪表盘,如图2-3。
图2-3
(3)选择cloud foundry 创建应用程序,并选择web应用程序
图2-4
(4)在这里,我们使用php语言,给新的应用程序命名,即可完成应用程序的创建。程序创建完成后会自动运行,这时打开仪表盘就可以看到正在运行的应用程序,如图2-8所示。
图2-6
2、下载安装Cloud Foundry 程序
(1) 打开创建的应用,点击网页上的开始编码。
图2-8
(2) 根据页面提示,下载入门代码,之后点击下载cf命令行界面,根据c操作系统下载相应的安装包,并安装。例如笔者下载地址是: Stable Installers 下的”Windows 64 bit”下载了一个文件,该文件为 installer-windows-amd64 .zip。 安装该文件后,在 C:\Program Files (x86)\Cloud Foundry 下产生了一个 cf.exe 文件。同时经过检查发现,在系统的 PATH 路径中,也增加了该目录,也就是说可以直接在 DOS COMMAND 环境下输入 CF 命令执行该文件。
图2-10
(3)cf的具体使用将在后文进行介绍
三、设置微信接口配置
1、申请测试号
登陆配置测试账号在浏览器中输入 http://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?t=sandbox/login 将打开如图3-1所示的测试账号登录页面。
图3-1
也可以申请正式的微信公众账号,在图3-2 所示的页面中点击“进入公众平台测试账号”
图3-2
2、根据微信公众平台开发者文档,接入微信公众平台开发,开发者需要按照如下步骤完成:
填写服务器配置
验证服务器地址的有效性
http://mp.weixin.qq.com/wiki/8/f9a0b8382e0b77d87b3bcc1ce6fbc104.html
(1)第一步:填写服务器配置
进入公众平台测试账号后,可以看到有“接口配置信息”,在这里的服务器地址(URL)和Token 中填写相应的值,就可以建立信息传输的通道,其中URL是开发者用来接收微信消息和事件的接口URL(这里填写bluemix上面创建的应用的URL)。Token可由开发者可以任意填写,用作生成签名(该Token会和接口URL中包含的Token进行比对,从而验证安全性)。
验证原理:
在微信服务器向URL地址发送的get请求中带有四个参数:
开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。
为什么建立一个信息通道需要这么多参数呢,这是因为微信公众账号服务器的URL是对外公开的,任何互联网上的用户都可以通过这个URL访问改服务器中的web页面,也就是说,其他人也可能杜撰一个消息发布到公众账号服务器上来,因此,为了验证消息的来源是由微信服务器发送的,因此特别添加以上参数,在我们的代码中,对以上参数按一定的算法进行计算,即可验证信息的来源了,微信规定的加密/校验流程如下:
(2)编写代码
打开eclipse,这时需要打开从bluemix上下载的入门代码,编写其中index.php 的内容。代码如下:
/**
* wechat php test
*/
//define your token
define("TOKEN", "token"); //定义token,这里填写接口配置时设置的token
$wechatObj = new wechatCallbackapiTest();//生成类实例
$wechatObj->valid();//调用类的校验方法
class wechatCallbackapiTest
{
public function valid()
{
$echoStr = $_GET["echostr"];//获取get请求的参数
//valid signature , option
if($this->checkSignature())//调用校验方法
{
echo $echoStr;
exit;
}
}
private function checkSignature()
{
// you must define TOKEN by yourself
if (!defined("TOKEN")) {
throw new Exception('TOKEN is not defined!');
}
$signature = $_GET["signature"]; //获取get请求的参数signature
$timestamp = $_GET["timestamp"];//获取get请求的参数timestamp
$nonce = $_GET["nonce"];//获取get请求的参数nonce
$token = TOKEN;
$tmpArr = array($token, $timestamp, $nonce);//将三个参数保存到数组中
// use SORT_STRING rule
sort($tmpArr, SORT_STRING);//对数组中的三个数排序
$tmpStr = implode( $tmpArr );//将数组中的三个数据组成一个字符串
$tmpStr = sha1( $tmpStr );//对字符串进行SHA-1散列运算
if( $tmpStr == $signature ){ //计算结果与signature相等
return true; //通过验证
}else{
return false; //未通过验证
}
}
}
?>
(3)将编写好的代码发布到bluemix,这里需要用到cf命令。参考bluemix提供的步骤(打开创建的程序点击开始编码)
第一步:在命令行切换至代码所在目录
cd your_new_directory
第二步:连接到bluemix
cf api https://api.ng.bluemix.net
第三步:账号密码登录
bluemix login -u 账号 -o 账号 -s 新创新的应用名称
回车后,命令行会提示输入密码,登录成功会提示OK
第四步:上传代码
cf push 工程文件夹的名称
(4) 在微信接口配置信息里点击提交,提示配置成功。