java版微信公众平台后台接入

关于微信平台的后台接入,官方已经提供了php示例的下载,对于java这块后台接入,暂时还没有一个完整的案例可以拿来直接使用,我写了一个java版本的demo便于大家使用。

一、前期准备

项目是用maven构建,直接导入到eclipse即可,jdk的版本为1.8.0_111 ,这两项都可以根据实际需求进行修改,最终达成war发布到服务器中即可。

二、实战演练

操作前,先阅读一下官方的文档,先整体有个思路流程,官方地址参考

1.设置成开发者模式:

登录微信公众平台后台后,点「功能」-「高级功能」-「开发模式」,进入开发模式,如果公众平台显示「尚未成为开发者」,就点击「成为开发者」

2.填写服务器配置:

点「开发」-「基本配置」-「填写服务器配置」如图1~如3

图1

图2

图3

3.示例代码:

SHA1.java

package com.dqiang.demo;

public class SHA1 {
 private final int[] abcde = { 0x67452301, 0xefcdab89, 0x98badcfe,
  0x10325476, 0xc3d2e1f0 };
 // 摘要数据存储数组
 private int[] digestInt = new int[5];
 // 计算过程中的临时数据存储数组
 private int[] tmpData = new int[80];

 // 计算sha-1摘要
 private int process_input_bytes(byte[] bytedata) {
 // 初试化常量
 System.arraycopy(abcde, 0, digestInt, 0, abcde.length);
 // 格式化输入字节数组,补10及长度数据
 byte[] newbyte = byteArrayFormatData(bytedata);
 // 获取数据摘要计算的数据单元个数
 int MCount = newbyte.length / 64;
 // 循环对每个数据单元进行摘要计算
 for (int pos = 0; pos < MCount; pos++) {
  // 将每个单元的数据转换成16个整型数据,并保存到tmpData的前16个数组元素中
  for (int j = 0; j < 16; j++) {
  tmpData[j] = byteArrayToInt(newbyte, (pos * 64) + (j * 4));
  }
  // 摘要计算函数
  encrypt();
 }
 return 20;
 }

 // 格式化输入字节数组格式
 private byte[] byteArrayFormatData(byte[] bytedata) {
 // 补0数量
 int zeros = 0;
 // 补位后总位数
 int size = 0;
 // 原始数据长度
 int n = bytedata.length;
 // 模64后的剩余位数
 int m = n % 64;
 // 计算添加0的个数以及添加10后的总长度
 if (m < 56) {
  zeros = 55 - m;
  size = n - m + 64;
 } else if (m == 56) {
  zeros = 63;
  size = n + 8 + 64;
 } else {
  zeros = 63 - m + 56;
  size = (n + 64) - m + 64;
 }
 // 补位后生成的新数组内容
 byte[] newbyte = new byte[size];
 // 复制数组的前面部分
 System.arraycopy(bytedata, 0, newbyte, 0, n);
 // 获得数组Append数据元素的位置
 int l = n;
 // 补1操作
 newbyte[l++] = (byte) 0x80;
 // 补0操作
 for (int i = 0; i < zeros; i++) {
  newbyte[l++] = (byte) 0x00;
 }
 // 计算数据长度,补数据长度位共8字节,长整型
 long N = (long) n * 8;
 byte h8 = (byte) (N & 0xFF);
 byte h7 = (byte) ((N >> 8) & 0xFF);
 byte h6 = (byte) ((N >> 16) & 0xFF);
 byte h5 = (byte) ((N >> 24) & 0xFF);
 byte h4 = (byte) ((N >> 32) & 0xFF);
 byte h3 = (byte) ((N >> 40) & 0xFF);
 byte h2 = (byte) ((N >> 48) & 0xFF);
 byte h1 = (byte) (N >> 56);
 newbyte[l++] = h1;
 newbyte[l++] = h2;
 newbyte[l++] = h3;
 newbyte[l++] = h4;
 newbyte[l++] = h5;
 newbyte[l++] = h6;
 newbyte[l++] = h7;
 newbyte[l++] = h8;
 return newbyte;
 }

