public bool Transfer(DebitUserRecord record, out string errMsg) { Redis redis = new Redis(); errMsg = String.Empty; string key = String.Format("lock_{0}", record.debitId); string retKey = String.Format("release_{0}", record.debitId); if (redis.LockTake(key, record.debitId, 300)) { try { string transferResult = redis.StringGet(retKey); if (!String.IsNullOrEmpty(transferResult)) { InquiryResponse response = JsonConvert.DeserializeObject <InquiryResponse>(transferResult); if (response.responseCode == "00") { Log.WriteDebugLog("LoanBank::Transfer", "[{0}]早已转帐成功:{1}", record.debitId, response.responseDesc); return(true); } } else { HttpHelper http = new HttpHelper(); Log.WriteDebugLog("LoanBank::Transfer", "[{0}] 准备转帐,查询银行信息。", record.debitId); //查询,验证转帐的银行信息 InquiryResponse response = null; response = DuitkuInquiryRequest(record); Log.WriteDebugLog("LoanBank::Transfer", "[{0}] 核对银行帐号信息:{1}", record.debitId, JsonConvert.SerializeObject(response)); if (response.responseCode == "00") { Log.WriteDebugLog("LoanBank::Transfer", "[{0}] 核对银行帐号信息,返回成功。", record.debitId); Log.WriteDebugLog("LoanBank::Transfer", "[{0}] 核对帐户名称,record:{1} ,response:{2}", record.debitId, record.userName.Trim().ToUpper(), response.accountName.Trim().ToUpper()); string bankUserName = response.accountName.Replace(" ", "").Trim().ToUpper(); string recordUserName = record.userName.Replace(" ", "").Trim().ToUpper(); ///相似度匹配 float rate = HttpHelper.Levenshtein(bankUserName, recordUserName); if (bankUserName.IndexOf(recordUserName) > -1 || rate >= 0.7) { Log.WriteDebugLog("LoanBank::Transfer", "[{0}] 帐户名称正确,初使化请求准备转帐。相似度:{1}%", record.debitId, rate * 100); TransferRequest transferRequest = new TransferRequest(); transferRequest.accountName = record.userName.ToUpper(); transferRequest.amountTransfer = response.amountTransfer; transferRequest.bankCode = response.bankCode.Trim(); transferRequest.custRefNumber = response.custRefNumber.Trim(); transferRequest.disburseId = response.disburseId; transferRequest.purpose = record.purpose; transferRequest.bankAccount = record.bankAccount; transferRequest.InitSingature(record.target); Log.WriteDebugLog("LoanBank::Transfer", "[{0}] 开始转帐,渠道为:{1},请求参数为:{2}", record.debitId, record.target, JsonConvert.SerializeObject(transferRequest)); response = http.DuitkuTransferRequest(transferRequest); Log.WriteDebugLog("LoanBank::Transfer", "[{0}] 转帐结果为:{1}", record.debitId, JsonConvert.SerializeObject(response)); if (response.responseCode == "00") { Log.WriteDebugLog("LoanBank::Transfer", "[{0}] 转帐成功,将结果写入缓存,30天内避免重复打款。:{1}", record.debitId, response.responseDesc); redis.StringSet(retKey, JsonConvert.SerializeObject(response), 60 * 60 * 24 * 30); return(true); } else { errMsg = String.Format("{0}({1})", response.responseDesc, response.responseCode); Log.WriteErrorLog("LoanBank::Transfer", "[{0}] 转帐失败:{1}", record.debitId, response.responseDesc); return(false); } } else { Log.WriteErrorLog("LoanBank::Transfer", "[{0}] 银行卡对应的名字与用户填写的名字不同:{1}!={2},相似度:{3}", record.debitId, bankUserName, recordUserName, rate); errMsg = String.Format("Bank Information Incorrect.accountName:{0} incorrect.", record.userName); return(false); } } else { errMsg = String.Format("{0}({1})", response.responseDesc, response.responseCode); Log.WriteErrorLog("LoanBank::Transfer", "[{0}] 转帐失败:{1}", record.debitId, response.responseDesc); return(false); } } } catch (Exception ex) { Log.WriteErrorLog("LoanBank::Transfer", "[{0}] 转帐失败,发生异常,渠道:{1}, {2}", record.debitId, record.target, ex.Message); } finally { redis.LockRelease(key, record.debitId); } return(false); } else { errMsg = "get lock fail."; return(false); } }