一、微信公众号开发--开发前准备

前言

        最近完成了一整套的微信公众号开发,赶忙来分享一下。刚好专栏申请下来了,就在专栏里写点东西吧。我本身是做javaweb开发的,现在工作做的是android,之前可谓是从来没有做过这个东西,官网的文档写的还是不错的,不过一开始入门的话难免有些摸不到头脑,看了这个再去看文档继续深度开发的话事半功倍;

        注册帐号什么的就不说了,那方面是个人就会注册。建议是去弄个开发者测试帐号,因为功能都是一样的,而且开发者帐号的权限还比较多。如果自身有公司资料的话也可以便审核资料,边用公众号学习嘛,后台代码都是一样的,开发完成之后只需要改一下后台配置即可,根本不用动代码。当然了,我是说的在代码写的漂亮的前提下;

        附上2个地址,分别是公众号和测试号的地址:

        公众号主页

        测试号地址

正文

        注册登录之后,进入正文,配置方面正式版和测试帐号是差不多的,我就以正式版为例了;

        

        首先设置开发者密码(appsecret)和ip白名单,这个密码生成之后你就复制粘贴保存好,这个之后就看不到了,除非重置新密码才能在看到。ip白名单指的是你的服务允许访问的连接ip,这里暂时设置的是我的服务器的ip地址;     

        服务器地址指向的是你处理微信请求的地址,使用全称,http://。。。,这个地址必须是被设置了ip地址白名单的地址才可以。配置好之后这个地址就会是以后微信所有网络请求访问的地址了。而且微信默认访问80端口,不要使用其他端口。令牌token的话自己随意设置就好了,通用语配置服务器时的验证操作;消息加密密钥也是随机生成的,这个用的时候来复制就是了;

        启用的时候回去url地址发送一个请求,这个后台要处理一下,其实也很简单,就是比对一下token,看一下是不是自己的验证请求,然后把他发送的一个随机码再给他发回去就可以了,代码如下:

        @Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//先验证是否是配置token的url
		if (Sign.checkSignature(request.getParameter("signature"), request.getParameter("timestamp"), request.getParameter("nonce"))) {
			Utils.out(response, request.getParameter("echostr"));//微信公众号验证Token,只需要将传入的echostr参数原封不动输出即可
			return;}
	}

        我后台这边就是简单的用servlet写的,道理都是一样的,对微信信息的处理主要集中在控制层和业务层;这里处理一个get请求,只需要写一个工具类,来验证一下微信的签名就可以了;

扫描二维码关注公众号,回复: 161720 查看本文章
package com.wx.util;

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

/**
 * 微信签名验证工具类
 * @author Baidu
 */
public class Sign {
    
    // 与接口配置信息中的Token要一致
    private static String wxToken = "yoursToken";

    /**
     * 微信验证签名
     * @param signature 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
     * @param timestamp 时间戳
     * @param nonce 随机数
     * @return 是否正确
     */
    public static boolean checkSignature(String signature, String timestamp,String nonce) {
        // 1.将token、timestamp、nonce三个参数进行字典序排序
        String[] arr = new String[] { wxToken, timestamp, nonce };
        Arrays.sort(arr);
        // 2. 将三个参数字符串拼接成一个字符串进行sha1加密
        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;
        // 3.将sha1加密后的字符串可与signature对比,标识该请求来源于微信
        return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;
    }

    /**
     * 将字节数组转换为十六进制字符串
     * @param byteArray 字节数组
     * @return String
     */
    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 String
     */
    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;
    }
}
        如果验证通过,前端会显示配置成功,那么就代表配置完成,可以开始下一步的开发了!

猜你喜欢

转载自blog.csdn.net/qq_36676433/article/details/80203097