 private int f1(int x, int y, int z) {
 return (x & y) | (~x & z);
 }

 private int f2(int x, int y, int z) {
 return x ^ y ^ z;
 }

 private int f3(int x, int y, int z) {
 return (x & y) | (x & z) | (y & z);
 }

 private int f4(int x, int y) {
 return (x << y) | x >>> (32 - y);
 }

 // 单元摘要计算函数
 private void encrypt() {
 for (int i = 16; i <= 79; i++) {
  tmpData[i] = f4(tmpData[i - 3] ^ tmpData[i - 8] ^ tmpData[i - 14]
   ^ tmpData[i - 16], 1);
 }
 int[] tmpabcde = new int[5];
 for (int i1 = 0; i1 < tmpabcde.length; i1++) {
  tmpabcde[i1] = digestInt[i1];
 }
 for (int j = 0; j <= 19; j++) {
  int tmp = f4(tmpabcde[0], 5)
   + f1(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4]
   + tmpData[j] + 0x5a827999;
  tmpabcde[4] = tmpabcde[3];
  tmpabcde[3] = tmpabcde[2];
  tmpabcde[2] = f4(tmpabcde[1], 30);
  tmpabcde[1] = tmpabcde[0];
  tmpabcde[0] = tmp;
 }
 for (int k = 20; k <= 39; k++) {
  int tmp = f4(tmpabcde[0], 5)
   + f2(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4]
   + tmpData[k] + 0x6ed9eba1;
  tmpabcde[4] = tmpabcde[3];
  tmpabcde[3] = tmpabcde[2];
  tmpabcde[2] = f4(tmpabcde[1], 30);
  tmpabcde[1] = tmpabcde[0];
  tmpabcde[0] = tmp;
 }
 for (int l = 40; l <= 59; l++) {
  int tmp = f4(tmpabcde[0], 5)
   + f3(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4]
   + tmpData[l] + 0x8f1bbcdc;
  tmpabcde[4] = tmpabcde[3];
  tmpabcde[3] = tmpabcde[2];
  tmpabcde[2] = f4(tmpabcde[1], 30);
  tmpabcde[1] = tmpabcde[0];
  tmpabcde[0] = tmp;
 }
 for (int m = 60; m <= 79; m++) {
  int tmp = f4(tmpabcde[0], 5)
   + f2(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4]
   + tmpData[m] + 0xca62c1d6;
  tmpabcde[4] = tmpabcde[3];
  tmpabcde[3] = tmpabcde[2];
  tmpabcde[2] = f4(tmpabcde[1], 30);
  tmpabcde[1] = tmpabcde[0];
  tmpabcde[0] = tmp;
 }
 for (int i2 = 0; i2 < tmpabcde.length; i2++) {
  digestInt[i2] = digestInt[i2] + tmpabcde[i2];
 }
 for (int n = 0; n < tmpData.length; n++) {
  tmpData[n] = 0;
 }
 }

 // 4字节数组转换为整数
 private int byteArrayToInt(byte[] bytedata, int i) {
 return ((bytedata[i] & 0xff) << 24) | ((bytedata[i + 1] & 0xff) << 16)
  | ((bytedata[i + 2] & 0xff) << 8) | (bytedata[i + 3] & 0xff);
 }

 // 整数转换为4字节数组
 private void intToByteArray(int intValue, byte[] byteData, int i) {
 byteData[i] = (byte) (intValue >>> 24);
 byteData[i + 1] = (byte) (intValue >>> 16);
 byteData[i + 2] = (byte) (intValue >>> 8);
 byteData[i + 3] = (byte) intValue;
 }

