springMVCはjson串と普通のkey-valuesパラメータを受け取ります。

99628 ワード

この理由を書いてください。米国団インターフェースとのドッキングには、フィードバックインターフェースが必要です。指定された方法で転送して暗号化します。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	int020305099:   
    					                    ,                 。
    					        。                  。
    					     “   ” “   ” ,            ,       ,  :      A     B,   B      ,                          ”
    			courier_name	String	 	     (   ,        ,         )
    			courier_phone	String	 	     (   ,        ,         )
    			cancel_reason_id	int	 	    id,                 --    -4.3,        
    			cancel_reason	String	 	      ,     256   
    			appkey	String	 	       appkey,       。
    			timestamp	longlong,   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	int020305099:   
    					                    ,                 。
    					        。                  。
    					     “   ” “   ” ,            ,       ,  :      A     B,   B      ,                          ”
    			courier_name	String	 	     (   ,        ,         )
    			courier_phone	String	 	     (   ,        ,         )
    			cancel_reason_id	int	 	    id,                 --    -4.3,        
    			cancel_reason	String	 	      ,     256   
    			appkey	String	 	       appkey,       。
    			timestamp	longlong,   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;
    	}