spc-kiosk-pb/Kiosk/Payments/SPC.Kiosk.Payments/posLastPayments.cs

1133 lines
48 KiB
C#
Raw Permalink Normal View History

2019-06-16 05:12:09 +00:00

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using Cosmos.BaseFrame;
using Cosmos.UserFrame;
using Cosmos.ServiceProvider;
using Cosmos.Common;
using Cosmos.CommonManager;
using System.Threading;
using SPC.Kiosk.Popup.Model;
using SPC.Kiosk.Common;
using System.Collections;
namespace SPC.Kiosk.Payments
{
/// <summary>
/// 통신사 할인 승인
/// </summary>
public class posLastPayments : IDisposable
{
//UserLog.WriteLogFile(UserCom.LOG_ERROR, "SPC.Kiosk.Payments", "posLastPayments.?", "Exception." + ex.Message);
#region [ Members ]
public enum ErrorCode
{
LastPaymentsCardNumberError,
LastPaymentsEncrtipError,
LastPaymentsNotInitailzedError,
LastPaymentsProcessingTimeOut,
LastPaymentsUnknownError,
LastPaymentsCardReadingError
}
/// <summary>
/// ErrorMessage Event
/// </summary>
/// <param name="LogString">반환 로그</param>
public delegate void ErrorMessageEventHandler(string ErrorString);
/// <summary>
/// 로그메세지 이벤트 반환용
/// </summary>
public event ErrorMessageEventHandler ErrorMessageEvent;
/// <summary>
/// Error 반환 Event
/// </summary>
/// <param name="errorCode">반환 Error Code</param>
public delegate void LogErrorHandler(ErrorCode errorCode);
/// <summary>
/// Error Code 이벤트 반환용
/// </summary>
public event LogErrorHandler ErrorEvent;
/// <summary>
/// IcReadStart Event
/// </summary>
/// <param name="sender"></param>
public delegate void IcReadStart(object sender);
/// <summary>
/// IcReadStart Event 반환용
/// </summary>
public event IcReadStart ReadStart;
/// <summary>
/// IcReadStart Event
/// </summary>
/// <param name="sender"></param>
public delegate void IcReadEnd(object sender);
/// <summary>
/// IcReadStart Event 반환용
/// </summary>
public event IcReadEnd ReadEnd;
/// <summary>
/// NeedSign Event
/// </summary>
/// <param name="sender"></param>
public delegate void NeedSignStart(object sender);
/// <summary>
/// NeedSign Event 반환용
/// </summary>
public event NeedSignStart SignStartEvent;
/// <summary>
/// NeedSignEnd Event
/// </summary>
/// <param name="sender"></param>
public delegate void NeedSignEnd(object sender);
/// <summary>
/// NeedSignEnd Event 반환용
/// </summary>
public event NeedSignEnd SignEndEvent;
private SManager sManager = null; // 이 객체를 통해 업무 Service 호출
private StateServer StateObject = null; // StateObject : StateServer Object (객체)
private PosStatus m_cPosStatus = null; // 기본정보 참조
private TranStatus m_cTrnStatus = null; // 거래정보 참조
private DeviceStatus m_cDevStatus = null; // 디바이스 관리
private PosOLEDevice.CallbackIc delegateReaderCardInfo; // IC리더 콜백(CardInfo)
private IDataProcessUs m_cDataService = null;
private IICReaderUs m_cDeviceICReader = null;
private IPaymentUs m_cSmilePay = null;
private IPaymentExpUs m_cHappyPoint = null; // 해피포인트 적립
private ICampaignUs m_cCampaingMain = null; // 캠페인 관리
private string m_sPosMenuKey = string.Empty;
private string m_sFallDiv; //FallBack구분
private string m_sIcChip; //IC CHIP DATA(EMV)
private string m_sSign; //사인 데이터
private string m_sTax; //세금
private double m_dCreditCardDcAtm = 0d; //카드할인금액
private string m_sCreditCardDcTy=string.Empty; //카드할인타입
//#15183 보안리더기 삼성페이 해피포인트 자동적립 기능 수정 start,phj
private string m_sMobileCode = "";
//#15183 보안리더기 삼성페이 해피포인트 자동적립 기능 수정 end,phj
/// <summary>
/// 입력구분
/// </summary>
private string m_InputType = string.Empty;
/// <summary>
/// 입력데이터
/// </summary>
private string m_sInPutData = string.Empty;
/// <summary>
/// 마스킹데이터
/// </summary>
private string m_sInMaskData = string.Empty;
/// <summary>
/// 카드데이터(암호화)
/// </summary>
private string m_sCardNo = string.Empty;
/// <summary>
/// 서비스코드
/// </summary>
private string m_sService = string.Empty;
/// <summary>
/// 처리 성공 여부
/// </summary>
private bool m_bProcessSuccess = false;
/// <summary>
/// POS 초기화 필요 유무
/// </summary>
public bool NeedInitModule { get; set; }
/// <summary>
/// 승인 수단
/// </summary>
public string CertifyKey { get; set; } = string.Empty;
public LastPaymentsType PaymentsType { get; set; }
public double Payment { get; set; } = 0d;
private bool ReadProcessEnd { get; set; } = false;
private bool icCallBack = false;
/// <summary>
/// Ic Reader CallBack Switch
/// </summary>
public bool IcCallBack
{
get { return icCallBack; }
set
{
if (value)
{
//m_cDeviceICReader.RegIcCallback(delegateReader);
try
{
string sApprID = PosMstManager.GetMstVan(ItemConst.TR_ITEM_ID.CREDITCARD_ITEM, ItemConst.TR_ITEM_ID.CREDITCARD.CREDIT_CARD, PosMst.MST_VAN.DATA.APPR_ID);
bool icR = m_cDeviceICReader.RegIcCallbackCardInfo(sApprID, m_cDataService.IntParse(Payment.ToString()), delegateReaderCardInfo);
icCallBack = value;
CommonLog.DebugLogWrite(this,"IcCallBack","RegIcCallbackCardInfo Success !!");
}
catch (Exception ex)
{
CommonLog.ErrorLogWrite(this,"IcCallBack","RegIcCallbackCardInfo Fail !!", string.Format("{0}\n{1}",ex.Message,ex.StackTrace));
}
}
}
}
public double PaymentsValue { get; protected set; } = 0d;
/// <summary>
/// Point 사용시 비번 필요 유무
/// </summary>
public bool NeedPassword { get; protected set; }
public long PaySEQ { get; protected set; }
/// <summary>
/// 인증 처리 성공 유무
/// </summary>
public bool ProcessOK
{
get { return m_bProcessSuccess; }
}
public bool IsTimeout
{
set
{
if (value)
{
ErrorEvent(ErrorCode.LastPaymentsProcessingTimeOut);
}
}
}
public bool SignEndStatus { get; set; }
public string SignData
{
get { return m_sSign; }
set { m_sSign = value; }
}
public double NoSignLimitAmount { get; set; } = 0d;
public string ReadBarcordNumber { get; set; } = string.Empty;
public bool SelfCashBill { get; protected set; } = false;
#endregion
#region [ Ctor && Dispose ]
/// <summary>
/// Ctor
/// </summary>
public posLastPayments()
{
try
{
sManager = new SManager();
StateObject = (StateServer)StateServer.GetInstance();
NeedInitModule = StateObject.POS == null
|| StateObject.TRAN == null
|| StateObject.DEVICE == null;
if (!NeedInitModule)
{
m_cPosStatus = (PosStatus)StateObject.POS; // POS 기본정보
m_cTrnStatus = (TranStatus)StateObject.TRAN; // POS 거래정보
m_cDevStatus = (DeviceStatus)StateObject.DEVICE;
m_cDeviceICReader = (IICReaderUs)sManager.InitServiceInstance(ServiceLists.AGENT_OLEDEVICE.DLL, ServiceLists.AGENT_OLEDEVICE.DEVICE_ICREADER);
delegateReaderCardInfo = new PosOLEDevice.CallbackIc(OnIcReaderCallBackCardInfo); // IC리더 콜백(CardInfo)
m_cDataService = (IDataProcessUs)sManager.InitServiceInstance(ServiceLists.ASV_DATA_PROCESS.DLL, ServiceLists.ASV_DATA_PROCESS.DATA_SERVICE);
m_cCampaingMain = (ICampaignUs)sManager.InitServiceInstance(ServiceLists.ASV_CAMPAIGN.DLL, ServiceLists.ASV_CAMPAIGN.CAMPAIGN_MAIN);
m_cSmilePay = (IPaymentUs)sManager.InitServiceInstance(ServiceLists.BSV_PAYMENT.DLL, ServiceLists.BSV_PAYMENT.SMAILPAY);
m_cHappyPoint = (IPaymentExpUs)sManager.InitServiceInstance(ServiceLists.BSV_PAYMENT.DLL, ServiceLists.BSV_PAYMENT.POINTHAPPYPOINT);
}
}
catch (Exception ex)
{
CommonLog.ErrorLogWrite(this, "Ctor" ,"Fail", string.Format("{0}\n{1}", ex.Message, ex.StackTrace));
}
}
/// <summary>
///
/// </summary>
public void Dispose()
{
try
{
ReadProcessEnd = true;
if (IcCallBack )
{
//m_cDeviceICReader.UnRegIcCallback();
m_cDeviceICReader.UnRegIcCallbackCardInfo();
IcCallBack = false;
}
InDataToZeroFill();
sManager = null;
StateObject = null;
m_cPosStatus = null; // POS 기본정보
m_cTrnStatus = null; // POS 거래정보
m_cDevStatus = null;
m_cDeviceICReader = null;
delegateReaderCardInfo = null;
m_cDataService = null;
}
catch (Exception ex)
{
CommonLog.ErrorLogWrite(this,"Dispose", "Fail", string.Format("{0}\n{1}", ex.Message, ex.StackTrace));
}
}
#endregion
#region [ Methods ]
public void StartCashBill(string _inputString, string _divType, double _cashAmount, double _taxAmount)
{
CommonLog.InfoLogWrite(this, "StartCashBill()", "Start");
try
{
m_bProcessSuccess = false;
SendReadStart();
//사업자인 경우 길10자리가 아니면 자진 발급을 위해 입력번호 삭제
if (_divType.Equals("1") && !_inputString.Length.Equals(10)) _inputString = string.Empty;
//개인(소극공제) 인 경우 6자리 이하면 자진 발급처리
if (_divType.Equals("0") && _inputString.Length < 6) _inputString = string.Empty;
if (string.IsNullOrEmpty(_inputString))
{
SelfCashBill = true;
_divType = "0"; //자진 발급은 개인(소득공제용만)
_inputString = CommonValue.CashReceiptDefaultNo;
}
m_sInPutData = EncryptedCashInputNo(_inputString, _divType);
if (string.IsNullOrEmpty(m_sInPutData))
{
SelfCashBill = true;
_divType = "0"; //자진 발급은 개인(소득공제용만)
_inputString = CommonValue.CashReceiptDefaultNo;
m_sInPutData = EncryptedCashInputNo(_inputString, _divType);
}
if (!string.IsNullOrEmpty(m_sInPutData))
{
int retry = 0;
do
{
CompleteTxtCashBilll(_inputString, _divType, _cashAmount, _taxAmount);
retry++;
if (!SelfCashBill)
{
if (retry.Equals(1))
{
//승인 실패시 자진 발급 재승인
SelfCashBill = true;
_divType = "0"; //자진 발급은 개인(소득공제용만)
_inputString = CommonValue.CashReceiptDefaultNo;
m_sInPutData = EncryptedCashInputNo(_inputString, _divType);
if (string.IsNullOrEmpty(m_sInPutData)) break;
}
else
{
break;
}
}
else
{
break;
}
} while (!m_bProcessSuccess && retry < 2);//1회만 재승인
}
SendReadEnd();
}
catch (Exception ex)
{
CommonLog.ErrorLogWrite(this, "StartCashBill()", "Fail !!", string.Format("{0}\n{1}", ex.Message, ex.StackTrace));
}
CommonLog.InfoLogWrite(this, "StartCashBill()", string.Format("End : Result={0}", ProcessOK ? "OK" : "Fail"));
}
private void CompleteTxtCashBilll(string inputString, string divType, double cashAmount, double taxAmount)
{
CommonLog.DebugLogWrite(this, "StartCashBill()", "Start");
var m_cCashBill = (IPaymentUs)sManager.InitServiceInstance(ServiceLists.BSV_PAYMENT.DLL, ServiceLists.BSV_PAYMENT.CASHBILL);
try
{
double dNetAmt = CmUtil.DoubleSubtraction(cashAmount, taxAmount);
string sIssueType = "0";
var sRet = m_cCashBill.SetPayment(new string[] { PosConst.POS_VAN_MASTER.INPUT_TYPE.VAN_KEYIN, m_sInPutData, dNetAmt.ToString(), taxAmount.ToString(), "0", cashAmount.ToString(), divType, sIssueType, "", "", "", "", "", "", m_sInMaskData, SelfCashBill ? "1" : "0" });
if (sRet != UserCom.RST_OK)
{
InDataToZeroFill();
m_bProcessSuccess = false;
if (sRet == null || sRet.Equals(UserCom.RST_ERR))
{
SendErrLogEvent(ErrorCode.LastPaymentsUnknownError);
}
else
{
SendErrorMessageEvent(sRet);
}
}
else
{
m_bProcessSuccess = true;
}
}
catch (Exception ex)
{
CommonLog.ErrorLogWrite(this, "CompleteTxtCashBilll()", "Fail !!", string.Format("{0}\n{1}", ex.Message, ex.StackTrace));
}
finally
{
m_cCashBill = null;
}
CommonLog.DebugLogWrite(this, "StartCashBill()", "End");
}
private string EncryptedCashInputNo(string sIndata,string divType)
{
string tmpEnc = "";
try
{
if (sIndata.Length == 18 && sIndata.StartsWith("15442020") == true)
{
sIndata = sIndata + "=";
}
//#20171024 START, PHJ
//DeviceICReader.cs로 결제코드,상세코드를 넘기기 위해서.
//해피포인트로 현금영수증 승인하는지 구분하기 위해서.
m_cDeviceICReader.PAY_WAY_CD = ItemConst.TR_ITEM_ID.ETC_INFO_ITEM;
m_cDeviceICReader.PAY_DTL_CD = ItemConst.TR_ITEM_ID.ETC_INFO.CASHBILL;
//#20171024 END, PHJ
//카드번호 처리 부분 임시 주석 2016-06-15
//#20170913 현금영수증, 포인트카드 마스킹 미적용 start
// "0"인 경우 마스킹 미처리
//기존
//tmpEnc = m_cDeviceICReader.GetEncryptedCardNo(sIndata).Trim();
//변경
tmpEnc = m_cDeviceICReader.GetEncryptedCardNo(sIndata, "0").Trim();
//#20170913 현금영수증, 포인트카드 마스킹 미적용 end
if (CmUtil.MidH(tmpEnc, 0, 2) == "00")
{
//#20170913 현금영수증, 포인트카드 마스킹 미적용 start
//기존
/*
// Mod, 2017.09.05, 전화번호 마스킹 변경 처리
//m_sMaskingCardNo = CmUtil.MidH(tmpEnc, 514, 37).Trim();
if (sIndata.Length == 10 || sIndata.Length == 11)
{
m_sMaskingCardNo = CmUtil.LeftH(sIndata, sIndata.Length - 4) + new string('*', 4);
}
else
{
m_sMaskingCardNo = CmUtil.MidH(tmpEnc, 514, 37).Trim();
}
*/
//변경
m_sInMaskData = CmUtil.MidH(tmpEnc, 514, 37).Trim();
//#20170913 현금영수증, 포인트카드 마스킹 미적용 end
m_sInPutData = m_sInMaskData;
//#20180426 현금영수증 마스킹 변경 및 영수증 문구 변경 start
//기존
/*
//#20170913 현금영수증, 포인트카드 마스킹 미적용 start
if (sIndata.Length == 10 || sIndata.Length == 11)
{
//#20171121 전화번호 길이와 마스킹 된 값의 길이와 다름. start, phj
//기존
//m_sMaskingCardNo = CmUtil.LeftH(m_sMaskingCardNo, m_sMaskingCardNo.Length - 4) + new string('*', 4);
//변경
m_sMaskingCardNo = CmUtil.LeftH(sIndata, 6) + new string('*', sIndata.Length - 6);
//#20171121 전화번호 길이와 마스킹 된 값의 길이와 다름. end, phj
}
else
{
m_sMaskingCardNo = CmUtil.MidH(m_sMaskingCardNo, 0, 6) + "********";
}
//#20170913 현금영수증, 포인트카드 마스킹 미적용 end
*/
//#20180426 현금영수증 마스킹 변경 및 영수증 문구 변경 end
//#20171024 지출증빙으로 발행시 입력한 자리수까지만 영수증상에 표시 되도록 수정 start
//10자리 입력시 spcnpos.dll로 암호화 처리시 6자리+'******' 로 변환이 되어 11자리 입력 한 것으로 보임
if (divType == "1")
{
m_sInMaskData = CmUtil.MidH(m_sInMaskData, 0, sIndata.Length);
}
//#20171024 지출증빙으로 발행시 입력한 자리수까지만 영수증상에 표시 되도록 수정 end
tmpEnc = CmUtil.MidH(tmpEnc, 2, 512).Trim();
}
else
{
tmpEnc = "";
//암호화 처리 실패!
CommonLog.ErrorLogWrite(this, "EncryptedCashInputNo()", "Fail !!");
}
}
catch (Exception ex)
{
tmpEnc = "";
CommonLog.ErrorLogWrite(this, "EncryptedCashInputNo()", "Fail !!", string.Format("{0}\n{1}", ex.Message, ex.StackTrace));
}
return tmpEnc;
}
/// <summary>
/// 최종 결제 처리
/// </summary>
/// <param name="_inputString"></param>
public void StartCertifyProcessing(LastPaymentsType _paymentsType, string _inputString, double _payments)
{
try
{
CommonLog.InfoLogWrite(this,"StartCertifyProcessing()","Start");
m_bProcessSuccess = false;
ReadBarcordNumber = string.Empty;
if (NeedInitModule)
{
SendReadStart();
Thread.Sleep(1000); //진행창 보이기 위한 딜레이
ErrorEvent(ErrorCode.LastPaymentsNotInitailzedError);
}
else
{
PaymentsType = _paymentsType;
Payment = _payments;
m_cTrnStatus.Head.TradeDiv = ItemConst.TRAN_DIV.NORMAL;
switch(PaymentsType)
{
case LastPaymentsType.IcCard:
case LastPaymentsType.SsLgPay:
ReadProcessEnd = false;
IcCallBack = true;
while (!ReadProcessEnd) ;
if (!string.IsNullOrEmpty(m_sInPutData))
{
CompleteTxtInPut();
}
else
{
SendErrLogEvent(ErrorCode.LastPaymentsCardReadingError);
}
break;
case LastPaymentsType.HappyGift:
ReadProcessEnd = false;
IcCallBack = true;
while (!ReadProcessEnd && string.IsNullOrEmpty(ReadBarcordNumber)) ;
if (!ReadProcessEnd)
{
if (IcCallBack)
{
m_cDeviceICReader.UnRegIcCallbackCardInfo();
IcCallBack = false;
}
ReadProcessEnd = true;
}
else
{
ReadBarcordNumber = string.Empty;
}
if (!string.IsNullOrEmpty(ReadBarcordNumber))
{
m_InputType = PosConst.POS_VAN_MASTER.INPUT_TYPE.VAN_SWIP;
m_sInMaskData = _inputString;
m_sInPutData = _inputString + "=";
if (EncryptedCardNo(m_sInPutData, ref m_sInMaskData, ref m_sCardNo))
{
CompleteTxtInPut();
}
else
{
SendErrLogEvent(ErrorCode.LastPaymentsEncrtipError);
}
}
else
{
if (!string.IsNullOrEmpty(m_sInPutData))
{
CompleteTxtInPut();
}
else
{
SendErrLogEvent(ErrorCode.LastPaymentsCardReadingError);
}
}
break;
case LastPaymentsType.CashBee:
case LastPaymentsType.Tmoney:
case LastPaymentsType.SpcEmployee:
SendReadStart();
SendErrLogEvent(ErrorCode.LastPaymentsUnknownError);
break;
case LastPaymentsType.SmilePay:
case LastPaymentsType.AliPay:
case LastPaymentsType.ZeroPay:
//SendReadStart();
if (_inputString.Replace("=", "").Replace("@", "").Length.Equals(16))
{
m_InputType = PosConst.POS_VAN_MASTER.INPUT_TYPE.VAN_SWIP;
m_sInMaskData = _inputString;
m_sInPutData = _inputString + "=";
if (EncryptedCardNo(m_sInPutData, ref m_sInMaskData, ref m_sCardNo))
{
CompleteTxtInPut();
}
else
{
SendErrLogEvent(ErrorCode.LastPaymentsEncrtipError);
}
}
else
{
SendErrLogEvent(ErrorCode.LastPaymentsCardNumberError);
}
break;
}
}
CommonLog.DebugLogWrite(this,"StartCertifyProcessing()","m_cDeviceICReader.Init_ICReader Before");
m_cDeviceICReader.Init_ICReader(" ");
CommonLog.DebugLogWrite(this, "StartCertifyProcessing()", "m_cDeviceICReader.Init_ICReader After");
SendReadEnd();
CommonLog.InfoLogWrite(this, "StartCertifyProcessing()", string.Format("End : Result={0}", ProcessOK ? "OK" : "Fail"));
}
catch (Exception ex)
{
CommonLog.ErrorLogWrite(this, "StartCertifyProcessing()","Fail !!", string.Format("{0}\n{1}", ex.Message, ex.StackTrace));
}
}
/// <summary>
/// 휴대폰 번호 형식 확인
/// </summary>
/// <param name="sInputData"></param>
/// <returns></returns>
private bool IsCellularPhoneNumber(string sInputData)
{
bool bRet = false;
try
{
if (sInputData.Length == 10 || sInputData.Length == 11)
{
if (sInputData.StartsWith("010") == true || sInputData.StartsWith("011") == true || sInputData.StartsWith("017") == true ||
sInputData.StartsWith("016") == true || sInputData.StartsWith("018") == true || sInputData.StartsWith("019") == true)
{
bRet = true;
}
}
}
catch
{
bRet = false;
}
return bRet;
}
/// <summary>
/// 승인 전문 처리
/// </summary>
private void CompleteTxtInPut()
{
CommonLog.DebugLogWrite(this, "CompleteTxtInPut()", "Start");
string sRet = UserCom.RST_ERR;
object m_cPayments = null;
object m_cPaymentsGift = null;
try
{
m_bProcessSuccess = false;
switch (PaymentsType)
{
case LastPaymentsType.IcCard:
case LastPaymentsType.SsLgPay:
//0:마스킹 카드번호 1:입력구분 2:카드번호 3:할부개월 4:총금액 5:봉사료
//6:세금 7:비밀번호 8:신용카드종류 9:칩데이터 10:사인
//11:Fallback구분 12:제휴할인금액(캠페인) 13:원승인번호 14:원승인일자 15:아이템코드
//16:매입사코드 17:매입사명 18:할인카드구분 19:할인금액
//20:승인구분 21:매체구분 22:서비스코드
// 캠페인 처리 => 키값(취소시사용),카드번호,캠페인대상,지불구분,지불금액
ArrayList alPayItem = (ArrayList)StateObject.GetItemObject(Column.TR_PAYMENT.ITEM);
double nDisAmt = m_cCampaingMain.ExecuteCampaignPayment(alPayItem.Count.ToString(), m_sCardNo + "0", ItemConst.CPI_CUST_PAY_TYPE.CREDTCARD, Payment);
var lastPayment = CmUtil.DoubleSubtraction(Payment, nDisAmt);
m_sSign = string.Empty;
if (NoSignLimitAmount > 0 && lastPayment > NoSignLimitAmount)
{
SignEndStatus = false;
SignStart();
while (!SignEndStatus) ;
SignEnd();
}
m_sTax = m_cDataService.GetPaymentAmtVAT(lastPayment).ToString();
m_cPayments = sManager.InitServiceInstance(ServiceLists.BSV_PAYMENT.DLL, ServiceLists.BSV_PAYMENT.CREDITCARD);
m_cPaymentsGift = sManager.InitServiceInstance(ServiceLists.BSV_PAYMENT.DLL, ServiceLists.BSV_PAYMENT.HPGIFTCARD);
if (m_cPayments is IPaymentUs paymentUs)
{
// 해피기프트카드 체크 2019.04.25
//string[] aRet = new string[4];
//string m_sCardDiv = "";
//sRet = paymentUs.SearchPayment(new string[] { PosConst.CREDITCARD_SEARCH_TYPE.PREFIX, CmUtil.MidH(m_sInMaskData, 0, 6).ToString() }, ref aRet);
//if (sRet == UserCom.RST_OK)
//{
// m_sCardDiv = aRet[0].Trim();
//}
//else
//{
// InDataToZeroFill();
// m_bProcessSuccess = false;
// if (!sRet.Equals(UserCom.RST_ERR)) SendErrorMessageEvent(sRet);
//}
////해피기프트카드 체크 끝
//sRet = UserCom.RST_ERR;
//if (aRet[0].Trim() == "C" )//&& aRet[2] == "98")
//{
// // 해피기프트(신)
// if (m_cPaymentsGift is IPaymentUs paymentUsGift)
// {
// sRet = paymentUsGift.SetPayment(new string[] {
// /*0*/m_sInMaskData, /*1*/m_InputType, /*2*/m_sCardNo, /*3*/"00", /*4*/Payment.ToString(), /*5*/"0"
// , /*6*/m_sTax, /*7*/"", /*8*/"", /*9*/m_sIcChip, /*10*/""
// , /*11*/m_sFallDiv, /*12*/"0",/*13*/"",/*14*/"",/*15*/""
// , /*16*/"",/*17*/"",/*18*/"", /*19*/m_dCreditCardDcAtm.ToString()
// , /*20*/ItemConst.PAY_APP_DIV.NORMAL, /*21*/"", /*22*/m_sService });
// }
//}
//else
//{
sRet = paymentUs.SetPayment(new string[] {
/*0*/m_sInMaskData, /*1*/m_InputType, /*2*/m_sCardNo, /*3*/"00", /*4*/lastPayment.ToString(), /*5*/"0"
, /*6*/m_sTax, /*7*/"", /*8*/"", /*9*/m_sIcChip, /*10*/m_sSign
, /*11*/m_sFallDiv, /*12*/"0",/*13*/"",/*14*/"",/*15*/""
, /*16*/"",/*17*/"",/*18*/"", /*19*/m_dCreditCardDcAtm.ToString()
, /*20*/ItemConst.PAY_APP_DIV.NORMAL, /*21*/"", /*22*/m_sService });
//}
if (sRet != UserCom.RST_OK)
{
InDataToZeroFill();
m_bProcessSuccess = false;
if (sRet == null || sRet.Equals(UserCom.RST_ERR))
{
SendErrLogEvent(ErrorCode.LastPaymentsUnknownError);
}
else
{
SendErrorMessageEvent(sRet);
}
}
else
{
PaymentsValue = lastPayment;
m_bProcessSuccess = true;
}
}
break;
case LastPaymentsType.SmilePay:
#region :: Smile Pay
// 승인금액 또는 결제 금액을 확인 하세요.
//if (m_cDataService.DoubleParse(txtPayAmt.Text) <= 0)
//{
// MessageManager.GetErrorMessage(POS_MESSAGE.ERROR.MSG_0597);
// return false;
//}
string sInPutType = m_InputType;
string sInPutData = m_sInPutData;
string sInEncData = m_sCardNo;
string sInOrgData = m_sInPutData;
//if (m_sInEncData == "")
//{
// if (m_sInPutData == "")
// {
// ///sInPutType = PosConst.POS_VAN_MASTER.INPUT_TYPE.VAN_KEYIN;
// sInPutType = PosConst.POS_VAN_MASTER.INPUT_TYPE.VAN_MOBILE_SWIP;
// sInOrgData = txtCardNo.Value;
// //sInPutData = txtCardNo.Value;
// }
// EncryptedCardNo(sInOrgData, ref sInPutData, ref sInEncData);
//}
//#17169 스마일페이 변경요청 건 start, 20181113
//기존소스
/*
//#17169 스마일페이 변경요청 건 start
string sSmilepayCampaingCode = "";
string sSmilepayPromotionCode = "";
double dSmileCashTargetAmt = 0;
if (m_cDataService.DoubleParse(txtDCAmt.Text) > 0)
{
m_cCampaingMain.GetSmilepayPromotionCode(out sSmilepayCampaingCode, out sSmilepayPromotionCode);
if (sSmilepayCampaingCode != "" && sSmilepayPromotionCode != "") { dSmileCashTargetAmt = m_cCampaingMain.GetSmileCashTargetAmt(sSmilepayCampaingCode); }
}
//#17169 스마일페이 변경요청 건 end
*/
//변경소스
string sSmilepayPromotionCode = ""; //스마일페이로모션코드
double dSmileCashTargetAmt = 0; //스마일캐시금액
bool bApplyCampaign = false; // 적용된캠페인유무
m_cCampaingMain.GetSmailePayCampaignCheck(Payment, out sSmilepayPromotionCode, out dSmileCashTargetAmt, out bApplyCampaign);
//#17169 스마일페이 변경요청 건 end, 20181113
//#17169 스마일페이 변경요청 건 start
//기존
//포인트 사용 승인 처리
//sRet = m_cSmilePay.SetPayment(new string[] { m_sPosMenuKey, sInPutType, sInPutData, sInEncData, m_cDataService.DoubleParse(txtPayAmt.Text).ToString(), "", sInOrgData });
//변경
//포인트 사용 승인 처리
m_sPosMenuKey = PosKey.MENU_KEY.SMILE_PAY;
sRet = m_cSmilePay.SetPayment(new string[] { m_sPosMenuKey, sInPutType, sInPutData, sInEncData, Payment.ToString(), "", sInOrgData, sSmilepayPromotionCode, m_cPosStatus.Global.NumericTOCurrency(dSmileCashTargetAmt) });
//#17169 스마일페이 변경요청 건 end
if (sRet != UserCom.RST_OK)
{
m_bProcessSuccess = false;
SendErrLogEvent(ErrorCode.LastPaymentsUnknownError);
return;
}
else
{ // 자동적립사용이면 스마일페이 자동적립 처리
if (PosMstManager.GetPosOption(POS_OPTION.OPT030) == "1")
{
sRet = m_cHappyPoint.SetSmilePayment(new string[] { sInPutType, sInPutData, sInEncData, "0", "", sInOrgData });
}
if (!sRet.Equals(UserCom.RST_OK))
{
}
}
// 캠페인 처리 => 키값(취소시사용),카드번호,캠페인대상,지불구분,지불금액
ArrayList alPayItem2 = (ArrayList)StateObject.GetItemObject(Column.TR_PAYMENT.ITEM);
m_cCampaingMain.CompleteCampaignPayment((alPayItem2.Count - 1).ToString());
//#14538 스마일페이 캠페인 확인창 중복 팝업 확인요청 start,phj
//double nDisAmt2 = m_cCampaingMain.ExecuteCampaignPayment(alPayItem2.Count.ToString(), m_sCardNo, ItemConst.CPI_CUST_PAY_TYPE.SMILEPAY, Payment, false);
PaymentsValue = Payment;
m_bProcessSuccess = true;
#endregion
break;
}
}
catch (Exception ex)
{
CommonLog.ErrorLogWrite(this,"CompleteTxtInPut()","Fail !!", string.Format("{0}\n{1}", ex.Message, ex.StackTrace));
}
finally
{
if (m_cPayments != null) m_cPayments = null;
}
CommonLog.DebugLogWrite(this, "CompleteTxtInPut()", "End");
}
/// <summary>
/// 카드 번호 암호화
/// </summary>
/// <param name="sInData"></param>
/// <param name="sInMaskData"></param>
/// <param name="sInEncData"></param>
/// <returns></returns>
private bool EncryptedCardNo(string sInData, ref string sInMaskData, ref string sInEncData)
{
string sEncData = sInData;
bool bRet = false;
try
{
//#20170913 현금영수증, 포인트카드 마스킹 미적용 start
// "0"인 경우 마스킹 미처리
//기존
//sEncData = m_cDeviceICReader.GetEncryptedCardNo(sInData).Trim();
//변경
sEncData = m_cDeviceICReader.GetEncryptedCardNo(sInData, "0").Trim();
//#20170913 현금영수증, 포인트카드 마스킹 미적용 end
if (CmUtil.MidH(sEncData, 0, 2) == "00")
{
sInEncData = CmUtil.MidH(sEncData, 2, 512).Trim(); // 암호화 데이터
sInMaskData = CmUtil.MidH(sEncData, 514, sEncData.Length - 514).Trim(); // 마스킹 데이터
//#20170913 현금영수증, 포인트카드 마스킹 미적용 start
sInMaskData = CmUtil.MidH(sInMaskData, 0, 6) + "********";
//#20170913 현금영수증, 포인트카드 마스킹 미적용 end
bRet = true;
}
else
{
CommonLog.ErrorLogWrite(this,"EncryptedCardNo()","Fail !!");
}
}
catch (Exception ex)
{
CommonLog.ErrorLogWrite(this,"EncryptedCardNo()","Fail !!", string.Format("{0}\n{1}", ex.Message, ex.StackTrace));
}
return bRet;
}
#region
/// <summary>
/// ZeroFill 초기화
/// </summary>
private void InDataToZeroFill()
{
try
{
//여전법 대응!
//////////////////////////////////////////////////////////////////////////////////
CmUtil.ZeroFillClear(ref m_sInPutData);
CmUtil.ZeroFillClear(ref m_sCardNo);
CmUtil.ZeroFillClear(ref m_sInMaskData);
//////////////////////////////////////////////////////////////////////////////////
}
catch
{
}
}
#endregion
#region IC리더
/// <summary>
/// IC리더 콜백 함수(CardInfo)
/// </summary>
/// <param name="returnValue"></param>
/// <param name="returnData"></param>
public void OnIcReaderCallBackCardInfo(int num, StringBuilder str)
{
try
{
IcCallBack = false;
switch (PaymentsType)
{
case LastPaymentsType.IcCard:
case LastPaymentsType.SsLgPay:
case LastPaymentsType.HappyGift:
SendReadStart();
break;
}
ClearCardInfo(); // 카드 입력 정보 클리어
if (num > 0)
{
string sRsvStr = str.ToString();
if (CmUtil.MidH(sRsvStr, 0, 2) == "00")
{
m_sCardNo = CmUtil.MidH(sRsvStr, 6, 512).Trim();
m_sInMaskData = CmUtil.MidH(sRsvStr, 1030, 37).Trim();
m_sService = CmUtil.MidH(sRsvStr, 1067, 5).Trim();
m_sFallDiv = CmUtil.MidH(sRsvStr, 3, 1).Trim();
m_sIcChip = CmUtil.MidH(sRsvStr, 518, 512).Trim();
//#15183 보안리더기 삼성페이 해피포인트 자동적립 기능 수정 start,phj
m_sMobileCode = CmUtil.MidH(sRsvStr, 1072, 7).Trim();
//#15183 보안리더기 삼성페이 해피포인트 자동적립 기능 수정 end,phj
if (CmUtil.MidH(sRsvStr, 4, 2).Trim() == "02")
//if (CmUtil.MidH(sRsvStr, 6, 2).Trim() == "EN") //모터드리븐 처리 (2019.04.23)
{
m_InputType = PosConst.POS_VAN_MASTER.INPUT_TYPE.VAN_SWIP;
m_sIcChip = m_sFallDiv.Equals("3") ? m_sIcChip : string.Empty;
}
else
{
m_InputType = PosConst.POS_VAN_MASTER.INPUT_TYPE.VAN_IC;
}
m_sInPutData = m_sInMaskData;
}
}
}
catch (Exception ex)
{
CommonLog.ErrorLogWrite(this,"OnIcReaderCallBackCardInfo()","Fail !!", string.Format("{0}\n{1}", ex.Message, ex.StackTrace));
}
ReadProcessEnd = true;
}
private bool GetIcCardData()
{
string sRsvStr = "";
try
{
//IcCallBack = false; // IC리더 콜백 해지
if (m_cDeviceICReader.GetCardInfo_ICReader(PosConst.IC_READER_TRAN_TYPE.CREDIT, CmUtil.IntParse(Payment.ToString()), ref sRsvStr) == true)
{
if (CmUtil.MidH(sRsvStr, 0, 2) == "00")
{
m_sCardNo = CmUtil.MidH(sRsvStr, 6, 512).Trim();
m_sInMaskData = CmUtil.MidH(sRsvStr, 1030, 37).Trim();
m_sIcChip = CmUtil.MidH(sRsvStr, 518, 512).Trim();
if (CmUtil.MidH(sRsvStr, 4, 2).Trim() == "02")
{
m_InputType = PosConst.POS_VAN_MASTER.INPUT_TYPE.VAN_SWIP;
}
else
{
m_InputType = PosConst.POS_VAN_MASTER.INPUT_TYPE.VAN_IC;
}
m_sService = CmUtil.MidH(sRsvStr, 1067, 5).Trim();
m_sFallDiv = CmUtil.MidH(sRsvStr, 3, 1); // == "3" ? "0" : "1";
m_sInPutData = m_sInMaskData;
//#15183 보안리더기 삼성페이 해피포인트 자동적립 기능 수정 start,phj
m_sMobileCode = CmUtil.MidH(sRsvStr, 1072, 7).Trim();
//#15183 보안리더기 삼성페이 해피포인트 자동적립 기능 수정 end,phj
return true;
}
}
}
catch (Exception ex)
{
CommonLog.ErrorLogWrite(this, "GetIcCardData()","Fail !!", string.Format("{0}\n{1}", ex.Message, ex.StackTrace));
}
finally
{
// 여전법 대응////////////////////////////////////////////////////////////////////
CmUtil.ZeroFillClear(ref sRsvStr);
//////////////////////////////////////////////////////////////////////////////////
}
return false;
}
#endregion
private void SendErrorMessageEvent(string _errorMessageString)
{
try
{
CommonLog.ErrorLogWrite(this, "SendErrorMessageEvent()", _errorMessageString);
ErrorMessageEvent(_errorMessageString);
}
catch
{
}
}
private void SendErrLogEvent(ErrorCode _errorCode)
{
try
{
CommonLog.DebugLogWrite(this, "SendErrLogEvent()", _errorCode.ToString());
ErrorEvent(_errorCode);
}
catch
{
}
}
private void SendReadStart()
{
try
{
CommonLog.DebugLogWrite(this, "SendReadStart()");
ReadStart(this);
}
catch
{
}
}
private void SendReadEnd()
{
try
{
CommonLog.DebugLogWrite(this, "SendReadEnd()");
ReadEnd(this);
}
catch
{
}
}
private void SignStart()
{
try
{
CommonLog.DebugLogWrite(this, "SignStart()");
SignStartEvent(this);
}
catch
{
}
}
private void SignEnd()
{
try
{
CommonLog.DebugLogWrite(this, "SignEnd()");
SignEndEvent(this);
}
catch
{
}
}
private void ClearCardInfo()
{
try
{
m_sSign = "";
m_InputType = ""; // 입력구분
m_sInPutData = ""; // 입력데이터
m_sInMaskData = ""; // 마스킹
m_sCardNo = ""; // 카드데이터인카드번호
m_bProcessSuccess = false;
}
catch
{
}
}
#endregion
}
}