微信开放平台API(一)第三方系统接入

最近接手一个公众号,决定学习下微信开放平台API,丰富下这个服务号。


在接入之前,首先最重要的就是阅读微信提供的API接口文档


一、接入操作步骤,参照接入指南,操作自己的服务号,初次接入本人选择的是明文模式

二、在页面中需要填写第三方服务器一个servlet的url,用于接入验证,下面代码是doGet的方法,用于接收来自微信的验证请求

sha1的签名生成算法参考了网上代码,如果需要删除,请随时联系我

package com.access;


import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Collections;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;



public class MyWeixinServlet extends HttpServlet {
	
	private static final long serialVersionUID = 1L;
	
	private static final char[] HEX_DIGITS = { '0', '1', '2', '3', '4', '5',
        '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };

	
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		try {

			response.setCharacterEncoding("UTF-8");
			request.setCharacterEncoding("UTF-8");
			/****************************************准备参数*************************************************/
			/**
			  微信接入验证时提交的4个参数,
			signature:微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
			timestamp:时间戳
			nonce:随机数
			echostr:随机字符串*/
			
			String signature = request.getParameter("signature");
			String timestamp = request.getParameter("timestamp");
			String nonce = request.getParameter("nonce");
			String echostr = request.getParameter("echostr");
			
			System.out.println("signature:"+signature);
			System.out.println("timestamp:"+timestamp);
			System.out.println("nonce:"+nonce);
			System.out.println("echostr:"+echostr);
			
			//自定义token
			String token = "zheshiwodetoken";
			
			/**
			        校验流程如下:
				1. 将token、timestamp、nonce三个参数进行字典序排序
				2. 将三个参数字符串拼接成一个字符串进行sha1加密
				3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
			*/
			//构建token、timestamp、nonce的数组,并进行字典排序
			ArrayList<String> arl = new ArrayList<String>();
			arl.add(token);
			arl.add(timestamp);
			arl.add(nonce);
			
			Collections.sort(arl);
			
			//构建sha1字符串
			String sha1 ="";
			for (int i = 0; i < arl.size(); i++) {
				sha1+=arl.get(i);
	        }
			System.out.println("for sha1:"+sha1);
			
			//使用sha1算法获得摘要sig
			MessageDigest messageDigest = MessageDigest.getInstance("SHA1");
			messageDigest.update(sha1.getBytes());
			String sig = getFormattedText(messageDigest.digest());
			
			//signature校验
			PrintWriter out = null;
			if(signature.equals(sig)){
				//校验成功,返回echostr,接入成功
				System.out.println("sha1: true!!!!!"+sig);
				out = response.getWriter();
				out.write(echostr);
				out.flush();
			}else{
				//校验失败,理论上是应该报错的,我省懒,一样返回了echostr,这个请注意。。。
				System.out.println("sha1: false!!!!!"+sig);
				out = response.getWriter();
				out.write(echostr);
				out.flush();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	private static String getFormattedText(byte[] bytes) {

		int len = bytes.length;

		StringBuilder buf = new StringBuilder(len * 2);

		// 鎶婂瘑鏂囪浆鎹㈡垚鍗佸叚杩涘埗鐨勫瓧绗︿覆褰㈠紡

		for (int j = 0; j < len; j++) {
			buf.append(HEX_DIGITS[(bytes[j] >> 4) & 0x0f]);

			buf.append(HEX_DIGITS[bytes[j] & 0x0f]);

		}

		return buf.toString();

	}
	
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response){
		try{
			InputStream is = request.getInputStream();
			{
				byte[] b = new byte[1024];
				int len = 0;
				StringBuilder builder = new StringBuilder();
				while ((len = is.read(b)) != -1) {
					byte[] t = new byte[len];
					System.arraycopy(b, 0, t, 0, len);
					builder.append(new String(t, "utf-8"));
				}
				
				System.out.println("get message:"+builder);
				
			}
		}catch (Exception e){
			e.printStackTrace();
		}
	}
	
	public static void main(String args[]) throws NoSuchAlgorithmException{
		String a = "1426521501";
		String s = "871891313";
		
		String d = "zheshiwodetouken";
		
		String sha1 = a + s + d;
		MessageDigest messageDigest = MessageDigest.getInstance("SHA1");
		messageDigest.update(sha1.getBytes());
		String sig = getFormattedText(messageDigest.digest());
		
		System.out.println(sig);
	}
}


三、之后点击提交,就接入成功了,微信会为你分配一个微信APPID作为你的唯一标识,之后就可以开始调用微信提供的丰富接口了


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值