 // 将字节转换为十六进制字符串
 private static String byteToHexString(byte ib) {
 char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A',
  'B', 'C', 'D', 'E', 'F' };
 char[] ob = new char[2];
 ob[0] = Digit[(ib >>> 4) & 0X0F];
 ob[1] = Digit[ib & 0X0F];
 String s = new String(ob);
 return s;
 }

 // 将字节数组转换为十六进制字符串
 private static String byteArrayToHexString(byte[] bytearray) {
 String strDigest = "";
 for (int i = 0; i < bytearray.length; i++) {
  strDigest += byteToHexString(bytearray[i]);
 }
 return strDigest;
 }

 // 计算sha-1摘要,返回相应的字节数组
 public byte[] getDigestOfBytes(byte[] byteData) {
 process_input_bytes(byteData);
 byte[] digest = new byte[20];
 for (int i = 0; i < digestInt.length; i++) {
  intToByteArray(digestInt[i], digest, i * 4);
 }
 return digest;
 }

 // 计算sha-1摘要,返回相应的十六进制字符串
 public String getDigestOfString(byte[] byteData) {
 return byteArrayToHexString(getDigestOfBytes(byteData));
 }

 public static void main(String[] args) {
 String data = "tokenDemo";
 System.out.println(data);
 String digest = new SHA1().getDigestOfString(data.getBytes());
 System.out.println(digest);
 }
}

weChatJavaTokenValidate.java

package com.dqiang.demo;

import java.io.IOException;
import java.util.Arrays;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author StemQ
 * @version v1.0
 * Blog:http://blog.csdn.net/stemq
 * Web:www.dqiang.com
 */
public class weChatJavaTokenValidate extends HttpServlet {

 private static final long serialVersionUID = -6761982938477193120L;
  /* 例如
   * URL(服务器地址) http://weixin.xxxx.com/weChatJavaTokenValidate/wechatToken
   * Token(令牌) tokenChat
   * */
  private String TOKEN = "tokenChat"; //根据实际情况自己定义token与基本配置/填写服务器配置Token(令牌)相同
 @Override
 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 // 微信加密签名
 String signature = request.getParameter("signature");
 // 随机字符串
 String echostr = request.getParameter("echostr");
 // 时间戳
 String timestamp = request.getParameter("timestamp");
 // 随机数
 String nonce = request.getParameter("nonce");

 String[] str = { TOKEN, timestamp, nonce };
 // 字典序排序
 Arrays.sort(str);
 String bigStr = str[0] + str[1] + str[2];
 // SHA1加密
 String digest = new SHA1().getDigestOfString(bigStr.getBytes()).toLowerCase();
 // 确认请求来至微信
 if (digest.equals(signature)) {
  response.getWriter().print(echostr);
 }
 }

}

3.源码下载:weChatJavaTokenValidate

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

(0)

