@RestController
@Slf4j
public class CardCallBackController {
@Value("${card.callback.apiSecret:test}")
private String apiSecret;
@RequestMapping(value = "/profile/card/callback", method = RequestMethod.POST)
public DynamicDataCallbackResponseDTO callBack(HttpServletRequest request, @RequestBody(required = false) DynamicDataCallbackRequestDTO cardCallBackVO) {
String content = cardCallBackVO.getContent();
log.info(JSON.toJSONString(cardCallBackVO));
Long signatureTimestamp = Long.valueOf(request.getHeader("x-ddpaas-signature-timestamp"));
String signature = request.getHeader("x-ddpaas-signature");
String calcSignature = calcSignature(apiSecret, signatureTimestamp);
log.info("signature==>" + signature + ",calcSignature==>" + calcSignature);
// if (!calcSignature.equalsIgnoreCase(signature)) {
// log.warn("signature==>" + signature + ",calcSignature==>" + calcSignature);
// return null;
// }
DynamicDataSourceContextRequestDTO contextRequestDTO = JSON.parseObject(content, DynamicDataSourceContextRequestDTO.class);
String profile = contextRequestDTO.getDynamicDataSourceQueryRequests().get(0).getDynamicParams().get("profile");
JSONObject profileJsonObject = JSON.parseObject(profile);
String targetUserId = (String) profileJsonObject.get("userId");
JSONObject object = new JSONObject();
JSONArray data1 = new JSONArray();
data1.add(object);
DynamicDataCallbackResponseDTO responseDTO = new DynamicDataCallbackResponseDTO();
DynamicDataCallbackResponseDTO.DataSourceQueryResponseDTO sourceQueryResponseDTO = new DynamicDataCallbackResponseDTO.DataSourceQueryResponseDTO();
sourceQueryResponseDTO.setDynamicDataSourceId("ds.profile");
sourceQueryResponseDTO.setDynamicDataValueType(OpenDynamicDataValueTypeEnum.OBJECT);
JSONObject data = new JSONObject();
data.put("data1", data1);
sourceQueryResponseDTO.setData(JSON.toJSONString(data));
List<DynamicDataCallbackResponseDTO.DataSourceQueryResponseDTO> sourceQueryResponseDTOS = new ArrayList<>();
sourceQueryResponseDTOS.add(sourceQueryResponseDTO);
responseDTO.setDataSourceQueryResponses(sourceQueryResponseDTOS);
log.info(JSON.toJSONString(responseDTO));
return responseDTO;
}
public static String calcSignature(String apiSecret, long ts) {
try {
Mac mac = Mac.getInstance("HmacSHA256");
SecretKeySpec key = new SecretKeySpec(apiSecret.getBytes(), "HmacSHA256");
mac.init(key);
return Base64.getEncoder()
.encodeToString(mac.doFinal(Long.toString(ts).getBytes()));
} catch (NoSuchAlgorithmException | InvalidKeyException e) {
throw new RuntimeException("sign api secret failed", e);
}
}
}