微信公众平台技术开发(微信公众帐号开发教程——开发模式启用及接口配置)

编辑模式和开发模式

微信公众号申请成功后,如果要接收和处理用户的请求,必须在“高级功能”中进行配置。点击“高级功能”看到如下界面:



从上图可以看出,高级功能包括编辑模式和开发模式两种模式,而这两种模式是互斥的,即不能同时启动。两种模式有什么区别?作为开发者你想开哪家?

编辑模式:主要是非程序员和信息发布的公众账号使用。这种模式开启后,你可以通过界面轻松配置“自定义菜单”和“自动回复消息”。

开发模式:主要是有开发能力的人使用。这种模式开启后,可以利用微信公众平台的开放接口,通过编程创建自定义菜单,接收/处理/回复用户消息。这种模式比较灵活,建议有开发能力的公司或个人采用这种模式。

启用开发模式(上)

微信公众号注册完成后,默认开启编辑模式。那么如何开启开发模式呢?操作步骤如下:

1)点击进入编辑模式,将右上角的编辑模式开关从“开”切换到“关”,如下图所示:

2)点击高级功能进入开发模式,将右上角的开发模式开关由“关”切换到“开”,但切换时会遇到如下提示:

提示我们先成为开发者,才能开启开发模式。然后点击“成为开发者”按钮,如下图所示:

如果提示信息不完整,先填写信息再回来继续操作。需要填写的信息包括公众账号头、描述、操作区。



信息填写完成后,再次点击“成为开发者”,会看到界面配置信息界面,如下图所示:



这里需要填写URL和令牌的两个值。URL是指可以接收和处理微信服务器发来的GET/POST请求的地址,并且已经存在,现在可以在浏览器中访问,这就需要我们开发公众账号后台处理程序(至少要处理完GET请求)并部署在公网服务器上。Token稍后会解释。

也就是说,完成接口配置,只需要先完成微信服务器的GET请求处理?是的,那为什么呢?因为这是微信公众平台接口里定义的。具体请参考API文档-消息接口-消息接口指南中的URL访问部分。点击此处进入。



写的很清楚。其实只要你能看懂它说的是什么,就OK。至于怎么写相关代码,我已经帮你完成了。请继续读下去。

创建一个公众账号后台接口程序

