利用OpenShift托管Node.js Web服务进行微信公众号开发

最近写了一个微信的翻译机器人。用户只要关注该微信号,发送英文的消息,就能收到中文翻译的回复。后台是用Node.js写的,托管在OpenShift的Paas平台上。翻译过程实际上是调用微软的Bing translation API做的,代码中用到了alexu84的bing-translate和JacksonTian的wechat这两个npm模块。下面把做的过程详细说一下。

1. 微信公众号开发

首先是要到https://mp.weixin.qq.com 申请一个公众号,并申请成为开发者。目前个人只能申请订阅号,不过订阅号也可以和用户进行消息的交互,这对我们的应用来说足够了。

成为开发者后,微信会给你一个AppID和一个AppSecret,都是一长串的字符串。在开发我们这个应用时,只要用到AppID。

微信客户端会接受用户输入的消息,并把它们转给我们的Web服务。所以微信会要求我们填写我们Web服务的URL地址,Token(令牌),EncodingAESKey(消息加解密密钥)。页面如下图所示:

大致上,填写好信息并提交后,微信服务器会发送一个GET请求到我们的Web服务,携带上Token和一个随机字符串。我们的Web服务必须按照微信开发者文档规定的方式处理这个请求,原样返回这个随机字符串,这样微信服务器才认为我们的Web服务是符合它的接入要求的。微信服务器转发消息给我们自己的Web服务时,是以一个POST消息携带上一个XML数据包,我们的web服务必须解析这个XML数据包才能取得用户发的消息。同样,当我们回复消息给微信服务器时,也要满足其规定的要求。所有这些,在微信的开发者文档中都有详细的描述。

我们当然可以仔细阅读微信的开发者文档,并自己按要求一一实现对应的接口,不过这样太麻烦了:-)。更方便的方式是使用JacksonTian的微信开发Node.js模块。使用这个模块,我们只需要填入我们的Token,APPID以及EncodingAESKey,它自动就帮我们处理好微信服务器的验证请求,并允许我们直接获取/回复用户的字符串消息,使我们不用处理XML数据解析等细节问题。在下文我会详细介绍如何使用这个模块。

2. 利用OpenShift托管Node.js Web服务

首先,我们要知道如何用Node.js开发一个Web服务。本文不打算详细介绍这部分内容。基本上,利用express模块,只需几行代码就可以搭起一个Web服务,像这样:

var express = require(‘express‘);

var app = express();
app.listen(80);

app.get(‘/‘, function (req, res) {
    res.send("hello world‘);
});

搭建好web服务后,我们需要一个拥有公有IP的服务器来运行这些代码。在这方面,我们有很多选择,本文使用OpenShift的应用托管服务。

Youtube上有一个很好的视频介绍如何利用OpenShift建立和发布一个Node.js应用,step by step级别的,非常的详细。我们只需要看前30分钟就行了。基本上,Openshift使用git来管理代码开发以及发布的过程。你建立一个应用,OpenShift就在云端为你创建了一个Git仓库,包含一个示例的Node.js应用,并把它在云端运行起来了。我们只要把这个Git仓库的代码Clone到本地,修改其中的server.js,并把修改好的代码push到云端,Openshift就会自动帮我们停掉当前的示例服务,重新编译代码,重新发布并把我们修改过后的服务运行起来。超级的简单,是不是?

下面是稍微详细一点的步骤:

1)安装OpenShift的客户端工具rhc,我们需要利用这个工具创建、发布Node.js应用

2)在command line窗口运行 $ rhc app create <my app name> nodejs-0.10。这个命令为我们在云端创建了一个Git仓库,把内含的示例应用运行起来,并把代码帮我们clone到了本地。

3)修改server.js,运行:

$ git commit -am <some comment>

$ git push

我们自己的web服务就在云端运行起来了!

3. 使用bing-translate 和wechat NPM module

这一部分稍微详细介绍一下如何修改server.js,也就是如何使用bing-translate和wechat这两个NPM模块的。

还是直接上代码吧,因为总共就不到40行代码。其中第18行展示了如何使用wechat,第23行展示了如何使用bing-translate。

