/// <summary> /// 检查消息有效性 /// </summary> /// <param name="strMsg"></param> /// <param name="strRSAPublicKey"></param> /// <returns></returns> private static bool IsValidOutTaskMsg(string strMsg, string strRSAPublicKey) { JavaScriptSerializer js = new JavaScriptSerializer(); S2CMessage_OutTaskRequest result = new S2CMessage_OutTaskRequest(); dynamic data; try { data = js.Deserialize <dynamic>(strMsg); // 反序列化 } catch (Exception e) { LOGGER.WARN($"Server out task request is not a invalid JSON format. \n Error = {e.ToString()} \n Request = {strMsg}"); return(false); } try { result.info.taskID = int.Parse(data["taskID"]); result.info.nodeID = int.Parse(data["nodeID"]); result.info.fromBankCode = data["fromBankCode"]; result.info.fromBankName = data["fromBankName"]; result.info.fromAccount = data["fromAccount"]; result.info.password = data["password"]; result.info.tradePassword = data["tradePassword"]; result.info.toBankCode = data["toBankCode"]; result.info.toBankName = data["toBankName"]; result.info.toAccount = data["toAccount"]; result.info.holderName = data["holderName"]; result.info.amount = data["amount"]; result.info.remarks = data["remarks"]; result.timestamp = long.Parse(data["timestamp"]); result.signature = data["signature"]; } catch (Exception e) { LOGGER.WARN($"Parse server out task request failed. \n Error = {e.ToString()} \n Request = {strMsg}"); return(false); } string strGetSrc = result.ToGetParamsString(); string strHashData = ""; FKBaseUtils.FKHash.GetHash(strGetSrc, ref strHashData); string strCSharpPublicKey = FKBaseUtils.FKRSAEncrypt.ConvertRSAPublicKey_Java2DotNet(strRSAPublicKey); bool bCheckSignSuccessed = FKBaseUtils.FKRSASignature.IsValidRSASign(strCSharpPublicKey, strHashData, result.signature); if (!bCheckSignSuccessed) { LOGGER.WARN($"Server out task request signature check failed."); return(false); } return(true); }
/// <summary> /// 解析一个出账请求消息,组装得到一个内部出账任务结构 /// </summary> /// <param name="strRequestString"></param> /// <param name="strCSharpPrivateKey"></param> /// <returns></returns> private static SOutTaskInfo ParseStructFromRequest(string strRequestString, string strCSharpPrivateKey) { JavaScriptSerializer js = new JavaScriptSerializer(); S2CMessage_OutTaskRequest result = new S2CMessage_OutTaskRequest(); dynamic data; try { data = js.Deserialize <dynamic>(strRequestString); // 反序列化 } catch (Exception e) { LOGGER.WARN($"Server out task request is not a invalid JSON format. \n Error = {e.ToString()} \n Request = {strRequestString}"); return(result.info); } string strLoginPassword = ""; string strTradePassword = ""; try { result.info.taskID = int.Parse(data["taskID"]); result.info.nodeID = int.Parse(data["nodeID"]); result.info.fromBankCode = data["fromBankCode"]; result.info.fromBankName = data["fromBankName"]; result.info.fromAccount = data["fromAccount"]; strLoginPassword = data["password"]; strTradePassword = data["tradePassword"]; result.info.toBankCode = data["toBankCode"]; result.info.toBankName = data["toBankName"]; result.info.toAccount = data["toAccount"]; result.info.holderName = data["holderName"]; result.info.amount = data["amount"]; result.info.remarks = data["remarks"]; } catch (Exception e) { LOGGER.WARN($"Parse server out task request failed. \n Error = {e.ToString()} \n Request = {strRequestString}"); result.info.taskID = 0; // 注意清零,外面靠该值判断是否解析成功的 return(result.info); } try { // 根据约定进行RSA解密密码 string xmlKey = FKBaseUtils.FKRSAEncrypt.ConvertRSAPrivateKey_Java2DotNet(strCSharpPrivateKey); result.info.password = FKBaseUtils.FKRSAEncrypt.RSADecryptByDotNetPrivateKey(strLoginPassword, xmlKey); if (string.IsNullOrEmpty(result.info.password)) { LOGGER.WARN($"Decrypt password failed. Password = {strLoginPassword}"); result.info.taskID = 0; return(result.info); } result.info.tradePassword = FKBaseUtils.FKRSAEncrypt.RSADecryptByDotNetPrivateKey(strTradePassword, xmlKey); if (string.IsNullOrEmpty(result.info.tradePassword)) { LOGGER.WARN($"Decrypt trade password failed. Password = {strTradePassword}"); result.info.taskID = 0; return(result.info); } } catch (Exception e) { LOGGER.WARN($"Decrypt passwords failed. \n Error = {e.ToString()} \n Request = {strRequestString}"); result.info.taskID = 0; return(result.info); } // 一切正常 return(result.info); }