• 微信公众帐号开发教程第3篇-开发模式启用及接口配置(转)


    编辑模式与开发模式

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

    从上图中能够看到,高级功能包括两种模式:编辑模式和开发模式,而且这两种模式是相互排斥关系,即两种模式不能同一时候开启。那两种模式有什么差别呢?作为开发人员究竟要开启哪一种呢?

    编辑模式:主要针对非编程人员及信息公布类公众帐号使用。开启该模式后,能够方便地通过界面配置“自己定义菜单”和“自己主动回复的消息”。

    开发模式:主要针对具备开发能力的人使用。开启该模式后,能够使用微信公众平台开放的接口,通过编程方式实现自己定义菜单的创建、用户消息的接收/处理/响应。这样的模式更加灵活,建议有开发能力的公司或个人都採用该模式。

    启用开发模式(上)

    微信公众帐号注冊完成后,默认开启的是编辑模式。那么该怎样开启开发模式呢?操作过程如下:

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

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

    提示须要我们先成为开发人员,才干开启开发模式。那就先点击下图所看到的的“成为开发人员”button:

    假设提示资料不全,那就先补齐资料再回来继续操作。须要补全的资料有公众帐号头像、描写叙述和运营地区。

    资料补全后,再次点击“成为开发人员”,这时将看到接口配置信息界面,如下图所看到的:

    这里须要填写URL和Token两个值。URL指的是能够接收处理微信server发送的GET/POST请求的地址,而且是已经存在的,如今就能够在浏览器訪问到的地址,这就要求我们先把公众帐号后台处理程序开发好(至少应该完成了对GET请求的处理)并部署在公网server上。Token后面会详细说明。

    也就是说要完成接口配置,仅仅须要先完成微信server的GET请求处理就能够?是的。 那这是为什么呢?由于这是微信公众平台接口中定义的。详细请參考API文档-消息接口-消息接口指南中的网址接入部分。点此进入

    面写的非常清晰,事实上你仅仅要能理解上面在说什么就OK了,至于怎么编写相关代码,我已经帮你完成了,请继续往下看。

    创建公众帐号后台接口程序

    创建一个Java Web工程,并新建一个能够处理请求的Servlet,命名随意,我在这里将其命名为org.liufeng.course.servlet.CoreServlet,代码如下:

    [java] view plaincopy
     
    1. package org.liufeng.course.servlet;  
    2.   
    3. import java.io.IOException;  
    4. import java.io.PrintWriter;  
    5.   
    6. import javax.servlet.ServletException;  
    7. import javax.servlet.http.HttpServlet;  
    8. import javax.servlet.http.HttpServletRequest;  
    9. import javax.servlet.http.HttpServletResponse;  
    10.   
    11. import org.liufeng.course.util.SignUtil;  
    12.   
    13. /** 
    14.  * 核心请求处理类 
    15.  *  
    16.  * @author liufeng 
    17.  * @date 2013-05-18 
    18.  */  
    19. public class CoreServlet extends HttpServlet {  
    20.     private static final long serialVersionUID = 4440739483644821986L;  
    21.   
    22.     /** 
    23.      * 确认请求来自微信server 
    24.      */  
    25.     public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
    26.         // 微信加密签名  
    27.         String signature = request.getParameter("signature");  
    28.         // 时间戳  
    29.         String timestamp = request.getParameter("timestamp");  
    30.         // 随机数  
    31.         String nonce = request.getParameter("nonce");  
    32.         // 随机字符串  
    33.         String echostr = request.getParameter("echostr");  
    34.   
    35.         PrintWriter out = response.getWriter();  
    36.         // 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败  
    37.         if (SignUtil.checkSignature(signature, timestamp, nonce)) {  
    38.             out.print(echostr);  
    39.         }  
    40.         out.close();  
    41.         out = null;  
    42.     }  
    43.   
    44.     /** 
    45.      * 处理微信server发来的消息 
    46.      */  
    47.     public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
    48.         // TODO 消息的接收、处理、响应  
    49.     }  
    50.   
    51. }  

    能够看到,代码中仅仅完成了doGet方法,它的作用正是确认请求是否来自于微信server;而doPost方法不是我们这次要讲的内容,而且完成接口配置也不须要管doPost方法,就先空在那里。

    在doGet方法中调用了org.liufeng.course.util.SignUtil.checkSignature方法,SignUtil.java的实现如下:

    [java] view plaincopy
     
    1. package org.liufeng.course.util;  
    2.   
    3. import java.security.MessageDigest;  
    4. import java.security.NoSuchAlgorithmException;  
    5. import java.util.Arrays;  
    6.   
    7. /** 
    8.  * 请求校验工具类 
    9.  *  
    10.  * @author liufeng 
    11.  * @date 2013-05-18 
    12.  */  
    13. public class SignUtil {  
    14.     // 与接口配置信息中的Token要一致  
    15.     private static String token = "weixinCourse";  
    16.   
    17.     /** 
    18.      * 验证签名 
    19.      *  
    20.      * @param signature 
    21.      * @param timestamp 
    22.      * @param nonce 
    23.      * @return 
    24.      */  
    25.     public static boolean checkSignature(String signature, String timestamp, String nonce) {  
    26.         String[] arr = new String[] { token, timestamp, nonce };  
    27.         // 将token、timestamp、nonce三个參数进行字典序排序  
    28.         Arrays.sort(arr);  
    29.         StringBuilder content = new StringBuilder();  
    30.         for (int i = 0; i < arr.length; i++) {  
    31.             content.append(arr[i]);  
    32.         }  
    33.         MessageDigest md = null;  
    34.         String tmpStr = null;  
    35.   
    36.         try {  
    37.             md = MessageDigest.getInstance("SHA-1");  
    38.             // 将三个參数字符串拼接成一个字符串进行sha1加密  
    39.             byte[] digest = md.digest(content.toString().getBytes());  
    40.             tmpStr = byteToStr(digest);  
    41.         } catch (NoSuchAlgorithmException e) {  
    42.             e.printStackTrace();  
    43.         }  
    44.   
    45.         content = null;  
    46.         // 将sha1加密后的字符串可与signature对照,标识该请求来源于微信  
    47.         return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;  
    48.     }  
    49.   
    50.     /** 
    51.      * 将字节数组转换为十六进制字符串 
    52.      *  
    53.      * @param byteArray 
    54.      * @return 
    55.      */  
    56.     private static String byteToStr(byte[] byteArray) {  
    57.         String strDigest = "";  
    58.         for (int i = 0; i < byteArray.length; i++) {  
    59.             strDigest += byteToHexStr(byteArray[i]);  
    60.         }  
    61.         return strDigest;  
    62.     }  
    63.   
    64.     /** 
    65.      * 将字节转换为十六进制字符串 
    66.      *  
    67.      * @param mByte 
    68.      * @return 
    69.      */  
    70.     private static String byteToHexStr(byte mByte) {  
    71.         char[] Digit = { '0''1''2''3''4''5''6''7''8''9''A''B''C''D''E''F' };  
    72.         char[] tempArr = new char[2];  
    73.         tempArr[0] = Digit[(mByte >>> 4) & 0X0F];  
    74.         tempArr[1] = Digit[mByte & 0X0F];  
    75.   
    76.         String s = new String(tempArr);  
    77.         return s;  
    78.     }  
    79. }  

    这里唯一须要注意的就是SignUtil类中的成员变量token,这里赋予什么值,在接口配置信息中的Token就要填写什么值,两边保持一致就可以,沒有其它要求,建议用项目名称、公司名称缩写等,我在这里用的是项目名称weixinCourse。

    最后再来看一下web.xml中,CoreServlet是怎么配置的,web.xml中的配置代码如下:

    [html] view plaincopy
     
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"  
    3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    4.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
    5.     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
    6.     <servlet>  
    7.         <servlet-name>coreServlet</servlet-name>  
    8.         <servlet-class>  
    9.             org.liufeng.course.servlet.CoreServlet  
    10.         </servlet-class>  
    11.     </servlet>  
    12.   
    13.     <!-- url-pattern中配置的/coreServlet用于指定该Servlet的訪问路径 -->  
    14.     <servlet-mapping>  
    15.         <servlet-name>coreServlet</servlet-name>  
    16.         <url-pattern>/coreServlet</url-pattern>  
    17.     </servlet-mapping>  
    18.   
    19.     <welcome-file-list>  
    20.         <welcome-file>index.jsp</welcome-file>  
    21.     </welcome-file-list>  
    22. </web-app>  

    到这里,全部编码都完成了,就是这么简单。接下来就是将工程公布到公网server上,假设沒有公网server环境,能够去了解下BAE、SAE或阿里云。公布到server上后,我们在浏览器里訪问CoreServlet,假设看到如下界面就表示我们的代码沒有问题:


    啊,代码都报空指针异常了还说证明没问题?那当然了,由于直接在地址栏訪问coreServlet,就相当于提交的是GET请求,而我们什么參数都沒有传,在验证的时候当然会报空指针异常。

    接下来,把coreServlet的訪问路径拷贝下来,再回到微信公众平台的接入配置信息界面,将coreServlet的訪问路径粘贴到URL中,并将SignUtil类中指定的token值weixinCourse填入到Token中,填写后的结果如下图所看到的:

    在写这篇教程的时候是使用的BAE环境,假设想学习微信公众帐号开发又沒有公网server环境的,建议能够试试,注冊使用都非常方便,假设有问题我们还能够交流。

    接着点击“提交”,假设程序写的没问题,而且URL、Token都填写正确,能够在页面最上方看到“提交成功”的提示,并会再次跳转到开发模式设置界面,而且能够看到“你已成为开发人员”的提示,如下图所看到的:

    启用开发模式(下)

    这个时候就已经成为开发人员了,百般周折啊,哈哈,到这里还沒有完哦,还有最后一步工作就是将开发模式开启。将右上角的开发模式开关由“关闭”切换到“开启”,如下图所看到的:

    到这里,接口配置、开发模式的开启就都完成了,本章节的内容也就说到这里。接下来要章节要讲的就是怎样接收、处理、响应由微信server转发的用户发送给公众帐号的消息,也就是完成CoreServlet中doPost方法的编写。

     

    假设认为文章对你有所帮助,请留言支持或关注微信公众帐号xiaoqrobot支持柳峰哦!

  • 相关阅读:
    GreenPlum failover,primary和mirror切换实验 -- 重要
    Greenplum 激活standby 和恢复 master 原有角色
    GreenPlum 常用命令
    Greenplum 添加mirror步骤
    PostgreSQL 多版本的实现与Innodb和oracle的差别
    Oracle 与 postgreSQL 事务处理区别(多版本与undo区别)
    服务器使用bbr加速配置
    线表之队列
    线性表之栈
    线性表之单链表
  • 原文地址:https://www.cnblogs.com/mfryf/p/3598239.html
Copyright © 2020-2023  润新知