SpringBoot 对接美团闪购,检验签名,获取推送订单参数,text转json
接口文档地址
订单推送(已确定订单):https://open-shangou.meituan.com/home/docDetail/177
签名算法:https://opendj.meituan.com/home/questionDetail/5730
测试订单:https://opendj.meituan.com/platform/guide/market/10657
控制器
@RequestMapping("confirm_order")
public void confirmOrder(HttpServletRequest request) {
//验证美团闪购签名
Boolean flag = CommonUtil.checkMeiTuanShanGouSign(request, "6bdfc78d4a64e82bc59e2a67d746a06e");
if (flag) {
SortedMap<String, String> requestParam = CommonUtil.getMeiTuanShanGouRequestParam(request);
String json = JSON.toJSONString(requestParam);
System.err.println(json);
MeiTuanShanGouConfirmOrderVo vo = JSON.parseObject(json, MeiTuanShanGouConfirmOrderVo.class);
System.out.println("=====================================");
System.err.println(vo);
}
}
工具类
/**
* 获取美团闪购请求参数
*
* @param request 请求头
* @return
*/
public static SortedMap<String, String> getMeiTuanShanGouRequestParam(HttpServletRequest request) {
SortedMap<String, String> treeMap = new TreeMap<>();
Enumeration<String> parameterNames = request.getParameterNames();
while (parameterNames.hasMoreElements()) {
String name = parameterNames.nextElement();
String value = request.getParameter(name);
if (!SIG_FIELD_NAME.equals(name)) {
try {
treeMap.put(name, URLDecoder.decode(value, "UTF-8"));
} catch (UnsupportedEncodingException e) {
}
}
}
return treeMap;
} /**
* 获取美团闪购签名
*
* @param url 请求url,注意不能带?,如:https://waimaiopen.meituan.com/api/v1/oauth/authorize
* @param param SortedMap<String, String> params = new TreeMap<>();
* @param appSecret APP Secret
* @return
*/
public static String getMeiTuanShanGouSign(String url, SortedMap<String, String> param, String appSecret) {
StringBuilder sb = new StringBuilder();
Set<Map.Entry<String, String>> entries = param.entrySet();
Iterator<Map.Entry<String, String>> it = entries.iterator();
while (it.hasNext()) {
Map.Entry<String, String> next = it.next();
String key = next.getKey();
String value = next.getValue();
if (null != value && !"".equals(value) && !"sign".equals(key) && !"key".equals(key)) {
sb.append(key + "=" + value + "&");
}
}
String result = url + "?" + sb.substring(0, sb.toString().length() - 1) + appSecret;
return MD5(result);
} /**
* 美团签名的字段名
*/
private static final String SIG_FIELD_NAME = "sig"; /**
* 检查美团闪购签名
*
* @param request 请求头
* @param appSecret 密钥
* @return
*/
public static Boolean checkMeiTuanShanGouSign(HttpServletRequest request, String appSecret) {
String url = String.format("%s://%s%s", request.getScheme(), request.getServerName(), request.getRequestURI());
SortedMap<String, String> treeMap = new TreeMap<>();
Enumeration<String> parameterNames = request.getParameterNames();
while (parameterNames.hasMoreElements()) {
String name = parameterNames.nextElement();
String value = request.getParameter(name);
if (!SIG_FIELD_NAME.equals(name)) {
try {
treeMap.put(name, URLDecoder.decode(value, "UTF-8"));
} catch (UnsupportedEncodingException e) {
}
}
}
String sign = generatorMeiTuanShanGouSign(url, treeMap, appSecret);
String realSign = request.getParameter(SIG_FIELD_NAME).toUpperCase();
if (sign.equals(realSign)) {
log.info("验证美团闪购签名正确,真实签名:{}", realSign);
return true;
}
log.error("验证美团闪购签名错误,真实签名:{}", realSign);
return false;
} /**
* 生成美团闪购签名
*
* @param url 请求的完整的url
* @param treeMap 请求的全部参数
* @param appSecret APP Secret
* @return sign
*/
private static String generatorMeiTuanShanGouSign(String url, SortedMap<String, String> treeMap, String appSecret) {
String queryString = Joiner.on("&").useForNull("").withKeyValueSeparator("=").join(treeMap);
String md5str = url.concat("?").concat(queryString).concat(appSecret);
try {
return MD5(URLDecoder.decode(md5str, "UTF-8"));
} catch (UnsupportedEncodingException encodingException) {
System.out.println("签名生成失败");
}
return "";
} /**
* md5加密
*
* @param data
* @return
*/
public static String MD5(String data) {
try {
java.security.MessageDigest md = MessageDigest.getInstance("MD5");
byte[] array = md.digest(data.getBytes("UTF-8"));
StringBuilder sb = new StringBuilder();
for (byte item : array) {
sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3));
}
return sb.toString().toUpperCase();
} catch (Exception exception) {
}
return null;
}
SpringBoot 对接美团闪购,检验签名,获取推送订单参数,text转json的更多相关文章
- springboot搭建一个简单的websocket的实时推送应用
说一下实用springboot搭建一个简单的websocket 的实时推送应用 websocket是什么 WebSocket是一种在单个TCP连接上进行全双工通信的协议 我们以前用的http协议只能单 ...
- iOS,APP退到后台,获取推送成功的内容并且语音播报内容。
老铁,我今天忙了一下午就为解决这个问题,网上有一些方法,说了一堆关于这个挂到后台收到推送并且获得推送内容的问题,有很多人都说APP挂到后台一会就被杀死.但实际上可以有办法解决的. WechatIMG3 ...
- 从苹果apns的feedback服务器获取推送失败的token
在开发自己的苹果推送服务时候,要合理的控制ios设备的Token,而这个Token是由苹果服务器Apns产生的,就是每次app问Apns要Token,由苹果服务器产生的Token会记录到Apns里面, ...
- serializeArray()获取的表单参数转化成json格式的对象
目标:将serializeArray()这个方法获取的表单对象 转换成json格式 function serializeObject(){ //easyui提交表单 $('#form').form( ...
- js发起长轮询获取推送消息
<!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...
- Springboot项目集成JPush极光推送(Java SDK)
1.由于项目的需求,需要在Android APP上实现消息推送功能,所以引用了极光推送(官网:https://www.jiguang.cn/, 文档:http://docs.jiguang.cn/) ...
- SpringBoot 实现微信推送模板
导读 由于最近手头上需要做个Message Gateway,涉及到:邮件(点我直达).短信.公众号等推送功能,网上学习下,整理下来以备以后使用. 添加依赖 在SpringBoot项目中添加依赖 < ...
- 公众号开发之wx-tools+springboot应用实战-音乐爬虫推送[JAVA]
springboot+wx-tools实践!音乐爬虫推送公众号DEMOGitHub地址:wx-tools 最终DEMO源码地址: music_collector 先理一下大概的开发步骤: 1. 创建一 ...
- 钉钉开发第三方H5微应用入门详细教程[ISV][免登流程][授权码][HTTP回调推送][识别用户身份][获取用户信息]
转载请注明原文地址:https://www.cnblogs.com/applerosa/p/11509512.html (by lnexin@aliyun.com 世间草木) 此教程注意点: 适用于第 ...
- Springboot+websocket+定时器实现消息推送
由于最近有个需求,产品即将到期(不同时间段到期)时给后台用户按角色推送,功能完成之后在此做个小结 1. 在启动类中添加注解@EnableScheduling package com.hsfw.back ...
随机推荐
- git安装和git命令:全局设置用户名邮箱配置
在网上下载并安装git:https://git-scm.com/downloads在开始菜单里面找到 "Git --> Git Bash",如下 运行Git Bash: 如果 ...
- grads 同时读取多个ctl文件方法
1.不同的文件进行不同的设置:'set dfile 2' 2.读取不同文件的变量:qv.2 实例如下:'reinit''open e:\tskt.CTL''open e:\uwnd.CTL''open ...
- ECMAScript 语言规范每年都会进行一次更新,而备受期待的 ECMAScript 2024 将于 2024 年 6 月正式亮相。目前,ECMAScript 2024 的候选版本已经发布,为我们带来了一系列实用的新功能。
Promise.withResolvers 使用 Promise.withResolvers() 关键的区别在于解决和拒绝函数现在与 Promise 本身处于同一作用域,而不是在执行器中被创建和一次性 ...
- OpenNESS NTS 的前世今生
目录 文章目录 目录 NEV SDK NEV SDK 的软件架构 NEV SDK 的持续演进 OpenNESS NTS NTS 在 VM 场景中的应用 NTS 在 Container 场景中的应用 N ...
- PageOffice 在线打开 word 文件实现痕迹保留、键盘批注、手写批注
一.痕迹保留 Word中的痕迹一般指的是审阅文档的用户对文档所做的修改(插入和删除)操作.在PageOffice的强制留痕模式下,用户对文档所做的任何修改都会以痕迹的形式保留下来,不同用户对文档做的修 ...
- yapi-plugin-notifier 插件安装报react 16.9.0版本错误 解决
使用yapi 1.9.2版本. 将配置的json文件替换掉. 参考这个issues解决方案:https://github.com/YMFE/yapi/issues/2109
- 基于WebSocket的modbus通信(三)- websocket和串口
WebSocket传递ModbusTCP数据包 错误纠正 上一篇还有个错误,就是客户端写数据时服务端不需要响应,但我的服务端响应了的.我选择改客户端,把写数据时接收到的响应丢弃. PrintBytes ...
- umask永久修改用户创建文件权限
Linux里永久设置用户创建文件权限的配置文件是/etc/profile.可以在该文件中添加umask命令来设置默认权限.具体操作步骤如下: 打开/etc/profile文件:sudo vi /etc ...
- linux使用过程中遇到的常见问题
1 xxxx is not in the sudoers file. This incident will be reported. 解决方式:https://www.cnblogs.com/xym4 ...
- js字符串类型
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...