2 微信开发者中心
2016-06-02 16:51
453 查看
微信公众号开发者中心提供了使用代码开发微信微应用的功能,使用代码开发微应用需要用到服务器,以存放编写的代码,因此我们需要一个服务器。那么在微信那里设置服务器呢?在微信公众号管理界面,点击【基本配置】
将会看到基本配置信息,在【服务器配置】选项
启用并设置服务器后,用户发送给公众号的信息将被转发给此服务器,这样我们就可以通过代码灵活的实现各种微应用。
点击【开发者由此进入】链接
使用微博账号登陆SAE云计算
进入新浪云控制台后,创建新应用(即服务器),填写二级域名、应用名称、运行环境。
点击【创建】,进入代码管理界面,选择SVN版本管理工具,为什么选择SVN?云空间收费,不考虑,GIT适合高级用户,SVN适合一般用户。
选择好SVN后,创建版本。版本的好处就是,当你完成一个具有基本功能的代码后(此版本号为M),交给老板。老板突发灵感说再添加一个功能,你鄙视他后还是老老实以M版本的基础创建一个N版本,然后就是无穷无尽的错误,代码被弄得乱七八糟。此时你该感激版本这个东西,让你有机会穿越回M版本。
总而言之,以每个阶段做作为一个版本,等回头看或者出问题的时候,可以查看或者从某个版本重新开始。
创建完版本后,将会看到应用的链接信息
点击【编辑代码】,进入SAE编辑器,默认情况下有【config.yaml】配置信息文件和【index.php】文件,
在浏览器中我们可以输入: http://wlvsoft.applinzi.com/ 或 http://1.wlvsoft.applinzi.com/ 访问应用服务器,浏览器将会显示echo输出的语句。
填写基本配置信息:
URL:应用服务器链接
Token:任意字符,记住此值,应用服务器需要Token进行验证
EncodingAESkey:随机生成即可
消息加解密方式:测试阶段选择【明文模式】
此时点击提交,将会提示token验证失败。
开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带四个参数:
开发者通过检验signature,对请求进行校验。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则服务器配置生效,否则提示token验证失败。
下面是微信公众平台开发者文档提供的验证代码:
下面是修改后的index.php代码:
此时,再次提交,服务器配置成功。
点击【启动】,手工配置的自动回复和自定义菜单将失效,全部将由应用服务器代码进行管理。
打开手机微信查看公众号,发现菜单和自动回复功能已经不能使用了。
提示(注意:不建议如此,不知道后续有没有错误,在这里列出仅供娱乐测试)
按照微信验证原理,其实可以直接返回验证参数【echostr】,跳过token验证。将index.php改为:
如果是用户在公众号输入的信息,我们直接返回为空。但是,微信公众号要求发送的信息是有标准格式的。简单的文本消息如下:
参数作用如下:
因此,用户要接收到应用服务器返回的信息,应用服务器必须按照微信公众号文本消息格式要求返回。
我们可以使用方倍工作室提供的微信调试器 对我们发送的信息进行测试。
接收用户指公众号原始ID 可在公众号设置中查询。
当输入:你好 ;发送给应用服务器的信息如下:
应用服务器可以获取提交的文本信息,进而获得公众号ID【ToUserName】、用户ID【FromUserName】和发送的文本信息【Content】。依据这些信息,应用服务器可以自动回复信息给用户。修改index.php:
完成后,测试如下:
将会看到基本配置信息,在【服务器配置】选项
启用并设置服务器后,用户发送给公众号的信息将被转发给此服务器,这样我们就可以通过代码灵活的实现各种微应用。
1 新浪SAE
首先,我们要去新浪云计算 申请一个空间,为什么使用SAE?因为可以免费申请啊。点击【开发者由此进入】链接
使用微博账号登陆SAE云计算
进入新浪云控制台后,创建新应用(即服务器),填写二级域名、应用名称、运行环境。
点击【创建】,进入代码管理界面,选择SVN版本管理工具,为什么选择SVN?云空间收费,不考虑,GIT适合高级用户,SVN适合一般用户。
选择好SVN后,创建版本。版本的好处就是,当你完成一个具有基本功能的代码后(此版本号为M),交给老板。老板突发灵感说再添加一个功能,你鄙视他后还是老老实以M版本的基础创建一个N版本,然后就是无穷无尽的错误,代码被弄得乱七八糟。此时你该感激版本这个东西,让你有机会穿越回M版本。
总而言之,以每个阶段做作为一个版本,等回头看或者出问题的时候,可以查看或者从某个版本重新开始。
创建完版本后,将会看到应用的链接信息
点击【编辑代码】,进入SAE编辑器,默认情况下有【config.yaml】配置信息文件和【index.php】文件,
<?php //这是一个php文件 /* 河源万绿软件工作室 CopyRight 2016 All Rights Reserved */ //调用echo方法输出一条语句 echo '<strong>Hello, SAE!</strong>';
在浏览器中我们可以输入: http://wlvsoft.applinzi.com/ 或 http://1.wlvsoft.applinzi.com/ 访问应用服务器,浏览器将会显示echo输出的语句。
2 服务器配置
申请成功服务器后,就可以在微信公众号管理界面进行服务器配置,点击【修改配置】链接。填写基本配置信息:
URL:应用服务器链接
Token:任意字符,记住此值,应用服务器需要Token进行验证
EncodingAESkey:随机生成即可
消息加解密方式:测试阶段选择【明文模式】
此时点击提交,将会提示token验证失败。
开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带四个参数:
开发者通过检验signature,对请求进行校验。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则服务器配置生效,否则提示token验证失败。
下面是微信公众平台开发者文档提供的验证代码:
private function checkSignature() { //获取微信服务器提交到应用服务器的参数 $signature = $_GET["signature"]; $timestamp = $_GET["timestamp"]; $nonce = $_GET["nonce"]; //获取token,与服务器配置中的一致 $token = TOKEN; //将参数组装成数组 $tmpArr = array($token, $timestamp, $nonce); //对参数进行排序 sort($tmpArr, SORT_STRING); //将数组转换为字符串 $tmpStr = implode( $tmpArr ); //加密 $tmpStr = sha1( $tmpStr ); //加密后与$signature进行对比 //如果相同,表示请求来自微信服务器 if( $tmpStr == $signature ){ return true; }else{ return false; } }
下面是修改后的index.php代码:
<?php
/*
河源万绿软件工作室
CopyRight 2016 All Rights Reserved
*/
//定义token,与服务器配置中的一致
define("TOKEN", "wlvsoft");
$wechatObj = new wechatCallbackapiTest();
//获取echostr,存在表示提交验证,否则为用户发送的一般消息 if (isset($_GET['echostr'])) { //如果提交为验证,进行有效验证 $wechatObj->valid(); }else{ //如果是用户发送信息,返回空 echo ''; exit; }
class wechatCallbackapiTest
{
//有效验证
public function valid()
{
$echoStr = $_GET["echostr"];
//调用验证方法
if($this->checkSignature()){
header('content-type:text');
//如果验证成功,返回echoStr
echo $echoStr;
exit;
}
}
//验证方法,如果来自微信服务器返回true
private function checkSignature() { //获取微信服务器提交到应用服务器的参数 $signature = $_GET["signature"]; $timestamp = $_GET["timestamp"]; $nonce = $_GET["nonce"]; //获取token,与服务器配置中的一致 $token = TOKEN; //将参数组装成数组 $tmpArr = array($token, $timestamp, $nonce); //对参数进行排序 sort($tmpArr, SORT_STRING); //将数组转换为字符串 $tmpStr = implode( $tmpArr ); //加密 $tmpStr = sha1( $tmpStr ); //加密后与$signature进行对比 //如果相同,表示请求来自微信服务器 if( $tmpStr == $signature ){ return true; }else{ return false; } }
}
此时,再次提交,服务器配置成功。
点击【启动】,手工配置的自动回复和自定义菜单将失效,全部将由应用服务器代码进行管理。
打开手机微信查看公众号,发现菜单和自动回复功能已经不能使用了。
提示(注意:不建议如此,不知道后续有没有错误,在这里列出仅供娱乐测试)
按照微信验证原理,其实可以直接返回验证参数【echostr】,跳过token验证。将index.php改为:
<?php /* 河源万绿软件工作室 CopyRight 2016 All Rights Reserved */ //设置返回类型 header('content-type:text'); //获取参数 $echoStr = $_GET["echostr"]; //跳过token验证,直接返回$echoStr echo $echoStr; exit;
3 应用服务器向用户发送消息
当我们在公众号中输入信息时,提示“该公众号暂时无法提供服务器,请稍后再试”。原因是我们在index.php中没有对用户的消息进行响应。//获取echostr,存在表示提交验证,否则为用户发送的一般消息 if (isset($_GET['echostr'])) { //如果提交为验证,进行有效验证 $wechatObj->valid(); }else{ //如果是用户发送信息,返回空 echo ''; exit; }
如果是用户在公众号输入的信息,我们直接返回为空。但是,微信公众号要求发送的信息是有标准格式的。简单的文本消息如下:
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>12345678</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[你好]]></Content> </xml>
参数作用如下:
因此,用户要接收到应用服务器返回的信息,应用服务器必须按照微信公众号文本消息格式要求返回。
我们可以使用方倍工作室提供的微信调试器 对我们发送的信息进行测试。
接收用户指公众号原始ID 可在公众号设置中查询。
当输入:你好 ;发送给应用服务器的信息如下:
<xml> <ToUserName><![CDATA[ ****** ]]></ToUserName> <FromUserName><![CDATA[ojpX_jig-gyi3_Q9fHXQ4rdHniQs]]></FromUserName> <CreateTime>1464855763</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[你好]]></Content> <MsgId>1234567890abcdef</MsgId> </xml>
应用服务器可以获取提交的文本信息,进而获得公众号ID【ToUserName】、用户ID【FromUserName】和发送的文本信息【Content】。依据这些信息,应用服务器可以自动回复信息给用户。修改index.php:
<?php
/*
河源万绿软件工作室
CopyRight 2016 All Rights Reserved
*/
//定义token,与服务器配置中的一致
define("TOKEN", "wlvsoft");
$wechatObj = new wechatCallbackapiTest();
//获取echostr,存在表示提交验证,否则为用户发送的一般消息
if (isset($_GET['echostr'])) {
//如果提交为验证,进行有效验证
$wechatObj->valid();
}else{
//如果是用户发送信息,调用responseMsg方法
$wechatObj->responseMsg();
}
class wechatCallbackapiTest
{
//有效验证
public function valid()
{
$echoStr = $_GET["echostr"];
//调用验证方法
if($this->checkSignature()){
header('content-type:text');
//如果验证成功,返回echoStr
echo $echoStr;
exit;
}
}
//验证方法,如果来自微信服务器返回true
private function checkSignature() { //获取微信服务器提交到应用服务器的参数 $signature = $_GET["signature"]; $timestamp = $_GET["timestamp"]; $nonce = $_GET["nonce"]; //获取token,与服务器配置中的一致 $token = TOKEN; //将参数组装成数组 $tmpArr = array($token, $timestamp, $nonce); //对参数进行排序 sort($tmpArr, SORT_STRING); //将数组转换为字符串 $tmpStr = implode( $tmpArr ); //加密 $tmpStr = sha1( $tmpStr ); //加密后与$signature进行对比 //如果相同,表示请求来自微信服务器 if( $tmpStr == $signature ){ return true; }else{ return false; } }
//返回文本消息
public function responseMsg()
{
//获取用户提交的XML格式数据
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
//如果用户提交的信息不为空
if (!empty($postStr)){
//将用户提交的XML转换为对象
$postObj = simplexml_load_string($postStr,
'SimpleXMLElement', LIBXML_NOCDATA);
//获取用户提交的类型(文本、图文、音频、视频等)
$RX_TYPE = trim($postObj->MsgType);
//不同的类型返回的结果不同
switch ($RX_TYPE)
{
//用户发送类型为文本
case "text":
//公众号ID
$fromUsername = $postObj->FromUserName;
//用户ID
$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 = date("Y-m-d H:i:s",
time())."\n".'欢迎关注河源万绿软件工作室!';
// sprintf() 函数把格式化的字符串写入一个变量中
// $toUsername位置和用户发送的互换
$resultStr = sprintf($textTpl, $fromUsername,
$toUsername, $time, $msgType, $contentStr);
break;
//非文本信息,默认不处理
default:
$resultStr = "";
break;
}
//应用服务器返回信息给用户
echo $resultStr;
}else{
echo "";
exit;
}
}
}
完成后,测试如下:
相关文章推荐
- JS与OC的交互 WebViewJavaScriptBridge WEB微信支付
- 微信支付开发(7) H5支付
- 微信自定义菜单集成多客服功能的方法与总结
- 微信浏览器强制使用
- 微信公众号开发之加密解密
- 微信公众号(justjavac)正式接受外部投稿,所有打赏金额归投稿者
- 微信分享功能,安卓手机分享图片不显示
- 我有几个粽子,和一个故事
- javascript获取wx.config内部字段解决微信分享
- 绑定微信公众平台提示“请求URL超时…
- 微信用户快赶上QQ了,达到了7.62亿
- 南通大学教务管理系统微信公众号体验
- 绑定微信公众平台提示“请求URL超时”解决办法
- 关于微信公众号支付tips
- 分享自动抓取缩略图相关文章(微信也有效)
- 微信JSSDK上传多张图片
- 一步一步实现iOS微信自动抢红包(非越狱)
- 微信接口开发缓存全局token,ticket
- 微信接口开发 控制层代码
- 第三方平台微信接口请求代码