接口文档地址

订单推送(已确定订单):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的更多相关文章

  1. springboot搭建一个简单的websocket的实时推送应用

    说一下实用springboot搭建一个简单的websocket 的实时推送应用 websocket是什么 WebSocket是一种在单个TCP连接上进行全双工通信的协议 我们以前用的http协议只能单 ...

  2. iOS,APP退到后台,获取推送成功的内容并且语音播报内容。

    老铁,我今天忙了一下午就为解决这个问题,网上有一些方法,说了一堆关于这个挂到后台收到推送并且获得推送内容的问题,有很多人都说APP挂到后台一会就被杀死.但实际上可以有办法解决的. WechatIMG3 ...

  3. 从苹果apns的feedback服务器获取推送失败的token

    在开发自己的苹果推送服务时候,要合理的控制ios设备的Token,而这个Token是由苹果服务器Apns产生的,就是每次app问Apns要Token,由苹果服务器产生的Token会记录到Apns里面, ...

  4. serializeArray()获取的表单参数转化成json格式的对象

    目标:将serializeArray()这个方法获取的表单对象  转换成json格式 function serializeObject(){ //easyui提交表单 $('#form').form( ...

  5. js发起长轮询获取推送消息

    <!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...

  6. Springboot项目集成JPush极光推送(Java SDK)

    1.由于项目的需求,需要在Android APP上实现消息推送功能,所以引用了极光推送(官网:https://www.jiguang.cn/, 文档:http://docs.jiguang.cn/) ...

  7. SpringBoot 实现微信推送模板

    导读 由于最近手头上需要做个Message Gateway,涉及到:邮件(点我直达).短信.公众号等推送功能,网上学习下,整理下来以备以后使用. 添加依赖 在SpringBoot项目中添加依赖 < ...

  8. 公众号开发之wx-tools+springboot应用实战-音乐爬虫推送[JAVA]

    springboot+wx-tools实践!音乐爬虫推送公众号DEMOGitHub地址:wx-tools 最终DEMO源码地址: music_collector 先理一下大概的开发步骤: 1. 创建一 ...

  9. 钉钉开发第三方H5微应用入门详细教程[ISV][免登流程][授权码][HTTP回调推送][识别用户身份][获取用户信息]

    转载请注明原文地址:https://www.cnblogs.com/applerosa/p/11509512.html (by lnexin@aliyun.com 世间草木) 此教程注意点: 适用于第 ...

  10. Springboot+websocket+定时器实现消息推送

    由于最近有个需求,产品即将到期(不同时间段到期)时给后台用户按角色推送,功能完成之后在此做个小结 1. 在启动类中添加注解@EnableScheduling package com.hsfw.back ...

随机推荐

  1. leaflet叠加图片图层

    <!DOCTYPE html> <html> <head> <title>Layers Control Tutorial - Leaflet</t ...

  2. 小程序 image 高度自适应及裁剪问题

    在做微信小程序的商品详情页,商品的详情是图片集合,渲染完成后发现图片加载的很不自然,后来我把样式设置宽度 100%,并对 image 组件添加属性 mode="widthFix"解 ...

  3. AIRIOT答疑第1期 | 零开发基础也能干物联网平台项目?

    当然可以! 物联网低代码平台以零门槛.部署快.灵活性高.满足二次开发等特点,成为近两年来IOT服务的生力军.项目团队即使没有研发人员,也可以像拼乐高一样快速搭建物联网平台,功能全面,满足多数业务场景下 ...

  4. 基于ADB Shell 实现的 Android TV、电视盒子万能遥控器 — ADB Remote ATV

    ADB Remote ATV Android TV 的遥控器,基于 ADB Shell 命令 ADB Remote ATV 是一个 Android TV 的遥控器,基于 ADB Shell 命令,泛用 ...

  5. Must use PackageReference 解决办法

    Must use PackageReference 这是因为 .net framework的项目 在nuget时,引用到了 .net core 下的包. 解决办法,把之前引用的相关包全部在nuget上 ...

  6. ceph客户端配置自动挂载存储服务

    1. 安装支持ceph的内核模块 可选: centos/ubuntu: yum install -y ceph-common 或 apt install -y ceph-common 2. 拷贝认证密 ...

  7. Java 集合的概念

    目录 集合 单列集合(Collection) Collection中的一些方法 public static < T > boolean addAll(Collection<? sup ...

  8. react路由渲染

    三种渲染方式 component = (组件对象或函数) <Route path="/home" component={Home} /> 或 <Route pat ...

  9. ETL工具-nifi干货系列 第十四讲 nifi处理器QueryDatabaseTableRecord查询表数据实战教程

    1.处理器QueryDatabaseTableRecord和处理器QueryDatabaseTable比较相似,该组件生成一个 SQL 查询,或者使用用户提供的语句,并执行它以获取所有在指定的最大值列 ...

  10. kettle从入门到精通 第十二课 kettle java代码过滤记录、利用Janino计算Java表达式

    1.下图通过简单的示例讲解了根据java代码过滤记录和利用Janino计算Java表达式两个组件. 2.根据java代码过滤记录 1)步骤名称:自定义 2)接收匹配的行的步骤(可选):下面条件(jav ...