基于Supabase开发公众号接口
在《开源BaaS平台Supabase介绍》一文中我们对什么是BaaS以及一个优秀的BaaS平台--Supabase做了一些介绍。在这之后,出于探究的目的,我利用一些空闲时间基于Microsoft .NET 7和Supabase开发了一个微信公众号接口的项目并且发布在Github上。欢迎各位朋友查阅、指导。如果您觉得这个项目对您有用,还希望给一个小小的Star:
本项目还包含了一些《使用MediatR实现CQRS》和《使用MediatR和FluentValidation实现CQRS应用程序的数据验证》的内容。目前项目正在不断进行完善,如果您有什么想法、意见、建议等,可以在文章下面留言或者在Github上提交Issue。
项目介绍
Woa(Wechat Official Account)是一个基于.net 7开发的微信公众平台接口项目,利用Supabase作为数据存储和消息通信服务,同时提供了ChatGPT和Claude2等目前热门的生成式AI会话功能接入。
项目结构

- Woa.Webapi: 微信公众平台接口及其他WebApi接口。
- Woa.Chatbot: 聊天机器人,提供Chat GPT、Claude2等聊天机器人接入。项目类型为Worker Service。
- Woa.Sdk: 微信公众平台、OpenAI、Claude接口Api封装。
- Woa.Common: 公共基础类库。
Chatbot的代码为何要分离出来呢?当然是为了异地单独部署咯!备案(国内服务器)和访问OpenAI,只能选一个。
运行和部署
开通及配置公众号
通过Woa的名称可以看出来,这是一个专门为微信公众号准备的项目,那要完整的运行项目,那我们得:
1. 申请开通公众号
关于如何开通公众号,网上已经有很详细的教程了,本篇文章里不再赘述,主要是因为说来说去无非就是其他人已经写好的内容复制过来。
公众号开通之后,需要配置服务器地址(微信公众平台向接口发送的消息全部都是通过这个接口的),请求令牌(Token,用于服务端接口鉴别消息是否来自腾讯服务器),开发者Id等等。
正式的公众号并不是所有接口都能使用的,根据账号类型、认证状态的不同,公众号的接口权限也不一样,为了方便接口对接调试,我们还需要同时开通公众平台测试账号。测试账号的所有接口权限都是开通的。
2. 准备域名
既然是开发公众号接口,一个可用的域名当然是必不可少的,国内的域名注册商有很多,例如时代互联、贝锐、阿里云、腾讯云等等,注册过程比较简单。
3. 内网穿透工具
开发过程中需要不断地进行调试,作为一名正常的程序员,我们不可能每次更改都要打包发布到公网服务器进行测试,即麻烦也不靠谱,最好的办法就是使用内网穿透,把微信服务的请求映射到我们自己的电脑上。
实现内网穿透的工具很多,例如GoProxy,ngrok等等,然而这两者都需要自己搭建一台服务器,实施过程也比较麻烦。我推荐的方案是使用natapp(官网地址:https://natapp.cn/),NATAPP提供免费隧道和收费隧道两种,并且可以自己注册固定的二级域名。
准备Supabase服务
1. 注册Supabase账号
Supabase账号注册比较简单,打开官网(https://supabase.com/)点击右上角Sign in按钮进入到登录界面,然后点击Sign Up Now并且填写好邮箱、密码提交注册即可。别忘了到邮箱里面查看一下supabase发送的账号激活邮件。
2. 创建项目
使用第一步注册的邮箱登录到官网,在dashboard页面点击New project。在创建新项目页面填写好相关的信息后点击Create new project。Supabase云服务的服务器提供商是AWS,目前可供选择的亚洲节点只有孟买、新加坡、东京和首尔,我选择的是新加坡节点,别问为什么,问就是我乐意……

创建成功后,浏览器会自动跳转到项目概览页面,如下图:

supabase 基于 PostgreSQL 数据库,因此当你创建完项目后,就自动为你分配好了一个可访问的 PostgreSQL 数据库,你完全可以将其当做一个远程的 PostgreSQL 数据主机。
可以在如下页面中查看到有关数据库连接的信息:

通过Navicat已经能够成功连接到数据库

配置项目
打开Woa.Webapi项目的appsettings.json,修改以下节点的配置项:
{
"Wechat": {
"Host": "https://api.weixin.qq.com",
"AppId": "",
"AppSecret": "",
"AppToken": "",
"EncodingKey": "",
"EncryptType": "None",
"OpenId": "",
"EnableCustomMessage": false,
"EnableTemplateMessage": true,
"ReplyTitle": "查看回复",
"ReplyDescription": "点击查看回复",
"ReplyUrl": null,
"ReplyPicUrl": null
},
"Supabase": {
"Url": "",
"Key": ""
}
}
- AppId:开发者ID
- AppSecret:开发者密码,公众号不提供展示开发者密码的功能,需要自己保存,忘记开发者密码只能进行重置。
- AppToken:令牌,在公众号自行设置,用于鉴别接口收到的请求是否来源于微信服务器。
- EncodingKey:消息加解密密钥,将用于消息体加解密过程。
- EncryptType:消息加密模式,可选值有None(明文模式)、Compatible(兼容模式)、Safe(安全模式)三个。
- OpenId:公众号原始Id,正式账号可以在公众号设置的注册信息栏找到。测试公众号在测试号管理页面右上角位置的微信号后面的字符串。
- EnableCustomMessage:是否开通客服消息权限。在接口权限页面查看开通状态,开通此接口权限必须通过微信认证。开通客服消息权限后,Chatbot回复的内容将通过客服消息接口异步下发给用户。
- EnableTemplateMessage:是否开通模板消息。
- ReplyTitle:回复消息标题。未开通客服消息的公众号,接口收到用户发送的消息后将同步回复一条图文消息,Chatbot回复之后用户可以通过点击图文消息查看回复内容。
- ReplyDescription:回复消息描述信息。
- ReplyUrl:回复消息Url。路由格式未
/api/wechat/{id:long}/reply。 - ReplyPicUrl:消息图片Url。
Supabase
- Url:项目Url地址,可以在supabase的项目配置里面找到。
- Key:项目API Key。
打开Woa.Chatbot项目的appsettings.json,修改以下节点的配置项:
{
"Bot": {
"Name": "OpenAi",
"OpenAi": {
"Host": "https://api.openai.com",
"Token": "",
"Organization": "",
"Model": "gpt-3.5-turbo"
},
"Claude": {
"Host": "https://api.anthropic.com",
"Key": "",
"Version": "2023.6.1",
"Model": "claude-2"
}
},
"Supabase": {
"Url": "",
"Key": ""
}
}
Supabase节点的配置与Woa.Webapi保持一致,OpenAI的配置在OpenAI开发者平台能找到。
运行项目
运行NATAPP:
在natapp官网下载客户端软件到本地,根据操作系统不同,需要下载不同的版本。打开终端并定位到natapp客户端所在文件夹,执行以下指令启动natapp客户端:
.natapp -authtoken=xxxxxx
如果觉得每次查询authtoken很费劲,也可以在natapp官网下载config.ini,与natapp客户端软件放到一起,将authtoken写到配置文件里面,启动的时候就不需要再指定authtoken参数。
具体教程可以在官网找到,这里不再赘述。
Woa.Chatbot和Woa.Webapi可以通过IDE启动,或者通过终端输入指令运行:
dotnet run
小知识
微信公众号的缩写为什么是MP?
微信公众平台的网址是mp.weixin.qq.com,这里面的mp其实是Media platform的缩写,可以理解为媒体平台,用于进行个人或企业等文化活动的宣传营销。事实上微信公众号的功能、用途和media platform的意思是完全契合的。
Worker Service是什么?
Worker Service是.NET Core 3.0引入的项目模板,通常用于构建需要长时间运行的服务,执行一些规律发生的工作负载。适用场景包括:
- 处理来自队列、服务总线或事件流的消息、事件
- 响应对象、文件存储中的文件更改
- 聚合数据存储中的数据
- 丰富数据提取管道中的数据
- AI/ML 数据集的格式化和清理
- 不需要用户交互的应用程序
由于Worker Service的宿主不监听任何端口,用户是不能直接访问的,所以它无法对外提供类似WebApi、gRPC的服务。
点关注,不迷路。
如果您喜欢这篇文章,请不要忘记点赞、关注、转发,谢谢!如果您有任何高见,欢迎在评论区留言讨论……

基于Supabase开发公众号接口的更多相关文章
- C#微信公众号接口开发,灵活利用网页授权、带参数二维码、模板消息,提升用户体验之完成用户绑定个人微信及验证码获取
一.前言 当下微信公众号几乎已经是每个公司必备的,但是大部分微信公众账号用户体验都欠佳,特别是涉及到用户绑定等,需要用户进行复杂的操作才可以和网站绑定,或者很多公司直接不绑定,而是每次都让用户填写账号 ...
- C#/ASP.NET MVC微信公众号接口开发之从零开发(四) 微信自定义菜单(附源码)
C#/ASP.NET MVC微信接口开发文章目录: 1.C#/ASP.NET MVC微信公众号接口开发之从零开发(一) 接入微信公众平台 2.C#/ASP.NET MVC微信公众号接口开发之从零开发( ...
- C#/ASP.NET MVC微信公众号接口开发之从零开发(二) 接收微信消息并且解析XML(附源码)
文章导读: C#微信公众号接口开发之从零开发(一) 接入微信公众平台 微信接入之后,微信通过我们接入的地址进行通信,其中的原理是微信用户发送消息给微信公众账号,微信服务器将消息以xml的形式发送到我们 ...
- C#/ASP.NET MVC微信公众号接口开发之从零开发(三)回复消息 (附源码)
C#/ASP.NET MVC微信接口开发文章目录: 1.C#/ASP.NET MVC微信公众号接口开发之从零开发(一) 接入微信公众平台 2.C#/ASP.NET MVC微信公众号接口开发之从零开发( ...
- 微信公众号接口类(PHP版本)
[项目需求] 通过微信提供的接口,实现微信公众号与后端的应用程序数据交互.消息响应等功能. [项目疑难点] 理解接口工作方式,统一接口API,响应速度.安全性等 [代码举例] WeixinAp ...
- 探究公众号接口漏洞:从后台登录口到旁站getshell
探究公众号接口漏洞:从后台登录口到旁站getshell 1.入口 发现与利用公众号接口安全漏洞 某120公众号提供了一处考核平台,通过浏览器处打开该网站. 打开可以看到一处密码登录口,试了一下常用的手 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(71)-微信公众平台开发-公众号管理
系列目录 思维导图 下面我们来看一个思维导图,这样就可以更快了解所需要的功能: 上一节我们利用了一个简单的代码例子,完成了与微信公众号的对话(给公众号发一条信息,并得到回复) 这一节将讲解公众号如何设 ...
- 基于NodeJS微信公众号
最近重新研究了微信公众号的高级接口,原来也利用C#或JAVA写过微信公众号,主要是消息的基础接口. 由于当时不知道微信公众号可以申请测试公众号,微信测试公众号基本上没有任何限制,对于开发来说是一个不错 ...
- 微信公众号开发(5)---使用开源组件开发公众号OAuth2.0网页授权授权登录
搞清微信公众号授权登录的步骤步骤,我们的开发就完成了一大步 献上github 地址: https://github.com/Wechat-Group/weixin-java-tools/wiki/MP ...
- 微信公众号菜单添加小程序,miniprogram,pagepath参数详解,php开发公众号
随着微信小程序功能的开发, 已经可以跟公众号打通了, 主要有两种方式: 1) 在公众号文章中插入小程序 2) 在公众号菜单中添加小程序 第一种方式, 子恒老师在前面的课程已经详细介绍过, 今天来讲第二 ...
随机推荐
- npm init vite@latest; 项目名字是abcde,选了vue-ts; cd abcde; npm install; npm run dev;浏览器访问,结果是空白的,这是怎么回事?
npm init vite@latest 项目名字是abcde,选了vue-ts cd abcde npm install npm run dev 浏览器访问,结果是空白的,这是怎么回事? 后来发现是 ...
- 2022-04-26:给定四个整数 sx , sy ,tx 和 ty,如果通过一系列的转换可以从起点 (sx, sy) 到达终点 (tx, ty),则返回 true,否则返回 false。 从点 (x
2022-04-26:给定四个整数 sx , sy ,tx 和 ty,如果通过一系列的转换可以从起点 (sx, sy) 到达终点 (tx, ty),则返回 true,否则返回 false. 从点 (x ...
- 【GPT-4理论篇-1】GPT-4核心技术探秘
前言 GPT-4已经发布有一段时间了,但是出于安全性等各种原因,OpenAI并没有公布GPT-4的技术细节和代码,而是仅仅给出了一个长达100页的技术报告[1]. 这个技术报告着重介绍了GPT-4的强 ...
- 【使用git之旅】
前言 在学习各种语言的时候我总喜欢把例子改成有自己想法并且有趣的程序, 但是时间一长,我发现在本地管理很麻烦,于是乎想到了github和gitee, 然后昨晚一时兴起,就开始了学习,开个博客记录一下我 ...
- 2013年蓝桥杯C/C++大学A组省赛真题(排它平方数)
题目描述: 小明正看着 203879 这个数字发呆. 原来,203879 * 203879 = 41566646641 这有什么神奇呢?仔细观察,203879 是个6位数,并且它的每个数位上的数字都是 ...
- ol设置最佳可视范围和限制缩放
目前随着科技发展,智慧城市的不断发展,GIS方面的技术也是层出不穷,如市场流行的 OPENLAYERS, CESIUM, THREE等,但是也会有很多棘手的问题,比如不同分辨率下,图层的显示范围,禁止 ...
- 大幅提升前端工作效率!Numeral.js数值格式化库来了!
我们日常开发中,时常会碰到数值格式化操作的场景,今天了不起就为大家分享一款相对比较全面的数值格式化的JS库:Numeral.js Numeral.js Numeral.js 是一个用来对数值进行操作和 ...
- Go 开源库运行时依赖注入框架 Dependency injection
Dependency injection 一个Go编程语言的运行依赖注入库.依赖注入是更广泛的控制反转技术的一种形式.它用于增加程序的模块化并使其具有可扩展性. 实例展示(High API): typ ...
- 解决github无法打开问题
在国内访问国外服务器(如github)会有卡顿.无法加载等问题,提供两种解决方案: 1.查看github的IP地址并修改Hosts windows键+R,打开cmd(或windows键+X,打开Win ...
- Python生成指定大小的文件
转载请注明出处️ 作者:测试蔡坨坨 原文链接:caituotuo.top/400bd75c.html 你好,我是测试蔡坨坨. 在日常测试工作中,我们经常需要对上传的文件大小进行测试,例如:一个文件上传 ...