var express = require(‘express‘);
var kutil = require(‘./util/kutil.js‘);
var wechat = require(‘wechat‘);

var server_port = process.env.OPENSHIFT_NODEJS_PORT || 8080
var server_ip_address = process.env.OPENSHIFT_NODEJS_IP || ‘127.0.0.1‘

var client_id_secret = kutil.readJsonFromFile(‘./res/client_id_secret.json‘);
var wechat_app_config = kutil.readJsonFromFile(‘./res/wechat_app_config.json‘);

var bt = require(‘./util/bing-translate.js‘).init(client_id_secret);

var app = express();
app.listen(server_port, server_ip_address);

// wechat API
app.use(express.query());
app.use(‘/wechat‘, wechat(wechat_app_config, function (req, res, next) {
    var message = req.weixin;
    if (message.MsgType == ‘text‘) {
        var input_word = message.Content;

        bt.translate(input_word, ‘en‘, ‘zh-CHS‘, function (translate_err, translate_res) {
            if (translate_err) {
                res.reply({
                    content: ‘translation error‘,
                    type: ‘text‘
                });
                return;
            }

            var translate_result = translate_res["translated_text"];
            res.reply({
                content: translate_result,
                type: ‘text‘
            });
        });
    }
}));

因为我不想在开源的代码中明文写上我的微信APPID等敏感信息,我又写了一个util从Json文件中读取这些信息。第8行是读Bing translation app的ID和secret,第9行是读微信的APPID等信息。这些信息都分别写在一个Json文件中,格式如下:

{
    "client_id": "your-Bing-translator-app-client_id",
    "client_secret": "your-Bing-translator-app-client_secret"
}
{
    "token": "your_wechat_app_token",
    "appid": "your_wechat_app_appid",
    "encodingAESKey": "your_wechat_app_AESKey"
}

另外,有人可能会注意到我没有直接使用alexu84的bing-translate模块,而是引用了一个本地的bing-translate.js文件。这是因为我对该模块的源文件做了少量的改动,主要是在本地cache了一个Bing translation API的token,这样就不用每次翻译的时候都去调微软的Web API重新拿token了,翻译响应的速度会大大提高。有空的时候我会把这个改动push给alexu84试试看。

4. 关于Microsoft Bing Translation API

大家都注意到在上一部分我们要填入Bing Translation的client ID和client secret。这是因为Bing Translation API也是一个Web服务,我们需要到这个页面去申请一个Bing Translation的app,申请好后,就有了我们自己的client ID 和 secret。当然这里可能涉及要注册微软的账号什么的,这里就不赘述了。

最后,我的代码都放到了GitHub上,除了把APPID和secret什么的替换成示例的字符串,其他的就和我在OpenShift上发布的代码一模一样了。

参考资源

1. Jose Annunziato 如何利用OpenShift 发布 Node.js应用的视频:https://www.youtube.com/watch?v=wnRtA7a0ST0

2. alexu84: Bing translation API 的Node.js wrapper https://github.com/alexu84/bing-translatehttps://github.com/alexu84/bing-translate

3. JacksonTian: 微信API的Node.js wrapper https://github.com/node-webot/wechat

4. Bing Translation API: http://blogs.msdn.com/b/translation/p/gettingstarted1.aspx

5. 我的代码示例:https://github.com/kaige/KDict/tree/master/openshift_host_code/kdict

时间: 2024-12-26 08:19:39

利用OpenShift托管Node.js Web服务进行微信公众号开发的相关文章

ASP.NET Web API实现微信公众平台开发(一)

最近朋友的微信公众号准备做活动,靠固定的微信公众平台模版搞定不了,于是请我代为开发微信后台.鉴于我也是第一次尝试开发微信后台,所以也踩了不少坑,此系列博客将会描述微信公众号各项功能的实现. 先决条件 1.一台可部署web服务的服务器或者云平台(我采用的是Microsoft Azure) 2.一个可以正常使用的微信公众账号 3.Visual Studio 开发准备 1.采用ASP.NET Web API网站项目作为微信公众号后台服务 成为微信公众号开发者 这一步很简单,只要在微信公众号后台的开发者

带领技术小白入门——基于java的微信公众号开发(包括服务器配置、java web项目搭建、tomcat手动发布web项目、微信开发所需的url和token验证)

微信公众号对于每个人来说都不陌生,但是许多人都不清楚是怎么开发的.身为技术小白的我,在闲暇之余研究了一下基于java的微信公众号开发.下面就是我的实现步骤,写的略显粗糙,希望大家多多提议! 一.申请服务器 1.我购买的是阿里云服务器,购买后要设置一下服务器密码,默认用户名是administrator,购买好后如下: 2.申请好后,copy一下此服务器的IP地址(公有),在本地ping一下看看是否可用,j键盘Win+R,输入cmd,输入ping+IP回车,如下即为成功: 二.配置服务器 1.下载远

利用NATAPP隧道解决微信公众号开发之本地调试难题

一.问题 众所周知,微信公众号开发需要公网的有效域名和80端口,本机当然互联网是访问不了的.那么我们难道去一个公网的服务器去开发吗?那样是不是太土了. 答案当然是,NO 当然我们在做微信支付的时候,有些URL需要域名进行备案了,那么我们首先需要准备一个域名,并且通过的备案,我这里是阿里的一个域名smartbi.club 已经个人备案成功,ICP可查 二.解决问题 2.1.准备条件 硬件:笔记本 软件:Tomcat+NATAPP软件https://natapp.cn+通过备案的域名 注册一个nat

微信公众号开发(三)----服务号客服消息

因为订阅号没有客服消息,所以只能在用户发送消息以后,进行被动的回复.而服务号可以通过客服消息主动给用户发消息,下面我就介绍一下这个功能怎么使用. 客服消息主要是向公众号服务器发送HTTPS请求,所以这部分的内容可以使用PostMan等工具进行测试和验证.那么下面就开始吧. 1. 获取AccessToken 发送客服消息需要用到AccessToken,可以用appId和AppSecrect来获取.获取的接口文档为获取AccessToken, AppId和AppSecrect可以在公众号主页--->

7天搞定Node.js微信公众号开发

课程目录:第1章 前期准备让我们和老师一起做些准备工作,搭建好开发环境,了解微信号的分类和功能,最后写段代码实现加密认证逻辑.第2章 实战入门理解微信中票据的作用,利用微信中消息与回复的功能,编写一个简易的"回复机器人"效果.第3章 微信流程及技术串讲本章节会对课程中所需要的ES6中的新技术点进行一次串讲,包括Promise 如何使用,Generator 生成器,及 Koa 和 Express 中间件.第4章 实战进阶这一天的工作是将微信提供的重要接口,一个一个串下来,尤其是实现素材接

卡袋服务平台微信公众号

在国内商户开通微信支付,可以联系卡袋公司,卡袋作为微信支付全国服务商,期待全国各地区商户加入中! 卡袋--微信支付全国服务商 卡袋官网:http://www.chinapaycard.com 卡袋客服热线:400-810-7565 更多微信支付最新动态请关注此公众号kadaifwpt 或扫描此二维码添加卡袋服务平台

[资料分享]7天搞定Node.js微信公众号开发

链接:http://pan.baidu.com/s/1bo6nZ1H 密码:m1jb

微信公众号开发 但是服务端仅仅接收到了 p1 p2 没有接收到p3

w 栗子 js window.location = www.xx.com?p1=123&p2=456&p3=789 但是服务端仅仅接收到了 p1 p2 没有接收到p3 原因有哪些呢? 参考PHP get方式传递参数小心掉坑 - 咖啡如同生活的专栏 - 博客频道 - CSDN.NEThttp://blog.csdn.net/gaoxuaiguoyi/article/details/48469165 除了未进行字符过滤或转码

node微信公众号开发---自动回复

微信开发的特点:1.post请求 (一定要注意,这里和配置域名的时候不一样,配置域名是get请求)2.数据包是xml格式的3.你给微信返回的数据也是xml格式的 var parseString = require('xml2js').parseString;//引入xml2js包 /** * 处理微信post消息请求 */ router.post('/', function (req, res) { try{ var buffer = []; //监听 data 事件 用于接收数据 req.on