前面几篇文章一直都在说微信公众平台的开发准备工作,那么从这篇开始我们就将正式的进入JAVA微信公众平台开发的整个流程,那么这篇我们开始聊聊如何将我们的服务端和微信公众平台对接!

(一)接入流程解析

通过上面我们可以看出其中接入微信公众平台开发,开发者需要按照如下步骤完成:

填写服务器配置

验证服务器地址的有效性

依据接口文档实现业务逻辑

按照上面的逻辑可能是填写服务器配置信息是在第一步,但是我们在真实的开发过程中往往都是先做第二步【编写代码实现验证服务器地址的有效性】,因为没有第二步的完成第一步的配置是不能达到任何效果的!

(二)验证服务器有效性代码编写

按照开发文档我们知道我们的应用服务器需要接受微信服务器的get请求,其中包含四个参数(signature、timestamp、nonce、echostr)然后通过校验方式校验服务器的可靠性,校验方式如下:

将token、timestamp、nonce三个参数进行字典序排序

将三个参数字符串拼接成一个字符串进行sha1加密

开发者获得加密后的字符串可与signature对比,标识该请求来源于微信

①我在这里写了一个工具类去实现其中的前两步,将三个参数排序并返回sha1加密后的字符串,代码如下:

package com.cuiyongzhi.wechat.util;

import java.security.MessageDigest;

import java.security.NoSuchAlgorithmException;

import java.util.Arrays;

/**

* ClassName: SignUtil

* @Description: 请求校验工具类

* @author dapengniao

* @date 2016年3月4日 下午6:25:41

*/

public class SignUtil {

// 与接口配置信息中的Token要一致

private static String token = "dapengniaowechat";

/**

* 验证签名

* @param signature

* @param timestamp

* @param nonce

* @return

*/

public static boolean checkSignature(String signature, String timestamp, String nonce) {

String[] arr = new String[] { token, timestamp, nonce };

// 将token、timestamp、nonce三个参数进行字典序排序

Arrays.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;

}

/**

* 将字节数组转换为十六进制字符串

* @param byteArray

* @return

*/

private static String byteToStr(byte[] byteArray) {

String strDigest = "";

for (int i = 0; i < byteArray.length; i++) {

strDigest += byteToHexStr(byteArray[i]);

}

return strDigest;

}

/**

* 将字节转换为十六进制字符串

* @param mByte

* @return

*/

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;

}

}

②将我们的工具类应用到我们的服务器验证过程中,这里我新建一个controller为WechatSecurity,实现同一个get用于接收参数和返回验证参数,简单代码如下:

package com.cuiyongzhi.wechat.controller;

import java.io.PrintWriter;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.web.bind.annotation.RequestParam;

import com.cuiyongzhi.wechat.util.SignUtil;

@Controller

@RequestMapping("/wechat")

public class WechatSecurity {

private static Logger logger = Logger.getLogger(WechatSecurity.class);

/**

*

* @Description: 用于接收get参数,返回验证参数

* @param @param request

* @param @param response

* @param @param signature

* @param @param timestamp

* @param @param nonce

* @param @param echostr

* @author dapengniao

* @date 2016年3月4日 下午6:20:00

*/

@RequestMapping(value = "security", method = RequestMethod.GET)

public void doGet(

HttpServletRequest request,

HttpServletResponse response,

@RequestParam(value = "signature", required = true) String signature,

@RequestParam(value = "timestamp", required = true) String timestamp,

@RequestParam(value = "nonce", required = true) String nonce,

@RequestParam(value = "echostr", required = true) String echostr) {

try {

if (SignUtil.checkSignature(signature, timestamp, nonce)) {

PrintWriter out = response.getWriter();

out.print(echostr);

out.close();

} else {

logger.info("这里存在非法请求!");

}

} catch (Exception e) {

logger.error(e, e);

}

}

@RequestMapping(value = "security", method = RequestMethod.POST)

// post方法用于接收微信服务端消息

public void DoPost() {

System.out.println("这是post方法!");

}

}

那么到这里我们的服务器验证的代码就基本完成了,下面我们就进入验证过程!

(三)服务器验证

这里我用来验证的是我的个人公众号【崔用志】,如果大家有兴趣可以搜索看到的,通过微博认证的一个私人号,当然有想法在这里我们也是可以一起交流的,验证方法如下图:

点击【提交】成功之后如下图所示:

点击图中【启用】即可,那么到这里我们的服务器接入配置就完成了,【下一篇我们将讲述如何接收消息并进行消息处理】,感谢你的翻阅,如有疑问可以留言讨论!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