创建一个Java Web项目,并创建一个可以处理请求的新servlet。任意命名。我在这里将其命名为org . liufeng . course . servlet . coreservlet,代码如下:


  • 包org . liufeng . course . servlet;
  • 导入Java . io . io exception;
  • 导入Java . io . printwriter;
  • 导入javax . servlet . servlet exception;
  • 导入javax . servlet . http . http servlet;
  • 导入javax . servlet . http . http servlet request;
  • 导入javax . servlet . http . http servlet response;
  • 导入org . liufeng . course . util . signutil;
  • /**
  • *核心请求处理类
  • *
  • * @作者刘峰
  • * @日期2013-05-18
  • */
  • 公共类CoreServlet扩展HttpServlet {
  • private static final long serial version uid = 4440739483644821986 l;
  • /**
  • *确认请求来自微信服务器。
  • */
  • 公共void doGet(HttpServletRequest请求,HttpServletResponse响应)引发ServletException,IOException {
  • //微信加密签名
  • string signature = request . getparameter(" signature ");
  • //时间戳
  • string timestamp = request . getparameter(" timestamp ");
  • //随机数
  • string nonce = request . getparameter(" nonce ");
  • //随机字符串
  • string echostr = request . getparameter(" echostr ");
  • PrintWriter out = response . getwriter();
  • //通过检查签名来检查请求。如果校验成功,则原样返回echostr,表示访问成功;否则,访问将失败。
  • if (SignUtil.checkSignature(签名、时间戳、随机数)){
  • out . print(echostr);
  • }
  • out . close();
  • out = null
  • }
  • /**
  • *处理微信服务器发送的消息
  • */
  • 公共void doPost(HttpServletRequest请求,HttpServletResponse响应)引发ServletException,IOException {
  • todo消息的接收、处理和响应
  • }
  • }
  • 可以看到,代码中只完成了doGet方法,它的作用是确认请求是否来自微信服务器。不过doPost方法不是我们这次要讲的,也不用管doPost方法完成接口配置,先空在那里就行了。在doGet方法中,调用org . liufeng . course . util . sign util . check signature方法,SignUtil.java实现如下:


  • 包org . liufeng . course . util;
  • 导入Java . security . message digest;
  • 导入Java . security . nosuchalgorithm exception;
  • 导入Java . util . arrays;
  • /**
  • *请求验证工具类
  • *
  • * @作者刘峰
  • * @日期2013-05-18
  • */
  • 公共类别标志{
  • //与接口配置信息中的令牌一致
  • 私有静态字符串token = " weixinCourse
  • /**
  • *验证签名
  • *
  • * @param签名
  • * @param时间戳
  • * @param nonce
  • * @返回
  • */
  • 公共静态布尔checkSignature(字符串签名、字符串时间戳、字符串随机数){
  • String[] arr = new String[] { token,timestamp,nonce };
  • //按照字典顺序对令牌、时间戳和nonce进行排序。
  • 数组. sort(arr);
  • StringBuilder content = new StringBuilder();
  • for(int I = 0;我& lt数组长度;i++) {
  • content . append(arr[I]);
  • }
  • MessageDigest md = null
  • String tmpStr = null
  • 尝试{
  • MD = message digest . getinstance(" SHA-1 ");
  • //将三个参数字符串拼接成一个字符串进行sha1加密。
  • byte[]digest = MD . digest(content . tostring()。getBytes());
  • tmpStr = byteToStr(digest);
  • } catch(nosuch algorithm exception e){
  • e . printstacktrace();
  • }
  • content = null
  • sha1加密的字符串可以和signature进行比对,识别出请求来源于微信。
  • 返回tmpStr!= null?tmpstr . equals(signature . toupper case()):false;
  • }
  • /**
  • *将字节数组转换为十六进制字符串。
  • *
  • * @param byteArray
  • * @返回
  • */
  • 私有静态字符串byteToStr(byte[] byteArray) {
  • String strDigest =
  • for(int I = 0;我& ltbyteArray.lengthi++) {
  • strDigest+= byteToHexStr(byteArray[I]);
  • }
  • return strDigest
  • }
  • /**
  • *将字节转换成十六进制字符串。
  • *
  • * @param兆字节
  • * @返回
  • */
  • 私有静态字符串byteToHexStr(字节兆字节){
  • 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 & gt;& gt& gt4)& amp;0X0F];
  • tempArr[1]= Digit[MB & amp;0X0F];
  • String s =新字符串(tempArr);
  • 返回s;
  • }
  • }
  • 这里唯一需要注意的是SignUtil类中的成员变量Token。这里给什么值,接口配置信息里的token要填什么值,只要双方一致就行,没有其他要求。建议使用项目名称、公司名称缩写等。我在这里使用的项目名称是weixinCourse。最后,我们来看看CoreServlet在web.xml中是如何配置的,web.xml中的配置代码如下:


  • & lt?xml版本="1.0 "编码="UTF-8 "?& gt
  • & ltwe B- app version = " 2.5 " xmlns = " http://Java . sun . com/XML/ns/javaee "
  • xmlns:xsi = " http://www . w3 . org/2001/XML schema-instance "
  • xsi:schema location = " http://Java . sun . com/XML/ns/javaee
  • http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  • & ltservlet & gt
  • & ltservlet-name & gt;coreServlet & lt/servlet-name & gt;
  • & ltservlet-class & gt;
  • org . liufeng . course . servlet . coreservlet
  • & lt/servlet-class & gt;
  • & lt/servlet & gt;
  • & lt!-/ coreServlet configured-URL-pattern用于指定该Servlet的访问路径->:
  • & ltservlet映射& gt
  • & ltservlet-name & gt;coreServlet & lt/servlet-name & gt;
  • & lturl模式& gt/coreServlet & lt;/URL-pattern & gt;
  • & lt/servlet-mapping & gt;
  • & lt欢迎文件列表& gt
  • & lt欢迎文件& gtindex.jsp & lt/welcome-file & gt;
  • & lt/welcome-file-list & gt;
  • & lt/we B- app & gt;
  • 至此,所有的编码都完成了,就这么简单。下一步是将项目发布到公共网络服务器。如果没有公网服务器环境,可以了解一下BAE,SAE或者阿里云。发布到服务器后,我们在浏览器中访问CoreServlet。如果我们看到下面的界面,这意味着我们的代码是好的:

    啊,所有代码都报空指针异常,证明没问题?当然,因为直接在地址栏访问coreServlet就相当于提交了一个GET请求,而我们没有传递任何参数,当然在验证的时候会报错空指针异常。

    接下来复制coreServlet的访问路径,然后返回微信公众平台的访问配置信息界面,将coreServlet的访问路径粘贴到URL中,将SignUtil类中指定的token值weixinCourse填充到Token中。填写后的结果如下图所示:



    我写这个教程的时候用的是BAE环境。如果你想学习没有公共服务器环境的微信公众号开发,建议你试试。注册和使用都很方便。有什么问题可以交流。

    然后点击“提交”。如果程序编写正确,URL和Token填写正确,可以在页面顶部看到“提交成功”的提示,再次跳转到开发模式设置界面,可以看到“您已经成为开发者”的提示,如下图所示:



    启用开发模式(如下)

    到这个时候,我已经成为一名开发人员,经历了各种波折。哈哈,还没完呢。最后一步,打开开发模式。将右上角的开发模式开关从“关”切换到“开”,如下图所示:

    微信公众平台技术





    至此,界面配置和开发模式的开启全部完成,内容在此。

    您可以还会对下面的文章感兴趣

    使用微信扫描二维码后

    点击右上角发送给好友