Esempio n. 1
0
    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);
        }
    }