首頁 >微信小程式 >微信開發 >java微信開發API伺服器存取詳解

java微信開發API伺服器存取詳解

高洛峰
高洛峰原創
2017-03-15 17:10:361754瀏覽

這篇文章主要為大家分享了java微信開發API伺服器存取詳解,有興趣的小夥伴們可以參考一下

微信開發API如何存取伺服器,下面就為大家介紹

一、說明

* 本範例根據微信開發文件:http://mp.weixin.qq. com/wiki/home/index.html最新版(4/3/2016 5:34:36 PM )進行開發示範。

* 編輯平台:myeclipse10.7+win32+jdk1.7+tomcat7.0  

* 伺服器:阿里雲windows server 2008 64bits
* 平台需求:servlet使用註解方式,平台需求:j2ee6.0+、jdk6.0+、tomcat7.0+
* 示範更著重於api解析。
* 為了方便測試說明,每個測試案例為獨立,不依賴其它方法。對於封裝,不多加考慮。
* 示範盡可能依照API要求進行,目的:了解文件使用方式,達到舉一反三的效果。
* 知識需求:強大的java基礎、了解http網路通訊知識、對於javaweb有足夠了解、json解析
* 當前時間:4/3/2016 5:32:57 PM ,以該時間為準。

二、文件原文(摘要

#文件網址:http://mp.weixin.qq.com/wiki /8/f9a0b8382e0b77d87b3bcc1ce6fbc104.html
存取微信公眾平台開發,開發者需要依照下列步驟完成:

1、填入伺服器設定
2.驗證伺服器位址的有效性  
3、依據介面文件實作業務邏輯

三、文件理解

#驗證伺服器位址的有效性

1、api這樣介紹:

#開發者提交資訊後,微信伺服器將發送GET請求到填寫的伺服器位址URL上, GET請求攜帶四個參數:signature、timestamp、nonce、echostr
開發者透過檢驗signature對請求進行校驗(下面有校驗方式)。
若確認此GET要求來自微信伺服器,請原樣回傳echostr參數內容,則存取生效,成為開發者成功,否則存取失敗。
加密/校驗流程如下:
1)、將token、timestamp、nonce三個參數進行字典序排序
2)、將三個參數字串拼接成一個字串進行sha1加密
3)、開發者取得加密後的字串可與signature對比,標識該請求來自微信

2、理解

說明該請求是「GET」方式,並且存取該請求會傳回四個參數:signature、timestamp、nonce、echostr。
我們要接受這幾個參數,然後再處理。如果驗證成功,返回接收到的“echostr”,否則驗證失敗。
驗證方式是對接受到的token、timestamp、nonce三個參數進行字典序排序,然後進行sha1加密,最後再和signature比較。
*加密後的字串可與signature對比,如果相等【該處api可能解釋不是太明白】,返回“echostr”,驗證成功。

3、實作

建立一個servlet CoreServlet實作HttpServlet,重載doGet方法。
參數準備


// 设置一个全局的token,开发者自己设置。api这样解释:Token可由开发者可以任意填写,
// 用作生成签名(该Token会和接口URL中包含的Token进行比对,从而验证安全性)
String token = "wgyscsf";
// 根据api说明,获取上述四个参数
String signature = req.getParameter("signature");
String timestamp = req.getParameter("timestamp");
String nonce = req.getParameter("nonce");
String echostr = req.getParameter("echostr");

根據api所說的三步驟進行操作


##

// 第一步:将token、timestamp、nonce三个参数进行字典序排序
String[] parms = new String[] { token, timestamp, nonce };// 将需要字典序排列的字符串放到数组中
Arrays.sort(parms);// 按照api要求进行字典序排序【百度:什么是字典序排序】




// 第二步:将三个参数字符串拼接成一个字符串进行sha1加密【百度:java sha1加密】
// 拼接字符串
String parmsString = "";// 注意,此处不能=null。
for (int i = 0; i < parms.length; i++) {
  parmsString += parms[i];
}
// sha1加密
String mParms = null;// 加密后的结果

... //该地方是sha1加密的实现,不再贴代码    

mParms = hexString.toString();// 加密结果




/*
 * api要求: 若确认此次GET请求来自微信服务器,请原样返回echostr参数内容, 则接入生效, 成为开发者成功,否则接入失败。
 */
// 第三步: 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信接入成功。
System.out.println(TAG + ":" + mParms + "---->" + signature);
if (mParms.equals(signature)) {
  // System.out.println(TAG + ":" + mParms + "---->" + signature);
  printWriter.write(echostr);
} else {
  // 接入失败,不用回写
  // System.out.println(TAG + "接入失败");
}

4、填寫伺服器設定

1)、包含內容

