• 本人现在用的是 微信web开发者工具v0.12.130400 在创建项目 添加项目时选择的项目目录的文件夹下能有次级文件夹 如果有次级文件 即便是空文件就会报“app.json 未找到入口 app.json 文件,或者文件读取失败,请...
    本人现在用的是 微信web开发者工具v0.12.130400  在创建项目  添加项目时选择的项目目录的文件夹下不能有次级文件夹   如果有次级文件 即便是空文件就会报“app.json

    未找到入口 app.json 文件,或者文件读取失败,请检查后重新编译。”


    展开全文
  • 自己创建的mpvue项目,玩了几天,知道自己操作了什么,用微信开发者打开项目直接报错了。。 郁闷了很久,开发者工具路径打开dist目录又可以,刚接触mpvue一时也找到原因 。。。 最后弄了好久,每个...

    自己创建的mpvue项目,玩了几天,不知道自己操作了什么,用微信开发者打开项目直接报错了。。

    郁闷了很久,开发者工具路径打开dist目录又可以,刚接触mpvue一时也找不到原因 。。。

    最后弄了好久,每个配置文件都看了一遍,最后终于找到了原因、

    原来是项目配置文件project.config.json  里面出了问题,可能是编译的有问题,miniprogramRootme 没有指定路径

    只需要把小程序源码的路径指向dist目录,问题就解决了 。。

     

    展开全文
  • 简单的功能做的差不多了,然后打包到微信开发者工具和真机进行调试时发现了一些匪夷所思的问题(也许只是对我来说是这样)。记录一下,以避免以后踩同样的坑。 一、self in not defined 在本地和开发者工具中调试都...

    背景

    最近在用cocoscreator做一个对战的小游戏,通信用的socket.io模块,客户端语言用的ts,后端用的node.js
    简单的功能做的差不多了,然后打包到微信开发者工具和真机进行调试时发现了一些匪夷所思的问题(也许只是对我来说是这样)。记录一下,以避免以后踩同样的坑。

    一、self in not defined

    在这里插入图片描述
    在本地和开发者工具中调试都是正常的,但是不知为什么到真机调试的时候就会报这样的一个错。
    国庆前,就一直搞这个问题,cocos论坛和微信开发社区,大佬群各种地方发帖子,寻求解决办法。最终,无疾而终。

    终于在国庆之后,死马当活马医。在我全局搜索项目中哪里用到了self之后,发现socket.io.js里边有几个self。代码是压缩状态,我也没仔细看里边的逻辑是怎样的,猜测有可能是这里边self有问题吧。
    反正已经试了很多方法了,也不差这一下,换个socket包试一下吧。

    于是,我把socket.io.js(客户端用)的版本改为之前在论坛找到的一个包,版本1.4.4。

    最终测试,竟然成功了,困扰我半个月之久的问题终于解决了。

    总结:
    1.用1.4.4版本的socket.io.js客户端包
    2.执行命令 npm install @types/socket.io-client 得到的1.4.5的ts声明文件(ts智能提示需要)

    疑问:socket.io包的版本是:^2.2.0,socket.io.js也是从这里边拿出来的,版本相同按理说应该是没问题的,为什么这儿却不行。

    如果你也需要使用 ts的.d.ts + socket.io.js ,我打了一个包,可以下载
    ts+socket.io
    没有积分的,可以留言邮箱,我给你发。

    二、json对象的循环引用

    Converting circular structure to JSON;at setTimeout callback function
    TypeError: Converting circular structure to JSON
    at JSON.stringify ()
    在这里插入图片描述
    看问题是在onLoad的时候,JSON.stringify 方法报的错,
    原代码里,我做了一个判断,

    //window.global不存在时,则初始化
    if (window.global == null || JSON.stringify(window.global) == '{}'){
    		window.global = {};
    }
    

    因为此时window.global是undefined,所以导致了JSON.stringify出错。
    把这句改为 if(!window.global) 就可以了。

    三、cannot set property ‘’ of undefined

    在这里插入图片描述
    PS:按理说,这种问题很简单,就和java的空指针类似,肯定是哪个变量没有定义才导致的。顺着这个思路走下去。

    看错误提示,是addPlayer方法里边出的错,经排查发现是取global的一个属性时,这个属性还未定义。
    因此,在入口程序的脚本里边把所有用到的全局变量都初始化一下。
    类似于这样的:window.global = { a:null, b:{}, c:[] };

    然而,重新测试还是这样的问题,百思不得其解,我已经初始化了,为什么还是找不到变量。于是,我在微信开发者工具里进行断点调试。

    这里无奈吐槽一下,我简直要被微信开发者工具的debug工具误导死了,还以为是json解析异常呢。让我走了很多弯路。

    首先说明一下,下边的data是从服务器接收的一个嵌套的对象,结构类似于

    {
    	players:{
    		aaa: {
    			name: "zhangsan",
    			age: 12
    		},
    		bbb: {
    			name: "lisi",
    			age: 13
    		}
    	}
    }
    

    看debug步骤:
    step1: 此处data值显示正常
    在这里插入图片描述
    step2: data.players显示的值也正常
    在这里插入图片描述
    step3: 发现let players = data.players这一行赋值语句,赋值后的players为一个字符串
    在这里插入图片描述
    这就很奇怪了,players本来应该是一个对象的,为什么在这却变成了一个字符串呢?

    此处略过我的各种猜测,又改服务器代码,又该客户端代码的。(内心MMP)

    虽然看着这语法没有什么不对的地方,但是我一时半会怎么也想不通到底结果为什么是这样。但是我不信邪,我就不信了,这么个小问题我还搞不定你了。

    最终,我在控制台打印了一下global变量的时候,发现了重要的问题所在,此时global定义的空对象{}和空数组[]竟然全是undefined未定义的。明明,我已经在游戏开始场景定义了啊。算了,那我在本场景再重新定义一下吧。

    终于,一番操作之后,问题被解决了。控制台也能正常的打印出来global空数组和空对象。此时再去看我debug的变量let players = data.players,players竟然显示正常了,WHAT???
    微信,你玩我呢是吧。真是把我害惨了好吗。为什么同样的代码,刚才显示异常,现在显示又正常了呢??完美的把我的注意点带偏了。

    总结:这个问题,导致的原因,是跨场景时global定义的空对象和空数组不识别,需要重新定义。
    也引出了另外一个问题,global已经是全局的变量了,为什么里边的空对象和空数组在初始场景定义了,进入到其他场景却还是undefined呢?(global里边定义的null可以正常的跨场景)这个问题,容我以后再研究,有知道的小伙伴可以留言告诉我,谢谢~

    展开全文
  • 过年前后做了个微信公众号项目,已经过去一段时间了,抽空回忆总结下基本流程吧,不然很快估计自己就忘了。。 微信公众平台官网:https://mp.weixin.qq.com 文章目录一、注册公众号二、了解公众号管理页面三、必备...

    背景:
    过年前后做了个微信公众号项目,已经过去一段时间了,抽空回忆总结下基本流程吧,不然很快估计自己就忘了。。

    微信公众平台官网:https://mp.weixin.qq.com



    一、注册公众号

    在这里插入图片描述
    首先注册时可以看到公众号有三种类型,个人用户大多数选择订阅号,而企业用户一般选择服务号和企业号

    我们平常大多数关注的都是订阅号,他们统一都放置在微信应用的订阅号消息列表中,没有微信支付等高级功能,只是用于发布文章等基础功能。
    在这里插入图片描述

    服务号企业号都在会话列表,和我们的微信好友是同级别的位置,具备微信支付等高级功能,一般是某个企业品牌的对外操作窗口,如海底捞火锅、顺丰速运等。
    在这里插入图片描述

    我们前期开发测试只需要注册个人订阅号即可,真正开发使用的是开发者工具里的测试号,具体下面会说。

    真正生产的话,使用的都是经过微信认证的订阅号、服务号、企业号。


    二、了解公众号管理页面

    我们在微信公众平台扫码登录后可以发现管理页面左侧菜单栏有丰富的功能:
    在这里插入图片描述
    大概可以分为这几大模块:
    首页功能小程序管理推广统计设置开发

    作为开发人员,首先应该关注的是设置、开发模块;而作为产品运营人员,关注的是功能、管理、推广模块;作为数据分析人员,关注的是统计模块。

    首先我们不妨各个功能模块都点击看一看,大概了解下我们能做些什么。可以确认的是,这个微信公众平台当然不只是给开发人员使用的,它提供了很多非技术人员可在UI界面上交互操作的功能模块。

    如配置消息回复、自定义菜单、发布文章等:
    在这里插入图片描述
    这个时候我们可能会想:这些功能好像非技术人员都能随意操作,那么还需要我们技术人员去开发吗?

    答案是: 如果只是日常简单的推送文章,就像我们关注的大多数公众号一样,那确实不需要技术人员去开发;但是,如果你想将你们的网站嵌入进去公众号菜单里(这里指的是把前端项目的首页链接配置在自定义菜单),并且实现微信端的独立登录认证、获取微信用户信息、微信支付等高级功能,或者觉得UI交互的配置方式无法满足你的需求,你需要更加自由、随心所欲的操作,那么我们就必须启用开发者模式了,通过技术人员的手段去灵活控制公众号。

    这里有一点需要注意,如果我们决定技术人员开发公众号,必须启用服务器配置,而这将导致UI界面设置的自动回复和自定义菜单失效!

    我们在 开发 - 基本配置 - 服务器配置 中点击启用
    在这里插入图片描述
    在这里插入图片描述
    我们团队就遇到过这种情况:两个项目组共用一个公众号,结果一个启用了服务器配置,使另一个项目组手动配置的菜单失效了。所以要注意这点!

    至于服务器配置中的选项代表什么意思、如何填写,我们下面再讲。


    三、必备开发者工具的使用

    在这里插入图片描述
    我们进入 开发 - 开发者工具, 可以发现微信提供了六种开发者工具,其中前四种属于开发必备:开发者文档在线接口调试工具web开发者工具公众平台测试账号

    1.开发者文档

    在这里插入图片描述
    这个不用说!在我们开发中属于最最最基础和重要的东西了,我们要想熟练开发公众号,首先必须熟读开发者文档!有些功能的开发甚至非要反复研读、咬文嚼字一番不可。PS:该文档吐槽的地方也不少,有些地方的确讲的不够明确!

    2.在线接口调试工具

    在这里插入图片描述
    这个工具也算比较实用,包含大多数接口的在线调试,我们可以直接在上面输入参数,获取微信服务端的返回结果。

    3.web开发者工具

    在这里插入图片描述
    这个工具是一款桌面应用,需要下载,它通过模拟微信客户端的UI使得开发者可以使用这个工具方便地在PC或者Mac上进行开发和调试工作,一般是前端使用该工具进行页面、接口调试。

    4.公众平台测试账号

    在这里插入图片描述
    这个测试号工具对我们的重要性可以说是仅次于开发者文档。我们可以创建测试号无需申请、认证真实的公众帐号、可在测试帐号中体验并测试微信公众平台所有高级接口。并且所有的配置都可在一个页面上编辑,使开发测试变得极其便利。


    四、细读开发者文档

    文档地址:https://mp.weixin.qq.com/wiki

    需要注意的是,细读开发者文档不是让你所有模块都去阅读,而是重点的重复细读,非重点的选择性阅读。
    在这里插入图片描述
    其中前两个模块:开始前必读开始开发,属于重点关注对象,也是整个微信开发的基石所在,需要多读几遍。其次是微信网页开发模块微信网页授权,比较难理解,需要特别注意。其他的模块则根据你们的项目功能需求,有选择性的阅读即可。

    这里我就不多罗嗦了,大家看文档去吧!下面我会描述一些重点内容的实际操作情况以及代码,请确保你已经浏览过文档


    五、开发流程重点解析


    1.开发环境准备

    这里所谓的开发环境准备主要指的是我们项目服务端和微信服务端的网络通讯环境准备。

    我们平常开发可能只需要IP端口就能通讯,顶多配置下白名单放行,但微信公众号开发我们需要通过域名通讯(微信会访问我们配置的域名地址:服务器基本配置中的URL,下面会介绍),也就是我们各自开发环境需要拥有独立的域名,微信就能通过这个域名请求到我们的本地开发服务,各自进行开发测试。

    而我们一般都是内网开发,整个内网只有一个对外域名,所以这时就需要 内网穿透 ,为我们每个开发人员配置各自开发机器的域名。

    那如何进行内网穿透呢?你首先可以找下你们的网管,看他能不能帮你解决,如果不能,那就安装内网穿透工具,我们自己动手!

    我选择的内网穿透工具是natapp,这个有免费版、收费版,免费版的域名会随机变化,而收费版可以拥有固定域名,建议选择收费版,9元每月并不贵;大家可以对照natapp的文档安装使用,并不难。
    在这里插入图片描述
    这样我们本地开发环境就拥有自己的域名啦!然后就可以在测试号管理页面配置本地访问地址URL了。

    2.服务器基本配置

    无论是在真实公众号开发 - 基本配置 - 服务器配置,还是在 测试号管理 中,我们都可以看到这几个基本参数:
    开发者ID(AppID)、开发者密码(AppSecret)、服务器地址(URL)、令牌(Token)

    AppID 是公众号唯一开发识别码,配合开发者密码可调用公众号的接口能力,大多数微信接口都需要附带该参数。

    AppSecret 是校验公众号开发者身份的密码,具有极高的安全性。切记勿把密码直接交给第三方开发者或直接存储在代码中。如需第三方代开发公众号,请使用授权方式接入。其中获取accessToken就需要同时传入AppID和AppSecret获取。

    URL 是开发者用来接收微信消息和事件的接口URL,也就是我们服务后端的入口地址,需要注意的是该地址必须以域名形式填写,且必须以http 或 https 开头,分别支持80端口和443端口。如:http://yuanj.natapp1.cc/wechat。

    Token 可由开发者可以任意填写,用作生成签名(该Token会和接口URL中包含的Token进行比对,从而验证安全性),也就是我们项目和微信服务端进行通信时,必须保证公众平台配置的Token和我们后台代码配置的Token保持一致,这样微信就能验证我们身份。

    注:EncodingAESKey 参数由开发者手动填写或随机生成,将用作消息体加解密密钥,我们前期可以采用明文模式进行开发测试,暂时先不用关注。
    在这里插入图片描述
    我们点击提交时,微信会以GET请求的方式访问我们配置的URL地址,并附加几个参数进行验证,所以你需要在该地址对应的项目后端接口里对这几个参数进行加工处理返回微信需要的结果,这样就可以验证成功,使微信服务端认可你配置的URL和Token参数,后续就能互相通信了!
    在这里插入图片描述
    具体情况可以阅读微信文档 - 开始前必读 - 接入指南

    这里附上该接口的Java代码:

    /**
     * 微信对接验证接口
     * */
    @RestController
    @RequestMapping(value = "/wechat")
    public class ValidateController {
        @Autowired
        WechatConfig wechatConfig;
    
       @RequestMapping(value = "", method = RequestMethod.GET)
       public void validate(HttpServletRequest req, HttpServletResponse resp) {
            System.out.println("-----开始校验签名-----");
    
            // 接收微信服务器发送请求时传递过来的参数
            String signature = req.getParameter("signature");
            String timestamp = req.getParameter("timestamp");
            String nonce = req.getParameter("nonce"); //随机数
            String echostr = req.getParameter("echostr");//随机字符串
    
            // 将token、timestamp、nonce三个参数进行字典序排序并拼接为一个字符串
            String TOKEN = wechatConfig.getToken();
            String sortStr = sort(TOKEN,timestamp,nonce);
            
            // 字符串进行shal加密
            String mySignature = WechatUtils.shal(sortStr);
            
            // 校验微信服务器传递过来的签名 和  加密后的字符串是否一致, 若一致则签名通过
            if(!"".equals(signature) && !"".equals(mySignature) && signature.equals(mySignature)){
                System.out.println("-----签名校验通过-----");
                try {
                    resp.getWriter().write(echostr);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }else {
                System.out.println("-----校验签名失败-----");
            }
        }
        
       /**
         * 参数排序
         * @param token
         * @param timestamp
         * @param nonce
         * @return
         */
        public static String sort(String token, String timestamp, String nonce) {
            String[] strArray = {token, timestamp, nonce};
            Arrays.sort(strArray);
            StringBuilder sb = new StringBuilder();
            for (String str : strArray) {
                sb.append(str);
            }
            return sb.toString();
        }
    }
    
    

    3.存取access_token参数

    access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时(7200秒),需定时刷新重复获取将导致上次获取的access_token失效

    access_token这个参数非常重要,几乎贯穿整个微信公关号项目开发,我们如何在有效期内定时刷新获取呢?
    如果我们的微信公众号项目是单服务架构,可以直接作为静态变量存储在内存里;如果是多服务,可以用中间件存储Redis、数据库都可以。SpringBoot项目内部可以通过@Scheduled注解,执行定时任务,既然access_token有效期是2小时,那我们可以一小时刷新获取一次,将其存入Redis,覆盖之前的access_token。


    4.公众号消息管理

    在这里插入图片描述
    很多公众号都可以通过消息发送来与其进行交互,那这样的功能如何代码实现呢?

    具体我们可以在微信文档 - 消息管理 模块查阅:
    在这里插入图片描述
    在此我要提到的一点就 微信公众号的消息交互都是通过XML格式进行的!这点就很坑了。。现在我们前后端、服务端的消息传输基本都是Json格式了,也习惯了Json格式的解析处理,所以遇到XMl格式的处理又要多费些事了。

    为什么微信采用XML格式呢?我个人猜测是几年前还是XML格式的天下,当时Json还没有这么流行,腾讯毕竟是产品业务驱动的,当然选择当时开发人员最熟悉的XML格式了开发,后面随着微信平台的普及,用户越来越多,想重构改成Json格式估计也十分困难,所以历史就遗留下来了呗。。

    我在此推荐一个GitHub上一个微信开发 Java SDK,里面有整个微信开发平台很多功能模块造好的轮子,我们可以参考下直接使用:
    https://github.com/Wechat-Group/WxJava
    在这里插入图片描述
    比如现在对于XMl消息解析这个需求,上面就提供了完整详尽的代码。


    5.获取openid以及网页授权(重难点)

    注意,这是公众号开发的重难点之一,请把技术文档中的微信网页授权模块多读两遍,然后带着疑问来看我的解析。

    (1)先明确为什么需要网页授权?我们的目的是什么?

    答:用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑。也就是通过这种授权机制,我们能获取微信用户信息,比如:头像、昵称、地区、个性签名等。

    (2)既然目的是获取用户基本信息,微信不是提供了专门的接口吗?非要网页授权?

    答:在文档的 用户管理 - 获取用户基本信息(UnionID机制) 模块可以看到的确有获取用户基本信息接口:
    在这里插入图片描述
    可以看到,这个接口只需要提供openid或者unionid,即可直接获取用户基本信息。那么问题来了,openid(unionid)又是如何获取呢?

    微信平台提供了两种方式获取用户的openid

    第一种方式:

    用户与公众号产生消息交互时,会以POST请求的方式向我们配置的服务器URL地址发送XML格式的消息,并附带该用户对应公众号的openid!关于什么是消息交互我们可以查看文档中的消息管理模块,比如我们在公众号输入栏中发送文字图片语音等属于普通消息交互,我们关注、取关、点击自定义菜单等属于事件消息交互,每当前端用户进行这个操作时,微信服务端都会向我们项目后台发送POST请求给我们传达信息:
    在这里插入图片描述
    可以看到,这个推送数据包中就包含了用户的消息交互类型、时间以及我们需要的openid!也就是说,无论用户在公众号里干了啥操作,我们都能知道他这个操作干了啥,以及他是谁(openid),这时就能调用 用户管理 - 获取用户基本信息(UnionID机制) 接口获取用户基本信息了。

    别高兴太早,这种通过消息交互获取用户信息的方式,用户占主动地位,我们项目后端服务被动接受,那么如果我有个基本需求:我想在自定义菜单 - 对应我们网站的前端页面上展示微信用户基本信息,能做到吗?你如何把后台接收到的消息和前端用户关联绑定?
    可见,这种被动的方式并不能实现该功能,我们需要主动出击,在前端就能获取到当前操作用户的openid!

    第二种方式:

    这种方式就是通过网页授权机制主动出击!详情见下文。

    (3)网页授权有哪几种机制?分别是怎样实现?应用于什么场景?

    答:主要有两种机制,对应两种scope:

    snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(往往是业务页面)。

    snsapi_userinfo为scope发起的网页授权,是用来获取用户基本信息的。但这种授权需要用户手动同意,并且由于用户同意过,所以无须关注,就可在授权后获取该用户的基本信息。

    光看这两句解释你可能有一堆疑问,我们逐一分析:

    两种机制的前面授权步骤相同,大概如下:

    我们先要按照文档要求构造一个链接https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
    其中重点参数是redirect_uri,这个参数填的既可以是前端项目url,也可以是后端接口url,然后点击这个链接后,微信服务端经过重定向到我们填写的redirect_uri,会在此redirect_uri后拼接上一个code参数!然后前端或者后端通过code参数就可以调微信接口https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code获取openid等信息了:
    在这里插入图片描述
    这里讲下 snsapi_basesnsapi_userinfo不同点

    首先snsapi_base静默授权,什么意思呢?就是用户没有感知;与之对应的就是非静默授权snsapi_userinfo了,这个scope公众号会弹出一个小窗口需要用户手动点击授权,类似这种:
    在这里插入图片描述
    那么这两种scope授权的优劣势在哪呢?

    snsapi_base 的优势在于用户无感知,体验好,方便快捷;劣势在于获取openid后只能通过用户管理 - 获取用户基本信息(UnionID机制) 接口获取用户基本信息,而这种方式需要确保用户已经关注,不然是没有相关信息的!
    snsapi_userinfo 的优势在于无需用户关注公众号,只要用户点击了授权确认,即可通过access_token和openid调用专门的拉去用户信息接口获取信息,比较暴力。。;劣势在于需要用户手动授权,可能影响用户体验
    在这里插入图片描述

    在此说下,我们项目是通过snsapi_base静默授权的,其中redirect_uri配置的是前端项目首页地址(前后端分离),并将构造的这个链接封装起来,直接配置在自定义菜单里,那么用户点击菜单,就直接重定向到前端项目,然后前端获取code参数调用后端获取openid接口,将获取的openid缓存到客户端,以便后面使用。

    (4)想要进行网页授权,我们需要在公众平台配置什么吗?

    答:需要!
    如果是测试号,需要在 测试号管理 - 体验接口权限表 - 网页服务 - 网页帐号 点击 修改
    在这里插入图片描述
    在这里插入图片描述
    在这里配置的是回调页面redirect_uri的域名

    如果是正式号(需要微信认证),需要在 开发 - 接口权限 - 网页服务 - 网页帐号 - 网页授权获取用户基本信息 的配置选项中,修改授权回调域名。请注意,这里填写的是域名(是一个字符串),而不是URL,因此请勿加 http:// 等协议头;

    而且正式号其他配置的地方也和测试号不一样,比如多了IP白名单、域名根路径下的txt验证文件,这个稍微摸索下应该没啥问题的。


    over 暂时就回忆这么多了。。。可能有遗漏大家可以提出哈 ~ 下一篇博客写几个开发时的小问题补充下吧

    展开全文
  • 微信公众号开发教程(一)验证接入本篇文章主要介绍了微信公众号开发接入详细流程,希望对刚接触公众号开发的同学有所帮助,有兴趣的同学可多多关注叩丁狼公众号,后续会更新不同的公众号小案例。公众号的分类我们平常...

    作者:陈惠,叩丁狼教育高级讲师。原创文章,转载请注明出处。

    微信公众号开发教程(一)验证接入

    本篇文章主要介绍了微信公众号开发接入详细流程,希望对刚接触公众号开发的同学有所帮助,有兴趣的同学可多多关注叩丁狼公众号,后续会更新不同的公众号小案例。

    公众号的分类

    我们平常在微信应用上会看到有很多的公众号,但是各自并不一样,公众号也分很多种类型,不过最常见的就是服务号和订阅号了。下面我们来看一下他们的区别:

    1、订阅号
    为媒体和个人提供一种信息传播方式,主要偏于为用户传达资讯(类似报纸杂志),主要的定位是阅读,每天可以群发1条消息;

    2、服务号
    为企业,政府或组织提供对用户进行服务,主要偏于服务交互(类似银行提供服务查询),每个月只可群发4条消息;

    3、企业微信(企业号)
    为企业,政府,事业单位,实现生产管理和协作运营的移动化,主要用于公司内部通讯使用,旨在为用户提供移动办公,需要先有成员的通讯信息验证才可以关注成功企业微信;

    通过以下图片我们可以更清晰的看出不同公众号的区别:

    分类.jpg

    区别.jpg

    还有一个比较明显的区别就是,订阅号都是存放在一个名叫订阅号的文件夹中,点开才能看到所有关注过的订阅号,但是服务号却和好友一样直接就显示在聊天列表中。这个大家打开微信客户端便能看到。

    如果大家有需要申请公众号的,要根据实际需求考虑清楚应该申请哪一种公众号
    以下是官方给出的建议,大家可以多参考参考

    1)如果想简单的发送消息,达到宣传效果,建议可选择订阅号;
    2)如果想用公众号获得更多的功能,例如开通微信支付,建议可以选择服务号;
    3)如果想用来管理内部企业员工、团队,对内使用,可申请企业号;
    4)订阅号可通过微信认证资质审核通过后有一次升级为服务号的入口,升级成功后类型不可再变;
    5)服务号不可变更成订阅号。

    4.测试号(用于开发测试及功能体验)
    这种是平常普通用户是涉及不到的,是专门为开发人员准备的一种仅用于测试的公众号。

    由于用户体验和安全性方面的考虑,微信公众号的注册有一定门槛,某些高级接口的权限需要微信认证后才可以获取。所以,为了帮助开发者快速了解和上手微信公众号开发,熟悉各个接口的调用,微信推出了公众帐号测试号,无需公众帐号、快速申请接口测试号,通过手机微信扫描二维码即可获得,利用测试号我们可以体验和测试更多高级功能。

    申请地址:
    http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login

    但测试号也不是万能的,部分高级功能,如微信支付,卡券功能等也是不开放的。
    如果要实现支付功能还是得去注册个正式的公众号。

    微信公众平台:

    我们注册的公众号都可以在这个平台上进行管理,比如想弄一些自定义菜单,或者自动回复,或者平常推送的文章,都可以在这上面操作。

    平台地址:
    http://mp.weixin.qq.com

    平台中分为两种管理模式:

    平台提供了两种管理模式给我们,应该根据我们的需求来选择使用不同的模式。

    下面我们来了解一下,两种模式的区别:

    编辑模式

    主要针对非编程人员及信息发布类公众帐号使用。
    开启该模式后,可以方便地通过界面配置“自定义菜单”和“自动回复的消息”。
    好处是可视化界面配置,操作简单,快捷,但是功能有限。

    开发模式

    主要针对具备开发能力的人使用。
    开启该模式后,能够使用微信公众平台开放的接口,但是编辑模式的设置会失效,比如“自定义菜单”和“自动回复的消息”功能。通过编程方式可以实现更多复杂的功能,提供个性化服务。

    总的来说,编辑模式就是为所有人提供的,如果你的需求仅仅只是最常见的菜单,自动回复等,使用编辑模式已经满足,但是如果你需求的功能比较复杂,有很多很多的想法,就需要使用到开发模式。

    下面我们来学习一下,怎么使用这个开发模式。

    开发模式配置流程

    1.登录测试号页面,可以看到该测试号相关的信息

    就是使用电脑打开http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
    使用微信扫一扫二维码,即可在打开的页面中看见微信给你分配的测试号的相关信息。

    下面两个属性是唯一的标识,每个测试号都会有自己的appid与appsecret ,是比较重要的信息,不要随意发给别人。

    appid:是公众号开发识别码,配合开发者密码可调用公众号的接口能力。
    appsecret:是校验公众号开发者身份的密码,具有极高的安全性。

    测试号信息.png

    如果是正式的公众号,登录公众平台官网之后,找到“基本配置”菜单栏也可以获取上公众号相关的信息。

    2.配置参数介绍

    再往下看,我们会看到URL和Token这两个属性,和上面appid/appsecret不同的是,上面的是微信分配给我们的,但是下面这两个是需要我们填进去的。

    我们先来了解一下,这两个属性有什么作用。

    URL:就是指我们自己的服务器地址
    该URL是开发者用来接收和响应微信消息和事件的接口URL
    (必须以http://或https://开头,分别支持80端口和443端口)

    Token:可任意填写,用作生成签名(必须为英文或数字,长度为3-32字符)
    该签名在后边会用到,这里暂时随便填个内容也可以

    接口信息配置.png

    接下来我们需要了解的是微信与我们的服务器交互的过程:

    当我们在微信app上,给公众号发送一条内容的时候,实际会发送到微信的服务器上,此时微信的服务器就会对内容进行封装成某种格式的数据比如xml格式,再转发到我们配置好的URL上,所以该URL实际就是我们处理数据的一个请求路径。所以该URL必须是能暴露给外界访问的一个公网地址,不能使用内网地址,生产环境可以申请腾讯云,阿里云服务器等,但是在开发环境中可以暂时利用一些软件来完成内网穿透,便于修改和测试,如NATAPP,花生壳等软件,使用起来也很方便,在本地安装对应的软件,配置运行后,直接使用软件分配的临时域名来访问本地应用即可,只是偶尔会存在网络不稳定的情况。这里不详细介绍如何使用了,具体教程可参考软件官网。

    交互流程.png

    在开发的过程中,我们会经常使用到微信公众号提供给开发者的开发文档
    具体地址:https://mp.weixin.qq.com/wiki
    大家打开后可以选择”接入指南”,参考微信提供的一些帮助信息。

    3.搭建本地应用(java/python/php等语言均可)

    基本概念都了解过后,我们马上就要开始开发了,因此需要先提供好一个应用,接下来就可以在该应用上添加公众号相关的功能了。

    本文项目使用java语言,SpringMVC+Spring+MyBatis框架

    4.URL接入验证

    我们需要先来了解一下接入的过程是怎么样的。下图是微信官方对接入过程的介绍。

    图片.png

    由以上介绍可知,当我们填入url与token的值,并提交后,微信会发送一个get请求到我们填写的url上,并且携带4个参数,而signature参数结合了开发者填写的token参数和请求中的timestamp参数、nonce参数来做的加密签名,我们在后台需要对该签名进行校验,看是否合法。实际上,我们发现微信带过来的4个参数中并没有带token参数,仅有signature是和token有关的,所以我们应该在本地应用中也准备一个和填入的token相同的参数,再通过微信传入的timestamp与nonce做相同算法的加密操作,若结果与微信传入的signature相同,即为合法,则原样返回echostr参数,代表接入成功,否则不做处理,则接入失败。

    详细流程可参考微信官方提供的逻辑流程图,我们的应用需要以该流程图的步骤来实现。

    图片.png

    代码示例:

    @Controller
    public class WeChatController {
            /**
             * 微信URL接入验证
             * @param signature
             * @param timestamp
             * @param nonce
             * @param echostr
             * @return
             */
            @RequestMapping(value="/weChat",method= RequestMethod.GET)
            @ResponseBody
            public String validate(String signature,String timestamp,String nonce,String echostr){
                //1. 将token、timestamp、nonce三个参数进行字典序排序
                String[] arr = {timestamp,nonce,WeChatUtil.TOKEN};
                Arrays.sort(arr);
                //2. 将三个参数字符串拼接成一个字符串进行sha1加密
                StringBuilder sb = new StringBuilder();
                for (String temp : arr) {
                   sb.append(temp);
                }
                //3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
                if(SecurityUtil.SHA1(sb.toString()).equals(signature)){
                    //接入成功
                    return echostr;
                }
                //接入失败
                return null;
            }
    }
    

    备注:

    1. 代码中WeChatUtil.TOKEN是一个常量,常量值必须要和我们在页面上填入的token值相同,通常可以抽取到配置文件中来注入值比较灵活。
      2.SecurityUtil是一个工具类,提供了sha1加密的方法。

    接入成功后即可根据开发文档实现一些小案例了。文章暂时使用的是测试号来做开发,后续有些高级功能权限不够可能会改成正式公众号来进行开发。


    展开全文
  • C#微信开发

    2017-12-24 10:35:37
    C#开发微信门户及应用教程   作者:伍华聪   C#开发微信门户及应用(1)--开始使用微信接口 6 1、微信账号 6 2、微信菜单定义 7 3、接入微信的链接处理 8 4、使用开发方式创建菜单 14 5、我创建的菜单案例 17 C#...
  • 微信开发资源下载

    2016-12-04 13:26:33
    微信公众平台技术文档 微信开发资源下载
  • 微信开发

    2018-02-03 09:43:44
    一、微信开发的整体介绍 开放平台:https://open.weixin.qq.com/ 公众平台:https://mp.weixin.qq.com/ 1、微信开发的种类 ①移动应用开发 支持微信的分享、收藏、支付三大功能,原生开发的人员去使用的开发...
  • 微信公众号主要有以下几个步骤 微信公众号的通讯机制 微信公众号简介 1.注册微信公众号 2.注册测试公众号 3.搭建微信本地调试环境 1)下载客户端natapp: 2)安装natapp: 4.微信公众号接入(校验签名) 第1步中...
  • 微信小程序的功能开发工具跟公众号的差别,小程序是一种减负思维对简单APP是巨大打击 摘要: 小程序和公众号最大的区别有如下四点:1.小程序没有粉丝,开发者在后台能看到的只能是累计用户访问数以及实时统计;2....
  • 微信公众号开发技术要点 微信公众号开发技术要点 微信公众号及其接口功能介绍 基本概念 公众号开发者模式 代码验证及图示 Open ID与Union ID 基本概念 使用说明 Access_token 基本介绍 注意事项 获取流程 ...
  • ... 创建完应用后,打开应用管理可见APP_ID、API_KEY、SECRET_KEY,需要用...由于百度提供了node.js的api,而小程序服务端云函数正是基于node的开发,在小程序开发工具云函数目录下打开终端导入文字识别api,命令:np...
  • 微信小程序(Wechat Mini Program)简称小程序,英文名Mini Program,是一种需要下载安装即可使用的应用,它实现了应用“触手可及”的梦想,用户扫一扫或搜一下即可打开应用。这次微信小程序的推出,应该更会激发...
  • 小程序项目的结构:小程序项目的配置文件:(需要自己创建)1、Project.config,json2、入口文件(重要):app.json3、应用程序的启动文件;app.js 作用是 监听小程序的生命周期4、通用样式配置文件:用于...
  • 微信小程序开发

    2019-01-08 19:01:00
    5.开发工具功能介绍 6.小程序的文件结构 7.小程序的组件 8.小程序样式 9.小程序生命周期 1.什么是小程序 小程序是一种需要下载、安装即可使用的应用,它实现了触手可及的梦想,用户扫一扫或者搜一下就能打开...
  • 微信公众号开发

    2018-03-04 23:09:23
    在互联网大大小小的站点内,拥有大量与微信开发相关的资源,包括技术博客、问题讨论、工具资源等。我们邀请多位微信开发专家对这些资源取其精华,按照微信开发的学习路线展示站内优质资源,从基础入门到高级开...
  • Ios系统 1、body上绑定click事件失效。...2、支持 YYYY-MM-DD 的时间格式。 用new Date(YYYY-MM-DD) 时,在安卓手机上正常获取时间数据。在ios上就不行。 解决:改成 YYYY/MM/DD 的格式。用 .replace(/-/g, '/'...
  • 1.微信小程序开发者工具 下载:小程序开发者工具 使用: 小程序原生开发:直接使用小程序开发者工具打开项目即可 小程序框架开发:首选官方提供类vue.js开发框架 wepy.js ,备选 mpVue。我们选择的是 wepy PS:...
  • 最新小程序商城类开发教程: 1微信小程序之侧栏分类 —— 微信小程序实战商城系列(1) 2微信小程序之仿淘宝分类入口 —— 微信小程序实战商城系列(2) 3微信小程序之购物数量加减 —— 微信小程序实战商城系列...
  • 一:本文只针对native第三方pc平台扫码支付 1. 名词解释: 1、 微信公众平台 ...商户可以在公众平台提交基本...微信开放平台是商户APP接入微信支付开放接口的申请入口,通过此平台可申请微信APP支付。 平台入口:http:...
1 2 3 4 5 ... 20
收藏数 2,700
精华内容 1,080