亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

利用java怎么實現一個微信公眾平臺消息接口應用

發布時間:2020-11-25 16:28:34 來源:億速云 閱讀:154 作者:Leah 欄目:編程語言

利用java怎么實現一個微信公眾平臺消息接口應用?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

具體如下:

微信公眾平臺現在推出自動回復消息接口,但是由于是接口內容用的是PHP語言寫的,很多地方操作起來讓本人這個對Java比較熟悉的小伙很別扭,所以仿照PHP的接口代碼做了一套jsp語言編寫的接口。

首先先把整個接口代碼貼出來做下比較,然后我們再分析代碼:

JAVA:

<%@page import="java.util.Date"%>
<%@page import="org.dom4j.Element"%>
<%@page import="org.dom4j.DocumentHelper"%>
<%@page import="org.dom4j.Document"%>
<%@page import="java.io.IOException"%>
<%@page import="java.io.InputStreamReader"%>
<%@page import="java.io.BufferedReader"%>
<%@page import="java.io.Reader"%>
<%@page import="java.security.MessageDigest"%>
<%@page import="java.util.Arrays"%>
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%
  //WeiXinHandler為內部類不能使用非final類型的對象
  final String TOKEN="weixin";
  final HttpServletRequest final_request=request;
  final HttpServletResponse final_response=response;
