• 微信开发交流群:148540125系列文章参考地址 极速开发微信公众号欢迎留言、转发 项目源码参考地址 点我点我–欢迎Start 前几篇文章已讲完如何导入项目,如何启动配置项目,如何成为开发者(如果前三项不会的看这里...

    微信开发交流群:148540125

    系列文章参考地址 极速开发微信公众号

    欢迎留言、转发
    项目源码参考地址 点我点我–欢迎Start

    前几篇文章已讲完如何导入项目,如何启动配置项目,如何成为开发者(如果前三项不会的看这里 极速开发微信公众号。这篇文章就来讲讲如果实现消息交互

    总所周知Jfinal 开发中配置非常简单只要在web.xml中添加如下代码就可以将所有的请求交由Jfianl处理

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
      <filter>
        <filter-name>jfinal</filter-name>
        <filter-class>com.jfinal.core.JFinalFilter</filter-class>
        <async-supported>true</async-supported>
        <init-param>
          <param-name>configClass</param-name>
          <param-value>com.javen.common.APPConfig</param-value>
        </init-param>
      </filter>
      <filter-mapping>
        <filter-name>jfinal</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping>
    </web-app>

    可以看到com.javen.common.APPConfig 是项目的核心配置文件,他是继承自JFinalConfig 实现了如下方法

    消息交互-配置详解.png

    以上配置 详细介绍参考官方文档
    成为开发者模式这篇文章中讲到过消息交互都是由WeixinMsgController接管的,

    消息到底是如何交互的在此做详细的讲解

    上面有讲到消息交互都是由WeixinMsgController接管的,她是继承自MsgControllerAdapter 又继承自 MsgController 里面有个index 方法其中上面的拦截器MsgInterceptor是进行加密验证的(成为开发者模式),验证没有问题就执行index方法,如下图

    消息交互-接收消息.png

    可以看出接收消息并返回一个InMsg,之后根据信息类型调用对应的抽象方法交给实现方式实现消息的处理。

    那么问题来了:
    1、如何接收微信交互的xml
    2、如何处理微信的各种消息
    3、如何响应微信的各种消息

    接收微信交互的xml

    成功开发者(get请求)之后,所有的消息接收处理都交由开发者url处理(post请求)所以就有一下方法获取xml

     @Before({NotAction.class})
        public String getInMsgXml() {
            if(this.inMsgXml == null) {
                this.inMsgXml = HttpKit.readData(this.getRequest());
                if(ApiConfigKit.getApiConfig().isEncryptMessage()) {
                    this.inMsgXml = MsgEncryptKit.decrypt(this.inMsgXml, this.getPara("timestamp"), this.getPara("nonce"), this.getPara("msg_signature"));
                }
            }
    
            if(StrKit.isBlank(this.inMsgXml)) {
                throw new RuntimeException("请不要在浏览器中请求该连接,调试请查看WIKI:http://git.oschina.net/jfinal/jfinal-weixin/wikis/JFinal-weixin-demo%E5%92%8C%E8%B0%83%E8%AF%95");
            } else {
                return this.inMsgXml;
            }
        }

    解析微信的各种消息

    @Before({NotAction.class})
        public InMsg getInMsg() {
            if(this.inMsg == null) {
                this.inMsg = InMsgParser.parse(this.getInMsgXml());
            }
    
            return this.inMsg;
        }

    可以看到this.inMsg 为null时会解析InMsgParser.parse(this.getInMsgXml());获取到的xml

    public static InMsg parse(String xml) {
            XmlHelper xmlHelper = XmlHelper.of(xml);
            return doParse(xmlHelper);
        }

    静态方法 通过xml 实例化一个XmlHelper(主要提供一些常用类型数据的获取方法) 再交给doParse方法处理 text消息 image消息 voice消息 vide消息 shortvideo消息 location消息 link消息 eveen消息

    private static InMsg doParse(XmlHelper xmlHelper) {
            String toUserName = xmlHelper.getString("//ToUserName");
            String fromUserName = xmlHelper.getString("//FromUserName");
            Integer createTime = Integer.valueOf(xmlHelper.getNumber("//CreateTime").intValue());
            String msgType = xmlHelper.getString("//MsgType");
            if("text".equals(msgType)) {
                return parseInTextMsg(xmlHelper, toUserName, fromUserName, createTime, msgType);
            } else if("image".equals(msgType)) {
                return parseInImageMsg(xmlHelper, toUserName, fromUserName, createTime, msgType);
            } else if("voice".equals(msgType)) {
                return parseInVoiceMsgAndInSpeechRecognitionResults(xmlHelper, toUserName, fromUserName, createTime, msgType);
            } else if("video".equals(msgType)) {
                return parseInVideoMsg(xmlHelper, toUserName, fromUserName, createTime, msgType);
            } else if("shortvideo".equals(msgType)) {
                return parseInShortVideoMsg(xmlHelper, toUserName, fromUserName, createTime, msgType);
            } else if("location".equals(msgType)) {
                return parseInLocationMsg(xmlHelper, toUserName, fromUserName, createTime, msgType);
            } else if("link".equals(msgType)) {
                return parseInLinkMsg(xmlHelper, toUserName, fromUserName, createTime, msgType);
            } else if("event".equals(msgType)) {
                return parseInEvent(xmlHelper, toUserName, fromUserName, createTime, msgType);
            } else {
                LogKit.error("无法识别的消息类型 " + msgType + ",请查阅微信公众平台开发文档");
                return parseInNotDefinedMsg(toUserName, fromUserName, createTime, msgType);
            }
        }

    解析出来消息类型之后就调用对应的解析方法并返回InMsg

    消息类型很多避免重复造轮子,所以就诞生了消息的封装这个东西。

    查看所有普通消息的xml格式找规律进行封装 官方文档 可以发现都包含有ToUserName FromUserName CreateTime MsgId 不同的是 MsgType 以及 各个类型对应的消息内容。

    这里是接收消息以及响应消息的截图
    消息交互-消息封装.png

    以解析 text消息 为栗子讲解

    接收到的xml 如下

    <xml>
     <ToUserName><![CDATA[toUser]]></ToUserName>
     <FromUserName><![CDATA[fromUser]]></FromUserName> 
     <CreateTime>1348831860</CreateTime>
     <MsgType><![CDATA[text]]></MsgType>
     <Content><![CDATA[this is a test]]></Content>
     <MsgId>1234567890123456</MsgId>
     </xml>

    解析text消息

    private static InMsg parseInTextMsg(XmlHelper xmlHelper, String toUserName, String fromUserName, Integer createTime, String msgType) {
            InTextMsg msg = new InTextMsg(toUserName, fromUserName, createTime, msgType);
            msg.setContent(xmlHelper.getString("//Content"));
            msg.setMsgId(xmlHelper.getString("//MsgId"));
            return msg;
        }

    封装text消息

    public class InTextMsg extends InMsg {
        private String content;
        private String msgId;
    
        public InTextMsg(String toUserName, String fromUserName, Integer createTime, String msgType) {
            super(toUserName, fromUserName, createTime, msgType);
        }
    
        public String getContent() {
            return this.content;
        }
    
        public void setContent(String content) {
            this.content = content;
        }
    
        public String getMsgId() {
            return this.msgId;
        }
    
        public void setMsgId(String msgId) {
            this.msgId = msgId;
        }
    }

    接收消息的公用部分

    public abstract class InMsg {
        protected String toUserName;
        protected String fromUserName;
        protected Integer createTime;
        protected String msgType;
    
        public InMsg(String toUserName, String fromUserName, Integer createTime, String msgType) {
            this.toUserName = toUserName;
            this.fromUserName = fromUserName;
            this.createTime = createTime;
            this.msgType = msgType;
        }
    
        public String getToUserName() {
            return this.toUserName;
        }
    
        public void setToUserName(String toUserName) {
            this.toUserName = toUserName;
        }
    
        public String getFromUserName() {
            return this.fromUserName;
        }
    
        public void setFromUserName(String fromUserName) {
            this.fromUserName = fromUserName;
        }
    
        public Integer getCreateTime() {
            return this.createTime;
        }
    
        public void setCreateTime(Integer createTime) {
            this.createTime = createTime;
        }
    
        public String getMsgType() {
            return this.msgType;
        }
    
        public void setMsgType(String msgType) {
            this.msgType = msgType;
        }
    }

    响应微信的各种消息

    由上分析可以知道,消息处理完成后都是交由抽象方法的实现方法处理消息。MsgControllerAdapter 主要是适配各种消息的抽象类。

    下面 text消息为例子说明

    接收到text消息之后会调用 WeixinMsgController中的protected void processInTextMsg(InTextMsg inTextMsg) 方法,可以通过InTextMsg对象获取text消息

    protected void processInTextMsg(InTextMsg inTextMsg)
      {
        String msgContent = inTextMsg.getContent().trim();
        // 帮助提示
        if ("help".equalsIgnoreCase(msgContent) || "帮助".equals(msgContent)) {
          OutTextMsg outMsg = new OutTextMsg(inTextMsg);
          outMsg.setContent(helpStr);
          render(outMsg);
        }else {
          renderOutTextMsg("你发的内容为:"+msgContent);
          //转发给多客服PC客户端
    //      OutCustomMsg outCustomMsg = new OutCustomMsg(inTextMsg);
    //      render(outCustomMsg);
        }
    
    }

    以上可以看到响应消息有两种实现方式

    第一种render一个消息对象

    OutTextMsg outMsg = new OutTextMsg(inTextMsg); 
    outMsg.setContent(helpStr); 
    render(outMsg);

    第二种直接传一个String

    renderOutTextMsg("你发的内容为:"+msgContent);

    以下是具体的实现:
    1、将对象转化为xml outMsg.toXml()
    2、如果是开发模式输出调试的xml
    3、如果是加密模式,就将消息加密
    4、通过Jfinal 的renderText()方法应用xml

    public void render(OutMsg outMsg) {
            String outMsgXml = outMsg.toXml();
            if(ApiConfigKit.isDevMode()) {
                System.out.println("发送消息:");
                System.out.println(outMsgXml);
                System.out.println("--------------------------------------------------------------------------------\n");
            }
    
            if(ApiConfigKit.getApiConfig().isEncryptMessage()) {
                outMsgXml = MsgEncryptKit.encrypt(outMsgXml, this.getPara("timestamp"), this.getPara("nonce"));
            }
    
            this.renderText(outMsgXml, "text/xml");
        }

    renderOutTextMsg(String content)方法就是调用的render(outMsg)方法

    public void renderOutTextMsg(String content) {
            OutTextMsg outMsg = new OutTextMsg(this.getInMsg());
            outMsg.setContent(content);
            this.render(outMsg);
        }

    欢迎留言、转发
    项目源码参考地址 点我点我–欢迎Start

    展开全文
  • 微信开发之入门教程

    2016-01-12 10:55:26
    微信开发也是有了一定的认识。在此,小宝鸽再次无私地分享给大家啦。其实微信开发跟web开发没有多大的区别,只是经过了微信,然后再由浏览器打开。因为经过微信,因此你的web会附加一些微信平台所提供的一些功能,...

    时间葱葱,小宝鸽入职也有半年了,刚入的时候刚好有负责开发一个微信企业号的新项目。从项目的一无所有到第一版上线,再一步步完善升级。期间学到了许多东西。对微信开发也是有了一定的认识。在此,小宝鸽再次无私地分享给大家啦。

    其实微信开发跟web开发没有多大的区别,只是经过了微信,然后再由浏览器打开。因为经过微信,因此你的web会附加一些微信平台所提供的一些功能,如获取用户地理位置、获取微信用户头像、拍照上传、发送微信消息等等,通过微信接口即可调用。要将web项目挂靠在微信公众平台上是需要一个帐号的。微信公众平号分为服务号、订阅号、企业号。这三种帐号有一些小区别,但是开发流程都是差不多的,只是开放的功能上有些区别,知道其中一种开发,其他的也差不多。关于具体区别先不作过多介绍,后面的文章会讲到。接下来我们以企业号为例带大家进入微信开发之旅。

    接下来将从下面几个角度带大家了解微信开发:

    (1)申请企业号体验号
    (2)企业号的一些配置
    (3)微信JS接口调用

    好了现在马上开始:

    一、申请企业号体验号

    1.1、首先来到微信企业号的网址 https://qy.weixin.qq.com/

    这里写图片描述

    1.2、可以看到“开发者中心”字眼,点击进入相应页面

    这里写图片描述

    1.3、进入后可以看到“欢迎你,开发者”的公告,右侧有个“申请体验号”,点击进入相应页面。

    这里写图片描述

    1.4、进入“申请体验号”后,可以看到注册流程,按照注册流程填写相应资料并申请,验证邮箱绑定微信号后体验号就申请成功啦。

    这里写图片描述

    1.5、申请成功之后,回到https://qy.weixin.qq.com/,用微信扫一扫扫描登录下方的二维码,输入对应密码即可登录成功,来到你的微信企业号首页啦。

    这里写图片描述

    二、企业号的一些配置

    2.1、添加子部门,如下图,将鼠标放到“企业号体验43560625”就会出现小下标,然后点击添加子部门,填写好信息保存,然后刷新页面即可。

    这里写图片描述
    这里写图片描述

    2.2、添加成员,点击通讯录,然后如下图进行操作,即可添加成员。部门选择刚刚添加的部门

    这里写图片描述

    2.3、然成员关注该企业号,如果添加成员的时候有输入邮箱,可以在通讯录的成员管理那里给成员发送关注邀请,邀请会将企业号二维码发送到对应成员邮箱。另外一种方法直接点击“设置”即可看到体验号二维码。让成员扫这个二维码关注也是可以的(需要注意的是,体验号只能最多关注10个成员哦)。另外下图中的CorpID (wx7099477f2de8aded)非常重要的,先记录起来,下面接口微信JS调用的时候会用到。

    这里写图片描述

    2.4、添加管理组,点击“设置”–>”权限管理”,就会跳转到下图页面,然后“新建管理组”,选择管理员的时候,如果提示该成员已在其他管理组,那么估计需要添加成员了。小宝鸽添加了一个管理组“测试”,添加成功后如下图。其中Secret也是非常重要的东西,之后JS接口调用获取签名需要用到。

    这里写图片描述

    2.5、应用管理。猿友们可以看到左侧菜单中有个”应用中心”。点击应用中心将来到下图页面。”企业小助手”就是本企业号默认存在的一个应用。猿友们可以自行创建更多的应用。

    这里写图片描述

    点击”企业小助手”将会来到下面的界面,默认是回调模式,我们需要设置成普通模式。

    这里写图片描述

    点击”普通模式”,启用模式,然后启用”自定义菜单”。

    这里写图片描述

    自定义菜单启用完成之后,点击自定义菜单中的设置,将会跳转到如下页面:

    这里写图片描述

    添加菜单”测试”,然后设置”微信信息”,内容为”测试啦啦啦”,保存–>发布,然后右边有个预览,点击菜单”测试”,就会自动回复消息,如下图:

    这里写图片描述

    菜单响应除了发送微信消息也可以是跳转到某个链接,因为跳转链接是需要配置可信域名的,因此先介绍如何配置可信域名
    应用管理还有一个地方需要设置的,那就可信域名,如下图,回到”企业小助手”应用的详情页面,添加可信域名,可信域名是有一些要求的(1. 设置的应用域名须通过ICP备案的验证,2. 请使用二级或二级以上域名),这里小宝鸽网上找了一个”yo.bbdfun.com”,猿友们也可以使用这个

    这里写图片描述

    配置了可信域名之后呢,猿友们可以配置跳转到链接的菜单啦,注意配置的url必须是已可信域名作为域名哈,例如:

    这里写图片描述

    三、微信JS接口调用

    3.1、微信提供了一系列的JS接口,使得公众号企开发十分快捷高效,微信JS-SDK接口:
    http://qydev.weixin.qq.com/wiki/index.php?title=%E5%BE%AE%E4%BF%A1JS-SDK%E6%8E%A5%E5%8F%A3
    各位猿友们可粗略看一下上面文档,便可知道大概提供的一些功能。

    3.2、各位猿友们粗略看完”微信JS-SDK接口”,应该有看到下图的说明吧,接口的使用是需要注入权限验证配置的,现在我们上面的体验号等等的一系列操作就派上用场啦。

    这里写图片描述

    3.3、接下来将会一点点向大家介绍怎么调用微信接口啦

    微信接口文档之后的猿友们应该都知道微信接口的调用步骤如下:

    这里写图片描述

    最重要的还是步骤二:权限验证配置。里面有几个参数,小宝鸽将会为猿友们一一介绍:
    debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来
    appId: ”, // 必填,企业号的唯一标识,此处填写企业号corpid
    timestamp: , // 必填,生成签名的时间戳
    nonceStr: ”, // 必填,生成签名的随机串
    signature: ”,// 必填,签名,见附录1
    jsApiList: [] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2

    debug、appId和jsApiList相信各位猿友们应该都知道大概是什么东西。那么现在给各位猿友们重点介绍:timestamp、nonceStr、signature。
    其实timestamp、nonceStr是用来生成signature的。
    js生成时间戳方法:timestamp = Date.parse(new Date()); //1414587457
    另外,nonceStr也是一串随机串,我们也用时间戳就好了nonceStr=Date.parse(new Date()); //1414587457

    剩下的就是最关键的signature生成方法,这里需要引入access_token概念
    生成signature签名第一步获得access_token:
    浏览器输入:https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=wx5f24fa0db1819ea2&corpsecret=uQtWzF0bQtl2KRHX0amekjpq8L0aO96LSpSNfctOBLRbuYPO4DUBhMn0_v2jHS-9
    即可得到access_token:YoxXjnJS57r8gk5Nf-Ki_mSvn98fILxv56EE7NFWE3qQNOH3OaW4iDWwLc05g1mdbuNhipK8fgy-q-pA93DqFw(其有效期为7200秒,即两个小时)

    这里写图片描述

    生成signature签名第二步通过access_token获得ticket:
    浏览器输入:https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=YoxXjnJS57r8gk5Nf-Ki_mSvn98fILxv56EE7NFWE3qQNOH3OaW4iDWwLc05g1mdbuNhipK8fgy-q-pA93DqFw
    即可得到ticket:”sM4AOVdWfPE4DxkXGEs8VLMMSNOZxIv5IhnWCyv5sA4UgJuWuMQdfMCeyC5kSL_c7OIMGeETC2y9PXfLbFIFNw(其有效期也是7200秒,即两个小时)

    这里写图片描述

    生成signature签名第三步通过ticket以及下面参数拼成字符串:
    noncestr=1414587457
    jsapi_ticket(即上面的ticket)=sM4AOVdWfPE4DxkXGEs8VLMMSNOZxIv5IhnWCyv5sA5kumyWTQ2VcKEcphBAW62J_HUgmaiKEQ3qhwj5Vlqq7g
    timestamp=1414587457
    url=http://mp.weixin.qq.com

    通过上面的参数拼成(注意参数顺序必须一样):jsapi_ticket=sM4AOVdWfPE4DxkXGEs8VLMMSNOZxIv5IhnWCyv5sA5kumyW
    TQ2VcKEcphBAW62J_HUgmaiKEQ3qhwj5Vlqq7g
    &noncestr=1414587457&timestamp=1414587457&url=http://mp.weixin.qq.com

    最后利用上面的字符串进行sha1加密,有在线的校验工具http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign。但是真正开发的时候肯定是需要写代码的,下面附上sha1加密的java算法:`

    jdk也有提供这个java.security这个包,里面封装好了sha1加密算法。使用方法可参考博主的另外一篇博客AES加密解密 SHA1、SHA加密 MD5加密

    注意真正获取access_token、ticket的时候是需要通过代码实现的,上面在浏览器输入对应地址获取只是为了理顺流程。下面是通过java代码获取。

    3.4、java代码获取签名

    关于使用java代码获取签名的详细过程请参考博主的另外一篇文章 微信开发之使用java获取签名signature(贴源码,附工程)

    该文章有详细的代码,而且附工程下载。

    获取到了签名之后就可以调用微信js接口了,例子后面的文章将会讲到。

    展开全文
  • 微信获取,操作公众号文章 项目地址:https://gitee.com/wrzhxy/wx_article 我以为微信支付和微信企业付款文档就够坑爹了,直到我遇到了微信获取公众号文章。。。 微信获取公众号文章就是指在第三方平台获取公众号...

    微信获取,操作公众号文章

    项目地址:https://gitee.com/wrzhxy/wx_article

    • 我以为微信支付和微信企业付款文档就够坑爹了,直到我遇到了微信获取公众号文章。。。
    • 微信获取公众号文章就是指在第三方平台获取公众号作者写的文章。

    一. 第三方开发需要到微信开放平台注册并且创建一个第三方平台应用

    创建第三方平台时要填写很多资料,其中填写的回调地址需要记下来,等下要用到

    第三方)

    二. 获取文章

    微信公众号的文章在微信里面叫做素材,获取素材列表和素材详细内容的文档在这里:

    获取素材列表

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

    素材列表里有media_id,用这个可以继续查素材详情以及各种操作

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

    三. 获取access_token
    获取公众号文章前需要获取access_token

    access_token有两种获取方式

    1. 公众号开发配置时根据APPsecret,appid获取
      但是这种获取方式只适合公众号自己获取自己的文章,不适合第三方平台获取别的作者的文章

    2. 作者授权给第三方平台,然后获取access_token

    四. 获取authorizer_access_token

    第三方平台按步骤获取用户微信授权时获取到的authorizer_access_token就是获取公众号文章需要的access_token

    第三方授权登录接口文档

    https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1453779503&token=58d58ee7c21059e4b719afa1ce71b76b5df38370&lang=zh_CN

    1. 预授权码获取
      1.1 推送ticket协议

    1.2 更新component_access_token
    1.3 更新预授权码
    2. 引导用户进入授权页(扫码授权)

    • 这里的回调地址必须由网页进入,否则微信会提示域名入口页配置不正确
    1. 用户同意授权
    2. 授权后回调URI,得到授权码和过期时间
    3. 利用授权码调用公众号api 获取authorizer_access_token

    文档这里不够详细,具体发送请求获取数据的操作可以参考我的源码,业务逻辑实现都在com.routz.wxarticlelist.demo.service.WxArticleServiceImp类中

    展开全文
  • 这段时间很多人看了我的帖子《微信开发之移动手机WEB页面(HTML5)Javascript实现一键拨号及短信发送功能 》询问我在微信中出现无法拨号的情况,原先我操作的时候,的确是OK的,现在微信版本升级了,我试了一下,果然...

    这段时间很多人看了我的帖子《微信开发之移动手机WEB页面(HTML5)Javascript实现一键拨号及短信发送功能 》询问我在微信中出现无法拨号的情况,原先我操作的时候,的确是OK的,现在微信版本升级了,我试了一下,果然拨号不行了,在首页的web页面中是没有问题的,但是在微信中就是拨打不了,找了很多,后来发现是微信做了屏蔽,解决方法如下:

    1、拨号的代码还是不变,和我原先的文章一样,

    2、打开拨号页面要做下处理,在网址后面增加一个锚节点mp.weixin.qq.com。

    实例如下:

    如:http://www.cnblogs.com/skylaugh/p/3277899.html 上需要拨号代码,操作如下

    1、http://www.cnblogs.com/skylaugh/p/3277899.html 继续写拨号代码

    <a href="tel:13764567708">移动WEB页面JS一键拨打号码咨询功能</a>

    2、打开这个网址链接的时候,就用这个链接http://www.cnblogs.com/skylaugh/p/3277899.html#mp.weixin.qq.com 

    这样,微信里面的一键拨号功能就OK了

    展开全文
  • 随着腾讯微信公众平台号的开放,围绕着微信的各种开发和营销...本系列文章试图通过从微信平台着手,围绕微信公众号的开发,最后将重点放在微信商城的开发上。 作为本系列的第一篇,重点介绍微信平台和开发环境的搭建。

         本系列文章属作者原创文章,请尊重作者的劳动成果,转载请注明出处:walkingmanc的专栏 , 谢谢!此外,因为为了完成《如何通过第3方平台搭建微信商城》的教程写作,需要有公众号,有愿意提供公众号试用的 可以联系我,QQ:2319482048,感谢了!



    1.   申请微信公众号

        我们要进行微信公众平台的开发,第一步当然是要有公众号了。什么?不知道什么是微信公众号,看来你还要先回炉炼炼了,呵呵。通俗的说,我们微信平台就好像是一个大社会,里面有个体人,也有各种组织机构。你自己使用的普通微信号就是个体人,而公众号就是那些组织,这些组织又分为2类:一类是提供各种信息的,称为订阅号;另一种是提供各种服务的,称为服务号。当然,目前个人只能申请到订阅号,只有组织机构,比如公司等才能申请到服务号。

        订阅号和服务号的区别在哪里呢?简单的说,服务号旨在为用户提供服务。你可以用你自己的微信加一下招商银行的微信号看看就知道什么是服务号了。订阅号旨在为用户提供信息和资讯。典型的例子有“骑行西藏”微信号。

        具体来说,服务号:

    1、1个月(30天)内仅可以发送1条群发消息。
    2、发给订阅用户(粉丝)的消息,会显示在对方的聊天列表中。
    3、在发送消息给用户时,用户将收到即时的消息提醒。
    4、服务号会在订阅用户(粉丝)的通讯录中。
    5、可申请自定义菜单。
     
        而订阅号:
    1、每天(24小时内)可以发送1条群发消息。
    2、发给订阅用户(粉丝)的消息,将会显示在对方的订阅号文件夹中。
    3、在发送消息给订阅用户(粉丝)时,订阅用户不会收到即时消息提醒。
    4、在订阅用户(粉丝)的通讯录中,订阅号将被放入订阅号文件夹中。
    5、订阅号不支持申请自定义菜单。

     

          通过这个比较大家大致有个直观的印象了吧,简单的说,订阅号主要是为粉丝提供各种资讯和新闻的,功能比较简单;而服务号呢,主要是为粉丝提供各种服务的,可以有自定义菜单。而且更重要的一点就是,服务号可以申请到更多的更高级的平台接口。到这里,大家就应该明白了,我们做微信商城,需要申请的是微信服务号。

         对个人开发者,是申请不到服务号的,不过,腾讯还是考虑到了这一点,特意为我们准备了测试帐号,通过这个帐号,我们可以获得微信服务号的所有功能和接口调用权限。

         好了,废话不多说了,接下来就跟着我一步一步的去申请微信测试帐号吧

     

     

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


    图片1

        看到上方的说明了吗?无需公众帐号,快速申请接口测试号,直接体验和测试公众平台所有高级接口。很激动吧。只要你输入手机号和验证码,马上就可以申请成功了,申请成功后如下图:


     

        大家注意观察,这个测试号的有效期是1年,而且分配了微信号和二维码。现在就拿起你的手机微信扫描一下刚刚分配给你的二维码图案吧,你会发现马上就可以关注申请到的这个测试公众号了。



        点击关注后,我们可以在订阅号里面找到这个公众号,大家请注意,虽然放在了订阅号里面,但是该测试号基本上可以调用微信平台所有的高级接口(见“可使用接口类别列表”),所以我们的这个测试号对我们是够用的。

     

     

     

    2.微信公众平台开发基本原理

        不知大家注意到没有,我们在第一节中的截图中,有个“网站接口配置”的配置项需要填写,其实这个就是微信平台和我们的网站对接的接口的url地址了。




         我们来看这张图。其中左侧蓝色框内部就是微信平台,右侧红色框内部就是我们自己的网站所在的服务器咯。微信平台和网站服务器之间通过接口调用来通信。当微信用户向我们的公众号发生消息时(具体的消息类型以后介绍),微信后台服务器会判断该消息是否是发给我们申请的公众号,如果是,将该消息转发给我们的公众号并向我们配置的网站接口地址发送一个请求消息,我们的网站接受到消息后,进行处理,并将处理的结果(响应消息)发送给微信平台,经过平台的转发,最后显示到微信用户的聊天框。

          这是一次典型的消息交互的过程,有了这个印象之后,我们就明白了,我们要做的工作的重点在于网站服务器端,也就是说:如何接受微信平台发送过来的请求消息,如何进行处理,最后如何返回处理结果给微信平台(图中绿色部分)。

    3.服务器环境准备

        我们要想接受并处理微信平台发送过来的消息,当然得有自己的网站服务器了。

    所以,接下来我们就要准备我们的网站服务器环境了。

        很多同学喜欢用百度应用引擎BAE,因为是免费申请而且不需要维护,这一点的确是很方便的,但我这里要说的是,我们在开发程序的时候,还是不建议那样做,为什么呢?因为不利于调试。  正常的步骤应该是在我们本地开发调试,没有任何问题之后再放到真正的服务器上去(例如新浪的SAE, 百度BAE等)。还有一个话题,我们开发我们的网站究竟使用什么语言呢?其实只要可以用来开发网站的语言都可以的,例如:Java、PHP、ASP.NET、Ruby、Python、Note.js等。微信平台和我们的网站交互是通过接口调用来实现的,只要我们的网站能对请求消息进行响应就可以了,使用什么语言都无所谓的。当然,看你最擅长哪门语言就使用哪门语言了,因为现在网站开发这一块php用得越来越多,所以我们就选择php作为我们网站的开发语言。

       语言选好了,下一步就是搭建本地的开发环境了。其实本地开发环境的搭建和普通php网站的开发环境的搭建是一样的,如果你不熟悉,可以自己直接到网上去下载一个WAMP套件,安装一下,然后再下载一个eclipse作为开发的工具就可以了。

       那么重点是什么呢?重点就是微信平台和我们本地服务器之间的通信问题。

    我们看下面的图:

     

        微信平台调用我们网站是通过这里配置的网站URL和Token来调用的,所以,我们首先需要为我们本地的服务器申请一个url,让外网能通过这个url访问到我们的本地网站。换句话说,就是要能将我们本地电脑上的网站发布到公网上去,让所有人都能访问。

     

    3.1 本地网站到公网域名的映射

         想要将自己本地电脑上运行的网站发布到公网,让所有的人都可以访问看起来是很麻烦的一件事情。因为你首先要有一个域名,然后还要在本地的路由器上配置端口映射,而且还要特别注意防火墙的设置。但是,现在我给大家推荐一个非常好的工具:新花生壳动态域名工具。通过这个工具,你不需要设置路由器的端口映射,也不必管防火墙的设置,甚至连域名都不需要申请,因为这一切,新花生壳都已经帮你解决了。好了,闲话还是少说,以免有广告之嫌。那我们正式开始教大家如何将你自己电脑上运行的网站发布到互联网上去让所有人都可以访问。

    1.   首先,你在本地要有一个可以运行的网站,如果没有自己新建一个web项目,然后运行起来。例如:我在eclipse新建了一个java的web项目,只有一个jsp页面,并且在tomcat里面启动运行起来。



    2.   自己在浏览器输入:localhost:8089/Demo访问一下,看是否能打开首页。(你的url地址可能与我的不同)

    3.   能打开的话,接着从这里:https://console.oray.com/passport/register.html 注册一个花生壳的帐号。在这里:http://hsk.oray.com/download/下载“新花生壳客户端”,安装后使用注册号的帐号登录。



    4.   登录后,马上就可以看到花生壳帮我们分配的免费2级域名了,我的是:walkingman123.vicp.cc



    5.   点击红圈处的图标进行域名诊断,结果出现“成功”字样则表示域名映射成功了。


    6.    回到域名列表页面,右键-》新花生壳管理



    7.在弹出页面点击添加映射。我们只需要在自定义应用选项卡里面填写我们的本地网站在内网的ip地址和端口号就可以了(注意勾选“开启外网HTTP80端口”),例如我的:


    8.点击确定后,通过花生壳给我们分配的2级域名就可以在互联网上的任何地方访问我们的网站了。这样,我们就把我们本地电脑上的web网站放到了互联网上。

     

    3.2 填写微信平台的接口配置信息

        接下来,把我们的2级域名填写到接口url里面(注意带应用名称)

    Token 自己随意输入一个字符串(主要用于校验,后面会详细说明),例如:wx123

     

        点击提交。

     

        到这里 我们的本地服务器的环境配置就完成了,下一讲我们开始微信平台公众号的开发。

     


    展开全文
  • 微信小程序文章页面 具体代码在git上,欢迎下载分享。 git:https://github.com/gitqin8170/wechat_applet_article
  • 概述最近应公司需求,对微信文章留言功能进行开发,然而由于微信文档描述贼简介,所以遇坑不断,特在此整理一下以便各位少走弯路。1. 留言功能开通首先,公众号需要具备可以进行留言的资格,如果你的公众号开通了...
  • 微信公众号开发
  • 最近微信发布了微信小程序内侧,各位程序员们是不是...本系列实战文章为大家介绍微信开发的相关知识,包括公众号申请、接口开发等。并为程序员们提供微信开发开源代码。后期也会出一些教学视频,和大家一起交流学习。
  • 本人刚刚开始学习微信公众号开发,想要实现点击按钮后群发一段图文并茂的文本,可是实现了之后才发现: {"articles":[ {"author":"","content":"欢迎 Welcome!&...
  •  微信支付开发系统开发流程及完整Demo展示3. 微信公共服务平台开发Net实现获取Access Token4. 微信公众平台开发文档获取用户地理位置5. 微信公共服务平台开发Net实现解决Access Token过期的问题6. 微信...
  • 过年前后做了个微信公众号项目,已经过去一段时间了,抽空回忆总结下基本流程吧,不然很快估计自己就忘了。。 微信公众平台官网:https://mp.weixin.qq.com 文章目录一、注册公众号二、了解公众号管理页面三、必备...
  • 本课程是一个系列入门教程,目标是从 0 开始带领读者上手实战,课程以微信小程序的核心概念作为主线,介绍配置文件、页面样式文件、JavaScript 的基本知识并以指南针为例对基本知识进行扩展,另外加上开发工具的安装...
  • 最近在开发中,需要在微信实现页面点击 拨打电话 实现一键拨打电话功能。... ,但在开发中发现微信上会屏蔽常规拨号功能。因为微信有白名单机制,所有qq.com的二级域名和腾讯微生活的合作伙伴的域名都是可...
  • 微信公众平台开发微信编辑器开发是子恒老师《微信公众平台开发》视频教程的第11部。...内容包含微信公众号编辑器开发思路,编辑器前端页面,功能实现,添加新样式等等。欢迎反馈,微信号:QQ68183131
  • 接下来的时间里,我会以连载的形式分享微信公众号开发的相关文章,其中也会说一下我遇到的问题以及解决的思路,以及在开发过程中的一些感悟!因为是一个连载系列,所以会以一个初学者,也就是接触过编程但是没有接触...
  • delphi 实现微信开发接入微信公众号平台,参见网上大神的例子,10.2.3下,intraweb15.0.10, CgDevTools_113_for_d25_IntraWeb15.0.15下编译通过, 部份单元直接从OrangeUI COPY过来使用。在此感谢。
  • 相信很多人对微信开发已经不那么陌生,我也是从一个微信开发的菜鸟经过各种问题的折磨,然后去搜索引擎搜索各种文章阅读,但是基本都是零散的资料,没有一个统一、系统的阐述微信应用如何开发。作者结合自己的实际...
  • csdn-微信开发

    2018-01-06 11:12:27
    1 .[025] 微信公众帐号开发教程第1篇-引言 2 .[028] 微信公众帐号开发教程第4篇-消息及消息处理工具的封装 ...微信开发 – 自定义菜单 7 .微信支付.NET版开发总结(JS API),好多坑,适当精简。 8 .一名An
  • 1、微信开发之入门教程,该文章详细讲解了企业号体验号免费申请与一些必要的配置,以及如何调用微信接口。 2、微信开发之通过代理调试本地项目,该文章详细讲解了如何调试本地项目,使用工具的详细安装与配置。 ...
1 2 3 4 5 ... 20
收藏数 80,473
精华内容 32,189
关键字:

微信开发怎么实现文章