자바 판 위 챗 공식 플랫폼 메시지 인터페이스 응용 예시
11885 단어 자바위 챗 공식 플랫폼메시지 인터페이스
위 챗 공식 플랫폼 은 현재 자동 답장 메시지 인 터 페 이 스 를 출시 하고 있 습 니 다.그러나 인터페이스 내용 은 PHP 언어 로 작 성 된 것 이기 때문에 자바 에 익숙 한 젊은이 가 어색 한 곳 이 많 습 니 다.그래서 PHP 의 인터페이스 코드 를 본 떠 jsp 언어 로 작 성 된 연결 을 만 들 었 습 니 다.
먼저 전체 인터페이스 코드 를 붙 여 비교 한 다음 에 우 리 는 코드 를 분석 합 니 다.
PHP:
<?php
/**
* wechat php test
*/
//define your token
define("TOKEN", "weixin");
$wechatObj = new wechatCallbackapiTest();
$wechatObj->valid();
class wechatCallbackapiTest
{
public function valid()
{
$echoStr = $_GET["echostr"];
//valid signature , option
if($this->checkSignature()){
echo $echoStr;
exit;
}
}
public function responseMsg()
{
//get post data, May be due to the different environments
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
//extract post data
if (!empty($postStr)){
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$fromUsername = $postObj->FromUserName;
$toUsername = $postObj->ToUserName;
$keyword = trim($postObj->Content);
$time = time();
$textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Content><![CDATA[%s]]></Content>
<FuncFlag>0</FuncFlag>
</xml>";
if(!empty( $keyword ))
{
$msgType = "text";
$contentStr = "Welcome to wechat world!";
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
echo $resultStr;
}else{
echo "Input something...";
}
}else {
echo "";
exit;
}
}
private function checkSignature()
{
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];
$token = TOKEN;
$tmpArr = array($token, $timestamp, $nonce);
sort($tmpArr);
$tmpStr = implode( $tmpArr );
$tmpStr = sha1( $tmpStr );
if( $tmpStr == $signature ){
return true;
}else{
return false;
}
}
}
?>
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 보다 좀 번 거 롭 습 니 다.많은 함수 들 이 스스로 써 야 하기 때 문 입 니 다.예 를 들 어 sha 1 암호 화,xml 문자열 해석 등 은 제3자 라 이브 러 리 를 찾 아야 합 니 다.
첫 번 째,우 리 는 위 챗 공식 플랫폼 이 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 Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.