%>
<%
class WeiXinHandler{
  public void valid(){
    String echostr=final_request.getParameter("echostr");
    if(null==echostr||echostr.isEmpty()){
      responseMsg();
    }else{
      if(this.checkSignature()){
        this.print(echostr);
      }else{
        this.print("error");
      }
    }
  }
  //自動回復內容
  public void responseMsg(){
    String postStr=null;
    try{
      postStr=this.readStreamParameter(final_request.getInputStream());
    }catch(Exception e){
      e.printStackTrace();
    }
    //System.out.println(postStr);
    if (null!=postStr&&!postStr.isEmpty()){
      Document document=null;
      try{
        document = DocumentHelper.parseText(postStr);
      }catch(Exception e){
        e.printStackTrace();
      }
      if(null==document){
        this.print("");
        return;
      }
      Element root=document.getRootElement();
      String fromUsername = root.elementText("FromUserName");
      String toUsername = root.elementText("ToUserName");
      String keyword = root.elementTextTrim("Content");
      String time = new Date().getTime()+"";
      String textTpl = "<xml>"+
            "<ToUserName><![CDATA[%1$s]]></ToUserName>"+
            "<FromUserName><![CDATA[%2$s]]></FromUserName>"+
            "<CreateTime>%3$s</CreateTime>"+
            "<MsgType><![CDATA[%4$s]]></MsgType>"+
            "<Content><![CDATA[%5$s]]></Content>"+
            "<FuncFlag>0</FuncFlag>"+
            "</xml>";
      if(null!=keyword&&!keyword.equals(""))
      {
        String msgType = "text";
        String contentStr = "Welcome to wechat world!";
        String resultStr = textTpl.format(textTpl, fromUsername, toUsername, time, msgType, contentStr);
        this.print(resultStr);
      }else{
        this.print("Input something...");
      }
    }else {
      this.print("");
    }
  }
  //微信接口驗證
  public boolean checkSignature(){
    String signature = final_request.getParameter("signature");
    String timestamp = final_request.getParameter("timestamp");
    String nonce = final_request.getParameter("nonce");
    String token=TOKEN;
    String[] tmpArr={token,timestamp,nonce};
    Arrays.sort(tmpArr);
    String tmpStr=this.ArrayToString(tmpArr);
    tmpStr=this.SHA1Encode(tmpStr);
    if(tmpStr.equalsIgnoreCase(signature)){
      return true;
    }else{
      return false;
    }
  }
  //向請求端發送返回數據
  public void print(String content){
    try{
      final_response.getWriter().print(content);
      final_response.getWriter().flush();
      final_response.getWriter().close();
    }catch(Exception e){
    }
  }
  //數組轉字符串
  public String ArrayToString(String [] arr){
    StringBuffer bf = new StringBuffer();
    for(int i = 0; i < arr.length; i++){
     bf.append(arr[i]);
    }
    return bf.toString();
  }
  //sha1加密
  public String SHA1Encode(String sourceString) {
    String resultString = null;
    try {
      resultString = new String(sourceString);
      MessageDigest md = MessageDigest.getInstance("SHA-1");
      resultString = byte2hexString(md.digest(resultString.getBytes()));
    } catch (Exception ex) {
    }
    return resultString;
  }
  public final String byte2hexString(byte[] bytes) {
    StringBuffer buf = new StringBuffer(bytes.length * 2);
    for (int i = 0; i < bytes.length; i++) {
      if (((int) bytes[i] & 0xff) < 0x10) {
        buf.append("0");
      }
      buf.append(Long.toString((int) bytes[i] & 0xff, 16));
    }
    return buf.toString().toUpperCase();
  }
  //從輸入流讀取post參數
  public String readStreamParameter(ServletInputStream in){
    StringBuilder buffer = new StringBuilder();
    BufferedReader reader=null;
    try{
      reader = new BufferedReader(new InputStreamReader(in));
      String line=null;
      while((line = reader.readLine())!=null){
        buffer.append(line);
      }
    }catch(Exception e){
      e.printStackTrace();
    }finally{
      if(null!=reader){
        try {
          reader.close();
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
    }
    return buffer.toString();
  }
}
%>
<%
  WeiXinHandler handler=new WeiXinHandler();
  handler.valid();
%>

以上就是PHP接口和JSP接口的所有代碼,現在我們來對一些需要注意的地方做下分析:

首先的從總體看的話,jsp要比PHP繁瑣一些,因為很多函數需要自己寫,像sha1加密,解析xml字符串等都需要自己找第三方的庫。

第一點,我們要獲取微信公眾平臺給jsp發送的post或get參數,正常情況下都是用request.getParameter就可以獲取到,但是在寫的過程中發現PHP是這樣獲取

$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

這時通過查詢一些資料知道這樣獲取的是無法通過$_GET或$_POST函數得到的”未識別 MIME 類型的數據“,原始的 POST 數據
(參考:https://www.jb51.net/article/117653.htm)

所以這里使用獲取原始數據流的方式來解析post的xml數據

String postStr=null;
try{
  postStr=this.readStreamParameter(final_request.getInputStream());
}catch(Exception e){
  e.printStackTrace();
}
//從輸入流讀取post參數
public String readStreamParameter(ServletInputStream in){
    StringBuilder buffer = new StringBuilder();
    BufferedReader reader=null;
    try{
      reader = new BufferedReader(new InputStreamReader(in));
      String line=null;
      while((line = reader.readLine())!=null){
        buffer.append(line);
      }
    }catch(Exception e){
      e.printStackTrace();
    }finally{
      if(null!=reader){
        try {
          reader.close();
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
    }
    return buffer.toString();
}

第二個,是response消息返回給微信平臺,我嘗試的用最一般的out.print去做,但是發現沒反應,觀察PHP的代碼寫法

echo "";
exit;

猜想可能需要有個刷新的操作才能把消息response回去,于是找了下response內的一些函數做出以下嘗試

//向請求端發送返回數據
public void print(String content){
    try{
      final_response.getWriter().print(content);
      final_response.getWriter().flush();
      final_response.getWriter().close();
    }catch(Exception e){
    }
}

發現以上做法是可以在微信發送端得到消息的;

第三個,接口描述上說目前只支持80端口的服務端地址,所以我這里的做法是用apache服務器路由到tomcat的jsp上

關于微信公眾平臺的消息接口的詳細介紹,可以參看微信公眾平臺的官方文檔,里面介紹了消息的xml的格式和消息的發送方式等。

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

武平县| 会泽县| 霍州市| 丰顺县| 南召县| 东乡县| 乃东县| 苍南县| 凤冈县| 深州市| 来凤县| 潞西市| 襄垣县| 敖汉旗| 临桂县| 镇宁| 盱眙县| 同江市| 阿城市| 军事| 庄河市| 鄂托克前旗| 乡城县| 宁海县| 洪江市| 仁布县| 镇原县| 南安市| 临夏县| 社旗县| 含山县| 罗江县| 南木林县| 满城县| 永兴县| 汝阳县| 上思县| 遵义市| 黑龙江省| 广汉市| 调兵山市|