首页 > 微信 > 详细

微信公众平台接入Java实例,结合BAE

时间:2014-05-09 21:46:57      阅读:562      评论:0      收藏:0      [点我收藏+]

关于注册公众账号这块不详细介绍

注册完成,审核认证完,就可以开始玩了

1.如何成为开发者?

bubuko.com,布布扣

需要填写接口配置信息,需要自己的服务器资源,一般自己没有服务器,所以可以采用云服务器,例如BAE,SAE,阿里云服务器。这里用BAE

2.打开百度开放云平台官网,注册,登陆,点击开发者服务管理

bubuko.com,布布扣

bubuko.com,布布扣

2.1.点击“创建工程”

bubuko.com,布布扣

bubuko.com,布布扣

填写工程相关信息,应用名称自定义,类型选择java-tomcat,域名唯一,代码管理工具选择svn     到这里,bae应用创建完了.

3.现在来实现TOKEN验证的代码部分

3.1.创建一个Java web工程,我用的是MyEclipse8.5,工程名称为voastudy,点击Finish完成。

bubuko.com,布布扣

bubuko.com,布布扣

3.2.新建一个servlet,这里是CoreServlet,点击Next.

bubuko.com,布布扣bubuko.com,布布扣

bubuko.com,布布扣

3.3.勾选创建web.xml,以及配置servlet,这里的路径很关键,这是去请求servlet里的方法

bubuko.com,布布扣

bubuko.com,布布扣

3.4.实现验证TOKEN方法,微信公众平台提供的是PHP的实例代码.但其验证本质是一样的,都是要经过排序,sha1加密进行比较。请参考下面的代码。这是CoreServlet.java类.

package wx.sunl.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 wx.sunl.util.SignUtil;

@SuppressWarnings("serial")
public class CoreServlet extends HttpServlet 
{
	public CoreServlet() {
		super();
	}
	public void destroy() {
		super.destroy(); 
	}

	/**
	 * 验证url和token
	 */
	public 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; 
	}

	/**
	 *用户向公众平台发信息并自动返回信息
	 */
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		
	}

	public void init() throws ServletException {
	}

}
其中调用到了SignUtil类的checkSignature方法,下面是SignUtil.java类.注意:其中一个静态属性token的值,在最后一步需要用到来验证的.

package wx.sunl.util;

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

public class SignUtil {
    /**
     * 与接口配置信息中的 token 要一致,这里赋予什么值,在接口配置信息中的Token就要填写什么值,
     * 两边保持一致即可,建议用项目名称、公司名称缩写等,我在这里用的是项目名称weixinface
     */
    private static String token = "weixintest";
    
    /**
     * 验证签名
     * @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);
        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");
            // 将三个参数字符串拼接成一个字符串进行 shal 加密
            byte[] digest = md.digest(content.toString().getBytes());
            tmpStr = byteToStr(digest);
        } catch (NoSuchAlgorithmException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        content = null;
        // 将sha1加密后的字符串可与signature对比,标识该请求来源于微信
        return tmpStr != null ? tmpStr.equals(signature.toUpperCase()): false;
    }
    
    /**
     * 将字节数组转换为十六进制字符串
     * @param digest
     * @return
     */
    private static String byteToStr(byte[] digest) {
        // TODO Auto-generated method stub
        String strDigest = "";
        for(int i = 0; i < digest.length; i++){
            strDigest += byteToHexStr(digest[i]);
        }
        return strDigest;
    }
    
    /**
     * 将字节转换为十六进制字符串
     * @param b
     * @return
     */
    private static String byteToHexStr(byte b) {
        // TODO Auto-generated method stub
        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[(b >>> 4) & 0X0F];
        tempArr[1] = Digit[b & 0X0F];
        
        String s = new String(tempArr);
        return s;
    }
}

4.代码已经写完了,现在来提交代码到svn.如果没有svn客户端工具,那首先下载(svn版本工具)安装。打开svn

bubuko.com,布布扣

bubuko.com,布布扣

4.1.这里的url去百度开放云平台去这里复制

bubuko.com,布布扣

bubuko.com,布布扣

4.2.粘贴url,打开svn,会看到服务器的2个文件

bubuko.com,布布扣

bubuko.com,布布扣

4.3.代码提交到svn 首先删掉root.war

bubuko.com,布布扣bubuko.com,布布扣

bubuko.com,布布扣

4.4.java web工程打包成war包,取名ROOT.war,然后提交到svn

bubuko.com,布布扣

bubuko.com,布布扣bubuko.com,布布扣

4.5.然后将这个war包提交到svn

bubuko.com,布布扣

bubuko.com,布布扣

4.6.如果提交成功了,百度开放云平台会检测到有新版本产生,选中应用,点击“发布设置

bubuko.com,布布扣

bubuko.com,布布扣

4.7.发布新版本

bubuko.com,布布扣

bubuko.com,布布扣

5.发布成功后,测试是否部署成功?

bubuko.com,布布扣

5.1.如果看到这个,离成功只差一步啦。

bubuko.com,布布扣

bubuko.com,布布扣

5.5.在域名后边加上请求我们刚刚servlet的请求路径,上边的例子是/CoreServlet,如果报505错误(why?因为那几个参数都是空的),说明部署成功了

bubuko.com,布布扣bubuko.com,布布扣


6.最后一步,填写Url 和 Token来验证 成为开发者。Url:百度应用的域名+请求servlet的路径例如:http://weixintest11.duapp.com/CoreServlet.Token是在程序中自定义的值(在SignUtil.java中定义)

bubuko.com,布布扣bubuko.com,布布扣


欢迎吐槽!!!









微信公众平台接入Java实例,结合BAE,布布扣,bubuko.com

微信公众平台接入Java实例,结合BAE

原文:http://blog.csdn.net/sunling_sz/article/details/25408097

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!