java微信开发平台_Java微信公众平台开发(1) 接入微信公众平台相关推荐

  1. 微信上的Siri:小i机器人首次接入微信语音API

    微信上的Siri:小i机器人首次接入微信语音API 不久前我们曾介绍过微信开放系统API,首次和印象笔记合作,可以将聊天内容无缝保存到印象笔记.除印象笔记外,智能语音助手小i机器人也是首批获得微信系统 ...

  2. 微信公众号 - H5 网页接入微信支付(JSAPI)

    前言 假设您已经申请成为微信商户(认证)且各项配置弄好了,并且开通 JSAPI 支付等,只差代码(前端)编写. 如果你之前不了解,强烈建议 先看一遍如下标注的文档: [官方文档]网页客户端(H5),需 ...

  3. 【微信小程序】2、SpringBoot整合WxJava接入微信客服

    上篇文章中已经开启了微信小程序的消息推送:[微信小程序]1.SpringBoot整合WxJava开启消息推送,接下来我们就对微信中用户发送的客服消息,转发到微信客服来处理回复 1.添加微信客服 登录微 ...

  4. 微信公众号一、接入微信并实现机器人自动回复功能

    一.说明 微信公众平台 https://mp.weixin.qq.com/cgi-bin/loginpage?t=wxm2-login&lang=zh_CN 测试平台 https://mp.w ...

  5. 公众号H5页面接入微信登录流程

    起步 首先创建一个项目,我们采用uni-app来作为我们的前端框架 环境安装 全局安装vue-cli npm install -g @vue/cli 创建uni-app 使用正式版(对应HBuilde ...

  6. java的开发工具_Java中常用的开发工具有哪些

    Eclipse   据数据显示很多Java开发人员的Java开发工具便是Eclipse,这主要得益于Eclipse是一个开源的.可以基于Java的可扩展开发平台.Eclipse本身而言,它只是一个框架 ...

  7. java数据类型的站位_Java 数据类型在实际开发中应用

    在前边的文章中,我已经介绍了Java核心的容器IO等,现在我来说一下java中的数据类型.在java中,一切东西皆为对象(这句话意思是java中绝大数情况都用对象),极少数不是对象的,也存在与之对应的 ...

  8. java 安卓项目案例_Java - 随笔分类 - android开发实例 - 博客园

    随笔分类 - Java 摘要:1.使用标准输入串对象System.inSystem.in.read()一次只读入一个字节数据,而我们通常要取得一个字符串或一组数字,这就很不适合,需要其他方法取得这样的 ...

  9. java订单实现的_java订单系统的开发

    问题Exceptioninthread"main"java.lang.NoSuchMethodError:mainPressandkeytocontinue..代码是importj ...

  10. java axis2小实例_java webservice axis2简单开发实例

    Web Service学习之axis 看着网上的资料学习了一下,做点笔记以防以后忘记. 一.准备工作: 到axis官方网站下载相应的jar包,我下的是1.4final版. http://www.doc ...

最新文章

  1. 数据连接池的工作机制是什么?
  2. Ingress 继任者 Gateway API 使用
  3. .NET技术 ASP.NET中常用的文件上传下载方法(多文件上传)
  4. 计算机一级b考试理论知识,计算机一级b-一级计算机等级考试中的“一级B”指什么?谢谢! 爱问知识人...
  5. github gitlab BitBucket
  6. 静态网站任何优化怎么设置_网站关键词怎么设置对网站推广优化有利?
  7. 有关HL7 的C# 源码
  8. debian搭建php mysql_Debian下MySQL安装经验分享
  9. Git协助方式:Fork项目开发新功能并使用Pull-Request把新特性推送给原项目
  10. qt QMessageBox 中文乱码的问题
  11. Android查看CPU和GPU使用率
  12. python xml第三方库_我应该使用哪个python XML库?
  13. 浅谈A*算法如何演变为rrt算法
  14. Selenium2学习笔记一
  15. Yii2汉字转拼音类
  16. 实验3:搜索算法求解8数码问题
  17. 读高明之《帛書老子校注》
  18. 北京CBD核心区有哪些值得加入的科技公司
  19. 2021-2025年中国SWIR-InGaAs光电二极管线阵行业市场供需与战略研究报告
  20. 某手app的__NS_sig3,sig,__NStokensig算法

热门文章

  1. 动环监控系统中B接口的实现
  2. DOS基本命令和批处理
  3. python官网学习爬虫资料_Python爬虫学习?
  4. web前端基础——超链接(dw笔记版)
  5. PyQt5 QPushButton 设置文字对齐方式(基于setStyleSheet)
  6. Oracle 锁表查询
  7. 电源平面Z阻抗参数的提取是否需要设置VRM,以及Port 参考阻抗对仿真结果的影响
  8. PS制作五彩抽象人像
  9. 12 个华丽的 UI 组件,为您提供设计灵感✨
  10. FreeSwitch_CallCenter_Tiers