import java.security.MessageDigest;

/**

* 网易云信 校验类

* User: NinetyOne

* Date: 2019/3/15

* Time: 11:33

* To change this template use File | Setting | File Template.

**/

public class CheckSumBuilder {

// 计算并获取CheckSum

public static String getCheckSum(String appSecret, String nonce, String curTime) {

return encode("sha1", appSecret + nonce + curTime);

}

// 计算并获取md5值

public static String getMD5(String requestBody) {

return encode("md5", requestBody);

}

private static String encode(String algorithm, String value) {

if (value == null) {

return null;

}

try {

MessageDigest messageDigest

= MessageDigest.getInstance(algorithm);

messageDigest.update(value.getBytes());

return getFormattedText(messageDigest.digest());

} catch (Exception e) {

throw new RuntimeException(e);

}

}

private static String getFormattedText(byte[] bytes) {

int len = bytes.length;

StringBuilder buf = new StringBuilder(len * 2);

for (int j = 0; j < len; j++) {

buf.append(HEX_DIGITS[(bytes[j] >> 4) & 0x0f]);

buf.append(HEX_DIGITS[bytes[j] & 0x0f]);

}

return buf.toString();

}

private static final char[] HEX_DIGITS = {'0', '1', '2', '3', '4', '5',

'6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};

}

import com.alibaba.fastjson.JSONObject;

import com.patient.core.config.NeteaseConfig;

import com.patient.core.middleware.CheckSumBuilder;

import org.apache.commons.io.IOUtils;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;

import java.io.IOException;

/**

* 网易云信抄送

*/

@RestController

@RequestMapping(value = "/v1")

public class RouteController {

public static final Logger logger = LoggerFactory.getLogger(RouteController.class);

@Autowired

private NeteaseConfig neteaseConfig;

@PostMapping("/route/mockClient")

public JSONObject mockClient(HttpServletRequest request)

throws Exception {

JSONObject result = new JSONObject();

try {

// 获取请求体 不可为空

byte[] body = readBody(request);

if (body == null) {

logger.warn("request wrong, empty body!");

result.put("code", 414);

return result;

}

// 获取部分request header,并打印

String ContentType = request.getContentType();

String AppKey = request.getHeader("AppKey");

String CurTime = request.getHeader("CurTime");

String MD5 = request.getHeader("MD5");

String CheckSum = request.getHeader("CheckSum");

logger.info("request headers: ContentType = {}, AppKey = {}, CurTime = {}, " +

"MD5 = {}, CheckSum = {}", ContentType, AppKey, CurTime, MD5, CheckSum);

// 将请求体转成String格式,并打印

String requestBody = new String(body, "utf-8");

logger.info("request body = {}", requestBody);

// 获取计算过的md5及checkSum

String verifyMD5 = CheckSumBuilder.getMD5(requestBody);

String verifyChecksum = CheckSumBuilder.getCheckSum(neteaseConfig.getAppSecret(), verifyMD5, CurTime);

logger.debug("verifyMD5 = {}, verifyChecksum = {}", verifyMD5, verifyChecksum);

// TODO: 比较md5、checkSum是否一致,以及后续业务处理

result.put("code", 200);

return result;

} catch (Exception ex) {

logger.error(ex.getMessage(), ex);

result.put("code", 414);

return result;

}

}

// body如果为空 request.getContentLength() = 0

private byte[] readBody(HttpServletRequest request) throws IOException {

if (request.getContentLength() > 0) {

byte[] body = new byte[request.getContentLength()];

IOUtils.readFully(request.getInputStream(), body);

return body;

} else

return null;

}

}

网易云信消息抄送php,网易云信消息抄送相关推荐

  1. 网易来聊聊子弹短信的消息漫游技术

