玩一玩微信公众号开发(一) 接入系统

一开始我准备学一学微信开发。后来看了一下文档,需要自己搭服务器进行接口对调。有点麻烦所以就没继续学下去。现在学习过了Kotlin、Spring Boot很多东西,感觉可以比较方便的进行开发了。今天就来回过头学习一下。

准备工作

申请公众号

首先说明一下,有两个微信相关平台,微信公众平台和微信开放平台。公众平台是我们运营微信号的主要地方,我们要想申请订阅号、公众号等都需要到这个平台进行申请。微信开放平台则是针对开发者的,我们可以在这里申请第三方平台等,然后和公众号进行对接。如果需要测试号的话也可以在这里申请。

这里因为是我自己主要玩玩,所以工具全部挑自己最喜欢的。编程语言我选择Kotlin,开发框架使用Spring Boot,IDE使用Intellij IDEA。剩下的想到再说。

首先第一步就是申请微信公众号了。我们去微信公众平台申请一个公众号。由于我是个人性质的,只能申请个人订阅号。申请过程很简单,照着腾讯的说明来就行了。

申请完成之后会进入到公众号页面,我们可以可以在这里进行各种设置。公众号发布信息也可以直接在这里手动发布。这样即使没有任何编程经验的人也可以运营自己的公众号。当然既然我们是公众号开发,那么肯定要用程序来实现这些功能了。在页面左部最下面就是开发相关资源了。开发者工具包含了几个很有用的工具,以后会很有用。

img_4d706a688965feab5bac073ace568b15.png
开发页面

花生壳建立内网映射

要接入微信系统的话需要提供一个公网地址,然后将该地址填入微信公众号,这样当用户通过公众号执行相应动作的时候,微信官方就会将请求发送到该地址上。我们就可以使用程序自动处理了。

当然,如果拥有一个自己的服务器,那是最好不过的了。原来腾讯云和阿里云也有提供学生优化,在校大学生可以用非常实惠的价格购买到云服务器。不过现在政策改了,不管是哪个都需要抢了。而且现在我也毕业了,弄不到这东西了。所以只能使用另外一种方式,那就是使用自己本机电脑当作服务器。

但是本机电脑并没有公网地址,无法从外部接受请求。所以我们还需要一种方式将外网请求映射到本机上。所以我们需要使用nat123或者花生壳这样的端口映射工具。这些端口映射工具的原理也很简单,我们注册申请之后它会给我们分配一个免费的二级域名。然后我们在电脑本机打开它的映射工具,这样当用户通过二级域名访问的时候,就会映射到我们本机端口上。

其实nat123感觉要比花生壳稳定一些,不过由于花生壳程序的界面更漂亮。所以我还是决定使用花生壳。花生壳的注册还是很早以前的了。我记得如果需要使用端口映射好像还需要支付1块钱激活这个功能。

然后我们设置一个内网穿透。内网地址随便写,不过由于一般开发web程序都是在8080上开发,所以这里也直接填写8080就行了。当然如果要保证服务一直可用,电脑必须打开并启动花生壳。所以我的个人公众号嘛,当电脑关了的时候肯定就不能用了。

img_f6b9a1dede8c3fae337b91d09473528f.png
内网穿透

建立Spring Boot项目

准备工作的最后一步就是建立一个项目了。使用Intellij IDEA也非常简单。如果想使用Java以及Maven的话也可以在这里方便的设置。

img_2a8bed3a95d90c265442874689f8e6e8.png
新建项目

这样,所有准备工作就都做完了。

接入微信平台

输入验证信息

要开发公众号,第一件事情就是接入平台了。先来看看微信公众平台开发文档。找到左边的接入指南。这将是我们参考的文档。

首先先进入微信公众平台,点击左下的基本配置。然后设置URL、Token、EncodingAESKey等信息。URL就是我们用花生壳配置的公网地址。Token是一个我们设置的字符串,将在后面web程序中使用。EncodingAESKey是消息加密的密钥,自动生成一个就行。设置完成之后,别忙着点提交。先来配置一下服务端。

服务器验证

服务端也就是我们的web项目了。由于服务器端需要使用刚才我们设置的token,所以我们需要保存该token。token可以硬编码在程序中,不过更好的方式就是使用配置文件了。所以我们打开application.properties。输入类似下面的配置。yitian.study.weixin.server.token用于保存token,当然你可以设置自己的属性名和token。

spring.output.ansi.enabled=always
yitian.study.weixin.server.token=weixintoken
logging.level.yitian.study=debug

我们需要在程序中按照微信的要求对请求进行校验,只有验证通过之后才能请求消息。在验证的时候,微信会向我们填写的URL发送一个GET请求,包含signature、timestamp、nonce和echostr四个参数。然后按照下面的规则校验。

1)将token、timestamp、nonce三个参数进行字典序排序
2)将三个参数字符串拼接成一个字符串进行sha1加密
3)将加密后的字符串与signature对比,相同时返回echostr

这个功能可以写成一个服务。如果不熟悉Kotlin的话也没事,这语法虽然看着和Java很不一样,但是其实也就是一个类,包含了verify方法,在verify方法中对几个参数进行验证。token参数由Spring的@Value注解从配置文件中读取,由于Kotlin的内插字符串语法和Spring的SpringEl语法冲突了,所以这里还需要对@Value注解中的美元符号进行转义。为了验证程序输出,这里还顺便打印了日志。

@Service
class WeixinVerificationService(@Value("\${yitian.study.weixin.server.token}") val token: String
) {private val logger = LoggerFactory.getLogger(WeixinVerificationService::class.java)fun verify(signature: String, timestamp: String, nonce: String, echostr: String): String {logger.debug("signature=$signature,timestamp=$timestamp,token=$token,nonce=$nonce,echostr=$echostr")val list = listOf(timestamp, nonce, token).sorted()val str = list.joinToString(separator = "")val result = Hashing.sha1().hashString(str, Charsets.UTF_8)if (result.toString() == signature) {return echostr} else {return ""}}
}

由于JDK好像没有自带Sha1加密类。所以我又引入了Guava库。如果使用Gradle的话添加下面的依赖即可。

compile group: 'com.google.guava', name: 'guava', version: '21.0'

当然仅仅一个服务是不够的。我们还需要控制器来处理请求。所以下面来定义一个控制器。上面的服务使用了@Service注解,所以我们可以直接把它注入到控制器中。

@RestController
class MainController(private @Autowired val weixinVerificationService: WeixinVerificationService) {@RequestMapping("/")fun validateServer(@RequestParam signature: String, @RequestParam timestamp: String, @RequestParam nonce: String, @RequestParam echostr: String): String {return weixinVerificationService.verify(signature, timestamp, nonce, echostr)}
}

写好控制器之后,启动Spring Boot程序。先在浏览器中输入在花生壳申请的域名,查看一下解析是否成功。如果出现了一个错误页面的话说明解析没有问题。然后回到刚刚的微信公众平台,确认信息之后点击提交。微信会向我们的服务器发送请求。验证通过之后,我们即成功接入了微信。

如果出现Token验证错误,那就是说明可能我们服务器端的token和在这里设置的token不同,导致最终生成的字符串不一致。如果提示URL超时,可能是花生壳解析的问题,检查花生壳解析或者稍等一会通常可以解决问题。

成功之后,我们就完成了微信开发的第一步!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/291111.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android studio之NDK integration is deprecated in the current plugin解决办法

1 、问题 编译Android项目,出现下面错误 NDK integration is deprecated in the current plugin 2、解决办法 在我们 gradle.properties(Project Properties) file add android.useDeprecatedNdktrue

使用 System.Net.Http.Json 简化 HttpClient 的使用

使用 System.Net.Http.Json 简化 HttpClient 的使用Intro从 .NET Core 3.1 开始,微软添加了一个 System.Net.Http.Json 的扩展,可以用来简化 HttpClient 的使用,看到在很多项目里还并未开始使用,所以想向大家介绍一下SamplePostAs…

MySQL的四种不同查询的分析

1.前置条件:本次是基于小数据量,且数据块在一个页中的最理想情况进行分析,可能无具体的实际意义,但是可以借鉴到各种复杂条件下,因为原理是相同的,知小见大,见微知著!打开语句分析并确认是否已经…

.NET6之MiniAPI(十八):OpenAPI swagger

从本篇开始,介绍一些很不错的三方库,来丰富MiniAPI的使用。在创建MiniAPI项目时,模板提供了一个是否启用OpenAPI的选项,足见这个三方库的优势和强大。OpenAPI为我们测试API提供了强大的支持,调用API的开发人员&#xf…

Android之ndk-build出现c:28:51: error: ‘get_string‘ undeclared here (not in a function)解决办法

1 problem ndk-build error: get_string undeclared here (not in a function) 2 resolve jstring get_strstring(JNIEnv* env, jobject thiz) {return (*env)->NewStringUTF(env, "I am chenyu, 动态注册JNI"); }jint add_int(JNIEnv* env, jobject jobj, ji…

BeetleX服务网关授权配置

很多应用服务都需要授权访问,为了更好地统一处理这种授权验证,服务网关提供了JWT验证插件用于解决这问题。网关的JWT验证插件默认是关闭的,只有当开启后网关才会对请求进行拦截验证处理。开启开启JWT验证需要在插件管理里开启Webapi JWT验证插…

Linux下的压缩与解压缩

tar命令zip命令unzip命令gzip命令bzip2命令tar命令:压缩和解压缩tar格式的文件格式:tar [主选项辅选项] 文件或目录【主选项告诉tar要做什么事,是必须要有的,辅选项是辅助使用的,和通常的选项一样,可选】主…

Android之JNI动态注册native方法和JNI数据简单使用

1、爆结果照片 2、介绍JNI注册方式 JVM 查找 native 方法有两种方式: 1)、按照 JNI 规范的命名规则(静态注册) 2) 、调用 JNI 提供的 RegisterNatives 函数,将本地函数注册到 JVM 中(动态注册) 静态注册的实现可以参考我的这篇博客 http://blog.csdn.net/u01…

Linux怎么查询全部容器时间,linuxea:如何单单修改docker容器的系统时间

一般情况下,我们仅仅需要修改容器的时间与我们宿主机的实际实际一致即可,我们知道,默认情况下docker容器是不允许访问系统时钟,但是有一款开源的软件使这样的需求变成了可能。此lib拦截用于检索当前时间和日期的所有系统调用&…

关闭系统索引(转)

转自“http://jingyan.baidu.com/article/d621e8daeaaa392865913f0a.html” 关闭系统索引 Windows索引服务是为文件、电子邮件和其他内容提供内容索引、属性缓存和搜索结果。 Windows系统在安装完成后,会逐步创建特定文件、文件夹和其它目标的索引,例如开…

如何编译 dotnet/aspnetcore 源代码

前言最近,准备为 dotnet/aspnetcore 修改 issue,但是在 clone 代码后,发现要编译成功,远没有想象中那么容易。因此,将整个过程进行记录,以供大家参考。以下操作都是在 Windows 10 下完成。0.环境准备详见官…

linux 编译工具链,Linux工具链for TKStudio下载_Linux工具链for TKStudio官方下载-太平洋下载中心...

Linux工具链for TKStudio是一款支持TKStudio IDE集成开发环境的辅助LINUX交叉编译工具链软件,交叉编译就是跨架构编译,编译出来的程序不能在本机执行(当然有例外情况)。所以这个时候就需要交叉编译工具链。译工具链一般最简化的为 binutils gcc glibc …

Convolutional Neural Networks for Visual Recognition 1

Introduction 这是斯坦福计算机视觉大牛李菲菲最新开设的一门关于deep learning在计算机视觉领域的相关应用的课程。这个课程重点介绍了deep learning里的一种比较流行的模型:Convolutional Neural Networks,简称CNN,主要利用CNN来做visual r…

记一次 .NET 某供应链WEB网站 CPU 爆高事故分析

一:背景 1. 讲故事年前有位朋友加微信求助,说他的程序出现了偶发性CPU爆高,寻求如何解决,截图如下:我建议朋友用 procdump 在 cpu 高的时候连抓两个dump,这样分析起来比较稳健,朋友也如期的成功…

html5做的太阳系

效果图&#xff1a; 源代码&#xff1a; <!DOCTYPE html><html><head><meta charset"UTF-8"> <title></title></head><body><canvas id"canvas" width"1000" height"1000" style&…

Windows 11 任务管理器重磅升级!界面迎来全新设计,十年来首次大改!

面向 Dev 频道的 Windows 预览体验成员&#xff0c;微软近日发布了 Windows 11 预览版 Build 22557。在此版本中&#xff0c;任务管理器迎来了全新的设计&#xff0c;这是其自 Windows 8 以来的首次变更&#xff0c; 也是任务管理器十年来最大的一次升级。史诗级更新&#xff0…

modbus调试工具 linux,linux libmodbus的移植

1.前言Modbus是一个工业通信系统&#xff0c;由带智能终端的可编程序控制器和计算机通过公用线路或局部专用线路连接而成。其系统结构既包括硬件、亦包括软件。它可应用于各种数据采集和过程监控。2.移植步骤第一&#xff0c;进入libmodbus目录下&#xff0c;在交叉编译器是最好…

微博自媒体,一个新的生态

昨日&#xff0c;微博、UC和360&#xff0c;三方宣布将联合打造自媒体平台&#xff0c;这是继微信公众平台、搜狐新闻客户端、百度百家、今日头条之后的又一大自媒体平台。自媒体平台之争正愈演愈烈&#xff0c;而这对自媒体人和读者来说都算是好事。为何巨头们钟爱自媒体起初微…

开发者说PaddleOCR的.NET封装与应用部署

本项目是一个基于PaddleOCR的C代码修改并封装的.NET的工具类库。包含文本识别、文本检测、基于文本检测结果的统计分析的表格识别功能&#xff0c;同时针对小图识别不准的情况下&#xff0c;做了优化&#xff0c;提高识别准确率。项目包含总模型仅8.6M的超轻量级中文OCR&#x…

转载 雨松mono Unity获取游戏对象详解(来自我的长微博)

Unity获取游戏对象详解&#xff08;来自我的长微博&#xff09; 转载 自 雨松mono 本文固定链接: http://www.xuanyusong.com/archives/2768转载请注明: 雨松MOMO 2014年06月16日 于 雨松MOMO程序研究院 发表我觉得Unity里面的Transform 和 GameObject就像两个双胞胎兄弟一样&a…