2021年11月

小程序开发目前市场主要三种方案:

  1. 基于某个语言开发或者某款开源系统开发后端API接口
  2. 基于腾讯云官方方案
  3. 基于Baas 平台开发。

WordPress.png

1. 基于某个语言开发或者某款开源系统开发后端API接口

PHP领域很多人喜欢用discuz、WordPress等开源程序搭建小程序,他优点是如果你本身博客是基于这类系统,只需要开启API配置好https接口就可以基于此系统开发。

缺点也非常明显、移植性能差,出问题的几率高,并发低,安全相对比较低。前端新手上手困难等。

image.png

2. 腾讯云官方方案

优点:官方方案相对来说相关套件比较完善,懂前后端相关技术的人一键部署,基本在配置,然后一键上传,遇到几个小服务器问题,很快解决。
缺点:如果对整个后端不是很熟悉的人,就会比较麻烦。一个服务器问题部分人几天也解决不了,官方人员很难联系到效率低。例如下面这位开发者的遭遇
腾讯云小程序官方群.png

3. 基于Baas 平台开发

一、小程序Baas有什么用?

它可以免去小程序开发中服务器搭建、域名备案、https、API接口等,简单一句形容:专心写自己想要的页面就好了,其他Baas都帮你做好。

二、小程序你为何要使用BAAS ?

  1. 简单易用(由于封装了SDK,一行代码实现支付、客服消息不再是问题)
  2. 高效 (除了后端不用写代码、基础备案都免除了,可以想象效率)
  3. 低开发成本(降低开发与硬件基础设施的部署和维护成本。)
  4. 好维护(完全不用维护后端问题)
  5. 降低应用扩展(scaling)成本,当你有100W并发时会遇到性能瓶颈。目前老牌的BAAS平台如Bmob、AVcloud,都可以支持动态的自动扩张。

三、哪些企业使用了BAAS ?

相比小程序,在App行业早就赶上了Baas的快车,国内像华为、腾讯、知乎等知名企业都在使用Baas,华为、百度甚至对外推出过Baas产品,由于Baas产品对用户积累与服务要求比较高,目前听说华为的Baas只给内部项目使用,百度的Baas推出没多久由于内部问题关闭了。

4. 举个例子常规操作

想象一下,我们在一个小程序论坛,看到一份喜欢的源码,发觉还不错,下载源码,想发布上线审核。

传统上线例子:

PS:为了体现出传统也很快,这里暂且默认你公司有些积累之前一些准备工作都有,包含域名、备案、https、服务器、以及这套源码的运行环境。

第一步
把数据库导入到线上数据库。
第二步
把代码传到线上环境。
第三步
调试小程序代码。
第四步
提交上线审核

这里经常遇到的问题是很多小程序源码代码不全,只放了小程序源码,没有数据库相关信息。导入上去后代码与小程序之间有些认证机制,你可能要稍微阅读下代码,知道这套代码的实现原理(如果要进行修改,可能就需要知道这个后端系统的整个流程,由于没有文档,很多情况下是盲人摸象),进行调试发布上线。

Bmob后端云.png

小程序 Baas上线例子

下载源码后不需要配置,搭建,设置服务器,解析域名。 直接创建一个应用,发布上线。

第一步
Baas平台创建应用。
第二步
修改小程序appkey。
第三步
提交上线审核

这里每一步都相对简单,只要你发布过小程序,基本三分钟内能发布上线。即使应用个别数据表缺失也不是问题,比如没有留言表,或者反馈表。你只需要反馈页面反馈一下,系统会判断是否存在此表,如果不存在,则默认创建。

可以看出,在这种API接口模式开发的应用,使用Baas服务有绝对的优势,目前已有几千小程序开发者从腾讯转向Bmob移动后端云,将有更多的移动开发者加入到Baas的队伍中。

在项目上线后,可能会遇到一些人需要在线咨询,腾讯给予的解决方案是内置客服,一般可以分为2种使用方式。
  • 第一种内置在平台设置客服,在网页登陆客服处理消息
  • 第二种则是自己开发,微信会提供客服消息回调url,我们在此URl处理客服消息。

第一种微信平台使用方式

1. 微信控制台添加客服人员

image.png

2.使用方式

image.png

3.未处理消息会超时

超时的消息

  • 优点:无需任何开发,添加即可使用
  • 缺点:使用端被限制,经常要登陆查看消息,容易遗漏消息、容易出现超时。

第二种自有平台使用方式

