2.公众号与自己项目的对接

公众号与自己项目的对接,也就是公众号会将相关事件交给你自己的项目处理,你需要提供一个入口,即一个servlet的url

1.创建Servlet,在doGet方法中处理验证消息,供公众号对接

 1 public class WeixinServlet extends HttpServlet {
 2
 3     private static final long serialVersionUID = 1L;
 4
 5     public WeixinServlet() {
 6     }
 7
 8     public void destroy() {
 9     }
10
11     public void doGet(HttpServletRequest request, HttpServletResponse response)
12             throws ServletException, IOException {
13
14         // 微信加密签名
15         String signature = request.getParameter("signature");
16         // 时间戳
17         String timestamp = request.getParameter("timestamp");
18         // 随机数
19         String nonce = request.getParameter("nonce");
20         // 随机字符串
21         String echostr = request.getParameter("echostr");
22
23         PrintWriter out = response.getWriter();
24         // 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败
25         if (SignUtil.checkSignature(signature, timestamp, nonce)) {
26             out.print(echostr);
27         }
28         out.close();
29         out = null;
30     }
31
32     public void doPost(HttpServletRequest request, HttpServletResponse response)
33             throws ServletException, IOException {
34
35     }
36
37     public void init() throws ServletException {
38     }
39 }

SignUtil的源码:

 1 public class SignUtil {
 2
 3     // 与接口配置信息中的Token要一致
 4     private static String token = "weixinCourse";
 5
 6     /**
 7      * 验证签名
 8      *
 9      * @param signature
10      * @param timestamp
11      * @param nonce
12      * @return
13      */
14     public static boolean checkSignature(String signature, String timestamp,
15             String nonce) {
16         String[] arr = new String[] { token, timestamp, nonce };
17         // 将token、timestamp、nonce三个参数进行字典序排序
18         Arrays.sort(arr);
19         StringBuilder content = new StringBuilder();
20         for (int i = 0; i < arr.length; i++) {
21             content.append(arr[i]);
22         }
23         MessageDigest md = null;
24         String tmpStr = null;
25
26         try {
27             md = MessageDigest.getInstance("SHA-1");
28             // 将三个参数字符串拼接成一个字符串进行sha1加密
29             byte[] digest = md.digest(content.toString().getBytes());
30             tmpStr = byteToStr(digest);
31         } catch (NoSuchAlgorithmException e) {
32             e.printStackTrace();
33         }
34
35         content = null;
36         // 将sha1加密后的字符串可与signature对比,标识该请求来源于微信
37         return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;
38     }
39
40     public static String sha1(String content){
41         MessageDigest md = null;
42         String tmpStr = null;
43
44         try {
45             md = MessageDigest.getInstance("SHA-1");
46             // 将三个参数字符串拼接成一个字符串进行sha1加密
47             byte[] digest = md.digest(content.toString().getBytes());
48             tmpStr = byteToStr(digest);
49         } catch (NoSuchAlgorithmException e) {
50             e.printStackTrace();
51         }
52         return tmpStr;
53     }
54
55     /**
56      * 将字节数组转换为十六进制字符串
57      *
58      * @param byteArray
59      * @return
60      */
61     private static String byteToStr(byte[] byteArray) {
62         String strDigest = "";
63         for (int i = 0; i < byteArray.length; i++) {
64             strDigest += byteToHexStr(byteArray[i]);
65         }
66         return strDigest;
67     }
68
69     /**
70      * 将字节转换为十六进制字符串
71      *
72      * @param mByte
73      * @return
74      */
75     private static String byteToHexStr(byte mByte) {
76         char[] Digit = { ‘0‘, ‘1‘, ‘2‘, ‘3‘, ‘4‘, ‘5‘, ‘6‘, ‘7‘, ‘8‘, ‘9‘, ‘A‘,
77                 ‘B‘, ‘C‘, ‘D‘, ‘E‘, ‘F‘ };
78         char[] tempArr = new char[2];
79         tempArr[0] = Digit[(mByte >>> 4) & 0X0F];
80         tempArr[1] = Digit[mByte & 0X0F];
81
82         String s = new String(tempArr);
83         return s;
84     }
85
86 }

第二,将项目部署到新浪云上,将servlet的请求地址配置到公众号上

时间: 2024-12-16 21:34:53

2.公众号与自己项目的对接的相关文章

项目开发-微信公众号被动响应消息处理

过去参与的一个微信公众号开发的项目,其中处理被动响应消息的类相对臃肿,原因是该项目需要处理的消息类型较多,通过switch分支,分支方法都写在一个类里面.功能完成后,这个类就巨大无比了.闲来无事,就在想应该怎么重构一下呢?设计模式里面有解决大量if分支的状态模式,但是模式应用还没看明白. 想来,还是switch最直观的,为了便于维护,有必要把每个分支都抽取成一个处理类,同时做好包结构规划,虽然会形成大量短小的消息处理类,但是整体结构是清晰的.简单整理了下代码,类图如下: 原来全部代码都是写在Re

微信支付-公众号支付H5调用支付详解

微信公众号支付 最近项目需要微信支付,然后看了下微信公众号支付,,虽然不难,但是细节还是需要注意的,用了大半天时间写了个demo,并且完整的测试了一下支付流程,下面分享一下微信公众号支付的经验. 一.配置公众号微信支付 需要我们配置微信公众号支付地址和测试白名单. 比如:支付JS页面的地址为 http://www.xxx.com/shop/pay/ 那此处配置www.xxx.com/shop/pay/ 二.开发流程 借用微信公众号支付api(地址 http://pay.weixin.qq.com

利用nat123解决微信公众号对接服务器必须为80端口的问题

背景:最近公司接到做一个微信公众号的项目,需要我们提前做一个demo,好做项目的整体评估:我们公司本身有个云服务器,但没有备案,所以80端口还被电信屏蔽着,就想到利用nat123做80端口的映射:(外网80端口访问服务器上非80端口的应用) 前提:存在对接微信服务器的服务,云服务器本地访问地址为:http://localhost:8080/wxtest/WechatServlet 目标:外网通过80端口访问上述地址: 一:下载nat123 1:地址:http://www.nat123.com/P

Java对接微信公众号模板消息推送

内容有点多,请耐心! 最近公司的有这个业务需求,又很凑巧让我来完成: 首先想要对接,先要一个公众号,再就是开发文档了:https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Overview.html 不过请注意这一点 ok,我们继续:再来完成公众号的基本配置: 服务器地址(URL):必须以http://或https://开头,分别支持80端口和443端口.这个URL是很重要的,需要响应微信发送的token验证 令牌(To

微信公众号项目笔记 二

一.项目介绍  通过公众号页面调用系统接口,完成物流系统客户签收功能. 1界面展示使用html5+css布局,使用weui样式库. 2Web项目使用asp.net MVC4技术.接口调用使用jquery库Ajax异步调用. 3 服务器环境server2008系统,Web容器IIS6 运行环境.net4.0 集成模式 二.用到知识点 1.  用户权限管理,首次登录保存用户token(openId)客户唯一标识符,微信公众号平台获取关注公众号的用户返回给系统调用,系统通过与工作号绑定的webAPI接

带领技术小白入门——基于java的微信公众号开发(包括服务器配置、java web项目搭建、tomcat手动发布web项目、微信开发所需的url和token验证)

微信公众号对于每个人来说都不陌生,但是许多人都不清楚是怎么开发的.身为技术小白的我,在闲暇之余研究了一下基于java的微信公众号开发.下面就是我的实现步骤,写的略显粗糙,希望大家多多提议! 一.申请服务器 1.我购买的是阿里云服务器,购买后要设置一下服务器密码,默认用户名是administrator,购买好后如下: 2.申请好后,copy一下此服务器的IP地址(公有),在本地ping一下看看是否可用,j键盘Win+R,输入cmd,输入ping+IP回车,如下即为成功: 二.配置服务器 1.下载远

微信公众号项目本地调试技巧

好吃妹微信项目,公众号只认授权域名wx.haochimei.com.所以本地调试需要引导到本地iis项目中. 创建本地IIS项目 修改环境文件,如下图 运行微信开发者工具,访问wx.haochimei.com地址,则引导到本地iis项目中去 在本地项目里打日志调试即可

公众号和app和web都是客户端,都可以对接一个后台

1.公众号和app和web都是客户端,都可以对接一个后台 2.域名中包含端口号吗?:不包括,不包括 3.目前在IIS服务器上搭建了一个网站,域名也申请了,可是80端口不能使用,可以使用8000,每次访问网站都要输入xxx.xxx.xxx:8000,能不能通过什么方法直接输入域名然后转到8000端口上

微信公众号项目总结--加快开发速度和调试效率

近端时间接手了某上市公司的内部员工分享系统的微信端项目,由于接手后去理解整个项目的架构.规范等的时间紧迫,所以导致开发期间遇到较多问题从而加班加到心力交瘁.现在项目大概算完成了一个里程碑,所以在这里总结一下项目中所获得的东西,所踩过的坑,好让下一次开发更具效率. 前端本地模拟微信登录 由于微信公众号要使用微信jssdk api,api的使用需要微信授权.登录.获取token等一系列操作,如果是本地调试的话可以通过url的判断进行微信模拟登录.这样做的好处利于扩展,如果该产品不只使用于微信端的时候