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

准备工作

申请公众号

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

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

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

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

开发页面

花生壳建立内网映射

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

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

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

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

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

内网穿透

建立Spring Boot项目

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

新建项目

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

接入微信平台

输入验证信息

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

首先先进入微信公众平台,点击左下的基本配置。然后设置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超时,可能是花生壳解析的问题,检查花生壳解析或者稍等一会通常可以解决问题。

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

玩一玩微信公众号开发(一) 接入系统相关推荐

  1. 200.微信公众号开发【接入】

    第一步:申请微信公众号 https://mp.weixin.qq.com/ 注意,个人只能选择订阅号 这里需要注意,要用一个绑定了银行卡的微信号扫码才能注册. 第二步:公众号开发环境准备 需要一个微信 ...

  2. 微信公众号开发--消息接收与回复

    在上篇文章中已经说明如何接入微信服务器,此篇直接接着上篇文章介绍公众号的消息接收与回复,可以结合上篇文章阅读本文,微信公众号开发–服务器接入. 微信公众号开发接口文档: https://mp.weix ...

  3. 微信公众号开发系列-玩转微信开发-目录汇总

    引言 最遗憾的不是把理想丢在路上,而是理想从未上路. 每一个将想法变成现实的人,都值得称赞和学习.致正在奔跑的您! 在现在这个无处不在的互联网背景下,各种应用已不再仅仅局限于网页或桌面应用了,IOS. ...

  4. 微信公众号开发 糟糕的体验_糟糕的开发人员–好老板

    微信公众号开发 糟糕的体验 当我键入此内容时,一些开发人员正在创建他的启动应用程序,这将使他成为百万富翁. 好吧,足够富有以维持他的小生意并激励他创造更多. 目前,其他一些开发人员正在Google P ...

  5. Python 微信公众号开发

    大三上的时候,对微信公众号开发浅尝辄止的玩了一下,感觉还是挺有意思的.http://blog.csdn.net/marksinoberg/article/details/54235271 后来服务器到 ...

  6. Python微信公众号开发平台

    上大学的时候,对微信公众号开发浅尝辄止的玩了一下,感觉还是挺有意思的. //www.jb51.net/article/133677.htm后来服务器到期了,也就搁置了.由于发布web程序,使用PHP很 ...

  7. 微信公众号开发---微信开发学习路线(及供参考)

    目录(?)[-] 1.       热门学习 1.        微信支付之H5页面WAP端接入 2.        微信支付开发系统开发流程及完整Demo展示 3.        微信公共服务平台开 ...

  8. Python微信公众号开发

    摘要: 大三上的时候,对微信公众号开发浅尝辄止的玩了一下,感觉还是挺有意思的.http://blog.csdn.net/marksinoberg/article/details/54235271 后来 ...

  9. 免费课程《微信公众号开发》开讲啦!!!

    微信硬件开发交流QQ群(488969821 )免费讲解<微信公众号开发知识>: 课程地点:微信硬件开发交流QQ群488969821        时间:2015/09/29 周二晚 20: ...

  10. 微信公众号开发(一):搭建开发环境

    微信作为移动互联网的第一张门票,是我们理解和连接世界的一条很好的路径,是我们在移动互联网时代的ID.而微信公众号可以建立起一对多的较强的服务与用户之间的连接,公众号分为订阅号.服务号.企业号三种,提供 ...

最新文章

  1. ASP.NET MVC 学习6、学习使用Code First Migrations功能,把Model的更新同步到DB中
  2. 结构光三维重建Projector-Camera Calibration投影仪相机标定
  3. wxpython使窗口重新显示出来_wxPython实现窗口在任务栏中闪烁
  4. 转:C#调用C++的DLL搜集整理的所有数据类型转换方式
  5. oracle指定过个时间点 job_SQL SERVER 快速恢复:生成指定时间点的恢复脚本
  6. Shell脚本修改Nginx upstream配置文件
  7. IntelliJ IDEA+jetty部署Eova
  8. k2p路由器搭建php,K2P新手教程之openwrt cc 基础设置
  9. ZedGraph的一些属性
  10. 数组逆时针旋转 90 度
  11. P1551 亲戚 并查集
  12. 中国最火最流行的40个博客网站
  13. Laravel 论坛系统之消息通知功能
  14. 【Python】批量修改照片日期和文件名
  15. 三十二楼层选几层最好_楼层风水几楼最好 1一32高楼层选最佳楼层
  16. 五、数据CRUD操作
  17. Apache Tomcat优化
  18. 获取当前日期是一年中的第几周
  19. day10--协成\异步IO\缓存
  20. 计算线段与平面的交点

热门文章

  1. 分布式实物实现方式_这是您完成实物产品设计任务的方式
  2. 黑客宣言_情感设计宣言
  3. 入坑 Electron 开发跨平台桌面应用
  4. Redis 集合处理
  5. Windows Nano Server安装配置详解03:远程管理Nano Server
  6. VS2013配置pro*C/C++开发环境
  7. 资源文件(.RES)的应用
  8. html select选择事件_一道搜狗面试题:IO多路复用中select、poll、epoll之间的区别...
  9. 分布式压测系列之Jmeter4.0第一季
  10. 智能停车O2O 独角兽初现:“ETCP停车”获5000万美金A轮融资