相关推荐

  • Java微信公众平台开发(1) 接入微信公众平台

    前面几篇文章一直都在说微信公众平台的开发准备工作,那么从这篇开始我们就将正式的进入JAVA微信公众平台开发的整个流程,那么这篇我们开始聊聊如何将我们的服务端和微信公众平台对接! (一)接入流程解析 在我们的开发过程中无论如何最好的参考工具当然是我们的官方文档了:http://mp.weixin.qq.com/wiki/8/f9a0b8382e0b77d87b3bcc1ce6fbc104.html 通过上面我们可以看出其中接入微信公众平台开发,开发者需要按照如下步骤完成: 填写服务器配置 验证服务

  • JAVA实现 springMVC方式的微信接入、实现消息自动回复实例

    前段时间小忙了一阵,微信公众号的开发,从零开始看文档,踩了不少坑,也算是熬过来了,最近考虑做一些总结,方便以后再开发的时候回顾,也给正在做相关项目的同学做个参考. 1.思路 微信接入:用户消息和开发者需要的事件推送都会通过微信方服务器发起一个请求,转发到你在公众平台配置的服务器url地址,微信方将带上signature,timestamp,nonce,echostr四个参数,我们自己服务器通过拼接公众平台配置的token,以及传上来的timestamp,nonce进行SHA1加密后匹配signa

  • java微信公众号开发第一步 公众号接入和access_token管理

    本文就来说一说微信开发第一步,公众号接入以及access_token的管理. 一.微信公众号接入 在微信公众号开发手册上,关于公众号接入这一节内容还是写的比较详细的,文档中说接入公众号需要3个步骤,分别是: 1.填写服务器配置 2.验证服务器地址的有效性 3.依据接口文档实现业务逻辑 其实,第3步已经不能算做公众号接入的步骤,而是接入之后,开发人员可以根据微信公众号提供的接口所能做的一些开发. 第1步中服务器配置包含服务器地址(URL).Token和EncodingAESKey. 服务器地址即公

  • JAVA实现 SpringMVC方式的微信接入、实现简单的自动回复功能

    前端时间小忙了一阵,微信公众号的开发,从零开始看文档,踩了不少坑,也算是熬过来了,最近考虑做一些总结,方便以后再开发的时候回顾,也给正在做相关项目的同学做个参考. 其实做过一遍之后会发现也不难,大致思路:用户消息和开发者需要的事件推送都会通过微信方服务器发起一个请求,转发到你在公众平台配置的服务器url地址,微信方将带上signature,timestamp,nonce,echostr四个参数,我们自己服务器通过拼接公众平台配置的token,以及传上来的timestamp,nonce进行SHA1

  • java微信开发API第一步 服务器接入

    微信开发API如何接入服务器,下面就为大家进行介绍 一.说明 * 本示例根据微信开发文档:http://mp.weixin.qq.com/wiki/home/index.html最新版(4/3/2016 5:34:36 PM )进行开发演示. * 编辑平台:myeclipse10.7+win32+jdk1.7+tomcat7.0  * 服务器:阿里云 windows server 2008 64bits * 平台要求:servlet使用注解方式,平台要求:j2ee6.0+.jdk6.0+.tom

  • 微信小程序 支付后台java实现实例

    微信小程序 支付后台java实现实例 前言: 前些天使用 LeanCloud 云引擎写了个小程序的支付相关 以前只做过 APP 支付 这次在小程序支付爬了两天的坑 把代码也分享出来 支付流程: 1.小程序前端获取微信 openId 以及订单号 传给后台 2,后台根据 openId 和订单号进行签名 post 微信统一下单接口 3.后台获取微信返回的xml字符串 解析 二次签名以后返回给前端 4.前端调起支付微信支付 API 先看支付函数: //获取支付信息 @EngineFunction("ge

  • java版微信公众平台后台接入

    关于微信平台的后台接入,官方已经提供了php示例的下载,对于java这块后台接入,暂时还没有一个完整的案例可以拿来直接使用,我写了一个java版本的demo便于大家使用. 一.前期准备 项目是用maven构建,直接导入到eclipse即可,jdk的版本为1.8.0_111 ,这两项都可以根据实际需求进行修改,最终达成war发布到服务器中即可. 二.实战演练 操作前,先阅读一下官方的文档,先整体有个思路流程,官方地址参考 1.设置成开发者模式: 登录微信公众平台后台后,点「功能」-「高级功能」-「

  • java版微信公众平台消息接口应用示例

    本文实例讲述了java版微信公众平台消息接口应用方法.分享给大家供大家参考,具体如下: 微信公众平台现在推出自动回复消息接口,但是由于是接口内容用的是PHP语言写的,很多地方操作起来让本人这个对Java比较熟悉的小伙很别扭,所以仿照PHP的接口代码做了一套jsp语言编写的接口. 首先先把整个接口代码贴出来做下比较,然后我们再分析代码: PHP: <?php /** * wechat php test */ //define your token define("TOKEN", &

  • php版微信公众平台入门教程之开发者认证的方法

    本文讲述了php版微信公众平台开发者认证的方法.分享给大家供大家参考,具体如下: 微信公众平台如何成为开发者? 登录微信公众平台后,点击高级功能=>开发模式=>成为开发者=>填写接口配置信息,提交后等待我司工作人员的审核. 1. 开发者认证 这个最简单了,直接上个超简单版代码: exit($_GET['echostr']); php文件就写上面这一句就行,微信公共平台随便填写token,写上php文件的url,然后验证即可通过,超级简单吧?官方的认证根本没有必要,因为后面的步骤没有使用的

  • php版微信公众平台之微信网页登陆授权示例

    本文实例讲述了php版微信公众平台之微信网页登陆授权.分享给大家供大家参考,具体如下: 微信公众平台实现微信网页登陆授权开发其实是非常的简单了,因为官方的参考程序了,下面小编就看了一站长根据官方参考做的一个网页登陆授权例子,大家可看看. 文件1:index.php //换成自己的接口信息 $appid = 'XXXXX'; header('location:https://open.weixin.qq.com/connect/oauth2/authorize?appid='.$appid.'&r

  • php版微信公众平台接口开发之智能回复开发教程

    本文实例讲述了php版微信公众平台接口开发之智能回复功能实现方法.分享给大家供大家参考,具体如下: 智能回复是根据用户输入的条件来反馈结果用用户了,这个小编以前有做过信整理了一些例子供各位参考,比较完整主要是介绍在开发端了. 微信自推出后,着实火了一把,而支付功能的推出,又把微信推到了一个无可比拟的高度,然后申请微信订阅号或者服务号的人也开始比肩接踵.下面我将给大家简单讲解下微信公众平台开发接口. 先去 微信公众平台 申请账号,然后按照提示一步步.在选择订阅号和服务号上,个人只能申请订阅号,而且

  • php版微信公众平台开发之验证步骤实例详解

    本文实例讲述了php版微信公众平台开发之验证步骤.分享给大家供大家参考,具体如下: 微信公众平台开发我们现在做得比较多了,这里给各位介绍的是一个入门级别的微信公众平台验证基础知识了,有兴趣的和小编来看看. 开发微信的时候 需要验证一下,在官方开发者中心哪里有可以下源代码,登录到 公众帐号后 看到左边的最下角有一个开发者中心点击,然后填写上你相对应的 Token 和 url 然后就可以验证成功的话就可以开发了. 下载微信php验证源代码在 开发者中心 - 开发者文档 - 接口消息 - 验证消息真实

  • php版微信公众平台接口参数调试实现判断用户行为的方法

    本文实例讲述了php版微信公众平台接口参数调试实现判断用户行为的方法.分享给大家供大家参考,具体如下: 微信开发的时候,发现有个重要的变量$postObj,获得了一个xml结构装入的对象里因为用户发来的事件,之前只知道用户发送一个消息,我进行处理. 今天要弄个用户订阅就给推送一个消息的功能,却发现不知道如何判断用户是订阅的操作,还是取消订阅,还是发消息,代码如下: public function responseMsg() { global $db; //get post data, May b

  • php版微信公众平台实现预约提交后发送email的方法

    本文实例讲述了php版微信公众平台实现预约提交后发送email的方法.分享给大家供大家参考,具体如下: 其实这种发送邮件是非常的简单了我们只要接受由用户提交过来的邮箱地址,然后再由php的邮件控制进行邮件发送了,下面看一个综合开发例子. 首先yyuc框架是支持发送email的,在yyuc/yyuc.php 上加上如下代码: require_once(YYUC_LIB.'plugin/SendMail.php'); $sendMail = new SendMail(); 在wx conf.php

  • php版微信公众平台回复中文出现乱码问题的解决方法

    本文实例分析了php版微信公众平台回复中文出现乱码问题的解决方法.分享给大家供大家参考,具体如下: 微信公众平开发时碰到回复中文乱码了,这个问题小编发现是编码问题,其实只要把编码转成utf8就可以解决了,具体来看看. 很多微信公众平台的自动回复程序都是 ThinkWechat.class.php 这个类开发的,今天碰到一个莫名其妙的乱码问题,查问题发现是GB2312编码导致,所以要修改源码. 先增加一个方法: /** * 检测是否UTF-8 * @param $str * @return boo

  • Java实现微信公众平台朋友圈分享功能详细代码

    其实分享的方法在微信官网有较为详细的文档说明,现就其中一些比较绕的步骤进行总结,有问题随时交流哈. 首先微信其实已经自带分享到朋友圈,朋友,qq空间等功能,对于开发微信专门提供了一个接口,可以根据需要修改一些配置.例如修改要分享内容的头像,链接,描述等. 开发步骤: 1.在公众平台配置js-sdk接口 "公众号设置"--"功能设置"--"JS接口安全域名" 2.在要分享的页面引入js http://res.wx.qq.com/open/js/jw

随机推荐