注意事项

  • 服务端回调地址必须https
  • 2种方式只能2选1(启用并设置消息推送配置后,用户发给小程序的消息以及开发者需要的事件推送,都将被微信转发至该服务器地址中)

1. 设置回调服务器处理地址

此处使用Bmob 云逻辑功能,可以实现免服务器实现自己需要的服务端逻辑(比如支付回调,公众号回调,客服消息回调等等。。)

一、登陆 www.bmob.cn,点击应用>找到云逻辑

创建方法

创建方法.png

找到服务器调用URL地址

调用URL.png

填写到微信消息推送地址

image.png

写入微信回调验证代码

备注:微信公众号与小程序回调加密验证一直,我们可以直接复制公众号的验证代码,地址:https://docs.bmob.cn/cloudcode/WEB/d_cloudcodeweixin/doc/index.html#微信公众平台的开发,复制此页面代码

文档代码
image.png

复制到云函数

image.png

代码


function onRequest(request, response, modules) {
    var token = "weixin";         //这里的值必须与在微信公众号后台填入的token值一致
    var crypto = modules.oCrypto; //使用加解密模块
    var httptype = request.method; //获取调用云端逻辑的是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”中,或做一些其他操作都可以。
         


    }
}

这里的 else 可以做的事情可多了,例如:

  • 发送个短信或邮件给你的客服人员,告知有人来问什么问题了,客服人员觉得重要可以回复,不重要可以忽略。
  • 实现与用户交互(例如回复1.话费问题 回复2.流量问题。。。)
  • 接入第三方只能聊天助手,例如小娜这种。
  • 实现自动回复,第一次提示XXX欢迎你咨询本小程序,第二提醒你反馈的信息已经收到。
  • 写入到数据表,再小程序端查出来,实现最新微信官方小程序:公众平台助手一样的功能。直接手机回复客服消息
  • 等等。。。

文档有提供写入数据表代码

//是post,接收定阅者发送过来的消息后返回,把反馈意见存储表“message”中。
            db.insert({
              "table":"message",             //表名
              "data":{"userId":request.body.xml.FromUserName,"content":request.body.xml.Content}           
            },function(err,data){    
           //写入数据库成功处理代码                 
                         });

比如我这实现个简单例子

image.png

公开免费接口实现微信消息主动推送
image.png


image.png

云逻辑里面调用另外一个云逻辑代码

文档地址
https://docs.bmob.cn/cloudcode/WEB/b_developdoc/doc/index.html#云端逻辑对象
var functions = modules.oFunctions;
functions.run({
               "name": "reply",
               "data":{"userId":request.body.xml.FromUserName,"content":content}
            },function(err,data){
               //回调函数
               if(request.body.xml.Content!=undefined){
                   functions.run({
                       "name": "sendMaster",
                       "data":{"userId":request.body.xml.FromUserName,"content":request.body.xml.Content}
                    },function(err,data){
                       //回调函数
                       
                    });    
               }
            });    

主动发送消息代码

//云端逻辑方法名:reply

function onRequest(request, response, modules) {

        var content = request.body.content || '你好。';
        var userId = request.body.userId || 'ocBzs0I9fkcJ6kq1_xSxtN5dj7bI';
    
        //获取Http模块
        var http = modules.oHttp;
        
        var options = {
          "url": 'https://api.bmob.cn/1/wechatApp/getAccessToken',
          "headers": {
            "x-bmob-application-id": "xx",
                    "x-bmob-rest-api-key": "xx",
            'Content-Type': 'application/json'
          }
        };
        http.get(options, function(error, res, body) {
            var result = JSON.parse(body)
            // response.send(result.access_token);
            
            
             /**
            *主动发起消息给用户请求
            */
            //获取Http模块
            var http = modules.oHttp;
            
            var options = {
              "url": 'https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token='+result.access_token,
              "body":JSON.stringify({"touser":userId,"msgtype":"text","text":{"content":content}})
            };
            // response.end(options.url);
            http.post(options, function(error, res, body) {
                console.log(body);
                response.send(body);
            });
        });
        
       
}                                                                                    

总结

前面截图指的微信回调地址选json Bug的问题是返回的头部不符合http标准。返回json格式header头应该是Content-Type:application/json,而微信的选json还是Content-Type:text/xml,如果将来微信改正过来,则支持选json格式。
无服务函数已经越来越受开发者欢迎,无需购买主机,搭建环境。不到10行代码,实现微信服务器返回回调授权。这是未来微型服务端的发展方向在线编程。腾讯云的无服务函数也已经公侧,个人测式暂时还是Bmob的功能实用很多。

无服务函数.png