微信公众号开发 - 开发环境搭建

公众号简介

    微信公众号有订阅号、服务号、企业号,在注册的时候看到这样的信息,只有订阅号可以个人申请,服务号和企业号要有企业资质才可以。这里所说的微信公众号开发指的是订阅号和服务号。

    另外,未认证的个人订阅号有一些接口是没有权限的,并且目前个人订阅号已不支持微信认证,也就是说个人订阅号无法调用一些高级的权限接口,下图就是一个未认证的个人订阅号所具备权限列表,像生成二维码、网页授权、自定义菜单、微信支付这样的接口权限都是不具备的。

说了半天,那如果没有企业资质,又想做高级接口的开发怎么办呢。

    微信公众平台提供了测试公众账号,登录地址为:http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login,只需要到这个页面,点击登录,并用自己的微信客户端扫码,并授权登录,就可以获得属于自己的测试公众号。测试公众号具备几乎所有的接口,平时开发如果没有可用的公众号,就用这个测试的公众号就可以了。

本地测试环境搭建

    开发微信公众账号的一大痛苦之处就是调试问题,每次实现一个功能后都需要部署到一个公网服务器,虽然目前有各种免费云平台可以部署,但是调式基本只能靠日志输出了,而且没次修改->部署->查看日志,这样的操作过程非常浪费时间,时间就是生命,这样难道不是在浪费生命吗。那么,有没有办法可以本地部署,本地调试呢?

    当然有,因为每次向公众号发送一条指令,公众号所在的服务器要和你的服务器进行网络交互,所以说你的服务器要保证外网可以访问到,那么只需要将你本地映射到一个外网地址即可实现微信公众号的本地调试。提供这样功能的软件不少,比如花生壳,但是要收费的。

=======================================================

    本人使用的内网穿透工具是natapp,下面说一下大概的部署natapp的过程吧。

    1、注册账号,生成隧道

    在“购买隧道”那里的免费隧道中,可以创建免费隧道,创建好后,可以在“我的隧道”页面中看到,把authtoken记下来,下面用到。

    2、下载客户端,配置配置文件,启动隧道

    客户端下载页:https://natapp.cn/#download

    本人用的是windows版本,下载好后,解压。然后在解压后的根目录新建一个文件config.ini,内容如下(自己配置前面获取到的隧道访问token):

#将本文件放置于natapp同级目录 程序将读取 [default] 段
#在命令行参数模式如 natapp -authtoken=xxx 等相同参数将会覆盖掉此配置
#命令行参数 -config= 可以指定任意config.ini文件
[default]
authtoken=                    #对应一条隧道的authtoken
clienttoken=                    #对应客户端的clienttoken,将会忽略authtoken,若无请留空,
log=none                        #log 日志文件,可指定本地文件, none=不做记录,stdout=直接屏幕输出 ,默认为none
loglevel=ERROR                  #日志等级 DEBUG, INFO, WARNING, ERROR 默认为 DEBUG
http_proxy=                     #代理设置 如 http://10.123.10.10:3128 非代理上网用户请务必留空

    启动客户端,成功后如下:

可以看到域名 http://xxxx.natappfree.cc 映射到了 127.0.0.1:80

 

3、配置nginx反向代理

现在,隧道已经建立了,由于默认映射到本地的80端口,假设项目需要在8090端口访问,这时需要部署nginx,nginx的部署如下,这里是把http://xxxx.natappfree.cc 反向代理到 http:localhost:8090

	#微信公众号测试,反向代理映射到http://127.0.0.1:8190
	server{
		listen 80; 
		server_name xxxx.natappfree.cc;
		
		location / { 
			proxy_pass http://127.0.0.1:8190;
			
			root   html;
			index  index.html index.htm;
			
			#设置主机头和客户端真实地址,以便服务器获取客户端真实IP
			proxy_set_header Host $host;
			proxy_set_header X-Real-IP $remote_addr;
			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

		} 
	}

部署nginx成功后,需要在项目中写点代码,作为公众号服务器校验(在公众号后台添加服务器URL时,需要测试成功才能配置),校验规则参考:

https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421135319

好了,看下接入校验代码吧。

  /**
     * 校验信息是否是从微信服务器发出,处理消息
     *
     * @return
     */
    @RequestMapping(value = {"", "/"}, method = {RequestMethod.GET})
    public void connectWX(HttpServletRequest request, HttpServletResponse response) {
        try {
            String signature = request.getParameter("signature");
            // 时间戳
            String timestamp = request.getParameter("timestamp");
            // 随机数
            String nonce = request.getParameter("nonce");
            // 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败
            if (SignUtils.checkSignature(signature, timestamp, nonce)) {
                // 随机字符串
                String echostr = request.getParameter("echostr");
                logger.info("接入成功,echostr=" + echostr);
                response.getWriter().write(echostr);
            } else {
                logger.info("接入失败,签名校验失败");
            }
        } catch (Exception e) {
            logger.error("接入失败", e);
        }

    }
/**
 * 签名工具类
 */
public class SignUtils {

    /**
     * 验证签名
     *
     * @param signature
     * @param timestamp
     * @param nonce
     * @return
     */
    public static boolean checkSignature(String signature, String timestamp, String nonce) {
        String[] arr = new String[]{WechatConfig.WECHAT_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();
        }
        // 将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;
    }
}

为了保守起见,先在浏览器访问http://xxxx.natappfree.cc看下是否可以访问本地的应用吧,OK之后继续。

4、公众号平台配置服务器

自己在服务器配置中,填写URL和TOKEN吧,如果微信公众号使用GET请求访问到了我们的服务器,并且获取到了返回的报文,会配置成功。否则显示配置失败

 

至此,开发环境已经配置完毕。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章