赞
踩
算是个系列内容吧,最终要实现的是将uniCloud作为后端完成“扫码关注公众号后完成网站登录”
将要涉及的内容可能包括:
0.准备工作:各种配置、基础搭建
1.接受并解析xml消息(本节)
2.请求access_token并缓存
3.生成带参数二维码
4.引入、封装redis缓存方法
5.引入、配置、初始化unipush
6.解析不同情况下用户扫码时推送的事件并完成登录
系列内容全部基于uniCloud+vk-uniCloud(云函数路由)+uni-app
编辑器HbuilderX最新版
云空间为阿里云
公众号为认证服务号
笔者实际上也已经做过一些公众号的后端开发了,但此前是php语言,基本上都是用easywechat来完成接口的对接,现在没有easywechat这个神器可以用了, 只能自己去看微信官方那翔一样的文档
。
好了,废话不多说,本节主要来看一下,如何在uniCloud环境中解析、拼装xml消息。
开始之前,先放一个官方对于云公共模块
的说明,没用过的可以先看看,下边就不赘述了。
一、新建xml2js云公共模块
这一步的目的是把npm包抽出来弄成单独的模块,这样给云函数用的时候,可以稍微降低一些启动速度。也比较方便给不同的云函数依赖。
1)引入xml2js
,打包为云公共模块
首先,在common
目录上右击,选择新建公共模块
,然后输入名称后即可新建一个基础的目录。
比如nb-xml2js
,这里建议自己弄个前缀,否则会冲突。
其次,在新建好的模块上右击,选择使用命令行打开所在目录
。
接着,在控制台中使用命令,引入完成xml2js的引入
npm i xml2js
最终,如下图所示:
2)编写云公共模块代码
这里直接贴代码了,官方也有说明,只用到了parseStringPromise
这一个方法:
var xml2js = require('xml2js');
module.exports = async (xml) => {
// 文本消息
let obj = await xml2js.parseStringPromise(xml, { explicitArray: false })
return obj.xml;
}
完成后,直接在nb-xml2js
文件夹上右击,选择上传云公共模块
同时,在router
云函数目录上也右击,选择管理云函数依赖
,勾选你刚刚上传的这个云函数,点击确定。
二、在云函数中完成xml解析
再次说明,本文使用了vk-unicloud框架,写法和uniCloud官方不同,请自行解决差异。
1)引用云公共模块
'use strict';
const xml2js = require('nb-xml2js'); // 这里这么写
module.exports = {
// 省略--------
2)解析xml消息
main: async (event) => {
// 省略--------
let xml = originalParam.event.body;
// 解析XML内容
let xmlObj = await xml2js(xml);
let {
ToUserName, // appid
FromUserName, // openid
MsgType, // text,event
EventKey,
} = xmlObj;
// 省略--------
}
这样,我们就接收到了微信服务器推送过来的消息,其中一般包含了以上几个字段。
后续这些字段都会用到,我们后边再说。
三、拼装xml消息返回
实际上现在我们已经可以返回消息了,然后给新手提示一下,这里用的是返回
而不是发送
,就是因为是一个被动的状态,只有用户主动
进行某个操作,让服务器收到消息时,才可以返回一条消息。
这里我在/cloudfunctions/router/util/pubFunction.js
中封装了这个纯文本消息
的方法:
/** * 组装XML格式数据 * pubFun.createXmlTextMsg(); */ // 这里要注意,tousername = 用户openid; // content=消息正文 // fromusername 不是你的appid,而是公众号id,在后台可以看到,微信推送的那个xml内容里也有 pubFun.createXmlTextMsg = (tousername, content, fromusername = '可以给一个默认的') => { var msg = '<xml>' + '<ToUserName><![CDATA[' + tousername + ']]></ToUserName>' + '<FromUserName><![CDATA[' + fromusername + ']]></FromUserName>' + '<CreateTime>' + parseInt(new Date().valueOf() / 1000) + '</CreateTime>' + '<MsgType><![CDATA[text]]></MsgType>' + '<Content><![CDATA[' + content + ']]></Content>' + '</xml>'; return msg; }
云函数中这样用
msgContent = await pubFun.createXmlTextMsg(FromUserName, '测试~');
res.body = msgContent;
return res;
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。