伺服器設定主要是當我們寫好自己的存取微信開發平台的程式碼之後要設定的伺服器和微信接入介面。
2)、伺服器操作
開啟伺服器的tomcat,將寫好的程式碼放到webapps檔案下。
3)、微信公眾平台操作
*申請微信測試帳號(直接用微信掃一掃即可以登入):
http://www.php.cn/
*開啟微信公眾平台測試號,設定介面配置資訊。設定如下

        URL:http://www.php.cn/
        Token:wgyscsf
*提交,設定成功與失敗皆會有提醒。

该部分所有操作源码,可以直接使用


package com.gist.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;

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

/**
 * @author 高远</n> 邮箱:wgyscsf@163.com</n> 博客 http://www.php.cn/;/n>
 *     编写时期 2016-4-3 下午4:34:05
 */
@WebServlet("/CoreServlet")
public class CoreServlet extends HttpServlet {
  String TAG = "CoreServlet";

  /*
   * 第二步:验证服务器地址的有效性 开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,
   * GET请求携带四个参数:signature、timestamp、nonce、echostr
   * 开发者通过检验signature对请求进行校验(下面有校验方式)。 若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,
   * 则接入生效, 成为开发者成功,否则接入失败。
   * 
   * 加密/校验流程如下: 1. 将token、timestamp、nonce三个参数进行字典序排序 2.
   * 将三个参数字符串拼接成一个字符串进行sha1加密 3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
   */
  /*
   * 字典排序(lexicographical
   * order)是一种对于随机变量形成序列的排序方法。其方法是,按照字母顺序,或者数字小大顺序,由小到大的形成序列。
   */
  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp)
      throws ServletException, IOException {

    // 设置编码
    req.setCharacterEncoding("utf-8");
    resp.setContentType("html/text;charset=utf-8");
    resp.setCharacterEncoding("utf-8");
    // 获取输出流
    PrintWriter printWriter = resp.getWriter();

    // 设置一个全局的token,开发者自己设置。api这样解释:Token可由开发者可以任意填写,
    // 用作生成签名(该Token会和接口URL中包含的Token进行比对,从而验证安全性)
    String token = "wgyscsf";
    // 根据api说明,获取上述四个参数
    String signature = req.getParameter("signature");
    String timestamp = req.getParameter("timestamp");
    String nonce = req.getParameter("nonce");
    String echostr = req.getParameter("echostr");
    // // temp:临时打印,观看返回参数情况
    // System.out.println(TAG + ":signature:" + signature + ",timestamp:"
    // + timestamp + ",nonce:" + nonce + ",echostr:" + echostr);
    // 根据api所说的“加密/校验流程”进行接入。共计三步

    // 第一步:将token、timestamp、nonce三个参数进行字典序排序
    String[] parms = new String[] { token, timestamp, nonce };// 将需要字典序排列的字符串放到数组中
    Arrays.sort(parms);// 按照api要求进行字典序排序
    // 第二步:将三个参数字符串拼接成一个字符串进行sha1加密
    // 拼接字符串
    String parmsString = "";// 注意,此处不能=null。
    for (int i = 0; i < parms.length; i++) {
      parmsString += parms[i];
    }
    // sha1加密
    String mParms = null;// 加密后的结果
    MessageDigest digest = null;
    try {
      digest = java.security.MessageDigest.getInstance("SHA");
    } catch (NoSuchAlgorithmException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    digest.update(parmsString.getBytes());
    byte messageDigest[] = digest.digest();
    // Create Hex String
    StringBuffer hexString = new StringBuffer();
    // 字节数组转换为 十六进制 数
    for (int i = 0; i < messageDigest.length; i++) {
      String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);
      if (shaHex.length() < 2) {
        hexString.append(0);
      }
      hexString.append(shaHex);
    }
    mParms = hexString.toString();// 加密结果

    /*
     * api要求: 若确认此次GET请求来自微信服务器,请原样返回echostr参数内容, 则接入生效, 成为开发者成功,否则接入失败。
     */
    // 第三步: 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信接入成功。
    System.out.println(TAG + ":" + mParms + "---->" + signature);
    if (mParms.equals(signature)) {
      // System.out.println(TAG + ":" + mParms + "---->" + signature);
      printWriter.write(echostr);
    } else {
      // 接入失败,不用回写
      // System.out.println(TAG + "接入失败");
    }
  }

  @Override
  protected void doPost(HttpServletRequest req, HttpServletResponse resp)
      throws ServletException, IOException {
    doGet(req, resp);
  }

}

java微信开发API的第一篇内容就为大家介绍到这里,希望大家继续关注之后的更新内容,谢谢!

以上是java微信開發API伺服器存取詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn