写点什么

微信程序开发系列教程(一)开发环境搭建

作者:Jerry Wang
  • 2021 年 11 月 30 日
  • 本文字数:2745 字

    阅读完需:约 9 分钟

微信程序开发系列教程(一)开发环境搭建

1. 您得从微信官方平台注册一个微信订阅号:


https://mp.weixin.qq.com


2. 这个教程使用 nodejs 开发微信订阅号对应的消息服务器,因此需要具备基本的 nodejs 开发技能。



登录微信公众号平台https://mp.weixin.qq.com, 使用菜单:Development->Basic configuration:



最重要的是在订阅号的控制台里指定一个消息服务器的 url。如下图所示。这个消息服务器的 url 从哪里来?



我会用 nodejs 开发一个服务器,部署到 Salesforce 的云平台 Heroku 上。



当您的微信订阅号的粉丝通过微信 App 同您的订阅号交互,比如发消息,或者使用您的微信订阅号自定义菜单时,这些请求就会通过微信 App 转发到您的 nodejs 消息服务器上。


但是当您配置的消息服务器要真正起作用,还得先通过一个验证。验证流程在微信官网上: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1472017492_58YV5



微信官网上提供的验证流程的实现是用 Python 写的,我提供了一个 nodejs 版本的实现。



我们在微信订阅号的控制台点了 Submit 按钮之后,微信框架会发送一个 HTTP 请求到你的微信服务器去,请求明细如下:


https://<your server url>/?signature=096abd439b41f9610aeabe2d7534084fd8dafa20&echostr=16168327802220428137&timestamp=1512810825&nonce=384289189


您的微信服务器的职责就是:按照上面流程图定义的规范,计算根据您微信订阅号的 token(令牌),时间戳和 nonce 字段,计算出一个签名值,然后同发到消息服务器的签名值做对比。如果对比发现两者不一致,会收到错误消息“Token authentication failed”。



下面是如何用 nodejs 开发使得消息服务器通过验证流程。


1. 创建一个新的 nodejs 工程,下列 package.json 文件里高亮部分是用于消息服务器通信的重要部分。


主要的逻辑位于 server.js 里。



2. Server.js 的主要代码:


var express = require('express');
var routesEngine = require('./index.js');
var app = express();
routesEngine(app);
app.listen(process.env.PORT || 3000, function () {
console.log('Listening on port, process.cwd(): ' + process.cwd() );
});
In implementation of index.js, now we need to implement verification process:
var request = require('request');
var jsSHA = require('jssha');
module.exports = function (app) {
app.route('/').get(function(req,res){
var token="jerry"; // replace it with your own token
var signature = req.query.signature,
timestamp = req.query.timestamp,
echostr = req.query.echostr,
nonce = req.query.nonce;
oriArray = new Array();
oriArray[0] = nonce;
oriArray[1] = timestamp;
oriArray[2] = token;
oriArray.sort();
var original = oriArray.join('');
var shaObj = new jsSHA("SHA-1", 'TEXT');
shaObj.update(original);
var scyptoString = shaObj.getHash('HEX');
console.log("calculated string: " + scyptoString);
if (signature == scyptoString) {
res.send(echostr);
} else {
res.send('bad token');
}
});
};
复制代码


3. 将该 nodejs 应用部署到 Heroku 平台。具体操作参考 Heroku 的操作手册。


部署成功后,到微信订阅号操作台点 Submit 按钮提交验证请求,然后在 Heroku 应用的控制台上能观察到我们自己的微信服务器计算出的 signature 和微信平台发送的 signature 完全一致,认证通过。



回到订阅号的操作台,发现我们的 nodejs 微信服务器认证成功,可以做开发了。



微信程序开发系列教程(二)使用 JavaScript 给微信用户发送消息


功能需求:当有微信用户关注了您的公众号之后,您用 JavaScript 发送一个欢迎消息给这个粉丝。

具体实现

我们登陆微信公众号的控制台后,点开发-> 基本配置:



能看到我们配置的微信消息服务器的地址。在我第一篇教程里讲到,我们在本地用 nodejs 开发一个 Web 服务器,然后部署到您喜欢的云平台,比如腾讯云,阿里云,百度云等等(我选的是云平台 Heroku),然后把部署后应用的 url 维护到微信公众号控制台的服务器配置,如下图所示。维护好之后,微信用户关注该公众号或者给该公众号发送的消息,就会通过微信平台投递到您的 nodejs 应用,我们在里面就可以编程实现一些需求了。下文将该 nodejs 应用称为“消息服务器”。



我们首先用 nodejs 的 express module 获得一个 app 对象:


var express = require('express');
var app = express();
复制代码


当有微信用户关注您的公众号时,微信平台会发送一个 HTTP post 请求到您的消息服务器。您需要编程响应这个 post 请求。


app.route('/').post(function(req,res){  var content;  // 把微信平台发送的HTTP post的内容存储到变量content里  req.on("data",function(data){    content = data.toString("utf-8");  }  );  req.on("end",function(){    console.log("new http post: " + content );    // 打印HTTP post请求,做调试用
复制代码


// 从微信平台发送的 HTTP 请求里解析出事件对象。如果是粉丝点关注,事件类型为 subscribe。


var msgType = formattedValue(getXMLNodeValue('MsgType', content));// 有粉丝点了关注按钮啦if( event === "subscribe"){  // 回复一条欢迎消息给粉丝  var replyxml = replyMessage(content, "欢迎欢迎,终于等到您了!");  res.send(replyxml);     }}
复制代码


上述代码逻辑很清晰,看注释都易懂。关键就是如何把欢迎消息回复给点了关注按钮的粉丝。


核心逻辑在 replyMessage 函数里,这个函数的任务是将粉丝的 openID 从微信平台发给消息服务器的 HTTP post 内容中解析出来。代码如下:


输入参数 1: 微信平台发给消息服务器的 HTTP post 全部内容


输入参数 2:准备给粉丝推送的欢迎消息


输出参数:准备通过 HTTP 返回给粉丝的欢迎消息的微信报文,需符合微信定义的消息规范,具体规范如下代码所示。


module.exports = function(originalBody, contentToReply){  // 从原始报文里提取出消息的接收方  var ToUserName = getXMLNodeValue('ToUserName', originalBody);  // 从原始报文里提取出消息的发送方  var FromUserName = getXMLNodeValue('FromUserName',originalBody);  var CreateTime = getXMLNodeValue('CreateTime',originalBody);  // 告诉微信平台这条消息的类型是文本消息  var MsgType = "<![CDATA[text]]>";  // 准备将欢迎消息的文字内容加入消息报文  var Content = contentToReply;  // 开始拼装准备发送给微信粉丝的消息报文  var xml = '<xml><ToUserName>'+FromUserName+'</ToUserName><FromUserName>'+ToUserName+'</FromUserName><CreateTime>'+CreateTime+'</CreateTime><MsgType>'  + MsgType + '</MsgType><Content>'+Content+'</Content></xml>';  console.log("xml to be sent: " + xml);  // 打印消息报文  return xml;  // 返回消息报文};
复制代码


发布于: 10 小时前阅读数: 6
用户头像

Jerry Wang

关注

个人微信公众号:汪子熙 2017.12.03 加入

SAP成都研究院开发专家,SAP社区导师,SAP中国技术大使。

评论

发布
暂无评论
微信程序开发系列教程(一)开发环境搭建