文档章节

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

细肉云吞
 细肉云吞
发布于 2017/09/06 22:20
字数 1639
阅读 70
收藏 4
点赞 0
评论 0

公众号简介

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

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

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

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

 

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

© 著作权归作者所有

共有 人打赏支持
细肉云吞
粉丝 104
博文 154
码字总数 122200
作品 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
一入前端深似海,从此红尘是路人系列第五弹之微信小程序canvas篇

看着小程序这些日子这么火爆,对于新鲜事物炒鸡感兴趣的我肯定也小小的研究了一下。于是乎便搞出了一个小程序版本的倒计时Demo。Demo效果图如下: 一、Demo思路来源 之所以写了这样一个Demo,...

qiangdada
2016/10/08
1K
8
开始学习微信公众号开发

注册开发账号 要开发微信公众号,首先得有一个微信公众号作为开发环境。否则,你怎么知道你写的是对的。这里,我直接就被自己坑了。注册是没错的,但是,我开通的是个人公众号。据我现在了解...

本然
2016/05/20
312
0
微信公众号开发纪要(1)-搭建开发环境

项目要做一个盘点功能,项目经理要求用微信扫一扫功能去扫描条码完成盘点。以前没搞过微信开发,这里把开发过程中趟过的坑记录一下。 一、申请自己的测试公众号 微信公众号分为服务号、订阅号...

pdzhsy
07/12
0
0
PHP 开发社区微信服务号实战图解

本博文就月初刚上线的微信服务号,图文进行总结分享给大家。 去年年底,我所在的团队讨论要开发微信号,话题由此拉开: 原来有一个3年前注册的微信号,但是后台操作无法从“订阅号”变更为“...

葡萄城控件技术团队
2015/04/23
0
0
微信公众号开发--环境搭建和准备工作

开发和调试之殇 微信公众号的开发,说简单也简单,说麻烦也麻烦,麻烦的不是开发过程,而是搭建开发环境的过程。不过俗话说得好,磨刀不误砍柴工,我们有必要花点时间来研究下如何攻破微信公...

我家有宝
2016/10/09
126
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

MyBatis源码解读之延迟加载

1. 目的 本文主要解读MyBatis 延迟加载实现原理 2. 延迟加载如何使用 Setting 参数配置 设置参数 描述 有效值 默认值 lazyLoadingEnabled 延迟加载的全局开关。当开启时,所有关联对象都会延...

无忌
9分钟前
0
0
javascript 类变量的实现

代码如下: function echo(){ for(let i=0;i<arguments.length;i++) console.log(arguments[i]);}function extend(o, p){for (prop in p) {o[prop] = p[prop]}retur......

backbye
13分钟前
0
2
编程语言对比分析:Python与Java和JavaScript(图)

编程语言对比分析:Python与Java和JavaScript(图): 凭什么说“Python 太慢,Java 太笨拙,我讨厌 JavaScript”?[图] 编程语言生而为何? 我们人类从原始社会就是用语言表达自己,互相沟通...

原创小博客
21分钟前
0
0
Akka构建Reactive应用《one》

看到这Akka的官网,描述使用java或者scala构建响应式,并发和分布式应用更加简单,听着很高级的样子,下面的小字写着消息驱动,但是在quickstart里面又写容错事件驱动,就是这么钻牛角尖。 ...

woshixin
33分钟前
0
0
ffmpeg源码分析 (四)

io_open 承接上一篇,对于avformat_open_input的分析还差其中非常重要的一步,就是io_open,该函数用于打开FFmpeg的输入输出文件。 在init_input中有这么一句 if ((ret = s->io_open(s, &s-...

街角的小丑
34分钟前
0
0
String,StringBuffer ,StringBuilder的区别

不同点 一、基类不同 StringBuffer、StringBuilder 都继承自AbStractStringBuilder,String 直接继承自 Object 2、底层容器“不同” 虽然底层都是字符数组,但是String的是final修饰的不可变...

不开心的时候不要学习
50分钟前
0
0
nodejs 文件操作

写文件code // 加载文件模块var fs = require("fs");var content = 'Hello World, 你好世界!';//params 文件名,内容,编码,回调fs.writeFile('./hello.txt',content,'utf8',function (er......

yanhl
52分钟前
0
0
SpringBoot mybits 查询为0条数据 但是在Navicat 中可以查询到数据

1.页面请求: 数据库查询: 2018-07-16 17:56:25.054 DEBUG 17312 --- [nio-9010-exec-3] c.s.h.m.C.selectSelective : ==> Preparing: select id, card_number, customer_id, customer_nam......

kuchawyz
今天
0
0
译:Self-Modifying cod 和cacheflush

date: 2014-11-26 09:53 翻译自: http://community.arm.com/groups/processors/blog/2010/02/17/caches-and-self-modifying-code Cache处在CPU核心与内存存储器之间,它给我们的感觉是,它具......

我叫半桶水
今天
0
0
Artificial Intelligence Yourself

TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学习系统,其命名来源于本身的运行原理。Tensor(张量)意味着N维数组,Flow(流)意味着基于数据流图的计算,TensorFlow为张量从流...

孟飞阳
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部