java开发微信公众平台(一)-- 服务器配置
微信公众平台开发好像已经火了很长一段时间,我好像有点后知后觉。但只从了解它后便有点不可收拾之势,脑袋里总想着开发一个自己的公众号,虽然不知道具体做什么。
下面就说说自己这段时间对公众号的学习。
欲善其事,必先利其器。在开发之前先要申请一个公众号,公众号有三种,个人比较容易申请的是订阅号,服务号还要审核,稍微麻烦一点,对于个人开发我建议申请服务号,
因为后面会做自定义菜单的功能。再就是我们需要有一个公网的服务器,这个可以申请sina的sae和百度的bae,个人比较喜欢sina的一点,比较容易上手。这里不讲公众号的申请
和sae服务器的申请和配置。
再做完这两件事后我们就可以开始公众号的开发了。首先我们需要了解微信公众号的工作流程,对其有个整体的把握,要不今后就会换挺多简单错误。在启用开发者模式情况下
(下面内容都是在此模式下)当用户通过微信客服端发送消息到微信服务后,微信服务器会将此消息转发给我们的公网服务器,如上面所说sae和bae(以下内容也均是在sae下完成)
。具体的业务逻辑就在sae上完成,处理完后再将结果发回微信服务器,微信服务器再发给用户。
申请到公众号后,登陆公众品台,可以看到微信已经帮我们准备好了许多功能,我们不需要编写任何代码就可以完成一个具有基本的公众号,但这不是本文的目的,我们是要
用自己的代码实现一些功能,因此我们要进入开发者中心去配置服务器接口。
下面就是本文核心内容:
试想一下让两个完全不沾边的服务器(微信服务器和sae)对接的风险,因此必须有什么验证机制的存在。具体的验证过程是
1、微信服务器会以get方式调用我们部署在sae服务器上的servlet,并传signature、timestamp、nonce、echostr四个参数。其中signature是微信加密签名;timestamp
是时间戳,防止即使有别有用心之人获得另外的参数而因时间戳的不一致无法完成验证;nonce是随机数;echostr是随机字符串,用于返回给微信服务器作比较。
2、servlet接收到以上数据后,会将token(在servlet中写好且要用公众平台上开发者中心的token相同)timestamp、nonce按字典方式排序,再拼接成字符串进行sha1加密
将加密后的字符串与signature比较,如果相同就返回echostr。
3、微信服务器接收到返回的echostr,与发过去的echostr相比较,如果相同,就接入成功,否则失败。
package com.java.Action;import java.io.IOException;
import java.io.PrintWriter;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** Servlet implementation class CrazyServlet*/
@WebServlet("/CrazyServlet")
public class CrazyServlet extends HttpServlet {private static final long serialVersionUID = 1L;/*** @see HttpServlet#HttpServlet()*/public CrazyServlet() {super();// TODO Auto-generated constructor stub}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 微信加密签名String signature = request.getParameter("signature");// 时间戳String timestamp = request.getParameter("timestamp");// 随机数String nonce = request.getParameter("nonce");// 随机字符串String echostr = request.getParameter("echostr");PrintWriter out = response.getWriter();// 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败if (SignUtil.checkSignature(signature, timestamp, nonce)) {out.print(echostr);}out.close();out = null;}}
servlet中的doGet()
package com.java.Action;import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;public class SignUtil {// 与接口配置信息中的Token要一致private static String token = "TCB2011";public static boolean checkSignature(String signature, String timestamp,String nonce) {//从请求中(也就是微信服务器传过来的)拿到的token, timestamp, nonceString[] arr = new String[] { token, timestamp, nonce };// 将token、timestamp、nonce三个参数进行字典序排序sort(arr);StringBuilder content = new StringBuilder();for (int i = 0; i < arr.length; i++) {content.append(arr[i]);}MessageDigest md = null;String tmpStr = null;try {md = MessageDigest.getInstance("SHA-1");// 将三个参数字符串拼接成一个字符串进行sha1加密byte[] digest = md.digest(content.toString().getBytes());//将字节数组转成字符串tmpStr = byteToStr(digest);} catch (NoSuchAlgorithmException e) {e.printStackTrace();}content = null;// 将sha1加密后的字符串可与signature对比,标识该请求来源于微信return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;}//将加密后的字节数组变成字符串private static String byteToStr(byte[] byteArray) {String strDigest = "";for (int i = 0; i < byteArray.length; i++) {strDigest += byteToHexStr(byteArray[i]);}return strDigest;}private static String byteToHexStr(byte mByte) {char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A','B', 'C', 'D', 'E', 'F' };char[] tempArr = new char[2];tempArr[0] = Digit[(mByte >>> 4) & 0X0F];tempArr[1] = Digit[mByte & 0X0F];String s = new String(tempArr);return s;}//用于字典排序public static void sort(String a[]) {for (int i = 0; i < a.length - 1; i++) {for (int j = i + 1; j < a.length; j++) {if (a[j].compareTo(a[i]) < 0) {String temp = a[i];a[i] = a[j];a[j] = temp;}}}}}
再sae上配置好后,点击开发者中心,首先启用服务器配置。填写url和token(和Java代码中的一样)、EncodingAESKey是随机生成,消息加解密方式选择明文模式。
这里的url就是你在sae中创建应用的地址,我们已经将写好的java代码上传到这个地址。token是微信服务器和sae服务器进行对接验证是用到的(必须保持一致),消息
加密暂时选择明文模式,如果选择加密模式需要编写加密代码,以后会再转到加密或兼容模式,这里先用明文模式。这样我们就完成了,点击提交(记得sae服务器要打开),
如果现实成功就说明接入完成,我们可以接着做下面的工作了。
java开发微信公众平台(一)-- 服务器配置相关推荐
- java微信接收消息_使用Java开发微信公众平台(二)——消息的接收与响应
上一篇文章中,我们学习了使用Java语言开发微信公众平台的第一部分--环境搭建与开发接入.那么,本篇文章,我们将在此基础上,学习[消息的接收与响应].喜欢本文,请点击下方喜欢按钮呗!❤️ 当然,我们在 ...
- Java开发微信公众平台之浅谈微信(一)
说起微信都不会陌生,每一部智能手机都有该APP也就是说 只要是使用智能手机的人都属于微信的用户,可想而知微信目前的使用人数.据16年数据统计微信的月活跃用户达到了8.06亿,什么概念,还没有算其余不是 ...
- 使用JAVA开发微信公众平台(一)——环境搭建与开发接入
转自:https://www.cnblogs.com/jerehedu/p/6377759.html 一. 初始微信公众平台 微信公众平台,即我们平时所说的"公众号",曾用名&qu ...
- java开发微信公众平台备忘
简单记录下前段时间开发的电子书的 公众平台的一些备忘及开发心得经验等 eclipse的一些技巧: 1.ctrl+shift+o 自动添加必要import空间及移除无用import 项目备忘+说明 1. ...
- 公众平台 java_java开发微信公众平台
<java开发微信公众平台>由会员分享,可在线阅读,更多相关<java开发微信公众平台(31页珍藏版)>请在人人文库网上搜索. 1.java开发微信公众平台响应消息的基类同样, ...
- Java开发微信公众号(二)---开启开发者模式,接入微信公众平台开发
接入微信公众平台开发,开发者需要按照如下步骤完成: 1.填写服务器配置 2.验证服务器地址的有效性 3.依据接口文档实现业务逻辑 资料准备: 1.一个可以访问的外网,即80的访问端口,因为微信公众号接 ...
- 基于java的微信公众平台开发视频教程
微信作为当前流行的通信社交软件已经有了几个亿的用户量,并且每天还在继续增加.几乎每一部智能手机都安装了微信.其公众平台拥有强大的功能.但是由于微信的示例代码基本使用php编写,市场上的java开发资料 ...
- 使用Bmob云端代码开发微信公众平台(教程)
使用Bmob云端代码开发微信公众平台(教程) 目录 一.简介...1 二.创建bmob应用...2 1.注册bmob账号...2 2. 创建应用...3 3. 数据的基本操作... ...
- Java对接微信公众平台详解
Java对接微信公众平台详解 1.公众平台概述 1.1 公众平台概述 1.2 入门指引 2.对接流程 2.1 接入概述 2.2 填写服务器配置 2.3 接口域名说明 2.4 获取Access toke ...
最新文章
- 开发者如何构建技术影响力
- 关注这些技术号,你将拥有半个互联网圈
- getchar()函数的返回值赋给char型,用if(ch=getchar() != EOF)测试,输入ctrl+z同样可以结束循环的分析...
- C++的常量、指针、引用
- Django-admin管理工具
- bit、byte、位、字节、汉字、字符之间的区别
- Linux Shell基础 - 流程控制 - for循环 - while 循环 - until循环
- 把windows当linux用,把Windows Vista当成Linux系统来使用
- Python Tricks(五)—— 计算 list of lists 的长度(元素个数)
- 本特利3500_3500系统轴振信号异常波动问题浅析及建议
- php 连接redis服务器
- MySQL 优化--持续整理
- vbs脚本打开web窗口隐藏地址栏和工具栏
- 数据分析师,数据挖掘工程师和数据研发工程师有什么区别?
- 云计算关键概念之一:云资源池
- 用Python爬取东方财富网上市公司财务报表
- Taro3 React hook怎么使用Taro-prase显示markdown文件?
- 科目二考试的只言片语
- 视频里面的音频怎么提取成mp3?
- 软考的高级证书难考吗,难度大吗?