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相比较,如果相同,就接入成功,否则失败。

 1 /**
 2  * 核心请求处理类
 3  *
 4  */
 5 public class CrazyServlet extends HttpServlet {
 6
 7     private static final long serialVersionUID = 5021188348833856475L;
 8     @Override
 9     protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
10         // 微信加密签名
11         String signature = request.getParameter("signature");
12         // 时间戳
13         String timestamp = request.getParameter("timestamp");
14         // 随机数
15         String nonce = request.getParameter("nonce");
16         // 随机字符串
17         String echostr = request.getParameter("echostr");
18         PrintWriter out = response.getWriter();
19         // 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败
20         if (SignUtil.checkSignature(signature, timestamp, nonce)) {
21                 out.print(echostr);
22         }
23         out.close();
24         out = null;
25     }

servlet中的doGet()

 

 1 /**
 2  * 请求校验工具类
 3  */
 4 public class SignUtil {
 5     // 与接口配置信息中的Token要一致
 6     private static String token = "845C2550903CE6FA54CACDB82EAD4350";
 7
 8
 9     public static boolean checkSignature(String signature, String timestamp,
10             String nonce) {
11         //从请求中(也就是微信服务器传过来的)拿到的token, timestamp, nonce
12         String[] arr = new String[] { token, timestamp, nonce };
13         // 将token、timestamp、nonce三个参数进行字典序排序
14         sort(arr);
15         StringBuilder content = new StringBuilder();
16         for (int i = 0; i < arr.length; i++) {
17             content.append(arr[i]);
18         }
19         MessageDigest md = null;
20         String tmpStr = null;
21
22         try {
23             md = MessageDigest.getInstance("SHA-1");
24             // 将三个参数字符串拼接成一个字符串进行sha1加密
25             byte[] digest = md.digest(content.toString().getBytes());
26             //将字节数组转成字符串
27             tmpStr = byteToStr(digest);
28         } catch (NoSuchAlgorithmException e) {
29             e.printStackTrace();
30         }
31
32         content = null;
33         // 将sha1加密后的字符串可与signature对比,标识该请求来源于微信
34         return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;
35     }
36
37   //将加密后的字节数组变成字符串
38     private static String byteToStr(byte[] byteArray) {
39         String strDigest = "";
40         for (int i = 0; i < byteArray.length; i++) {
41             strDigest += byteToHexStr(byteArray[i]);
42         }
43         return strDigest;
44     }
45
46     private static String byteToHexStr(byte mByte) {
47         char[] Digit = { ‘0‘, ‘1‘, ‘2‘, ‘3‘, ‘4‘, ‘5‘, ‘6‘, ‘7‘, ‘8‘, ‘9‘, ‘A‘,
48                 ‘B‘, ‘C‘, ‘D‘, ‘E‘, ‘F‘ };
49         char[] tempArr = new char[2];
50         tempArr[0] = Digit[(mByte >>> 4) & 0X0F];
51         tempArr[1] = Digit[mByte & 0X0F];
52
53         String s = new String(tempArr);
54         return s;
55     }
56 //用于字典排序
57     public static void sort(String a[]) {
58         for (int i = 0; i < a.length - 1; i++) {
59             for (int j = i + 1; j < a.length; j++) {
60                 if (a[j].compareTo(a[i]) < 0) {
61                     String temp = a[i];
62                     a[i] = a[j];
63                     a[j] = temp;
64                 }
65             }
66         }
67     }
68 }

验证核心代码

 再sae上配置好后,点击开发者中心,首先启用服务器配置。填写url和token(和java代码中的一样)、EncodingAESKey是随机生成,消息加解密方式选择明文模式。

这里的url就是你在sae中创建应用的地址,我们已经将写好的java代码上传到这个地址。token是微信服务器和sae服务器进行对接验证是用到的(必须保持一致),消息

加密暂时选择明文模式,如果选择加密模式需要编写加密代码,以后会再转到加密或兼容模式,这里先用明文模式。这样我们就完成了,点击提交(记得sae服务器要打开),

如果现实成功就说明接入完成,我们可以接着做下面的工作了。

时间: 2024-12-17 17:13:54

java开发微信公众平台(一)-- 服务器配置的相关文章

使用JAVA开发微信公众平台(一)——环境搭建与开发接入

一. 初始微信公众平台 微信公众平台,即我们平时所说的“公众号”,曾用名“官方平台”.“媒体平台”,但最终命名为“公众平台”.从微信的命名我可以发现,公众平台不只是官方.媒体使用的平台,而是对所有公众都开放的统一平台. 微信公众平台地址:https://mp.weixin.qq.com/ 微信公众平台公分4大板块:订阅号.服务号.小程序.企业号.按照微信2016年公开课规划,企业号后续将与企业微信合并,因此我们主要针对前三部分开始讲解: 简单的对比一下前三者的区别以及本次课程即后续课程的讲解重点

