springboot 기반 위 챗 공식 번호 개발(위 챗 자동 답장)
20737 단어 springboot공중 호
1.준비 작업
위 챗 구독 번호 신청(개인 은 구독 번호 만 신청 할 수 있 고 기능 도 없고 인증 도 할 수 없 음),신청 완료,클릭 개발=>기본 설정,아래 그림:
서버 설정 에 도 메 인 이름 80 포트 가 필요 합 니 다.없 을 것 같 습 니 다.실 용적 인 도 구 를 추천 합 니 다.pagekite,링크 다운로드,
이 도 구 는 python 2.7 이상 의 환경 이 필요 합 니 다.그리고 메 일 한 개,메 일 한 달 이 필요 합 니 다.메 일 이라는 것 을 잘 알 고 있 습 니 다.
페이지 키 트 로 도 메 인 이름 을 신청 하면 자신의 컴퓨터 로 구독 번호 서버 를 만 들 수 있 습 니 다.
2.서버 코드
springboot 프로젝트 만 들 기
pom.xml
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!-- thymeleaf h5 -->
<dependency>
<groupId>net.sourceforge.nekohtml</groupId>
<artifactId>nekohtml</artifactId>
<version>1.9.22</version>
</dependency>
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
입구 류
@SpringBootApplication
public class WeChatApplication {
public static void main(String[] args) {
SpringApplication.run(WeChatApplication.class, args);
System.out.println("==== ====");
}
}
application.properties,server.port=80 설정Controller,이것 은 위 챗 요청 을 처리 하 는 것 입 니 다.get 방법 은 위 챗 공공 플랫폼 서버 설정 url 요청 의 경로 입 니 다.post 는 사용자 사건 을 처리 하 는 것 입 니 다.
@RestController
public class WeChatController {
@Autowired
private WeChatService weChatService;
/**
* get ,
*
* signature
* timestamp
* nonce
* echostr
*/
@GetMapping(value = "wechat")
public String validate(@RequestParam(value = "signature") String signature,
@RequestParam(value = "timestamp") String timestamp,
@RequestParam(value = "nonce") String nonce,
@RequestParam(value = "echostr") String echostr) {
return WeChatUtil.checkSignature(signature, timestamp, nonce) ? echostr : null;
}
/**
*
*/
@PostMapping(value = "wechat")
public String processMsg(HttpServletRequest request) {
//
return weChatService.processRequest(request);
}
}
Service,post 요청 처리
/**
*
*/
@Service
public class WeChatServiceImpl implements WeChatService{
@Autowired
private FeignUtil feignUtil;
@Autowired
private RedisUtils redisUtils;
public String processRequest(HttpServletRequest request) {
// xml
String respXml = null;
//
String respContent;
try {
// parseXml
Map<String,String> requestMap = WeChatUtil.parseXml(request);
//
String msgType = (String) requestMap.get(WeChatContant.MsgType);
String mes = null;
//
if (msgType.equals(WeChatContant.REQ_MESSAGE_TYPE_TEXT)) {
mes =requestMap.get(WeChatContant.Content).toString();
if(mes!=null&&mes.length()<2){
List<ArticleItem> items = new ArrayList<>();
ArticleItem item = new ArticleItem();
item.setTitle(" ");
item.setDescription(" ");
item.setPicUrl("http://changhaiwx.pagekite.me/photo-wall/a/iali11.jpg");
item.setUrl("http://changhaiwx.pagekite.me/page/photowall");
items.add(item);
item = new ArticleItem();
item.setTitle(" ");
item.setDescription(" ");
item.setPicUrl("http://changhaiwx.pagekite.me/images/me.jpg");
item.setUrl("http://changhaiwx.pagekite.me/page/index");
items.add(item);
item = new ArticleItem();
item.setTitle(" 2048");
item.setDescription(" 2048");
item.setPicUrl("http://changhaiwx.pagekite.me/images/2048.jpg");
item.setUrl("http://changhaiwx.pagekite.me/page/game2048");
items.add(item);
item = new ArticleItem();
item.setTitle(" ");
item.setDescription(" ");
item.setPicUrl("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1505100912368&di=69c2ba796aa2afd9a4608e213bf695fb&imgtype=0&src=http%3A%2F%2Ftx.haiqq.com%2Fuploads%2Fallimg%2F170510%2F0634355517-9.jpg");
item.setUrl("http://www.baidu.com");
items.add(item);
respXml = WeChatUtil.sendArticleMsg(requestMap, items);
}else if(" ".equals(mes)){
Map<String, String> userInfo = getUserInfo(requestMap.get(WeChatContant.FromUserName));
System.out.println(userInfo.toString());
String nickname = userInfo.get("nickname");
String city = userInfo.get("city");
String province = userInfo.get("province");
String country = userInfo.get("country");
String headimgurl = userInfo.get("headimgurl");
List<ArticleItem> items = new ArrayList<>();
ArticleItem item = new ArticleItem();
item.setTitle(" ");
item.setDescription(" :"+nickname+" :"+country+" "+province+" "+city);
item.setPicUrl(headimgurl);
item.setUrl("http://www.baidu.com");
items.add(item);
respXml = WeChatUtil.sendArticleMsg(requestMap, items);
}
}
//
else if (msgType.equals(WeChatContant.REQ_MESSAGE_TYPE_IMAGE)) {
respContent = " !";
respXml = WeChatUtil.sendTextMsg(requestMap, respContent);
}
//
else if (msgType.equals(WeChatContant.REQ_MESSAGE_TYPE_VOICE)) {
respContent = " !";
respXml = WeChatUtil.sendTextMsg(requestMap, respContent);
}
//
else if (msgType.equals(WeChatContant.REQ_MESSAGE_TYPE_VIDEO)) {
respContent = " !";
respXml = WeChatUtil.sendTextMsg(requestMap, respContent);
}
//
else if (msgType.equals(WeChatContant.REQ_MESSAGE_TYPE_LOCATION)) {
respContent = " !";
respXml = WeChatUtil.sendTextMsg(requestMap, respContent);
}
//
else if (msgType.equals(WeChatContant.REQ_MESSAGE_TYPE_LINK)) {
respContent = " !";
respXml = WeChatUtil.sendTextMsg(requestMap, respContent);
}
//
else if (msgType.equals(WeChatContant.REQ_MESSAGE_TYPE_EVENT)) {
//
String eventType = (String) requestMap.get(WeChatContant.Event);
//
if (eventType.equals(WeChatContant.EVENT_TYPE_SUBSCRIBE)) {
respContent = " !";
respXml = WeChatUtil.sendTextMsg(requestMap, respContent);
}
//
else if (eventType.equals(WeChatContant.EVENT_TYPE_UNSUBSCRIBE)) {
// TODO ,
}
//
else if (eventType.equals(WeChatContant.EVENT_TYPE_SCAN)) {
// TODO
}
//
else if (eventType.equals(WeChatContant.EVENT_TYPE_LOCATION)) {
// TODO
}
//
else if (eventType.equals(WeChatContant.EVENT_TYPE_CLICK)) {
// TODO
}
}
mes = mes == null ? " " : mes;
if(respXml == null)
respXml = WeChatUtil.sendTextMsg(requestMap, mes);
System.out.println(respXml);
return respXml;
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
}
위 챗 도구 류(답장 메시지 만 썼 고 그림 메시지 와 다 름 없 음)
package com.wechat.util;
import java.io.InputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.servlet.http.HttpServletRequest;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import com.wechat.bean.ArticleItem;
/**
*
*
* @author 32950745
*
*/
public class WeChatUtil {
/**
*
*
* @param signature
* @param timestamp
* @param nonce
* @return
*/
public static boolean checkSignature(String signature, String timestamp, String nonce) {
String[] arr = new String[] { WeChatContant.TOKEN, timestamp, nonce };
// token、timestamp、nonce
// Arrays.sort(arr);
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");
// sha1
byte[] digest = md.digest(content.toString().getBytes());
tmpStr = byteToStr(digest);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
content = null;
// sha1 signature ,
return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;
}
/**
*
*
* @param byteArray
* @return
*/
private static String byteToStr(byte[] byteArray) {
String strDigest = "";
for (int i = 0; i < byteArray.length; i++) {
strDigest += byteToHexStr(byteArray[i]);
}
return strDigest;
}
/**
*
*
* @param mByte
* @return
*/
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;
}
private static void sort(String a[]) {
for (int i = 0; i < a.length - 1; i++) {
for (int j = i + 1; j < a.length; j++) {
if (a[j].compareTo(a[i]) < 0) {
String temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
}
/**
* (xml)
*
* @param request
* @return
* @throws Exception
*/
@SuppressWarnings({ "unchecked"})
public static Map<String,String> parseXml(HttpServletRequest request) throws Exception {
// HashMap
Map<String,String> map = new HashMap<String,String>();
// request
InputStream inputStream = request.getInputStream();
//
SAXReader reader = new SAXReader();
Document document = reader.read(inputStream);
// xml
Element root = document.getRootElement();
//
List<Element> elementList = root.elements();
//
for (Element e : elementList)
map.put(e.getName(), e.getText());
//
inputStream.close();
inputStream = null;
return map;
}
public static String mapToXML(Map map) {
StringBuffer sb = new StringBuffer();
sb.append("<xml>");
mapToXML2(map, sb);
sb.append("</xml>");
try {
return sb.toString();
} catch (Exception e) {
}
return null;
}
private static void mapToXML2(Map map, StringBuffer sb) {
Set set = map.keySet();
for (Iterator it = set.iterator(); it.hasNext();) {
String key = (String) it.next();
Object value = map.get(key);
if (null == value)
value = "";
if (value.getClass().getName().equals("java.util.ArrayList")) {
ArrayList list = (ArrayList) map.get(key);
sb.append("<" + key + ">");
for (int i = 0; i < list.size(); i++) {
HashMap hm = (HashMap) list.get(i);
mapToXML2(hm, sb);
}
sb.append("</" + key + ">");
} else {
if (value instanceof HashMap) {
sb.append("<" + key + ">");
mapToXML2((HashMap) value, sb);
sb.append("</" + key + ">");
} else {
sb.append("<" + key + "><![CDATA[" + value + "]]></" + key + ">");
}
}
}
}
/**
*
* @param requestMap
* @param content
* @return
*/
public static String sendTextMsg(Map<String,String> requestMap,String content){
Map<String,Object> map=new HashMap<String, Object>();
map.put("ToUserName", requestMap.get(WeChatContant.FromUserName));
map.put("FromUserName", requestMap.get(WeChatContant.ToUserName));
map.put("MsgType", WeChatContant.RESP_MESSAGE_TYPE_TEXT);
map.put("CreateTime", new Date().getTime());
map.put("Content", content);
return mapToXML(map);
}
/**
*
* @param requestMap
* @param items
* @return
*/
public static String sendArticleMsg(Map<String,String> requestMap,List<ArticleItem> items){
if(items == null || items.size()<1){
return "";
}
Map<String,Object> map=new HashMap<String, Object>();
map.put("ToUserName", requestMap.get(WeChatContant.FromUserName));
map.put("FromUserName", requestMap.get(WeChatContant.ToUserName));
map.put("MsgType", "news");
map.put("CreateTime", new Date().getTime());
List<Map<String,Object>> Articles=new ArrayList<Map<String,Object>>();
for(ArticleItem itembean : items){
Map<String,Object> item=new HashMap<String, Object>();
Map<String,Object> itemContent=new HashMap<String, Object>();
itemContent.put("Title", itembean.getTitle());
itemContent.put("Description", itembean.getDescription());
itemContent.put("PicUrl", itembean.getPicUrl());
itemContent.put("Url", itembean.getUrl());
item.put("item",itemContent);
Articles.add(item);
}
map.put("Articles", Articles);
map.put("ArticleCount", Articles.size());
return mapToXML(map);
}
}
위 챗 상수
public class WeChatContant {
//APPID
public static final String appID = "appid";
//appsecret
public static final String appsecret = "appsecret";
// Token
public static final String TOKEN = "zch";
public static final String RESP_MESSAGE_TYPE_TEXT = "text";
public static final Object REQ_MESSAGE_TYPE_TEXT = "text";
public static final Object REQ_MESSAGE_TYPE_IMAGE = "image";
public static final Object REQ_MESSAGE_TYPE_VOICE = "voice";
public static final Object REQ_MESSAGE_TYPE_VIDEO = "video";
public static final Object REQ_MESSAGE_TYPE_LOCATION = "location";
public static final Object REQ_MESSAGE_TYPE_LINK = "link";
public static final Object REQ_MESSAGE_TYPE_EVENT = "event";
public static final Object EVENT_TYPE_SUBSCRIBE = "SUBSCRIBE";
public static final Object EVENT_TYPE_UNSUBSCRIBE = "UNSUBSCRIBE";
public static final Object EVENT_TYPE_SCAN = "SCAN";
public static final Object EVENT_TYPE_LOCATION = "LOCATION";
public static final Object EVENT_TYPE_CLICK = "CLICK";
public static final String FromUserName = "FromUserName";
public static final String ToUserName = "ToUserName";
public static final String MsgType = "MsgType";
public static final String Content = "Content";
public static final String Event = "Event";
}
그림 메시지 실체 bean
public class ArticleItem {
private String Title;
private String Description;
private String PicUrl;
private String Url;
public String getTitle() {
return Title;
}
public void setTitle(String title) {
Title = title;
}
public String getDescription() {
return Description;
}
public void setDescription(String description) {
Description = description;
}
public String getPicUrl() {
return PicUrl;
}
public void setPicUrl(String picUrl) {
PicUrl = picUrl;
}
public String getUrl() {
return Url;
}
public void setUrl(String url) {
Url = url;
}
}
프로젝트 를 실행 하고 공공 플랫폼 에 url 을 설정 하 며 개인 구독 번호 가 완료 되 었 습 니 다.이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin Springboot -- 파트 14 사용 사례 REST로 전환하여 POST로 JSON으로 전환前回 前回 前回 記事 の は は で で で で で で を 使っ 使っ 使っ て て て て て リクエスト を を 受け取り 、 reqeustbody で 、 その リクエスト の ボディ ボディ を を 受け取り 、 関数 内部 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.