文档章节

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

细肉云吞
 细肉云吞
发布于 2017/09/06 22:20
字数 1639
阅读 73
收藏 4

公众号简介

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

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

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

    微信公众平台提供了测试公众账号,登录地址为: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请求访问到了我们的服务器,并且获取到了返回的报文,会配置成功。否则显示配置失败

 

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

© 著作权归作者所有

共有 人打赏支持
细肉云吞
粉丝 106
博文 155
码字总数 122781
作品 0
其它
高级程序员
如何使用云服务器作为微信公众号的开发空间

喜欢我们的文章?!欢迎大家关注腾讯云技术社区-简书主页哦~文末有彩蛋,不要错过! 我们在做微信公众号的开发时,都需要一个开发的环境,我们平常叫做开发空间,常用的空间我们在新浪和百度...

2017/12/18
0
0
Wechat Framework —— 微信开发框架

Wechar Framework(微信开发框架,简称WTF)能帮助开发者快速搭建微信公众号开发环境,开发者在自己的微信公众号开发项目中引入本框架后,仅需简单的几步配置即可获得消息接收、解析、回复等...

oschina
2015/11/16
17
0
微信开发环境搭建

一、微信开发环境搭建   工欲善其事,必先利其器。要做微信公众号开发,那么要先准备好两样必不可少的东西:   1、要有一个用来测试的公众号。   2、用来调式代码的开发环境。 1.1、注...

林夕2018
2016/04/29
671
0
微信开发框架(WTF)--Wechat Framework

Wechat Framework(微信开发框架,简称WTF)能帮助开发者快速搭建微信公众号开发环境,开发者在自己的微信公众号开发项目中引入本框架后,仅需简单的几步配置即可获得消息接收、解析、回复等...

老程序狗
2015/11/16
13.6K
10
IDE中显示 *.properties 为中文

之前做过几个开源项目(极速开发微信公众号weixinguide以及IJPay 让支付触手可及),Demo中有涉及到一些配置文件。有些同学下载了之后反馈说有乱码。一个一个的耐心去回复很浪费时间以及精力现...

Javen205
2017/08/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

JavaFX WebView概述,很强大,内置了类似Electron的功能

来自 Murali Billa JavaFX技术人员的主要成员 在本博客中,我们将了解JavaFX如何呈现网页及其主要的组件 - 即WebView JavaFX是: 用于创建和交付桌面应用程序的软件平台,以及可以在各种设备...

GuoMengyue
29分钟前
4
0
数据库监控系统小实现1

需求:通过java 去调取python 去目标数据库采集信息,然后插入到数据库,由前台UI显示出来,从而达到监控目的。 设计:通过java的Runtime.getRuntime().exec(args1)方法去调用python脚本,j...

hnairdb
31分钟前
1
0
spring boot logback-spring 配置 日志分文件

因为更规规范化,想将日志分文异常类型,分别存储起来,方便以后查询问题。 以下是 logback-spring.xml 配置: <?xml version="1.0" encoding="UTF-8"?><configuration scan="true"> ...

诺岚
32分钟前
3
0
OSChina 周三乱弹 —— 这下回去要被老婆挠死

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @andonny :分享Passenger的单曲《Let Her Go》 《The Importance of Being Idle》-Noel Gallagher/It's a Cover Up 手机党少年们想听歌,请使...

小小编辑
51分钟前
808
19
RedHat已更改其开源许可规则

对于编程圈外的人来说,软件许可证似乎并不重要,但是,在开源领域,开源许可是非常重要的。 因此,领先的Linux公司Red Hat宣布了一件大事,所有新的由Red Hat发起的使用GNU通用公共许可证(...

linuxCool
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部