
-
- 数据服务
- Android SDK
- iOS SDK
- 小程序
- Cocos2D-X
- C# SDK
- GO
- JavaScript
- PHP
- RESTful
-
- 云函数
- Android SDK
- iOS SDK
- Java 云函数
- JavaScript
- C#
- PHP
- RESTful
- Web
-
- 支付服务
- Android SDK
- iOS SDK
- RESTful
-
- 短信服务
- Android SDK
- iOS SDK
- JavaScript
- PHP
- RESTful
-
- IM服务
- Android SDK
- iOS SDK
-
- 推送服务
- Android SDK
- iOS SDK
- JavaScript
- PHP
- RESTful
-
- 其他
- 常见问题
- 错误码
- 数据安全
- BQL
- 知识库
- 下载
- 搜索
Web - 快速入门
- 开发文档
- 定时任务
- 微信云函数
- 简介
- 创建bmob应用
- 注册bmob账号
- 创建应用
- 数据的基本操作
- 云函数
- 获取Secret Key
- 以Get的方式调用云函数
- 以Post的方式调用云函数
- 微信公众平台的开发
- 创建云函数
- 启用微信公众号的开发模式
- 数据收发原理及消息数据格式
- 总结
- 编码规范
## 简介 在这篇微信公众平台开发教程中,将会带领你一步步领略使用云后端服务bmob的方便性,同时使用bmob进行微信公众号平台开发。 注意:升级云函数套餐后就没法在微信公众号中调用云函数 使用bmob有什么好处,下面一一为你道来: - 不需要购买服务器,不需要懂linux,不需要懂运维知识,零成本地拥有属于自己的后台系统。 - 不在需要mysql,轻松存储和获取数据,同时提供了一个方便的数据管理后台。 - 提供灵活的“云函数”,其融合了bmob的数据服务和大量的第三方服务,让你轻松应对复杂的业务逻辑。同时云函数能被第三方平台调用,再也不需要php,java等复杂的web服务。 本教程将引导你完成如下任务: - 创建bmob应用 - 使用bmob云函数实现微信公众平台的开发 ## 创建bmob应用 在这节中,将会从基本的创建bmob账号开始,到创建应用,数据的基本操作,到云函数的运行,使读者对bmob的功能有初步的了解。 在这个教程中,用到了bmob的两个功能: -
数据存储:把订阅者发到微信公众号的信息存储起来。 -
云函数:微信后台回调云函数后,完成公众号所需的业务逻辑:信息存储,把信息加工后返回给订阅者的微信。 ### 注册bmob账号 在网址栏输入www.bmob.cn或者在百度输入Bmob进行搜索,打开Bmob官网后,点击右上角的“注册”,在跳转页面填入你的姓名、邮箱、设置密码,如下图1所示:









当用post请求的方式传入参数,可用如下的方法获取参数的值:
request.query.name //获取传入参数name的值
##### response模块 response为云函数的信息回传模块,该模块包含了一个end方法,实现将云端的执行结果(如查询的数据)返回给SDK或者RestApi等调用端:
request.body.name //获取传入参数name的值
##### modules模块 modules是Bmob云函数提供给大家的各种对象处理的模块,包括数据库对象(oData)、文件对象(oFile)、地理位置对象(oLocation)、关联关系对象(oRelation)、原子操作对象(oAtom)、数据批量操作对象(oBatch)、数组对象(oArray)、消息推送对象(oPush)、云函数对象(oFunctions)、邮件发送对象(oMail)、同步对象(oAsync)、HTTP对象(oHttp)、字符编码转换对象(oEncodeing)、事件对象(oEvent)、bql对象(oBql)、html元素解析对象(oHtmlparser)、加密对象(oCrypto)。云函数想要调用这些对象时,只需要用如下的方法即可获取:
response.end(string result)
#### 用云函数实现"helleworld" 下面用云函数输出一个经典的"helleworld"程序,让开发者对编写云函数有个初步的了解。 输出"helleworld"的云函数如下:
//获取数据库对象
var db = modules.oData;
//下面进行其他操作
在"helloworld"的云函数编辑界面上输入上面的代码,按下“保存”按钮就能把编辑完毕的代码保存在云端,如下图11所示:
function onRequest(request, response, modules) {
response.end("this is hello world"); //返回字符串"this is hello world"
}





其中: - a12af19a1b8bf434:应用的Secret Key。 - helloworld:云函数的名称 看到云函数的返回结果如下图15所示:

其中: - a12af19a1b8bf434:应用的Secret Key。 - helloworld:云函数的名称 #### 云函数操作数据库初步入门 bmob提供了数据库对象(oData)用于操作数据。 用云函数往数据表“message”插入一条数据,可用如下的代码
curl -X POST \
http://cloudweixinopen.bmob.cn/a12af19a1b8bf434/helloworld
点击保存后在云函数调试区按“发送请求”,返回“success”的值,如下图16所示:
function onRequest(request, response, modules) {
//获取数据库对象
var db = modules.oData;
db.insert({
"table":"message", //表名
"data":{"userId":"dsfd2324","content":"插入的第一条信息"} //需要插入的数据,格式为JSON
},function(err,data){ //回调函数
response.end("success"); //运行完毕后返回“success”
});
}


点击保存后在云函数调试区按“发送请求”,返回表“message”的数据,如下图18所示:
function onRequest(request, response, modules) {
//获取数据库对象
var db = modules.oData;
db.find({
"table":"message" //表名
},function(err,data){ //回调函数
response.end(data); //data为返回的数据,格式为json
});
}

在同步型的编程语言中,find和insert都是数据库的操作,有文件读写的IO操作,在db->find执行前,能确保db->insert已经执行完毕了。 在异步编程中,用类似下面的代码才能保证执行完db.insert后才执行:
db->insert(xxxxx);
db->find(xxxxx);
只有通过在db.insert的回调函数中执行db.find,才能保证执行db.find前db.insert的数据库操作已经完成。 举个生活中的例子说明异步编程。在饭馆里,服务员接待客人一般是这样的:
db.insert({xxx},function(xxx){
db.find({xxx},function(xxx){xxxx});
});
采用异步模式的服务员可以这样接待客人:服务员指引客人就座,把菜单递给客人,在客人浏览菜单时服务员在旁边一直等待,当客户点菜后,服务员把订单交给厨房后继续干别的事情。
在服务员接待客人的行为中,通过比较普通的做法和异步的做法,能发现采用异步的方法后服务员的效率大大提高,云函数使用异步也是基于同样的理由,当云函数在等待IO操作(文件读写请求,网络请求)的结果时是一直空闲,如果不等待IO的结果继续执行下面的语句,能大大提高系统的效率。 在云函数异步编程中“function(xxx){xxxx}”部分称为回调函数,云函数会把IO操作的返回结果封装后传入到function函数执行里面的逻辑。服务员指引客人就座,把菜单递给客人,在客人浏览菜单时服务员就去干别的事情。当客户决定点菜后,客人把服务员招来,服务员把客人下的订单交给厨房后继续干别的事情。
## 微信公众平台的开发 在本节中,通过bmob云函数开发微信公众平台,实现一个反馈意见收集的功能: 1.把订阅者发送到公众号后台的反馈意见存储在上一节在bmob中创建的表“message”中。 2.订阅者提交反馈意见后,公众号自动给订阅者发送消息,表示消息已收到。 ### 创建云函数 创建一个名为"feedback"的云函数用于实现上面的功能,代码如下:
db.insert({xxx},function(xxx){xxxx});
这个云函数的内容暂时看不懂没关系,下面会逐渐解释其中的含义。 ### 启用微信公众号的开发模式 只有启用微信公众号的开发模式后,才能把订阅者发送到微信公众号后台的消息发送到bmob云函数中进行处理。 微信公众平台地址:https://mp.weixin.qq.com 登录微信公众平台后台,在左侧列表中最下方,找到“开发者中心”,点击进入,如图19所示:
function onRequest(request, response, modules) {
var token = "weixin"; //这里的值必须与在微信公众号后台填入的token值一致
var crypto = modules.oCrypto; //使用加解密模块
var httptype = modules.oHttptype; //获取调用云函数的是post或者get方式
var xml2js = modules.oXml2js; //实现xml和js格式之间的相互转换
var db = modules.oData; //数据库对象
if ("get" == httptype) {
//是get方法,则是微信验证回调的url是否有效
var oriStr = [token, request.query.timestamp, request.query.nonce].sort().join('')
var code = crypto.createHash('sha1').update(oriStr).digest('hex');
if (code == request.query.signature) { //验证通过,输出
response.end(request.query.echostr);
} else {
response.end("Unauthorized");
}
} else {
//是post,接收定阅者发送过来的消息后返回,把反馈意见存储表“message”中。
db.insert({
"table":"message", //表名
"data":{"userId":request.body.xml.FromUserName,"content":request.body.xml.Content}
},function(err,data){
//构造公众号后台所需要的xml格式,并返回给公众号后台
var result = {xml: {
ToUserName: request.body.xml.FromUserName,
FromUserName: request.body.xml.ToUserName ,
CreateTime: new Date().getTime(),
MsgType: 'text',
Content: '你好,你发送的反馈内容「' + request.body.xml.Content + '」已收到。'
}
}
var builder = new xml2js.Builder();
var xml = builder.buildObject(result); //利用模块xml2js,把json对象转换为一个xml文本
response.set('Content-Type', 'text/xml'); //设置返回的http header
response.end(xml);
});
}
}