    "子弹短信"炸翻了创投圈,上线短短7天,掀起IM行业一股巨浪.网易云信作为子弹短信IM以及音视频通话技术提供者,今天来聊聊子弹短信这款即时通讯产品里面一个重要功能-消息漫游. [知 ...

  2. 网易创新企业大会倒计时,云信将发布新一代音视频技术架构

    网易创新企业大会倒计时 4 天! 当下,科技创新已成为推动经济社会发展的主要力量,运用创新技术构建前瞻性业务模式.提高业务增长成为各大企业生存和发展的重要着力点. 对此,网易旗下一站式企业服务提供商网 ...

  3. 基于云信IM实现的文字+图片消息聊天功能

    前言 记得在初学Android时,自己当时定下的目标的是实现一个QQ,虽然当时的想法比较高,但是自己当时技术不足,很多功能无从下手,最后便做了一些QQ的效果来当做学习,后来就搁置在那里了,然后在大二暑 ...

  4. 网易HR告诉你关于网易招聘的那些事(下篇)

    本文 Github/javamap 已收录,有Java程序员进阶技术知识地图以及我的系列文章,欢迎大家Star. --正文-- 菜架:雷架我师妹也想去网易,不过她对网易招聘情况不了解,惆怅- 雷架:有 ...

  5. java jms消息删除_activemq的topic消息一直都会存在数据库中,为什么不会删除

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 我把消息设置的持久化到数据库.采用topic的方式发送消息. 每次发送消息之后,数据库的ACTIVEMQ_MSGS表里都会插入10条记录(每次是发送10条 ...

  6. 阿里一面:如何保障消息100%投递成功、消息幂等性?

    点击关注公众号,Java干货及时送达来源:toutiao.com/i6672235084336071179 前言 我们小伙伴应该都听说够消息中间件MQ,如:RabbitMQ,RocketMQ,Kafk ...

  7. Java开发微信公众号(四)---微信服务器post消息体的接收及消息的处理

    在前几节文章中我们讲述了微信公众号环境的搭建.如何接入微信公众平台.以及微信服务器请求消息,响应消息,事件消息以及工具处理类的封装:接下来我们重点说一下-微信服务器post消息体的接收及消息的处理,这 ...

  8. rabbitmq消费固定个数消息_SpringBoot+RabbitMQ (保证消息100%投递成功并被消费)

    作者:wangzaiplus https://www.jianshu.com/p/dca01aad6bc8 一.先扔一张图 说明:本文涵盖了关于RabbitMQ很多方面的知识点, 如: 消息发送确认机 ...

  9. RabbitMQ中的虚拟主机、交换机、消息队列、绑定、消息

    虚拟主机(virtual host ) 虚拟地址,用于进行逻辑隔离,最上层的消息路由,一个 virtual host 里面可以有若干个 exchange 和 queue,但是里面不能有相同名称的 ex ...

最新文章

  1. 百度大脑发布企业服务解决方案,将 AI 技术落实到细分领域
  2. 华为平板电脑_当5G遇上平板电脑,华为MatePad Pro 5G带来了什么?
  3. win10系统预览体验计划错误代码0x800bfa19怎么办
  4. VC2010 项目的创建
  5. VMware虚拟机CentOS7 - VMnet8网络配置及常见问题解决
  6. xssfdataformat 设置单元格式为数值_Excel表格为工作表的部分区域设置保护密码同时隐藏单元格内容。...
  7. 手眼标定,我的结果显示手和眼相距上千米!手眼标定结果准确率如何提高?
  8. python 拼音地名对应关系,Python使用百度地图API根据地名获取相应经纬度
  9. 双系统——彻底删除ubuntu
  10. 空洞卷积(膨胀卷积)的相关知识以及使用建议(HDC原则)
  11. ps滤镜之——马赛克
  12. 【一致性仿真】Consensus Control of Leader-Following Multi-Agent Systems in Directed Topology With ...
  13. Ubuntu桌面不见了,桌面找回
  14. (算法练习)——小白鼠排队
  15. b级车里有比迈腾空间更大的车吗?
  16. 全加器--两种方法实现
  17. linux .opj文件,OPJ 文件扩展名: 它是什么以及如何打开它?
  18. spring cloud微服务框架 第七天
  19. 聚丙烯酰胺凝胶电泳检测非还原性SDS-PAGE蛋白质产品的纯度
  20. 后疫情时代,智慧物流遭遇危机还是邂逅转机?

热门文章

  1. python播放网络音乐_Python实现在线音乐播放器示例
  2. 【NOIP模拟】德拉曼兹路基
  3. 谷歌chrome浏览器不能启动完美解决
  4. Python 竟能开发如此精美的俄罗斯方块!
  5. 如何看懂HijackThis扫描日志------学习帖
  6. Android SIM 卡信息加载流程
  7. ArcGIS 中创建自定义python工具箱
  8. 容错服务器有什么特别之处
  9. 产品笔试刷题错题记录
  10. 报错:from .. import deform_conv_cuda