当前位置: 首页 > news >正文

uniCloud开发公众号:一、接收、解析、组装xml消息

算是个系列内容吧,最终要实现的是将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;

在这里插入图片描述

相关文章:

  • YOLO系列目标检测算法-YOLOv1
  • JavaScript高级,ES6 笔记 第三天
  • 【雷达图】R语言绘制雷达图(ggradar),NBA季后赛数据为例
  • 机器学习笔记 - 在QT/PyTorch/C++ 中加载 TORCHSCRIPT 模型
  • redis 技术分享
  • 怎么让面试官喜欢你?
  • 深度学习模型理解-CNN-手写数据字代码
  • C# ZBar解码测试(QRCode、一维码条码)并记录里面隐藏的坑
  • 【技术美术图形部分】图形渲染管线3.0-光栅化和像素处理阶段
  • css:一个容器(页面),里面有两个div左右摆放并且高度和容器高度一致,左div不会随着页面左右伸缩而变化,右div随页面左右伸缩宽度自适应(手写)
  • Kubernetes 1.25 集群搭建
  • 【每周CV论文推荐】GAN在医学图像生成与增强中的典型应用
  • python毕业设计项目源码选题(16)跳蚤市场二手物品交易系统毕业设计毕设作品开题报告开题答辩PPT
  • C# 连接 SqlServer 数据库
  • 【408计算机组成原理】—进位计数制(二)
  • Android 控件背景颜色处理
  • Angular 4.x 动态创建组件
  • extjs4学习之配置
  • gitlab-ci配置详解(一)
  • JavaScript 基础知识 - 入门篇(一)
  • js
  • Kibana配置logstash,报表一体化
  • MySQL QA
  • Web Storage相关
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 搞机器学习要哪些技能
  • 给新手的新浪微博 SDK 集成教程【一】
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 力扣(LeetCode)22
  • 批量截取pdf文件
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 使用Swoole加速Laravel(正式环境中)
  • 使用权重正则化较少模型过拟合
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • ​Java并发新构件之Exchanger
  • #QT(一种朴素的计算器实现方法)
  • (02)vite环境变量配置
  • (2022 CVPR) Unbiased Teacher v2
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (二)linux使用docker容器运行mysql
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (转)【Hibernate总结系列】使用举例
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .bat文件调用java类的main方法
  • .net 8 发布了,试下微软最近强推的MAUI
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • .net和php怎么连接,php和apache之间如何连接
  • .NET简谈设计模式之(单件模式)
  • ::什么意思
  • @for /l %i in (1,1,10) do md %i 批处理自动建立目录