springMVCはjson串と普通のkey-valuesパラメータを受け取ります。
この理由を書いてください。米国団インターフェースとのドッキングには、フィードバックインターフェースが必要です。指定された方法で転送して暗号化します。https://peisong.meituan.com/open/doc#section1-1 API呼び出しプロトコル-呼び出しフロー インターフェースパラメータ紹介
******************************************************************************
API
API, : > > HTTP > HTTP > HTTP > json
https://peisongopen.meituan.com/api
HTTPS
POST
application/x-www-form-urlencoded
UTF-8
application/json
UTF-8
{
"code": ,
"message": ,
"data":
}
API 。 API 。
: , appkey, , ,
: API
appkey String appkey, 。 appkey secret, 。 secret, 。 secret , 。
timestamp long , long, GMT+8, Epoch(1970 1 1 ) (unix-timestamp)。 10 ( - < 10 )。
version String API , :1.0。
sign String API 。
API 。
3安全規範-署名アルゴリズム
API , API , , , 。
1) ( sign,byte[] )
2) 1 1 2 2... , a=&c=3&b=1, b1c3, utf-8
3) secret + ,
4) sha1 ,
5) sign
secret: test
:
appkey=test
timestamp=1477395862
version=1.0
:
number=123
string=
double=123.123
boolean=true
empty=
testappkeytestbooleantruedouble123.123number123string timestamp1477395862version1.0
sha1 sign
8943ba698f4b009f80dc2fd69ff9b313381263bd
java ,
//
Set keySet = paramMap.keySet();
List keyList = new ArrayList<>(keySet);
Collections.sort(keyList);
//
StringBuilder signStr = new StringBuilder();
for (String key : keyList) {
if (key.equals( "sign" )) {
continue ;
}
Object value = paramMap.get(key);
if (value == null || (value.getClass().isArray() && byte . class .isAssignableFrom(value.getClass().getComponentType()))) {
continue ;
}
String valueString = value.toString();
if (StringUtils.isEmpty(valueString)) {
continue ;
}
signStr.append(key).append(value);
}
// SHA1
String sign = SHA1Util.Sha1( "test" + signStr.toString()).toLowerCase();
注文状況のフィードバック******************************************************************************
, url 。
: url 80 8080
。 appkey secret 。
http 200 {"code":0} ,
, 10 5 ,
5 , , 。
:post
:application/x-www-form-urlencoded
******************************************************************************
誤った使用は、米国のグループはフィードバックを受信できませんでした。/**
* 1.
* @param jsonParam
* @return
* @author wenjian,2019-05-22
* @see CallBack=CB=
*/
@ResponseBody
@RequestMapping(value="/orderStatusCallBack"
,method = RequestMethod.POST,produces = "application/x-www-form-urlencoded")
public String orderStatusCallBack(HttpServletRequest request
,String delivery_id ,String mt_peisong_id ,String order_id ,int status ,String courier_name
,String courier_phone ,int cancel_reason_id ,String cancel_reason
,String appkey ,long timestamp ,String sign ,String version) {
Date dateBeign = new Date();
String outData = "";//
String inData = "";//
LinkedHashMap<String, Object> returnDataMap = new LinkedHashMap<String, Object>();// Map
String returnStr = "";// json
String logStatus = CommonConstant.CODE_FAIL;
String apiInfo [] = {CommonConstant.API_SOURCE_MEITUAN,"orderStatusCallBack","[ ]1. "};// , ,
//*******************************************************************************************
String clientIp = IPUtil.getIP(request);
String methodMsg = "1. ";
String method = "orderStatusCallBack" + "[" + methodMsg + "]";
String uuid = UUIDUtil.getUUIDUpperCase();
String methodName = method + "[" + uuid + "]";
int codeValue = Integer.valueOf(CommonConstant.CODE_FAIL);//
inData = "{delivery_id:" + delivery_id + "}" + ",{mt_peisong_id:" + mt_peisong_id + "}" + ",{order_id:"+ order_id + "}"
+ ",{status:"+ status + "}"+ ",{courier_name:"+ courier_name + "}"
//****************************************************************************************
+ ",{courier_phone:"+ courier_phone + "}"+ ",{cancel_reason_id:"+ cancel_reason_id + "}"+ ",{cancel_reason:"+ cancel_reason + "}"
//****************************************************************************************
+ ",{appkey:"+ appkey + "}"+ ",{timestamp:"+ timestamp + "}"+ ",{sign:"+ sign + "}" + ",{version:"+ version + "}";
log.info(methodName + "begin[ip:" + clientIp + "]" + " :" + inData);
try {
/** delivery_id long
mt_peisong_id String id, 32
order_id String , 32
status int , 0: 20: 30: 50: 99:
, 。
。 。
“ ” “ ” , , , : A B, B , ”
courier_name String ( , , )
courier_phone String ( , , )
cancel_reason_id int id, -- -4.3,
cancel_reason String , 256
appkey String appkey, 。
timestamp long , long, GMT+8, Epoch(1970 1 1 ) , unix-timestamp。
sign String */
Map<String,Object> dataMap = new HashMap<String,Object>();
if( null != delivery_id && delivery_id.trim().length() != 0) {
dataMap.put("delivery_id", delivery_id);
}
if( null != mt_peisong_id && mt_peisong_id.trim().length() != 0) {
dataMap.put("mt_peisong_id", mt_peisong_id);
}
if( null != order_id && order_id.trim().length() != 0) {
dataMap.put("order_id", order_id);
}
dataMap.put("status", status);
if( null != courier_name && courier_name.trim().length() != 0) {
dataMap.put("courier_name", courier_name);
}
//***************************************************************************
if( null != courier_phone && courier_phone.trim().length() != 0) {
dataMap.put("courier_phone", courier_phone);
}
dataMap.put("cancel_reason_id", cancel_reason_id);
if( null != cancel_reason && cancel_reason.trim().length() != 0) {
dataMap.put("cancel_reason", cancel_reason);
}
//***************** *****************************************
if( null != appkey && appkey.trim().length() != 0) {
dataMap.put("appkey", appkey);
}
dataMap.put("timestamp", timestamp);
if( null != version && version.trim().length() != 0) {
dataMap.put("version", version);
}
//***************** *****************************************
Map<String,Object> meiTuanConfigMap = getMeiTuanConfig(uuid);
String secretDB = (String) meiTuanConfigMap.get("secret");
String appkeyDB = (String) meiTuanConfigMap.get("appkey");
String phoneDB = (String) meiTuanConfigMap.get("phone");
log.info(" [" + phoneDB + "]"+" key:[" + appkeyDB + "], appkey:" + "[" + appkey +"]," + (appkeyDB.equals(appkey)?" ":" "));
String signNew = MeiTuanSignHelper.generateSign(uuid,dataMap, secretDB );
boolean isSameSign = signNew.equals(sign);//
log.info(methodName + "signNew{"+ signNew + "},sign{" + sign + "}," + isSameSign + "," + (isSameSign?" ":" "));
if(isSameSign) {
//
codeValue = Integer.valueOf(CommonConstant.CODE_SUCCESS);
logStatus = CommonConstant.CODE_SUCCESS;
}else {
//
}
}catch (Exception e) {
e.printStackTrace();
log.error(methodName + ", ",e);
if(e instanceof CommonCheckedParamException) {
}
}catch (Error e) {
e.printStackTrace();
log.error(methodName + "[ Error ]",e);
}finally {
returnDataMap.put(CommonConstant.CODE, codeValue);
returnStr = JSON.toJSONString(returnDataMap);
outData = returnStr;
InterfaceLogsDto logDto = DtoUtil.getInterfaceLogsDto(apiInfo[0], clientIp, apiInfo[1], apiInfo[2], dateBeign, inData,outData, logStatus);
interfaceService.addLog(uuid, logDto);
}
log.info(methodName + ",end, :" + returnStr);
return returnStr;
}
1.普通のjsonの形/**
* [ ]
* @param jsonParam
* @return
* @author wenjian,2019-05-22
*/
@ResponseBody
@RequestMapping(value="/getGoodsCategoryList"
,method = RequestMethod.POST,produces = "application/json;charset=UTF-8")
public String getGoodsCategoryList(HttpServletRequest request,@RequestBody String jsonParam) {
String clientIp = IPUtil.getIP(request);
String methodMsg = " ";
String method = "getGoodsCategoryList" + "[" + methodMsg + "]";
String uuid = UUIDUtil.getUUIDUpperCase();
String methodName = method + "[" + uuid + "]";
log.info(methodName + "begin[ip:" + clientIp + "]" + " :" + jsonParam);
String codeValue = CommonConstant.CODE_FAIL;//
String msgValue = CommonConstant.MSG_VALUE_FAIL;//
String msgDetailValue = "";
List<GoodsCategoryDto> dtoList = new ArrayList<GoodsCategoryDto>();
int total = 0;
try {
JSONObject jsonObject =JSONObject.parseObject(jsonParam);
//------ tokenInfo -------
ServiceUtil.checkTokenInfoHead(jsonObject);
JSONObject tokenInfo = (JSONObject) jsonObject.get("tokenInfo");//
String channelId = String.valueOf(tokenInfo.get("channelId"));// code
String tockenTimestamp = String.valueOf(tokenInfo.get("tockenTimestamp"));//tockenTimestamp;
String token = String.valueOf(tokenInfo.get("token"));//
//**************************************
//******************** ********************
List<Map<String,Object>> channelKeyInfoList = interfaceService.getChannelKeyInfo(uuid);
String channelKey = ServiceUtil.getChannelKey(uuid,channelId,channelKeyInfoList);
String md5Input = channelId + tockenTimestamp + channelKey;
ServiceUtil.checkMD5(md5Input, token);
/********** - **********************/
String queryDateBegin = CommonStringUtil.getStringValueByFastjson(jsonObject.get("queryDateBegin"));// :
String queryDateEnd = CommonStringUtil.getStringValueByFastjson(jsonObject.get("queryDateEnd"));// :
ServiceUtil.checkedTimestamp(queryDateBegin);
ServiceUtil.checkedTimestamp(queryDateEnd);
Map<String,Object> paraMap = new HashMap<String,Object>();
paraMap.put("queryDateBegin", queryDateBegin);
paraMap.put("queryDateEnd", queryDateEnd);
dtoList = goodsCategoryService.getGoodsCategoryList(uuid, paraMap);
total = dtoList.size();
codeValue = CommonConstant.CODE_SUCCESS;
msgValue = CommonConstant.MSG_VALUE_SUCCESS;
msgDetailValue = methodMsg + ", ";
}catch (CommonCheckedParamException e) {
e.printStackTrace();
msgDetailValue = methodMsg + ", !" + e.getMessage();
log.error(methodName + " ",e);
}catch (Exception e) {
e.printStackTrace();
msgDetailValue = methodMsg + ", !" + e.getMessage();
log.error(methodName + " ",e);
}catch (Error e) {
e.printStackTrace();
msgDetailValue = methodMsg + ", ![ Error ]" + e.getMessage();
log.error(methodName + "[ Error ]",e);
}
LinkedHashMap<String, Object> dataMap = new LinkedHashMap<String, Object>();//
dataMap.put(CommonConstant.CODE, codeValue);
dataMap.put(CommonConstant.MSG, msgValue);
dataMap.put(CommonConstant.MSG_DETAIL, msgDetailValue);
dataMap.put(CommonConstant.TOTAL, total);
dataMap.put(CommonConstant.DATA, dtoList);
String returnStr = JSON.toJSONString(dataMap);
log.info(methodName + ",end, :" + ServiceUtil.getResponseMsg(codeValue, total,dataMap));
return returnStr;
}
2.key-value形式-例えば米団の要求に対する回答/**
* 1.
* @param jsonParam
* @return
* @author wenjian,2019-05-22
* @see CallBack=CB=
*/
@ResponseBody
@PostMapping(value = "/orderStatusCallBack")
public String orderStatusCallBack(HttpServletRequest request ,@RequestParam Map<String, Object> paramMap) {
String clientIp = IPUtil.getIP(request);
String methodMsg = "1. ";
String method = "orderStatusCallBack" + "[" + methodMsg + "]";
String uuid = UUIDUtil.getUUIDUpperCase();
String methodName = method + "[" + uuid + "]";
log.info(methodName + "begin[ip:" + clientIp + "]" + " :" + JSON.toJSONString(paramMap));
//*********************** ,begin **********************************************************************
String delivery_id = paramMap.containsKey("delivery_id") ? paramMap.get("delivery_id").toString():"";
String mt_peisong_id = paramMap.containsKey("mt_peisong_id") ? paramMap.get("mt_peisong_id").toString():"";
String order_id = paramMap.containsKey("order_id") ? paramMap.get("order_id").toString():"";
int status = paramMap.containsKey("status") ? Integer.valueOf(paramMap.get("status").toString()):INT_DEFAULT_NULL;
String courier_name = paramMap.containsKey("courier_name") ? paramMap.get("courier_name").toString():"";
String courier_phone = paramMap.containsKey("courier_phone") ? paramMap.get("courier_phone").toString():"";
int cancel_reason_id = paramMap.containsKey("cancel_reason_id") ? Integer.valueOf(paramMap.get("cancel_reason_id").toString()):INT_DEFAULT_NULL;
String cancel_reason = paramMap.containsKey("cancel_reason") ? paramMap.get("cancel_reason").toString():"";
String appkey = paramMap.containsKey("appkey") ? paramMap.get("appkey").toString():"";
long timestamp = paramMap.containsKey("timestamp") ? Long.valueOf(paramMap.get("timestamp").toString()):LONG_DEFAULT_NULL;
String sign = paramMap.containsKey("sign") ? paramMap.get("sign").toString():"";
String version = paramMap.containsKey("version") ? paramMap.get("version").toString():"";
//*********************** ,begin **********************************************************************
Date dateBeign = new Date();
String outData = "";//
String inData = "";//
LinkedHashMap<String, Object> returnDataMap = new LinkedHashMap<String, Object>();// Map
String returnStr = "";// json
String logStatus = CommonConstant.CODE_FAIL;
String apiInfo [] = {CommonConstant.API_SOURCE_MEITUAN,"orderStatusCallBack","[ ]1. "};// , ,
//*******************************************************************************************
int codeValue = Integer.valueOf(CommonConstant.CODE_FAIL);//
inData = "{delivery_id:" + delivery_id + "}" + ",{mt_peisong_id:" + mt_peisong_id + "}" + ",{order_id:"+ order_id + "}"
+ ",{status:"+ status + "}"+ ",{courier_name:"+ courier_name + "}"
//****************************************************************************************
+ ",{courier_phone:"+ courier_phone + "}"+ ",{cancel_reason_id:"+ cancel_reason_id + "}"+ ",{cancel_reason:"+ cancel_reason + "}"
//****************************************************************************************
+ ",{appkey:"+ appkey + "}"+ ",{timestamp:"+ timestamp + "}"+ ",{sign:"+ sign + "}" + ",{version:"+ version + "}";
log.info(methodName + "begin[ip:" + clientIp + "]" + " :" + inData);
inData = JSON.toJSONString(paramMap);
try {
/** delivery_id long
mt_peisong_id String id, 32
order_id String , 32
status int , 0: 20: 30: 50: 99:
, 。
。 。
“ ” “ ” , , , : A B, B , ”
courier_name String ( , , )
courier_phone String ( , , )
cancel_reason_id int id, -- -4.3,
cancel_reason String , 256
appkey String appkey, 。
timestamp long , long, GMT+8, Epoch(1970 1 1 ) , unix-timestamp。
sign String */
Map<String,Object> dataMap = new HashMap<String,Object>();
if( null != delivery_id && delivery_id.trim().length() != 0) {
dataMap.put("delivery_id", delivery_id);
}
if( null != mt_peisong_id && mt_peisong_id.trim().length() != 0) {
dataMap.put("mt_peisong_id", mt_peisong_id);
}
if( null != order_id && order_id.trim().length() != 0) {
dataMap.put("order_id", order_id);
}
if(status!= INT_DEFAULT_NULL) {
dataMap.put("status", status);
}
if( null != courier_name && courier_name.trim().length() != 0) {
dataMap.put("courier_name", courier_name);
}
//***************************************************************************
if( null != courier_phone && courier_phone.trim().length() != 0) {
dataMap.put("courier_phone", courier_phone);
}
if(cancel_reason_id != INT_DEFAULT_NULL) {
dataMap.put("cancel_reason_id", cancel_reason_id);
}
if( null != cancel_reason && cancel_reason.trim().length() != 0) {
dataMap.put("cancel_reason", cancel_reason);
}
//***************** *****************************************
if( null != appkey && appkey.trim().length() != 0) {
dataMap.put("appkey", appkey);
}
if(timestamp != LONG_DEFAULT_NULL) {
dataMap.put("timestamp", timestamp);
}
if( null != version && version.trim().length() != 0) {
dataMap.put("version", version);
}
//***************** *****************************************
Map<String,Object> meiTuanConfigMap = getMeiTuanConfig(uuid);
String secretDB = (String) meiTuanConfigMap.get("secret");
String appkeyDB = (String) meiTuanConfigMap.get("appkey");
String phoneDB = (String) meiTuanConfigMap.get("phone");
log.info(" [" + phoneDB + "]"+" key:[" + appkeyDB + "], appkey:" + "[" + appkey +"]," + (appkeyDB.equals(appkey)?" ":" "));
String signNew = MeiTuanSignHelper.generateSign(uuid,dataMap, secretDB );
boolean isSameSign = signNew.equals(sign);//
log.info(methodName + "signNew{"+ signNew + "},sign{" + sign + "}," + isSameSign + "," + (isSameSign?" ":" "));
if(isSameSign) {
//
codeValue = Integer.valueOf(CommonConstant.CODE_SUCCESS);
logStatus = CommonConstant.CODE_SUCCESS;
}else {
//
}
}catch (Exception e) {
e.printStackTrace();
log.error(methodName + ", ",e);
if(e instanceof CommonCheckedParamException) {
}
}catch (Error e) {
e.printStackTrace();
log.error(methodName + "[ Error ]",e);
}finally {
returnDataMap.put(CommonConstant.CODE, codeValue);
returnStr = JSON.toJSONString(returnDataMap);
outData = returnStr;
InterfaceLogsDto logDto = DtoUtil.getInterfaceLogsDto(apiInfo[0], clientIp, apiInfo[1], apiInfo[2], dateBeign, inData,outData, logStatus);
interfaceService.addLog(uuid, logDto);
}
log.info(methodName + ",end, :" + returnStr);
return returnStr;
}