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 ...
随机推荐
- leaflet叠加图片图层
<!DOCTYPE html> <html> <head> <title>Layers Control Tutorial - Leaflet</t ...
- 小程序 image 高度自适应及裁剪问题
在做微信小程序的商品详情页,商品的详情是图片集合,渲染完成后发现图片加载的很不自然,后来我把样式设置宽度 100%,并对 image 组件添加属性 mode="widthFix"解 ...
- AIRIOT答疑第1期 | 零开发基础也能干物联网平台项目?
当然可以! 物联网低代码平台以零门槛.部署快.灵活性高.满足二次开发等特点,成为近两年来IOT服务的生力军.项目团队即使没有研发人员,也可以像拼乐高一样快速搭建物联网平台,功能全面,满足多数业务场景下 ...
- 基于ADB Shell 实现的 Android TV、电视盒子万能遥控器 — ADB Remote ATV
ADB Remote ATV Android TV 的遥控器,基于 ADB Shell 命令 ADB Remote ATV 是一个 Android TV 的遥控器,基于 ADB Shell 命令,泛用 ...
- Must use PackageReference 解决办法
Must use PackageReference 这是因为 .net framework的项目 在nuget时,引用到了 .net core 下的包. 解决办法,把之前引用的相关包全部在nuget上 ...
- ceph客户端配置自动挂载存储服务
1. 安装支持ceph的内核模块 可选: centos/ubuntu: yum install -y ceph-common 或 apt install -y ceph-common 2. 拷贝认证密 ...
- Java 集合的概念
目录 集合 单列集合(Collection) Collection中的一些方法 public static < T > boolean addAll(Collection<? sup ...
- react路由渲染
三种渲染方式 component = (组件对象或函数) <Route path="/home" component={Home} /> 或 <Route pat ...
- ETL工具-nifi干货系列 第十四讲 nifi处理器QueryDatabaseTableRecord查询表数据实战教程
1.处理器QueryDatabaseTableRecord和处理器QueryDatabaseTable比较相似,该组件生成一个 SQL 查询,或者使用用户提供的语句,并执行它以获取所有在指定的最大值列 ...
- kettle从入门到精通 第十二课 kettle java代码过滤记录、利用Janino计算Java表达式
1.下图通过简单的示例讲解了根据java代码过滤记录和利用Janino计算Java表达式两个组件. 2.根据java代码过滤记录 1)步骤名称:自定义 2)接收匹配的行的步骤(可选):下面条件(jav ...