一套模仿WhatsApp消息API的接口设计

发布时间:2026/10/31 10:07:23

一套模仿WhatsApp消息API的接口设计 背景前一段模仿WhatsApp Business的核心功能做了一套商业号服务,为了让老外看起来亲切,因此其接口设计尽量与WhatsApp保持一致,因此可以将此接口设计share出来,通过该接口设计,大家可以了解到WhatsApp Business的核心功能及其对应的接口定义;尽管如此,一些地方的设计也有小差异,例如:WhatsApp直接使用手机号码定位用户,在这套设计中则借鉴了微信公众号OpenUserId的套路,另外为了安全考虑对真实userId又进行了加入应用ID因子的混淆,因此可以做到:同一个用户不同应用(订阅号)下的OpenUserId不同,OpenUserId实现参考如下:ByteUtilpackagecodec;importorg.apache.commons.lang3.ArrayUtils;/** * ByteUtil * * @author chenx */publicclassByteUtil{publicstaticfinalintONE_BYTE_INT_MAX_VALUE=127;publicstaticfinalintONE_BYTE_INT_MIN_VALUE=-128;publicstaticfinalintTIMESTAMP_BYTES=6;privatestaticfinalStringINPUT_BYTES_LENGTH_MUST_MORE_THAN="The input bytes.length must =";privatestaticfinalStringINPUT_BYTES_LENGTH_MUST_BE="The input bytes.length must be ";privateByteUtil(){}/** * timestampToSixBytes * * @param timestamp * @return */publicstaticbyte[]timestampToSixBytes(longtimestamp){byte[]data=newbyte[TIMESTAMP_BYTES];data[0]=(byte)(timestamp40);data[1]=(byte)(timestamp32);data[2]=(byte)(timestamp24);data[3]=(byte)(timestamp16);data[4]=(byte)(timestamp8);data[5]=(byte)(timestamp0);returndata;}/** * sixBytesToTimestamp * * @param bytes * @return */publicstaticlongsixBytesToTimestamp(byte[]bytes){if(ArrayUtils.isEmpty(bytes)||bytes.lengthTIMESTAMP_BYTES){thrownewIllegalArgumentException(INPUT_BYTES_LENGTH_MUST_MORE_THAN+TIMESTAMP_BYTES);}return(((long)(bytes[0]255)40)+((long)(bytes[1]255)32)+((long)(bytes[2]255)24)+((bytes[3]255)16)+((bytes[4]255)8)+((bytes[5]255)0));}/** * short2Bytes * * @param num * @return */publicstaticbyte[]short2Bytes(shortnum){byte[]bytes=newbyte[Short.BYTES];bytes[0]=(byte)(num8);bytes[1]=(byte)num;returnbytes;}/** * bytes2Short * * @param bytes * @return */publicstaticshortbytes2Short(byte[]bytes){if(ArrayUtils.isEmpty(bytes)||bytes.length!=Short.BYTES){thrownewIllegalArgumentException(INPUT_BYTES_LENGTH_MUST_BE+Short.BYTES);}return(short)((bytes[0]8)|(bytes[1]0xFF));}/** * int2Bytes * * @param num * @return */publicstaticbyte[]int2Bytes(intnum){byte[]byteNum=newbyte[Integer.BYTES];for(intix=0;ixInteger.BYTES;++ix){intoffset=32-(ix+1)*8;byteNum[ix]=(byte)((numoffset)0xff);}returnbyteNum;}/** * bytes2Int * * @param bytes * @return */publicstaticintbytes2Int(byte[]bytes){if(ArrayUtils.isEmpty(bytes)||bytes.length!=Integer.BYTES){thrownewIllegalArgumentException(INPUT_BYTES_LENGTH_MUST_BE+Integer.BYTES);}intnum=0;for(intix=0;ixInteger.BYTES;++ix){num=8;num|=(bytes[ix]0xff);}returnnum;}/** * long2Bytes * * @param num * @return */publicstaticbyte[]long2Bytes(longnum){byte[]byteNum=newbyte[Long.BYTES];for(intix=0;ixLong.BYTES;++ix){intoffset=64-(ix+1)*8;byteNum[ix]=(byte)((numoffset)0xff);}returnbyteNum;}/** * bytes2Long * * @param bytes * @return */publicstaticlongbytes2Long(byte[]bytes){if(ArrayUtils.isEmpty(bytes)||bytes.length!=Long.BYTES){thrownewIllegalArgumentException(INPUT_BYTES_LENGTH_MUST_BE+Long.BYTES);}longnum=0;for(intix=0;ixLong.BYTES;++ix){num=8;num|=(bytes[ix]0xff);}returnnum;}/** * mergeBytes * * @param arrays * @return */publicstaticbyte[]mergeBytes(byte[]...arrays){inttotalLength=0;for(byte[]array:arrays){totalLength+=array.length;}byte[]result=newbyte[totalLength];intcurrentIndex=0;for(byte[]array:arrays){System.arraycopy(array,0,result,currentIndex,array.length);currentIndex+=array.length;}returnresult;}/** * getBytesFromStart * * @param array * @param length * @return */publicstaticbyte[]getBytesFromStart(byte[]array,intlength){if(ArrayUtils.isEmpty(array)){thrownewIllegalArgumentException("the input bytes is empty!");}if(length=0){thrownewIllegalArgumentException("The length must 0!");}if(array.lengthlength){thrownewIllegalArgumentException("the input bytes.length must "+length+"!");}byte[]result=newbyte[length];System.arraycopy(array,0,result,0,length);returnresult;}/** * obfuscateBytes * * @param bytes * @param hashBytesLength */publicstaticvoidhashObfuscate(byte[]bytes,inthashBytesLength){if(hashBytesLength=0){thrownewIllegalArgumentException("invalid hashLength!");}if(ArrayUtils.isEmpty(bytes)||bytes.length=hashBytesLength){thrownewIllegalArgumentException("bytes.length = "+hashBytesLength);}intleftBytesSize=bytes.length-hashBytesLength;byte[]hashBytes=newbyte[hashBytesLength];byte[]leftBytes=new
延伸阅读

更多相关文章

2026/10/28 23:02:47

[AutoSar]BSW_Com 01 Can通信入门

目录关键词平台说明一、车身CAN简介二、相关模块三、Can报文分类及信号流路径3.1 应用报文3.2 应用报文(多路复用multiplexer)3.3 诊断报文3.4 网络管理报文3.5 XCP报文(标定报文)关键词 嵌入式、C语言、autosar、OS、BSW 平台说…

2026/10/25 12:24:52

【单片机毕设案例分享】阈值自定义的 STM32 人体健康监测报警装置研究 基于 STM32 MPU6050 的跌倒检测与运动信息采集系统(013306)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于单片机,STM32单片机,51单片机,J…

2026/10/30 9:55:42

【Vue】nvm安装教程,支持nodejs多版本(解决版本冲突)

系列文章 【Vue】vue增加导航标签 本文链接:https://blog.csdn.net/youcheng_ge/article/details/134965353 【Vue】Element开发笔记 本文链接:https://blog.csdn.net/youcheng_ge/article/details/133947977 【Vue】vue,在Windows IIS平台…

2026/10/31 10:03:51

关于deepseek部署到qq对话怎样显得有人味(新手向)

我这个是qq开放平台的官方机器人渠道(因为方便),流程就是注册,绑定qq,实名认证后在教程里给你一串代码,发给deepseek harness识别这串代码就能自动生成deepseek harness的qq机器人插件,让qq机器…

2026/10/31 10:03:51

c++ Bellman-Ford算法的具体实现

前言 Bellman-Ford 算法解决的是单源最短路径问题,与 Dijkstra 的区别在于:它允许边权为负。代价是时间复杂度 O(VE),比 Dijkstra 的 O(E log V) 慢,但换来两个能力——处理负权边,以及检测负权环(negative…

2026/10/31 10:03:51

AI模型推理性能测试:从工具配置到实战优化

1. AI模型推理性能测试的核心价值 在AI模型部署落地的最后阶段,性能测试往往成为决定项目成败的关键环节。我曾参与过一个金融风控项目,团队花费三个月训练的模型在实际推理时响应时间超过5秒,完全无法满足业务需求。这个教训让我深刻认识到&…

2026/10/31 10:03:51

技能(Skills)概念解析与技术能力构建路径

我无法基于当前输入生成符合要求的博文。 原因在于:您提供的输入内容中, 项目标题仅为“skills” ,且后续所有字段(项目正文、关键词、摘要描述)均为空或未提供有效信息。同时,“相关热搜词”与“最新网…

2026/10/31 10:03:51

Pandas实现RFM客户价值分析与实战技巧

1. RFM模型基础与Pandas适配性分析 RFM模型作为客户价值分析的经典方法论,由三个核心维度构成: Recency(最近一次消费时间):客户最近一次交易距今的天数 Frequency(消费频率):客户…

2026/10/31 9:58:51

技能管理系统化:从盘点、组合到迭代,打造你的职业竞争力

上个周末,我帮一个刚转行做产品经理的朋友梳理他的简历。聊到“技能”那一栏时,他自己都愣住了——写了“沟通能力强、会Axure、懂SQL”,但问他这些技能分别帮他解决过什么问题、在什么场景下能复用,他说得含含糊糊。这件事让我想…

2026/10/30 20:55:10

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/30 20:55:10

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/30 20:55:09

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/31 0:02:41

猫狗目标检测数据集:VOC/COCO/YOLO三格式一体化实战包

简介:本资源是一套面向计算机视觉初学者与YOLO目标检测实践者的猫狗图像数据集及配套开发工具包,专为快速上手目标检测模型训练而设计。资源包含1000张真实场景高清猫狗图片,标注质量高,同时提供VOC(XML)、…

2026/10/31 0:02:41

HDU2017多校标程复现:算法竞赛工程化真题沙盒

简介:本资源为2017年HDU多校联合训练第一场官方配套资料,面向ACM程序设计竞赛备赛学生、算法爱好者及高校编程集训队成员,旨在提供权威解题参考与完整测试验证环境。压缩包共40个文件,含15份C标程(覆盖全部赛题&#x…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