微信公众号 接口配置

1、登录微信公众平台-->设置与开发-->基本配置页面,打开服务器配置

2、在网站后台添加两个接口get请求验证和post请求消息转发,url为上图填写的url,

    
@RestController
@RequestMapping("/officialAccount/")
public class OfficialAccountController extends BaseController {
    @GetMapping("/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 WeChatHelper.checkSignature(signature, timestamp, nonce) ? echostr : null;

	}

	/**
	 * 此处是处理微信服务器的消息转发的
	 */
	@PostMapping("/wechat")
	public String processMsg(HttpServletRequest request) {
		//System.out.println("message received, start process message!");
		// 调用核心服务类接收处理请求
		return processRequest(request);
	}
}

WeChatHelper 为解密验证的代码

package com.ruoyi.stock.applet.util;

import com.ruoyi.common.utils.DateUtils;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import javax.servlet.http.HttpServletRequest;
import java.io.InputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.*;


public class WeChatHelper {

	/**
	 * 验证签名
	 *
	 * @param signature
	 * @param timestamp
	 * @param nonce
	 * @return
	 */
	public static boolean checkSignature(String signature, String timestamp, String nonce) {
		String[] arr = new String[] {WeChatConstant.TOKEN, timestamp, nonce};
		// 将token、timestamp、nonce三个参数进行字典序排序
		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<>();
		// 从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(WeChatConstant.FromUserName));
		map.put("FromUserName", requestMap.get(WeChatConstant.ToUserName));
		map.put("MsgType", WeChatConstant.RESP_MESSAGE_TYPE_TEXT);
		map.put("CreateTime", DateUtils.getDate());
		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(WeChatConstant.FromUserName));
//		map.put("FromUserName", requestMap.get(WeChatConstant.ToUserName));
//		map.put("MsgType", "news");
//		map.put("CreateTime", DateUtils.getDate());
//		List<Map<String, Object>> Articles = new ArrayList<Map<String, Object>>();
//		for (ArticleItem item : items) {
//			Map<String, Object> itemMap = new HashMap<String, Object>();
//			Map<String, Object> itemContent = new HashMap<String, Object>();
//			itemContent.put("Title", item.getTitle());
//			itemContent.put("Description", item.getDescription());
//			itemContent.put("PicUrl", item.getPicUrl());
//			itemContent.put("Url", item.getUrl());
//			itemMap.put("item", itemContent);
//			Articles.add(itemMap);
//		}
//		map.put("Articles", Articles);
//		map.put("ArticleCount", Articles.size());
//		return mapToXML(map);
//	}

}

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值