java开发微信公众平台(二)-- 消息的接收与回复文本消息

前面完成了服务器的对接,这一篇主要是实现各类消息的接收,并封装成map形式,供后面的使用,以及回复文本消息. 前面介绍的服务器的对接是通过get请求,而微信服务器准发过来用户的信息则是通过post请求,因此我们的方法要在post中实现. 同样,sae在接收微信服务器发过来消息时仍需要验证消息的可靠性,与上一讲中类似,只不过当验证成功后不是返回echostr,而是对 微信服务器发过来的消息进行解析处理. 1 protected void doPost(HttpServletRequest requ

java开发微信公众平台备忘

简单记录下前段时间开发的电子书的 公众平台的一些备忘及开发心得经验等 eclipse的一些技巧: 1.ctrl+shift+o 自动添加必要import空间及移除无用import 项目备忘+说明 1.struts配置 :resources->struts.xml 经验心得: 1.struts在前台显示后台属性:${属性名称},

Jfinal开发微信公众平台

http://blog.csdn.net/lyq8479/article/details/8937622 方法就是柳峰老师发的教程,jfinal的区别就是核心servlet的处理可以用拦截器结合controller实现. 1.定义一个验证请求的拦截器 public class CoreFilterInterceptor implements Interceptor { // 验证请求来源拦截器 public void intercept(ActionInvocation ai) { Contro

[转]C#开发微信公众平台-就这么简单

本文转自:http://www.it165.net/pro/html/201403/11102.html 写在前面 服务号和订阅号 URL配置 创建菜单 查询.删除菜单 接受消息 发送消息(图文.菜单事件响应) 示例Demo下载 后记 最近公司在做微信开发,其实就是接口开发,网上找了很多资料,当然园友也写了很多教程,但都是理论说了一大堆,实用指导或代码很少.如果你自己仔细研究下,其实就那么点东西,C#实现起来也很简单,原本不想写这篇文章的,但是本人当时摸索走了很多弯路,这边总结下,希望初次接触微

[c#]asp.net开发微信公众平台(8)微信9大高级接口,自定义菜单

前7篇把最基础的消息接收和回复全做完了,  也把高级接口的入口和分拆处理写好了空方法,  此篇接着介绍微信的9大高级接口, 并着重讲解其中的自定义菜单. 微信9大接口为: 1.语音识别接口 2.客服接口 3.OAuth2.0 网页授权接口 4.生成带参数的二维码接口 5.获取用户地理位置接口 6.获取用户基本信息接口 7.获取关注者列表接口 8.用户分组接口 9.上传下载多媒体文件接口 具体介绍: 1. 语音识别 功能描述:通过语音识别接口,用户发送的语音,将同时给出语音识别出的文本内容. 实用

django开发微信公众平台遇到的问题记录

在pythonanywhere.com上使用django开发微信公众平台应用,结果用户发送的信息,微信服务器一次也没有成功转发到pythonanywhere上来,但是用接口测试工具调试却发现是正常的,而且修改URL配置时验证也是成功的,找了几天,终于发现原来是URL配置末尾少了个斜杠,因为在django的url配置中有斜杠. 原因是在后台配置URL的时候是手写的,而用测试工具测试的时候我是复制的地址. 总结: 如果发现微信服务器无法转发消息到自己的应用服务器上,检查配置,主要就是URL和TOKE

荒废了很久的java以及微信公众平台今天拿起来看了看:这里有很好的教程

我的微信公众号刚刚起步: ,感兴趣可以关注一下. 关于java开发微信公众号有一个很好的教程博客:推荐一下:http://blog.csdn.net/lyq8479/article/details/8937622 希望有兴趣的道友可以和我多多交流,QQ1006367538. 另外,本人在做ionic+angular.js方面的移动端开发,有相同的或者有兴趣的也可以和我多多交流.

一旦手把手教你开发微信公众平台

一旦手把手教你开发微信公众平台 目录 一旦手把手教你开发微信公众平台 目录 1 初步认识微信公众平台 2 如何申请微信公众平台测试号 3 接口配置信息 4 环境搭建以及验证消息真实性 1: 初步认识微信公众平台 微信公众平台,简称weChat.曾命名为"官号平台"和"媒体平台",最终定位为"公众平台",无疑让我们看到一个微信对后续更大的期望.和新浪微博早期从明星战略着手不同,微信此时已经有了亿级的用户,挖掘自己用户的价值,为这个新的平台增加更优质