微信公众平台+Java+新浪云(SinaAppEngine)快速接入方法

来源:互联网 发布:乐高nxt编程软件下载 编辑:程序博客网 时间:2024/04/30 04:09

近期突然对微信公众号开发有点感兴趣,参考了CSDN博客,我便开始搭建java web项目,发布项目需要主机,在网上搜索了一番,因为只是临时测试使用,免费的原因选择了新浪云应用,结果发现各种坑


开发工具:Eclipse Java EE IDE for Web Developers.  Mars Release (4.5.0)

1. 创建Maven项目 选择webapp类型 过程略过,如果不懂maven,自行补习maven知识

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">  <modelVersion>4.0.0</modelVersion>  <groupId>com.ljg</groupId>  <artifactId>weixin_server</artifactId>  <packaging>war</packaging>  <version>0.0.1-SNAPSHOT</version>  <name>weixin_server Maven Webapp</name>  <url>http://maven.apache.org</url>  <dependencies>    <dependency>      <groupId>junit</groupId>      <artifactId>junit</artifactId>      <version>3.8.1</version>      <scope>test</scope>    </dependency>  </dependencies>  <build>    <finalName>weixin_server</finalName>  </build></project>

上面就是普通的maven web项目的pom,无任何特别之处

web.xml

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">  <display-name>Archetype Created Web Application</display-name>  <servlet>    <servlet-name>CrazyServlet</servlet-name>    <servlet-class>              com.ljg.weixin.servlet.CrazyServlet         </servlet-class>  </servlet>  <servlet-mapping>    <servlet-name>CrazyServlet</servlet-name>    <url-pattern>/Javen</url-pattern>  </servlet-mapping>    <welcome-file-list>    <welcome-file>index.jsp</welcome-file>  </welcome-file-list></web-app>

新建servlet
package com.ljg.weixin.servlet;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import com.ljg.weixin.util.SignUtil;/** * 核心请求处理类  * @author 简爱微萌 * @Email zyw205@gmail.com *  */public class CrazyServlet extends HttpServlet {    private static final long serialVersionUID = -5021188348833856475L;    @Override    protected void doGet(HttpServletRequest request, HttpServletResponse response)throws 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();          // 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败          if (SignUtil.checkSignature(signature, timestamp, nonce)) {              out.print(echostr);          }          out.close();        out = null;    }        @Override    protected void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        // TODO 消息的接收、处理、响应      }}
签名工具类

package com.ljg.weixin.util;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;import java.util.Arrays;/** * 请求校验工具类 *  * @author 简爱微萌 * @Email zyw205@gmial.com *  */public class SignUtil {    // 与接口配置信息中的Token要一致    private static String token = "Javen";    /**     * 验证签名     *      * @param signature     * @param timestamp     * @param nonce     * @return     */    public static boolean checkSignature(String signature, String timestamp,            String nonce) {        String[] arr = new String[] { token, timestamp, nonce };        // 将token、timestamp、nonce三个参数进行字典序排序        //Arrays.sort(arr);        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();        }        System.out.println(tmpStr);         content = null;        // 将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;    }    public static void sort(String a[]) {        for (int i = 0; i < a.length - 1; i++) {            for (int j = i + 1; j < a.length; j++) {                if (a[j].compareTo(a[i]) < 0) {                    String temp = a[i];                    a[i] = a[j];                    a[j] = temp;                }            }        }    }        public static void main(String[] args) {boolean checkSignature = checkSignature("3EA0FC1149E97F47A2FE9FEB5E79E308F4ED864A", "1393224944", "1392553418");System.out.println(checkSignature);}}
加servlet必须的jar包 javax.servlet-api-3.1.0.jar,我用的是这个,是仿照新浪云项目的入门例子:https://github.com/sinacloud/java-getting-started

打包成war,上传。

这时要把javax.servlet-api-3.1.0.jar去掉!!!如果不小心忘记去掉了,那么后果是这样的:



去掉之后,上传再访问: http://1.xxxx.applinzi.com/Javen?signature=3EA0FC1149E97F47A2FE9FEB5E79E308F4ED864A&echostr=helloworld&timestamp=1393224944&nonce=1392553418(xxxx是新浪云web应用名称)

页面显示

helloworld5、微信测试。此步暂时还没做

0 0
原创粉丝点击