其中token的值是在微信公众号后台填入的token值:“weixin”。 在这个校验流程的云函数中,使用oCrypto这个云函数的加密对象模块,提供md5和sha1两种加密算法。通过这个模块,按照微信校验的流程完成校验。oCrypto更多的功能详细参考:https://www.npmjs.org/package/crypto 另外,云函数使用了oHttptype模块获取当前的http调用方式。因为微信公众平台调用云函数有两种方式: - get方式,用于检验。 - post方式,用于转发订阅者往公众平台发送的消息。 通过oHttptype模块得知是用采用get方式调用云函数,运行校验的代码并返回echostr参数。 #### 云函数收发微信公众号后台传递过来的消息的原理 在上一节的演示中,订阅者往该公众号发送消息后,返回已收到反馈内容的消息。 这一原理的消息流程如图29所示:
//是get方法,则是微信验证回调的url是否有效
var oriStr = [token, request.query.timestamp, request.query.nonce].sort().join('')
var code = crypto.createHash('sha1').update(oriStr).digest('hex');
if (code == request.query.signature) { //验证通过,输出
response.end(request.query.echostr);
} else {
response.end("Unauthorized");
}

从上图可以看出,用户在发送一个文本后,微信公众号后台将组装一个xml消息发送给云函数服务器。当云函数接收到http头部Content-Type为text/xml的请求后,云函数自动把xml消息转换为一个对象放在request.body.xml中,通过获取request.body.xml对应的属性就能获取xml节点的值。 云函数解析xml对象,根据节点信息,把发送者(request.body.xml.FromUserName)和消息内容(request.body.xml.Content)存储在表“message”后,然后通过一定的规则组装成一个xml文本回复给微信公众号后台,微信公众号后台再回复给用户。在这个收发过程中,发送方和接收方进行了调换(ToUserName和FromUserName值互换),收发都是以xml格式在后台进行传输的。所以掌握各种消息类型的接收回复是进行微信公众平台开发的基础! 最常见的消息类型为文本的xml格式如下:
//是post,接收定阅者发送过来的消息后返回,把反馈意见存储表“message”中。
db.insert({
"table":"message", //表名
"data":{"userId":request.body.xml.FromUserName,"content":request.body.xml.Content}
},function(err,data){
//构造公众号后台所需要的xml格式,并返回给公众号后台
var result = {xml: {
ToUserName: request.body.xml.FromUserName,
FromUserName: request.body.xml.ToUserName ,
CreateTime: new Date().getTime(),
MsgType: 'text',
Content: '你好,你发送的反馈内容「' + request.body.xml.Content + '」已收到。'
}
}
var builder = new xml2js.Builder();
var xml = builder.buildObject(result); //利用模块xml2js,把json对象转换为一个xml文本
response.set('Content-Type', 'text/xml'); //设置返回的http header
response.end(xml);
});
XML格式讲解: - ToUserName 消息接收方微信号,一般为公众平台账号微信号 - FromUserName 消息发送方微信号 - CreateTime 消息创建时间 - MsgType 消息类型;文本消息为text - Content 消息内容 - MsgId 消息ID号 各种类型的消息详解,请查看微信开发文档:http://mp.weixin.qq.com/wiki/14/89b871b5466b19b3efa4ada8e577d45e.html ## 总结 通过本教程,你得到了以下收获: - 了解bmob应用和云函数的功能。 - 在不需要搭建服务器,不需要懂得基本的运维知识下,使用bmob云函数在30分钟内实现微信公众平台的开发,完了消息存储和消息自动回复这两个功能。 阅读本教程后,想了解云后端服务bmob可以实现哪些更酷的功能吗?点击http://www.bmob.cn,立刻进入bmob了解更多。 Copyright © 2017 Bmob, Maintained by the Bmob Support.
<xml>
<ToUserName><![CDATA[gh_b36303ca8941]]></ToUserName>
<FromUserName><![CDATA[oqwUds6-SG7L8t6ZBDexZvaRWnXM]]></FromUserName>
<CreateTime>1444464955</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[这个公众号不错]]></Content>
<MsgId>6203929742163889773</MsgId>
</xml>
搜索
请输入您要搜索的内容
Keyboard Shortcuts
Keys | Action |
---|---|
? | Open this help |
← | Previous page |
→ | Next page |
s | Search |
[返回
旧版](https://docs.bmob.cn/data/Android/a_faststart/doc/index.html)