对接微信-----微信服务器配置(java版)

本文详细介绍如何配置微信服务器,包括理解微信服务器配置原理、本地应用如何映射为外网URL、具体的Java代码实现,并提供了一个实用的工具类。

概述:

初次接触微信服务器配置真的不知怎么弄。所以记录下来。

1、理解微信服务器配置原理

在配置的时候,当你点击提交的时候,微信会校验你的服务器是否通畅,关键问题是:

微信会发什么数据到我指定服务器?

服务器应该回什么数据?

看一下微信开发文档没有找到这个

最后在一篇博文中找到了。

微信向服务器发送字段:

signature微信加密签名
timestamp时间戳
nonce随机数
echostr随机字符串

服务器返回给微信:

echostr随机字符串

原理:将Token、timestamp、nonce 排序之后通过SHA-1加密变成byte[] ,然后将字节数组变成字符串,判断加密之后字符串和signature是否一样,一样表示微信发过来的数据。

2、本地应用怎么映射成外网url

我使用的是:ngrok    官网:点击打开链接

下载下来是一个.exe 文件

双击运行既可

输入:ngrok http 80       (表示监听80端口)


3、接下来写java代码

采用Spring框架,简单测试一下可以参考下列链接

@ResponseBody
	@RequestMapping(value="/event", method = RequestMethod.GET)
	public void event(HttpServletRequest request, HttpServletResponse response) throws IOException {
		 //微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp,nonce参数
        String signature = request.getParameter("signature");
        //时间戳
        String timestamp = request.getParameter("timestamp");
        //随机数
        String nonce = request.getParameter("nonce");
        //随机字符串
        String echostr = request.getParameter("echostr");
        if(SignUtil.checkSignature(signature, timestamp, nonce)) {
        	logger.info("[signature: "+signature + "]<-->[timestamp: "+ timestamp+"]<-->[nonce: "+nonce+"]<-->[echostr: "+echostr+"]");
        	response.getOutputStream().println(echostr);
        }
	}

工具类;

package com.rinlink.intelligent.weixin.utils;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;

/**
 * 2017年7月21日20:14:19
 * @author jack
 *
 */
public class SignUtil {
	
	private static String token = "9999";
	
	/**
	 * 校验签名
	 * @param signature  签名
	 * @param timestamp 时间戳
	 * @param nonce 随机数
	 * @return true 成功,false 失败
	 */
	public static boolean checkSignature(String signature,String timestamp, String nonce){
		
		String checktext = null;
		if(null != signature){
			//对Token,timestamp nonce 按字典排序
			String [] paramArr = new String[] {token, timestamp, nonce};
			Arrays.sort(paramArr);
			//将排序后的结果拼成一个字符串
			String content = paramArr[0].concat(paramArr[1]).concat(paramArr[2]);
			try {
				MessageDigest md = MessageDigest.getInstance("SHA-1");
				//对接后的字符串进行sha1加密
				byte[] digest = md.digest(content.toString().getBytes());
				checktext = byteToStr(digest);
			} catch (NoSuchAlgorithmException e) {
				e.printStackTrace();
			}
		}
		//将加密后的字符串与signature进行对比
		return checktext != null ? checktext.equals(signature.toUpperCase()) :false;
	}

	/**
	 * 将字节数组转化为16进制字符串
	 * @param digest  字符数组
	 * @return 字符串
	 */
	private static String byteToStr(byte[] byteArrays) {
		String str="";
		for (int i = 0; i < byteArrays.length; i++){
			str += byteToHexStr(byteArrays[i]);
		}
		return str;
	}

	/**
	 * 将字节转化为十六进制字符串
	 * @param myByte 字节
	 * @return 字符串
	 */
	private static String byteToHexStr(byte myByte) {

			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[(myByte >>> 4)&0X0F];
			tempArr[1] = Digit[myByte & 0x0F];
			String str = new String(tempArr);
		return str;
	}
	
	
}

4、配置url和Token


5、启动你服务,然后点击微信提交按钮,祝你成功。

参考地址:点击打开链接

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值