smithhan

导航

微信公众号开发之开发模式的启用——学习笔记

启用开发者模式的必备条件

1)完善账号信息,如公众账号的头像,功能介绍,运营地区等信息。公众平台的设置模块可以看到公众账号的全部信息。

2)请求校验程序:启用开发模式的过程中会要求填写接口配置信息,需要先完成请求校验程序的开发。

请求校验程序的开发:参考微信开发者文档中“新手介入”中的“接入指南”。

开发者文档中说明在启用开发模式时,需要填写URltoken

第二步在开发者文档中说明了请求校验的作用和流程。我们开发的请求校验程序必须能够处理Http GET请求,并且要对请求者进行身份校验,确保请求来自微信服务器。

请求校验的流程:

(1)获取HTTP GET请求的signaturetimestampnonceechostr参数

(2)tokentimestampnonce3个参数字典排序

    (3)将排序后的3个参数按顺序拼接成一个字符串,并对字符串进行sha-1加密

    (4)sha-1加密后的字符串与参数signature进行对比,如果相等即请求来自微信服务器,需要原样返回参数echostr

核心代码段:

CoreServlet.java

package org.weixin.servlet.CoreServlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.weixin.util.SignUtil;


@WebServlet("/CoreServlet")
/*
 * 核心请求处理类
 * 
 */
public class CoreServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
   
    public CoreServlet() {
        super();
        
    }
/*
 * 确认请求来自微信服务器
 * 
 */
    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();
        if(SignUtil.checkSignature(signature,timestamp,nonce))
        {
            out.print(echostr);
        }
        out.close();
        out=null;
    }

/*
 * 处理微信服务器发来的消息
 * 
 */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
    {
    

    }
}

SignUtil类

package org.weixin.util;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;

/*
  * 请求校验工具类

 */

public class SignUtil {
    private static String token="weixin2016";
    /*
     * 验证签名
     */
    public static boolean checkSignature(String signature,String timestamp,String nonce)
    {
        String[]  paramArr=new String[]{token,timestamp,nonce};
        Arrays.sort(paramArr);
        String content=paramArr[0].concat(paramArr[1]).concat(paramArr[2]);
        String ciphertext=null;
        try{
            MessageDigest md=MessageDigest.getInstance("SHA-1");
            byte[] digest=md.digest(content.toString().getBytes());
            ciphertext=byteToStr(digest);
        }catch(NoSuchAlgorithmException e){
            e.printStackTrace();
        }
        return ciphertext!=null?ciphertext.equals(signature.toUpperCase()):false;
            
    }

    
        
                

    private static String byteToStr(byte[] byteArray) {
        
        String strDigest="";
        
        for(int i=0;i<byteArray.length;i++)
        {
            strDigest+=byteToHexStr(byteArray[i]);
        }
        return strDigest;
        
        
    
    }
    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; 
    }


}

 

必要的公网环境,在这里我使用的是新浪云服务SAE,微博账号登入。进入云应用SAE

点击创建新应用。说明一下SAE使用时需要付费,可以查看其收费标准。填写相应的项目信息。创建成功。在eclipse中导出已编写的后台接口核心程序(war格式导出)。

SAE界面中的代码管理中选择上传war包。

 

posted on 2016-01-26 23:07  smithhan  阅读(344)  评论(0编辑  收藏  举报