From 097d8eabf37d45d2bf3a8200398d46ad1b8df308 Mon Sep 17 00:00:00 2001 From: hodong13 Date: Tue, 24 Nov 2020 08:34:18 +0000 Subject: [PATCH] --- Dao/DB/DB1.Scheme.txt | 2 +- Dao/MyBatis/Maps/CM.xml | 3 +- Dao/MyBatis/Maps/Pay.xml | 51 +- FO/Controllers/AccountController.cs | 151 ++++++ FO/Controllers/CourseController.cs | 37 +- FO/Controllers/FOBaseController.cs | 740 ++++++++------------------- FO/Views/Course/ApplyComplete.cshtml | 171 ++++--- FO/Views/Course/ApplyPay.cshtml | 3 +- FO/Views/Course/XpayREQ.cshtml | 3 +- FO/Views/Home/Index.cshtml | 3 + FO/Views/My/Ready.cshtml | 34 +- FO/Web.config | 2 +- Model/CM.cs | 1 + Model/Model.csproj | 1 + Model/PPLog.cs | 2 +- Model/Pay.cs | 22 +- Model/VMHome.cs | 1 + Model/VMPay.cs | 1 + Model/Xpay.cs | 301 +++++++++++ 19 files changed, 884 insertions(+), 645 deletions(-) create mode 100644 Model/Xpay.cs diff --git a/Dao/DB/DB1.Scheme.txt b/Dao/DB/DB1.Scheme.txt index f504cce..b18fcd7 100644 --- a/Dao/DB/DB1.Scheme.txt +++ b/Dao/DB/DB1.Scheme.txt @@ -817,7 +817,7 @@ create table paydata ( ,cardquota varchar(2) ,cardquotatype tinyint not null ,cardeventcode varchar(30) - ,cardnum varchar(50) + ,cardnum varbinary(200) ,iscardpoint tinyint not null ,cardcode varchar (10) ,cardbankcode varchar (10) diff --git a/Dao/MyBatis/Maps/CM.xml b/Dao/MyBatis/Maps/CM.xml index 6e4e4c1..f535f21 100644 --- a/Dao/MyBatis/Maps/CM.xml +++ b/Dao/MyBatis/Maps/CM.xml @@ -1588,10 +1588,11 @@ - select a.payno,a.ptype,a.isgroup,a.isexam,a.userno,a.pstatus,a.payamt,a.rstatus,a.refundamt,a.ispg + select a.payno,a.ptype,a.isgroup,a.isexam,a.userno,a.pstatus,a.payamt,a.rstatus,a.refundamt,a.ispg,a.paylimit + ,b.isready from pay a + left outer join pplog b on b.pplno=a.pplno a.payno=#payno# a.userno=#userno# @@ -320,17 +322,18 @@ ,ispc,isjoin,fgno,apoint,mpoint ,fpoint,spoint,dpoint,tpoint,ischanged ,stime,etime,sip,eip,ispcs - ,ispce,fgno2,) + ,ispce,fgno2,cmisno,) select a.itemno,a.payno,a.pino,case when b.isgroup=1 then a.userno else b.userno end ,case when b.ptype=3 then 2 else 1 end,null,null,0,a.isrebate ,0,ifnull(d.isjoin, 0),null,null,null ,null,null,null,null,0 ,null,null,null,null,null - ,null,a.fgno, + ,null,a.fgno,e.cmisno, from payitem a inner join pay b on b.payno=a.payno inner join users c on c.userno=b.userno left outer join assign d on d.asno=c.asno + left outer join pplog e on e.pplno=b.pplno where a.payno=#payno# and a.ptype=0; update lect a @@ -339,7 +342,7 @@ set a.status=case when b.pstatus=22 then 2 else 1 end,a.uno=#uno#,a.uip=#uip# where a.payno=#payno# and a.status=4; - update examuser a + update pay set pstatus=#pstatus# where payno=#payno#; @@ -379,11 +382,11 @@ ,a.status=1 where a.payno=#payno#; - update examuser a - inner join pay b on b.isexam=1 and b.payno=a.payno and b.pstatus=1 + update pay set ,pstatus=case when pstatus=22 then 43 else 41 end - where payno=#payno# and userno=#userno# and pstatus in (51,21,22); + where payno=#payno# and userno=#userno# and pstatus in (51,55,21,22); update payitem a inner join pay b on b.payno=a.payno and b.userno=#userno# and b.pstatus in (41,43) @@ -648,7 +660,7 @@ left outer join exam c3 on a.ptype=3 and c3.exno=a.itemno left outer join users u on u.userno=a.userno left outer join assign ua on ua.asno=u.asno - left outer join comcode uc on uc.ccode=u.ccposition + left outer join comcode uc on uc.ccode=u.ccpositionc left outer join cmrs rs on rs.cmno=c0.cmno and rs.rstype=1 and rs.isdel=0 left outer join lect t on a.ptype in (0,1,4) and t.cmno=c0.cmno and t.payno=a.payno and t.pino=a.pino and t.userno=a.userno where a.payno=#payno# @@ -850,7 +862,7 @@ + diff --git a/FO/Controllers/AccountController.cs b/FO/Controllers/AccountController.cs index 1db4e3b..211f140 100644 --- a/FO/Controllers/AccountController.cs +++ b/FO/Controllers/AccountController.cs @@ -12,6 +12,8 @@ using Newtonsoft.Json.Linq; using Newtonsoft.Json; using OkCert3Com; +using XPayClientNet; + namespace NP.FO.Controllers { public class AccountController : FOOpenBaseController @@ -842,5 +844,154 @@ namespace NP.FO.Controllers { return View(); } + + public String XPayVBankMoney() + { + var x = new Xpay(); + x.LGD_RESPCODE = Request.Params.Get("LGD_RESPCODE"); + x.LGD_RESPMSG = Request.Params.Get("LGD_RESPMSG"); + x.LGD_MID = Request.Params.Get("LGD_MID"); + x.LGD_OID = Request.Params.Get("LGD_OID"); + x.LGD_AMOUNT = Request.Params.Get("LGD_AMOUNT"); + x.LGD_TID = Request.Params.Get("LGD_TID"); + x.LGD_PAYTYPE = Request.Params.Get("LGD_PAYTYPE"); + x.LGD_PAYDATE = Request.Params.Get("LGD_PAYDATE"); + x.LGD_HASHDATA = Request.Params.Get("LGD_HASHDATA"); + x.LGD_FINANCECODE = Request.Params.Get("LGD_FINANCECODE"); + x.LGD_FINANCENAME = Request.Params.Get("LGD_FINANCENAME"); + x.LGD_ESCROWYN = Request.Params.Get("LGD_ESCROWYN"); + x.LGD_TIMESTAMP = Request.Params.Get("LGD_TIMESTAMP"); + x.LGD_ACCOUNTNUM = Request.Params.Get("LGD_ACCOUNTNUM"); + x.LGD_CASTAMOUNT = Request.Params.Get("LGD_CASTAMOUNT"); + x.LGD_CASCAMOUNT = Request.Params.Get("LGD_CASCAMOUNT"); + x.LGD_CASFLAG = Request.Params.Get("LGD_CASFLAG"); + x.LGD_CASSEQNO = Request.Params.Get("LGD_CASSEQNO"); + x.LGD_CASHRECEIPTNUM = Request.Params.Get("LGD_CASHRECEIPTNUM"); + x.LGD_CASHRECEIPTSELFYN = Request.Params.Get("LGD_CASHRECEIPTSELFYN"); + x.LGD_CASHRECEIPTKIND = Request.Params.Get("LGD_CASHRECEIPTKIND"); + x.LGD_PAYER = Request.Params.Get("LGD_PAYER"); + + x.LGD_BUYER = Request.Params.Get("LGD_BUYER"); + x.LGD_PRODUCTINFO = Request.Params.Get("LGD_PRODUCTINFO"); + x.LGD_BUYERID = Request.Params.Get("LGD_BUYERID"); + x.LGD_BUYERADDRESS = Request.Params.Get("LGD_BUYERADDRESS"); + x.LGD_BUYERPHONE = Request.Params.Get("LGD_BUYERPHONE"); + x.LGD_BUYEREMAIL = Request.Params.Get("LGD_BUYEREMAIL"); + x.LGD_BUYERSSN = Request.Params.Get("LGD_BUYERSSN"); + x.LGD_PRODUCTCODE = Request.Params.Get("LGD_PRODUCTCODE"); + x.LGD_RECEIVER = Request.Params.Get("LGD_RECEIVER"); + x.LGD_RECEIVERPHONE = Request.Params.Get("LGD_RECEIVERPHONE"); + x.LGD_DELIVERYINFO = Request.Params.Get("LGD_DELIVERYINFO"); + x.CST_PLATFORM = GetConfig("CST_PLATFORM"); + /* + ' ************************************************* + ' * 2. MD5 해쉬암호화 (수정하지 마세요) - BEGIN + ' * + ' * MD5 해쉬암호화는 거래 위변조를 막기위한 방법입니다. + ' ************************************************* + ' * (1) XpayClient의 사용을 위한 xpay 객체 생성 + ' * (2) XPayClient 초기화(환경설정 파일 로드) + ' CST_PLATFORM: - test, service 값에 따라 lgdacom.conf의 test_url(test) 또는 url(srvice) 사용 + ' - test, service 값에 따라 테스트용 또는 서비스용 아이디 생성 + ' * (3) Init_TX: 메모리에 mall.conf, lgdacom.conf 할당 및 트랜잭션의 고유한 키 TXID 생성 + ' * MD5 해쉬데이터 암호화 검증을 위해 + ' * LG유플러스에서 발급한 상점키(MertKey)를 환경설정 파일(lgdacom/conf/mall.conf)에 반드시 입력하여 주시기 바랍니다. + ' */ + //* LGD_HASHDATA2 추출 ///////////////////// + x.configPath = GetConfig("lgdacomConfigPath"); + + // (1) XpayClient의 사용을 위한 xpay 객체 생성 + XPayClient xpay = new XPayClient(); + + // (2) Init: XPayClient 초기화(환경설정 파일 로드) + // configPath: 설정파일 + // CST_PLATFORM: - test, service 값에 따라 lgdacom.conf의 test_url(test) 또는 url(srvice) 사용 + // - test, service 값에 따라 테스트용 또는 서비스용 아이디 생성 + xpay.Init(x.configPath, x.CST_PLATFORM); + + try + { + // (3) Init_TX: 메모리에 mall.conf, lgdacom.conf 할당 및 트랜잭션의 고유한 키 TXID 생성 + xpay.Init_TX(x.LGD_MID); + x.LGD_HASHDATA2 = xpay.GetHashDataCas(x.LGD_MID, x.LGD_OID, x.LGD_AMOUNT, x.LGD_RESPCODE, x.LGD_TIMESTAMP); + } + catch (Exception err) + { + SetError("가상계좌입금오류(LGD_HASHDATA2 추출 오류): " + err.StackTrace); + return "FAIL"; + } + + /* + * 상점 처리결과 리턴메세지 + * + * OK : 상점 처리결과 성공 + * 그외 : 상점 처리결과 실패 + * + * ※ 주의사항 : 성공시 'OK' 문자이외의 다른문자열이 포함되면 실패처리 되오니 주의하시기 바랍니다. + */ + String resultMSG = "결제결과 상점 DB처리(LGD_CASNOTEURL) 결과값을 입력해 주시기 바랍니다."; + if (x.LGD_HASHDATA2.Equals(x.LGD_HASHDATA)) + { //해쉬값 검증이 성공이면 + if (("0000".Equals(x.LGD_RESPCODE))) + { //결제가 성공이면 + if ("R".Equals(x.LGD_CASFLAG)) + { + return "OK"; + } + else if ("I".Equals(x.LGD_CASFLAG)) + { + /* + * 무통장 입금 성공 결과 상점 처리(DB) 부분 + * 상점 결과 처리가 정상이면 "OK" + */ + //if( 무통장 입금 성공 상점처리결과 성공 ) + var payvbankin = new PayVBankIn() + { + payno = GetLong(x.LGD_OID.Substring(2)), + uno = 1, + uip = GetUserIP(), + pgkey = x.LGD_TID, + inbankcode = x.LGD_FINANCECODE, + vacct = x.LGD_ACCOUNTNUM, + inamt = GetInt(x.LGD_CASTAMOUNT), + fromname = x.LGD_PAYER, + fromymd = x.LGD_PAYDATE + }; + if (Dao.Save("pay.paylect.vbankin", payvbankin) < 3) + { + //상품구매완료 처리 (최소 3건 업데이트 (payvbankin, pay) + return "FAIL"; + } + return "OK"; + } + else if ("C".Equals(x.LGD_CASFLAG)) + { + /* + * 무통장 입금취소 성공 결과 상점 처리(DB) 부분 + * 상점 결과 처리가 정상이면 "OK" + */ + //if( 무통장 입금취소 성공 상점처리결과 성공 ) + return "OK"; + } + } + else + { //결제가 실패이면 + /* + * 거래실패 결과 상점 처리(DB) 부분 + * 상점결과 처리가 정상이면 "OK" + */ + //if( 결제실패 상점처리결과 성공 ) + return "FAIL"; + } + } + else + { //해쉬값이 검증이 실패이면 + /* + * hashdata검증 실패 로그를 처리하시기 바랍니다. + */ + SetError("가상계좌입금오류(결제결과 상점 DB처리(LGD_CASNOTEURL) 해쉬값 검증이 실패): " + x.LGD_OID); + } + return "FAIL"; + } } } \ No newline at end of file diff --git a/FO/Controllers/CourseController.cs b/FO/Controllers/CourseController.cs index 2bb097b..5ce0173 100644 --- a/FO/Controllers/CourseController.cs +++ b/FO/Controllers/CourseController.cs @@ -843,7 +843,7 @@ namespace NP.FO.Controllers { return Redirect("/"); } - if (vm.PPLog.payno > 0) + if (vm.PPLog.payno > 0 && vm.PPLog.pstatus > 0) { //새로고침? return RedirectPermanent("/Course/ApplyComplete?payno=" + vm.PPLog.payno); @@ -855,12 +855,16 @@ namespace NP.FO.Controllers var uip = GetUserIP(); payitems.Add(new PayItem() { - itemno = vm.cmno, + itemno = vm.PPLog.cmno, userno = SUserInfo.UserNo, status = 6, pstatus = 55, pcnt = 1, payamt = 0, + isrebate = vm.PPLog.isrebate ?? 0, + rbank = vm.PPLog.rbankname, + rbankaccnum = vm.PPLog.rbankacc, + tbankuser = vm.PPLog.rbankowner, isready = 1, cmisno = vm.PPLog.cmisno, uno = SUserInfo.UserNo, @@ -868,12 +872,16 @@ namespace NP.FO.Controllers }); //정가확인 var cms = Dao.Get("cm.cms.forpay", new Hashtable() { { "userno", SUserInfo.UserNo }, { "cmno", vm.PPLog.cmno } }); + if (cms.First().lectnocheck > 0) + { + return RedirectPermanent("/?isalreadyreq=1"); + } var pi = payitems.First(); pi.orgamt = cms.Where(w => w.cmno == pi.itemno).First().fee; var pay = new Pay() { pplno = vm.pplno, - ptype = 7, + ptype = 0, userno = SUserInfo.UserNo, pstatus = 55, rstatus = 0, @@ -895,10 +903,11 @@ namespace NP.FO.Controllers } vm.CM = Dao.Get("cm.cms", new System.Collections.Hashtable() { { "cmno", vm.PPLog.cmno } }).First(); vm.User = Dao.Get("users.users", new System.Collections.Hashtable() { { "userno", SUserInfo.UserNo } }).First(); + vm.viewname4 = "/Course/OnPayReturn"; return View(vm); } - public ActionResult ApplyComplete(VMCourse vm) + public ActionResult ApplyComplete(VMPay vm) { if (vm.payno < 1) { @@ -906,7 +915,12 @@ namespace NP.FO.Controllers } vm.PayItem = Dao.Get("pay.payresult", new Hashtable() { { "payno", vm.payno }, { "userno", SUserInfo.UserNo } }).First(); vm.CM = Dao.Get("cm.cms", new System.Collections.Hashtable() { { "cmno", vm.PayItem.itemno } }).FirstOrDefault(); - + vm.Pay = Dao.Get("pay.pay", new System.Collections.Hashtable() { { "payno", vm.payno }, { "userno", SUserInfo.UserNo } }).FirstOrDefault(); + if (vm.Pay.isready == 1) + { + vm.Pay.ccount = Dao.Get("pay.lectready", vm.CM.cmno).FirstOrDefault() ?? 1; + } + vm.Pay.payresult = "1:결제완료"; return View(vm); } public ActionResult XpayREQ(VMPay vm) @@ -937,11 +951,21 @@ namespace NP.FO.Controllers vm.payParams.Add("LGD_CASNOTEURL", GetConfig("LGD_CASNOTEURL")); vm.payParams.Add("LGD_AUTOFILLYN_BUYER", GetConfig("LGD_AUTOFILLYN_BUYER")); vm.payParams.Add("LGD_ESCROW_USEYN", GetConfig("LGD_ESCROW_USEYN")); - vm.payParams.Add("LGD_CASHRECEIPTYN", GetConfig("LGD_CASHRECEIPTYN")); + vm.payParams.Add("LGD_DOMAIN_URL", "xpayvvip"); vm.payParams.Add("LGD_CUSTOM_PROCESSTYPE", "TWOTR"); + //vm.payParams.Add("LGD_CASHRECEIPTYN", GetConfig("LGD_CASHRECEIPTYN")); + vm.payParams.Add("LGD_CASHRECEIPTYN", "N"); if (Request["ptype"] == "3") { + if (Request["iscashrct"] == "1") + { + vm.payParams["LGD_CASHRECEIPTYN"] = "Y"; + vm.payParams.Add("LGD_DEFAULTCASHRECEIPTUSE", "1"); + vm.payParams.Add("LGD_CASHRECEIPTUSE", "1"); + vm.payParams.Add("LGD_CASHRECEIPTNUM", "1"); + vm.payParams.Add("LGD_CASHCARDNUM", Request["cashrcthp"]); + } vm.payParams.Add("LGD_CLOSEDATE", Request["LGD_CLOSEDATE"]); } String OSTYPE = Request["LGD_OSTYPE_CHECK"]; @@ -1049,6 +1073,7 @@ namespace NP.FO.Controllers //nptech 추가 파라미터 vm.payParams.Add("items", Request["items"]); + vm.payParams.Add("pplno", Request["pplno"]); vm.payParams.Add("rsMsg", ""); Session.Add("PAYREQ_MAP", vm.payParams); diff --git a/FO/Controllers/FOBaseController.cs b/FO/Controllers/FOBaseController.cs index 0763148..f089352 100644 --- a/FO/Controllers/FOBaseController.cs +++ b/FO/Controllers/FOBaseController.cs @@ -6,6 +6,10 @@ using System.Web.Mvc; using NP.Model; using NP.Base.Auth; + +using XPayClientNet; +using System.Security.Cryptography; +using System.Text; namespace NP.FO.Controllers { public class FOBaseController : NP.Base.BaseController @@ -43,6 +47,10 @@ namespace NP.FO.Controllers } //여기서 로그 남겨? base.OnActionExecuting(filterContext); + if (Request.Cookies["yicte"] != null && !string.IsNullOrEmpty(Request.Cookies["yicte"].Value)) + { + Response.Cookies["yicte"].Value = Request.Cookies["yicte"].Value + ";SameSite=None; Secure"; + } var cm = new Model.MenuPage() { }; //if (Request.Url.AbsolutePath.ToUpper().StartsWith("/DIVISION/A")) //{ @@ -451,581 +459,251 @@ namespace NP.FO.Controllers //} protected ActionResult PayReturn(VMPay vm) { - if (vm.payno > 0 && vm.absptype == 6) + if (vm.payno > 0 && (vm.absptype == 6 || vm.absptype == 7)) { //0원강좌 결제 - vm.Pay = new Pay() { payno = vm.payno, ptype = vm.absptype, oid2 = "free" + vm.payno }; + vm.Pay = new Pay() { payno = vm.payno, ptype = vm.absptype, oid2 = (vm.absptype == 6 ? "free" : string.Empty) + vm.payno }; vm.PayItemResults = Dao.Get("pay.payitems", vm.Pay.payno); } else { - if (string.IsNullOrEmpty(Request["P_NOTI"])) + vm.Pay = new Pay(); + /* ※ 중요 + * 환경설정 파일의 경우 반드시 외부에서 접근이 가능한 경로에 두시면 안됩니다. + * 해당 환경파일이 외부에 노출이 되는 경우 해킹의 위험이 존재하므로 반드시 외부에서 접근이 불가능한 경로에 두시기 바랍니다. + * 예) [Window 계열] C:\inetpub\wwwroot\lgdacom ==> 절대불가(웹 디렉토리) + */ + String configPath = GetConfig("lgdacomConfigPath"); //토스페이먼츠에서 제공한 환경파일 위치를 지정해 주세요. + + /* + * [최종결제요청 페이지(STEP2-2)] + * + * 매뉴얼 "5.1. XPay 결제 요청 페이지 개발"의 "단계 5. 최종 결제 요청 및 요청 결과 처리" 참조 + * + * 토스페이먼츠으로 부터 내려받은 LGD_PAYKEY(인증Key)를 가지고 최종 결제요청.(파라미터 전달시 POST를 사용하세요) + */ + + /* + ************************************************* + * 1.최종결제 요청(수정하지 마세요) - BEGIN + * (단, 최종 금액체크를 원하시는 경우 금액체크 부분 주석을 제거 하시면 됩니다.) + ************************************************* + */ + String CST_PLATFORM = Request.Params.Get("CST_PLATFORM"); + String CST_MID = Request.Params.Get("CST_MID"); + String LGD_MID = (("test".Equals(CST_PLATFORM.Trim())) ? "t" : "") + CST_MID; + String LGD_PAYKEY = Request.Params.Get("LGD_PAYKEY"); + String LGD_CLOSEDATE = Request.Params.Get("LGD_CLOSEDATE"); + //String DB_AMOUNT = ""; //반드시 위변조가 불가능한 곳(DB나 세션)에서 금액을 가져오십시요. + + // (1) XpayClient의 사용을 위한 xpay 객체 생성 + XPayClient xpay = new XPayClient(); + + // (2) Init: XPayClient 초기화(환경설정 파일 로드) + // configPath: 설정파일 + // CST_PLATFORM: - test, service 값에 따라 lgdacom.conf의 test_url(test) 또는 url(srvice) 사용 + // - test, service 값에 따라 테스트용 또는 서비스용 아이디 생성 + xpay.Init(configPath, CST_PLATFORM); + + try { - ViewBag.OffCode = OffCode; - System.Collections.Specialized.NameValueCollection parameters = Request.Params; - System.Collections.IEnumerator enumerator = parameters.GetEnumerator(); - System.Text.StringBuilder sb = new System.Text.StringBuilder("paramMap : "); - while (enumerator.MoveNext()) + // (3) Init_TX: 메모리에 mall.conf, lgdacom.conf 할당 및 트랜잭션의 고유한 키 TXID 생성 + xpay.Init_TX(LGD_MID); + xpay.Set("LGD_TXNAME", "PaymentByKey"); + xpay.Set("LGD_PAYKEY", LGD_PAYKEY); + + //금액을 체크하시기 원하는 경우 아래 주석을 풀어서 이용하십시요. + //xpay.Set("LGD_AMOUNTCHECKYN", "Y"); + //xpay.Set("LGD_AMOUNT", DB_AMOUNT); + + } + catch (Exception err) + { + SetError("환경파일의 경로가 잘못 되었습니다. configPath의 경로를 확인해 주시기 바랍니다." + "|" + err.StackTrace); + vm.Pay.payresult = "0:호출실패"; + vm.Pay.cancelresult = "환경파일의 경로가 잘못 되었습니다. configPath의 경로를 확인해 주시기 바랍니다."; + } + /* + ************************************************* + * 1.최종결제 요청(수정하지 마세요) - END + ************************************************* + */ + + /* + * 2. 최종결제 요청 결과 처리 + * + * 최종 결제요청 결과 리턴 파라미터는 연동메뉴얼을 참고하시기 바랍니다. + */ + // (4) TX: lgdacom.conf에 설정된 URL로 소켓 통신하여 최종 인증요청, 결과값으로 true, false 리턴 + if (xpay.TX()) + { + Int64 payno = GetLong(xpay.Response("LGD_OID", 0).Substring(2)); + //1)결제결과 화면처리(성공,실패 결과 처리를 하시기 바랍니다. + vm.Pay = new Pay() { payno = payno, uno = SUserInfo.UserNo, uip = GetUserIP() }; + String cancelMsg = "결제오류|" + payno; + + // (5) DB에 인증요청 결과 처리 + if ("0000".Equals(xpay.m_szResCode)) { - string key = enumerator.Current.ToString(); - sb.Append(string.Format("{0}={1}&", key, HttpUtility.UrlEncode(parameters[key]))); - } - //##################### - // 인증이 성공일 경우만 - //##################### - vm.Pay = new Pay() { payno = GetLong(parameters["orderNumber"].Substring(2)), uno = SUserInfo.UserNo, uip = GetUserIP() }; - if ("0000".Equals(parameters["resultCode"])) - { - var pginfo = GetConfig("pginfo").Split('|'); - //############################################ - // 1.전문 필드 값 설정(***가맹점 개발수정***) - //############################################ - String mid = parameters.Get("mid"); // 가맹점 ID 수신 받은 데이터로 설정 - Int64 oid = GetLong(parameters["orderNumber"].Substring(2));//주문번호 np + payno - String signKey = pginfo[2]; // 가맹점에 제공된 키(이니라이트키) (가맹점 수정후 고정) !!!절대!! 전문 데이터로 설정금지 - string timeTemp = "" + DateTime.UtcNow.Subtract(DateTime.MinValue.AddYears(1969)).TotalMilliseconds; - string[] artime = timeTemp.Split('.'); - String timestamp = artime[0]; - String charset = "UTF-8"; // 리턴형식[UTF-8,EUC-KR](가맹점 수정후 고정) - String format = "JSON"; // 리턴형식[XML,JSON,NVP](가맹점 수정후 고정) - String authToken = parameters.Get("authToken"); // 취소 요청 tid에 따라서 유동적(가맹점 수정후 고정) - String authUrl = parameters.Get("authUrl"); // 승인요청 API url(수신 받은 값으로 설정, 임의 세팅 금지) - String netCancel = parameters.Get("netCancelUrl"); // 망취소 API url(수신 받은 값으로 설정, 임의 세팅 금지) - String mKey = ComputeHash(signKey); // 가맹점 확인을 위한 signKey를 해시값으로 변경 (SHA-256방식 사용) - String merchantData = parameters.Get("merchantData"); // 가맹점 관리데이터 수신 - //##################### - // 2.signature 생성 - //##################### - String signParam = "authToken=" + @authToken + "×tamp=" + timestamp; - String signature = ComputeHash(signParam); - //##################### - // 3.API 요청 전문 생성 - //##################### - System.Collections.Generic.Dictionary authMap = new System.Collections.Generic.Dictionary(); - authMap.Add("mid", mid); // 필수 - authMap.Add("authToken", HttpUtility.UrlEncode(authToken)); // 필수 - 반드시 urlencode 해서 전달. - authMap.Add("timestamp", timestamp); // 필수 - authMap.Add("signature", signature); // 필수 - authMap.Add("charset", charset); // default=UTF-8 - authMap.Add("format", format); // default=XML - authMap.Add("mkey", mKey); // default=XML - String cancelMsg = "결제오류|" + oid; - vm.Pay.payno = oid; //이거 확인 MOID? try { - //##################### - // 4.API 통신 시작 - //##################### - String authResultString = ""; - authResultString = processHTTP(authMap, authUrl); - //############################################################ - //5.API 통신결과 처리(***가맹점 개발수정***) - //############################################################ - String strReplace = authResultString.Replace(",", "&").Replace(":", "=").Replace("\"", "").Replace(" ", "").Replace("\n", "").Replace("}", "").Replace("{", ""); - System.Collections.Generic.Dictionary resultMap = parseStringToMap(strReplace); //문자열을 MAP형식으로 파싱 - /************************* 결제보안 추가 START ****************************/ - Dictionary secureMap = new Dictionary(); - if (resultMap["resultCode"] == "R201") + //통신상의 문제가 없을시 + //최종결제요청 결과 성공 DB처리(LGD_RESPCODE 값에 따라 결제가 성공인지, 실패인지 DB처리) + vm.Pay = Dao.Get("pay.pay", new System.Collections.Hashtable() { { "payno", payno }, { "userno", SUserInfo.UserNo }, { "pstatus21", 0 } }).FirstOrDefault(); + if (vm.Pay == null) { - vm.Pay.payresult = "1:결제완료"; - //기결제 건(새로고침) - vm.Pay.oid2 = pginfo[4] + vm.Pay.payno; - vm.PayItemResults = Dao.Get("pay.payitems", vm.Pay.payno); - return View("PayReturn", vm); - } - secureMap.Add("mid", mid); //mid - secureMap.Add("tstamp", timestamp); //timestemp - secureMap.Add("MOID", resultMap["MOID"]); //MOID - secureMap.Add("TotPrice", resultMap["TotPrice"]); //TotPrice - vm.Pay.pgkey = (resultMap.ContainsKey("tid") ? resultMap["tid"] : "null"); - vm.Pay.ptype = "Card".Equals(resultMap.ContainsKey("payMethod") ? resultMap["payMethod"] : "") ? 1 : "DirectBank".Equals(resultMap.ContainsKey("payMethod") ? resultMap["payMethod"] : "") ? 2 : 3; - vm.Pay.payamt = GetInt(resultMap.ContainsKey("TotPrice") ? resultMap["TotPrice"] : "0"); - vm.Pay.payno = GetLong((resultMap.ContainsKey("MOID") ? resultMap["MOID"] : "np0").Substring(2)); - //(resultMap.ContainsKey("applDate") ? resultMap["applDate"] : "null") //승인날짜 - //(resultMap.ContainsKey("applTime") ? resultMap["applTime"] : "null")//승인시간 - - // signature 데이터 생성 - String secureSignature = makeSignatureAuth(secureMap); - /************************* 결제보안 추가 END ****************************/ - if ("0000".Equals((resultMap.ContainsKey("resultCode") ? resultMap["resultCode"] : "null")) && secureSignature.Equals(resultMap["authSignature"])) //결제보안 추가 - { - /***************************************************************************** - * 여기에 가맹점 내부 DB에 결제 결과를 반영하는 관련 프로그램 코드를 구현한다. - [중요!] 승인내용에 이상이 없음을 확인한 뒤 가맹점 DB에 해당건이 정상처리 되었음을 반영함 - 처리중 에러 발생시 망취소를 한다. - ******************************************************************************/ - vm.Pay = Dao.Get("pay.pay", new System.Collections.Hashtable() { { "payno", oid }, { "userno", SUserInfo.UserNo }, { "pstatus21", 0 } }).FirstOrDefault(); - if (vm.Pay == null) - { - vm.Pay = new Pay() { payno = oid, uno = SUserInfo.UserNo, uip = GetUserIP() }; - vm.Pay.payresult = "0:결제상품 오류(E1)"; - cancelMsg += "|결제상품 오류(E1)"; - vm.Pay = new Pay() { payno = oid, uno = SUserInfo.UserNo, uip = GetUserIP() }; - throw new Exception("결제상품 오류(E1)"); - } - else - { - vm.Pay.uno = SUserInfo.UserNo; - vm.Pay.uip = GetUserIP(); - //if (vm.Pay.ptypecode != (resultMap.ContainsKey("payMethod") ? resultMap["payMethod"] : "x")) - //{ - // vm.Pay.payresult = "0:결제방식 오류(E2)"; - // cancelMsg += "|결제방식 오류(E2)"; - // throw new Exception("결제방식 오류(E2)"); - //} - if (vm.Pay.payamt != GetInt((resultMap["TotPrice"] ?? "").Replace(",", ""))) - { - vm.Pay.payresult = "0:결제금액 오류(E3)"; - cancelMsg += "|결제금액 오류(E3)"; - throw new Exception("결제금액 오류(E3)"); - } - else - { - if (vm.Pay.ptype == 3) - { //가상계좌 - vm.Pay.vactnum = resultMap.ContainsKey("VACT_Num") ? resultMap["VACT_Num"] : null; - vm.Pay.vactbankcode = resultMap.ContainsKey("VACT_BankCode") ? resultMap["VACT_BankCode"] : null; - vm.Pay.vactbankname = resultMap.ContainsKey("vactBankName") ? resultMap["vactBankName"] : null; - vm.Pay.vactname = resultMap.ContainsKey("VACT_Name") ? resultMap["VACT_Name"] : null; - vm.Pay.vactinname = resultMap.ContainsKey("VACT_InputName") ? resultMap["VACT_InputName"] : null; - //resultMap.ContainsKey("VACT_Date") ? resultMap["VACT_Date"] : "null" 송금일자 확인, 송금 전인데? - //resultMap.ContainsKey("VACT_Time") ? resultMap["VACT_Date"] : "null" 송금시간 확인, 송금 전인데? - } - else if (vm.Pay.ptype == 2) - { //실시간계좌이체 - vm.Pay.vactbankcode = resultMap.ContainsKey("ACCT_BankCode") ? resultMap["ACCT_BankCode"] : null; - vm.Pay.cshrrcode = resultMap.ContainsKey("CSHR_ResultCode") ? resultMap["CSHR_ResultCode"] : null; - vm.Pay.cshrtype = resultMap.ContainsKey("CSHR_Type") ? resultMap["CSHR_Type"] : null; - } - else - {//카드 - vm.Pay.cardquota = resultMap.ContainsKey("CARD_Quota") ? resultMap["CARD_Quota"] : null; - int quota = Convert.ToInt16((resultMap.ContainsKey("CARD_Quota") ? resultMap["CARD_Quota"] : "01")); - if ("1".Equals((resultMap.ContainsKey("CARD_Interest") ? resultMap["CARD_Interest"] : "null")) - || "1".Equals((resultMap.ContainsKey("EventCode") ? resultMap["EventCode"] : "null"))) - { - vm.Pay.cardquotatype = 1; - } - vm.Pay.cardeventcode = resultMap.ContainsKey("EventCode") ? resultMap["EventCode"] : null; - vm.Pay.cardnum = resultMap.ContainsKey("CARD_Num") ? resultMap["CARD_Num"] : null; - vm.Pay.iscardpoint = "1".Equals((resultMap.ContainsKey("point") ? resultMap["point"] : "null")) ? 1 : 0; - vm.Pay.cardcode = resultMap.ContainsKey("CARD_Code") ? resultMap["CARD_Code"] : null; - vm.Pay.cardbankcode = resultMap.ContainsKey("CARD_BankCode") ? resultMap["CARD_BankCode"] : null; - vm.Pay.cardprtccode = resultMap.ContainsKey("CARD_PRTC_CODE") ? resultMap["CARD_PRTC_CODE"] : null; - vm.Pay.checkflag = resultMap.ContainsKey("CARD_CheckFlag") ? resultMap["CARD_CheckFlag"] : null; - if ((resultMap.ContainsKey("OCB_Num") ? resultMap["OCB_Num"] : "null") != null && (resultMap.ContainsKey("OCB_Num") ? resultMap["OCB_Num"] : "null") != "") - { - vm.Pay.ocbnum = resultMap.ContainsKey("OCB_Num") ? resultMap["OCB_Num"] : null; - vm.Pay.ocbappno = resultMap.ContainsKey("OCB_SaveApplNum") ? resultMap["OCB_SaveApplNum"] : null; - vm.Pay.ocbprice = resultMap.ContainsKey("OCB_PayPrice") ? resultMap["OCB_PayPrice"] : null; - } - if ((resultMap.ContainsKey("GSPT_Num") ? resultMap["GSPT_Num"] : "null") != null && (resultMap.ContainsKey("GSPT_Num") ? resultMap["GSPT_Num"] : "null") != "") - { - vm.Pay.gsnum = resultMap.ContainsKey("GSPT_Num") ? resultMap["GSPT_Num"] : null; - vm.Pay.gsremain = resultMap.ContainsKey("GSPT_Remains") ? resultMap["GSPT_Remains"] : null; - vm.Pay.gsprice = resultMap.ContainsKey("GSPT_ApplPrice") ? resultMap["GSPT_ApplPrice"] : null; - } - if ((resultMap.ContainsKey("UNPT_CardNum") ? resultMap["UNPT_CardNum"] : "null") != null && (resultMap.ContainsKey("UNPT_CardNum") ? resultMap["UNPT_CardNum"] : "null") != "") - { - vm.Pay.unum = resultMap.ContainsKey("UNPT_CardNum") ? resultMap["UNPT_CardNum"] : null; - vm.Pay.upoint = resultMap.ContainsKey("UPNT_UsablePoint") ? resultMap["UPNT_UsablePoint"] : null; - vm.Pay.uprice = resultMap.ContainsKey("UPNT_PayPrice") ? resultMap["UPNT_PayPrice"] : null; - } - } - vm.Pay.payresult = resultMap.ContainsKey("resultCode") ? resultMap["resultCode"] : null; - vm.Pay.payresultmsg = resultMap.ContainsKey("resultMsg") ? resultMap["resultMsg"] : null; - vm.Pay.pgkey = resultMap.ContainsKey("tid") ? resultMap["tid"] : null; - vm.Pay.uno = SUserInfo.UserNo; - vm.Pay.uip = GetUserIP(); - //상품구매완료 처리 (최소 3건 업데이트 (pay, paydata, payitem) - if (Dao.Save("pay.paylect", vm.Pay) < 3) - { - vm.Pay.payresult = "0:구매완료 실패(E4)"; - cancelMsg += "|구매완료 실패(E4)"; - throw new Exception("구매완료 실패(E4)"); - } - vm.Pay.payresult = "1:결제완료"; - //if (GetConfig("ispaytest") == "1" && vm.Pay.ptype != 3) - //{ - // vm.Pay.payresult = "1:구매완료 성공 개발단 망취소(S1)"; - // String netcancelResultString = processHTTP(authMap, netCancel); // 망취소 요청 API url(고정, 임의 세팅 금지) - //} - try - { - vm.Pay.oid2 = pginfo[4] + vm.Pay.payno; - vm.PayItemResults = Dao.Get("pay.payitems", vm.Pay.payno); - } - catch (Exception exresult) - { - SetError(exresult.StackTrace); - } - } - } - //System.Collections.Generic.Dictionary checkMap = new System.Collections.Generic.Dictionary(); - //checkMap.Add("mid", mid); // 필수 - //checkMap.Add("authToken", HttpUtility.UrlEncode(authToken)); // 필수 - 반드시 urlencode 해서 전달. - //checkMap.Add("applDate", (resultMap.ContainsKey("applDate") ? resultMap["applDate"] : "null")); // 필수 - //checkMap.Add("applTime", (resultMap.ContainsKey("applTime") ? resultMap["applTime"] : "null")); // 필수 - //checkMap.Add("timestamp", timestamp); // 필수 - //checkMap.Add("signature", signature); // 필수 - //checkMap.Add("charset", charset); // default=UTF-8 - //checkMap.Add("format", format); // default=XML + vm.Pay = new Pay() { payno = payno, uno = SUserInfo.UserNo, uip = GetUserIP() }; + vm.Pay.payresult = "0:결제상품 오류(E1)"; + cancelMsg += "|결제상품 오류(E1)"; + vm.Pay = new Pay() { payno = payno, uno = SUserInfo.UserNo, uip = GetUserIP() }; + throw new Exception("결제상품 오류(E1)"); } else { - vm.Pay.payresult = resultMap.ContainsKey("resultMsg") ? ("0:" + resultMap["resultMsg"]) : "0:결제취소"; - vm.Pay.cancelresult = resultMap.ContainsKey("resultCode") ? resultMap["resultCode"] : ""; - //결제보안키가 다른 경우. - if (!secureSignature.Equals(resultMap["authSignature"]) && "0000".Equals((resultMap.ContainsKey("resultCode") ? resultMap["resultCode"] : "null"))) + vm.Pay.uno = SUserInfo.UserNo; + vm.Pay.uip = GetUserIP(); + if (vm.Pay.payamt != GetInt((xpay.Response("LGD_AMOUNT", 0) ?? "").Replace(",", ""))) { - cancelMsg += "|보안키오류(E41)"; - vm.Pay.payresult = "0:보안키오류(E41)"; - //망취소 - if ("0000".Equals((resultMap.ContainsKey("resultCode") ? resultMap["resultCode"] : "null"))) - { - vm.Pay.payresult = "0:데이터 위변조 에크 오류(E42)"; - cancelMsg += "|데이터위변조 체크 실패(E42)"; - throw new Exception("데이터 위변조 체크 실패"); - } - else - { - try - { - Dao.Save("pay.pay.fail", new System.Collections.Hashtable() { {"payno", oid },{"pstatus", 66 }, - { "payresult", (resultMap.ContainsKey("resultCode") ? resultMap["resultCode"] : "").Substring(0, 100)}, - {"payresultmsg", (resultMap.ContainsKey("resultCode") ? resultMap["resultCode"] : "").Substring(0, 100) },{ "uno", SUserInfo.UserNo},{"uip", GetUserIP() } }); - } - catch (Exception ex2) - { - SetError(cancelMsg += "|" + (cancelMsg ?? "") + "|" + ex2.StackTrace); - } - } + vm.Pay.payresult = "0:결제금액 오류(E3)"; + cancelMsg += "|결제금액 오류(E3)"; + throw new Exception("결제금액 오류(E3)"); } else { - vm.Pay.payresult = "0:결제오류(기타)(E44)"; + if (vm.Pay.ptype == 3) + { //가상계좌 + vm.Pay.vactnum = xpay.Response("LGD_ACCOUNTNUM", 0); + vm.Pay.vactbankcode = xpay.Response("LGD_FINANCECODE", 0); + vm.Pay.vactbankname = xpay.Response("LGD_FINANCENAME", 0); + vm.Pay.vactname = xpay.Response("LGD_SAOWNER", 0); + vm.Pay.vactinname = xpay.Response("LGD_PAYER", 0); + //vm.Pay.paylimit = Convert.ToDateTime(xpay.Response("LGD_CLOSEDATE", 0)); + } + else if (vm.Pay.ptype == 2) + { //실시간계좌이체 + vm.Pay.vactbankcode = xpay.Response("LGD_FINANCECODE", 0); + vm.Pay.cshrtype = xpay.Response("LGD_CASHRECEIPTKIND", 0); + vm.Pay.cshrauthno = xpay.Response("LGD_CASHRECEIPTNUM", 0); + } + else + {//카드 + vm.Pay.cardquota = xpay.Response("LGD_CARDINSTALLMONTH", 0); + if (!"00".Equals(xpay.Response("LGD_CARDINSTALLMONTH", 0)) && "1".Equals(xpay.Response("LGD_CARDNOINTYN", 0))) + { + vm.Pay.cardquotatype = 1; + } + vm.Pay.cardnum = xpay.Response("LGD_CARDNUM", 0); + vm.Pay.iscardpoint = vm.Pay.cardquota.Count() == 4 ? 1 : 0; // 포인트 사용 시 할부개월 + 포인트별로 숫자 두개가 붙음, 즉 4개면 포인트 사용했다는 뜻 + vm.Pay.cardcode = xpay.Response("LGD_FINANCECODE", 0); + vm.Pay.cardbankcode = xpay.Response("LGD_CARDACQUIRER", 0); + vm.Pay.cardprtccode = xpay.Response("LGD_PCANCELFLAG", 0); + vm.Pay.checkflag = xpay.Response("LGD_CARDGUBUN2", 0); + } + vm.Pay.payresult = xpay.Response("LGD_RESPCODE", 0); + vm.Pay.payresultmsg = xpay.Response("LGD_RESPMSG", 0); + vm.Pay.pgkey = xpay.Response("LGD_TID", 0); + vm.Pay.mid = LGD_MID; + vm.Pay.uno = SUserInfo.UserNo; + vm.Pay.uip = GetUserIP(); + //상품구매완료 처리 (최소 3건 업데이트 (pay, paydata, payitem) + if (Dao.Save("pay.paylect", vm.Pay) < 3) + { + vm.Pay.payresult = "0:구매완료 실패(E4)"; + cancelMsg += "|구매완료 실패(E4)"; + throw new Exception("구매완료 실패(E4)"); + } + vm.Pay.payresult = "1:결제완료"; try { - Dao.Save("pay.pay.fail", new System.Collections.Hashtable() { {"payno", oid },{"pstatus", 66 }, - { "payresult", (resultMap.ContainsKey("resultCode") ? resultMap["resultCode"] : "").Substring(0, 100)}, - {"payresultmsg", (resultMap.ContainsKey("resultCode") ? resultMap["resultCode"] : "").Substring(0, 100) },{ "uno", SUserInfo.UserNo},{"uip", GetUserIP() } }); + vm.Pay.oid2 = GetConfig("PAYMENT_CLASSIFICATION") + vm.Pay.payno; + vm.PayItemResults = Dao.Get("pay.payitems", vm.Pay.payno); + vm.PayItem = Dao.Get("pay.payresult", new System.Collections.Hashtable() { { "payno", vm.Pay.payno }, { "userno", SUserInfo.UserNo } }).First(); + vm.Pay.pstatus = vm.Pay.ptype == 1 ? 1 : 22; + vm.CM = Dao.Get("cm.cms", new System.Collections.Hashtable() { { "cmno", vm.PayItemResults.First().itemno } }).FirstOrDefault(); } - catch (Exception ex2) + catch (Exception exresult) { - SetError(cancelMsg += "|" + (cancelMsg ?? "") + "|" + ex2.StackTrace); + SetError(exresult.StackTrace); } + #region 영수증 출력 관련 + String authdata = vm.Pay.mid + vm.Pay.pgkey + GetConfig("LGD_MERTKEY"); + HashAlgorithm hash; + byte[] authdataTextBytes = Encoding.UTF8.GetBytes(authdata); + hash = new MD5CryptoServiceProvider(); + byte[] hashed = hash.ComputeHash(authdataTextBytes); + for (int i = 0; i < hashed.Length; i++) + { + vm.Pay.authdata += string.Format("{0:x2}", hashed[i]); + } + #endregion } } - // 수신결과를 파싱후 resultCode가 "0000"이면 승인성공 이외 실패 - // 가맹점에서 스스로 파싱후 내부 DB 처리 후 화면에 결과 표시 - // payViewType을 popup으로 해서 결제를 하셨을 경우 - // 내부처리후 스크립트를 이용해 opener의 화면 전환처리를 하세요 - //throw new Exception("강제 Exception"); } catch (Exception ex) { - //#################################### - // 실패시 처리(***가맹점 개발수정***) - //#################################### - //---- db 저장 실패시 등 예외처리----// + //망취소 + xpay.Rollback("상점 DB처리 실패로 인하여 Rollback 처리 [TID:" + xpay.Response("LGD_TID", 0) + ",MID:" + xpay.Response("LGD_MID", 0) + ",OID:" + xpay.Response("LGD_OID", 0) + "]"); - //##################### - // 망취소 API - //##################### - String netcancelResultString = processHTTP(authMap, netCancel); // 망취소 요청 API url(고정, 임의 세팅 금지) - // 취소 결과 확인 - //Response.Write("

" + netcancelResultString.Replace("<", "<").Replace(">", ">") + "

"); - //망취소기록 - try + if ("0000".Equals(xpay.m_szResCode)) { - vm.Pay.cancelresult = (vm.Pay.cancelresult ?? "") + "|" + netcancelResultString; + try + { + // 자동취소가 정상적으로 완료 되었을때 + vm.Pay.cancelresult = (vm.Pay.cancelresult ?? "") + "|" + xpay.Response("LGD_RESPMSG", 0); + vm.Pay.pstatus = 66; + Dao.Save("pay.pay.fail", vm.Pay); + SetError(cancelMsg += "|" + xpay.Response("LGD_RESPMSG", 0) + "|" + ex.StackTrace); + } + catch (Exception ex2) + { + SetError(cancelMsg += "|" + xpay.Response("LGD_RESPMSG", 0) + "|" + ex2.StackTrace); + } + } + else + { + // 자동취소가 정상적으로 처리되지 않았을때 + vm.Pay.cancelresult = (vm.Pay.cancelresult ?? "") + "|" + xpay.Response("LGD_RESPMSG", 0); vm.Pay.pstatus = 66; Dao.Save("pay.pay.fail", vm.Pay); - SetError(cancelMsg += "|" + (netcancelResultString ?? "") + "|" + ex.StackTrace); - } - catch (Exception ex2) - { - SetError(cancelMsg += "|" + (netcancelResultString ?? "") + "|" + ex2.StackTrace); + SetError(cancelMsg += "|" + xpay.Response("LGD_RESPCODE", 0) + "|" + xpay.Response("LGD_RESPMSG", 0)); } + vm.Pay.payresult = "0:결제중 오류(E101)"; } } else { - //############# - // 인증 실패시 - //############# - vm.Pay.payresult = "0:인증실패"; - vm.Pay.cancelresult = HttpUtility.UrlDecode(sb.ToString()); + //통신상의 문제 발생(최종결제요청 결과 실패 DB처리) + vm.Pay.payresult = "0:통신상의 문제 발생(" + xpay.Response("LGD_RESPCODE", 0) + ")"; + vm.Pay.cancelresult = xpay.Response("LGD_RESPMSG", 0); + if ("S007".Equals(xpay.m_szResCode)) + { + vm.Pay.cancelresult = "이미 거래시도된 내역입니다."; + } + else + { + try + { + Dao.Save("pay.pay.fail", new System.Collections.Hashtable() { {"payno", payno },{"pstatus", 66 }, + { "payresult", xpay.Response("LGD_RESPCODE", 0)}, + { "payresultmsg", xpay.Response("LGD_RESPMSG", 0) }, + { "uno", SUserInfo.UserNo},{"uip", GetUserIP() } }); + } + catch (Exception ex2) + { + SetError(cancelMsg += "|" + (cancelMsg ?? "") + "|" + ex2.StackTrace); + } + } } } else { - var noti = Request["P_NOTI"]; - //모바일 - vm.pginfo = GetConfig("pginfo"); - vm.IsMobilePay = true; - System.Collections.Specialized.NameValueCollection parameters = Request.Params; - if ("00".Equals(parameters.Get("P_STATUS"))) - { - String strReplace = ""; - try - { - //데이터베이스 - System.Collections.Generic.Dictionary authMap = new System.Collections.Generic.Dictionary(); - authMap.Add("P_TID", parameters.Get("P_TID"));// 필수 - authMap.Add("P_MID", vm.pginfo.Split('|')[1]); // 필수 - //결제승인요청 - String authResultString = processHTTP(authMap, parameters.Get("P_REQ_URL")); - strReplace = authResultString.Replace(",", "&").Replace(":", "=").Replace("\"", "").Replace(" ", "").Replace("\n", "").Replace("}", "").Replace("{", ""); - System.Collections.Generic.Dictionary resultMap = parseStringToMap(strReplace); - if ("00".Equals(resultMap["P_STATUS"])) - { - //db처리 - try - { - Int64 oid = GetLong(resultMap["P_OID"].Substring(2)); - vm.Pay = Dao.Get("pay.pay", new System.Collections.Hashtable() { { "payno", oid }, { "userno", SUserInfo.UserNo } }).FirstOrDefault(); - if (vm.Pay == null) - { - vm.Pay = new Pay() { payno = 0, payresultmsg = "주문내역오류입니다." }; - throw new Exception("결제상품 오류(E1)"); - } - else if (vm.Pay.pstatus == 1 || vm.Pay.pstatus == 22) - { - vm.Pay = new Pay() { payno = 0, payresultmsg = "이미 결제된 주문내역입니다." }; - } - else - { - vm.Pay.uno = SUserInfo.UserNo; - vm.Pay.uip = GetUserIP(); - if (vm.Pay.payamt != GetInt((resultMap["P_AMT"] ?? "").Replace(",", ""))) - { - vm.Pay = new Pay() { payno = 0, payresultmsg = "결제금액 오류입니다." }; - throw new Exception("결제금액 오류(E3)"); - } - else - { - //if (GetConfig("ispaytest") == "1" && vm.Pay.ptype != 3) - //{ - // try - // { - // //개발단 망취소 - // System.Collections.Generic.Dictionary authMapCancel = new System.Collections.Generic.Dictionary(); - // authMapCancel.Add("P_TID", parameters.Get("P_TID")); - // authMapCancel.Add("P_MID", vm.pginfo.Split('|')[1]); - // authMapCancel.Add("P_AMT", vm.Pay.payamt.ToString()); - // authMapCancel.Add("P_OID", resultMap["P_OID"]); - // authResultString = processHTTP(authMapCancel, parameters.Get("P_REQ_URL").Substring(0, parameters.Get("P_REQ_URL").Length - parameters.Get("P_REQ_URL").Split('/').Last().Length) + "payNetCancel.ini", true); - // strReplace = authResultString.Replace(",", "&").Replace(":", "=").Replace("\"", "").Replace(" ", "").Replace("\n", "").Replace("}", "").Replace("{", ""); - // System.Collections.Generic.Dictionary resultMapCancel = parseStringToMap(strReplace); - // if ("00".Equals(resultMapCancel["P_STATUS"])) - // { - // Console.WriteLine(resultMapCancel["P_TID"] + ":" + resultMapCancel["P_RMESG1"]); - // } - // else - // { - // Console.WriteLine(EuckrToUtf8(resultMapCancel["P_RMESG1"])); - // } - // } - // catch (Exception excancel) - // { - // SetError(excancel.Message); - // } - //} - if (vm.Pay.ptype == 3) - { - #region 가상계좌파라미터전문 - //가상계좌 - //"P_STATUS=00&P_AUTH_DT=20190819174235&P_AUTH_NO=&P_RMESG1=성공적으로 처리 하였습니다.&P_RMESG2= - //&P_TID =INIMX_VBNKINIpayTest20190819174235894667&P_FN_CD1=&P_AMT=1000&P_TYPE=VBANK&P_UNAME=npuser1name&P_MID=INIpayTest - //&P_OID=te170&P_NOTI=MOBILE|/OffDetail?cmno=87|170 - //&P_NEXT_URL=https://phd.nptc.kr:8080/Course/OffPayReturn&P_MNAME= - //&P_NOTEURL=https://phd.nptc.kr:8080/Account/PayVBankMoney - //&P_VACT_NUM=07500531297112 - //&P_VACT_DATE=20190825 - //&P_VACT_TIME=235900 - //&P_VACT_NAME=(주)케이지이니시 - //&P_VACT_BANK_CODE=03 - //&P_CSHR_CODE=0000&P_CSHR_MSG=정상처리되었습니다.&P_CSHR_AMT=1000 - //&P_CSHR_SUP_AMT=1000&P_CSHR_TAX=0&P_CSHR_SRVC_AMT=0&P_CSHR_TYPE=0&P_CSHR_DT=20190819174235&P_CSHR_AUTH_NO=" - #endregion - vm.Pay.vactnum = resultMap["P_VACT_NUM"]; - vm.Pay.vactbankcode = resultMap["P_VACT_BANK_CODE"]; - vm.Pay.vactbankname = GetBankName(resultMap["P_VACT_BANK_CODE"]); - vm.Pay.vactname = resultMap["P_VACT_NAME"]; - //vm.Pay.vactinname = resultMap.ContainsKey("VACT_InputName") ? resultMap["VACT_InputName"] : null; 입금자명 안주네? - } - else if (vm.Pay.ptype == 2) - { - #region 실시간계좌이체 파라미터전문 - /* - * 실시간계좌이체 - P_STATUS=00 - P_AUTH_DT =20190820154747 - P_AUTH_NO= - P_RMESG1=성공적으로처리하였습니다. - P_RMESG2= - P_TID=INIMX_DBNKINIpayTest20190820154747214066 - P_FN_CD1=04 - P_AMT=1000 - P_TYPE=BANK - P_UNAME=npuser1name - P_MID=INIpayTest - P_OID=te222 - P_NOTI=MOBILE|/OffDetail?cmno=87|222 - P_NEXT_URL=https=//phd.nptc.kr=8080/Course/OffPayReturn - P_MNAME= - P_NOTEURL= - P_FN_NM=KB국민은행 - P_ACCT_NUM=*********58215 - P_CSHR_CODE=0000 - P_CSHR_MSG=정상처리되었습니다. - P_CSHR_AMT=1000 - P_CSHR_SUP_AMT=1000 - P_CSHR_TAX=0 - P_CSHR_SRVC_AMT=0 - P_CSHR_TYPE=0 - P_CSHR_DT=20190820154747 - P_CSHR_AUTH_NO=266393740 - */ - #endregion - vm.Pay.vactnum = resultMap["P_ACCT_NUM"]; - vm.Pay.vactbankcode = resultMap["P_FN_CD1"]; - vm.Pay.vactbankname = resultMap["P_FN_NM"]; - vm.Pay.cshrrcode = resultMap["CSHR_ResultCode"]; - vm.Pay.cshrtype = resultMap["CSHR_Type"]; - vm.Pay.cshrauthno = resultMap["P_CSHR_AUTH_NO"]; - - } - else - { - #region 신용카드 파라미터전문 - //카드 - //P_STATUS=00 - //P_AUTH_DT =20190820154214 - //P_AUTH_NO =30025104 - //P_RMESG1=성공적으로처리하였습니다. - //P_RMESG2=00 - //P_TID=INIMX_ISP_INIpayTest20190820154214874779 - //P_FN_CD1=06 - //P_AMT=1000 - //P_TYPE=CARD - //P_UNAME=npuser1name - //P_MID=INIpayTest - //P_OID=te219 - //P_NOTI=MOBILE|/OffDetail?cmno=87|219 - //P_NEXT_URL=https=//phd.nptc.kr=8080/Course/OffPayReturn - //P_MNAME= - //P_NOTEURL= - //P_CARD_MEMBER_NUM= - //P_CARD_NUM=943646*********7 - //P_CARD_ISSUER_CODE=04 - //P_CARD_PURCHASE_CODE=06 - //P_CARD_PRTC_CODE=1 - //P_CARD_INTEREST=0 - //P_CARD_CHECKFLAG=1 - //P_CARD_ISSUER_NAME=국민카드 - //P_CARD_PURCHASE_NAME=국민계열 - //P_FN_NM=국민계열 - //P_ISP_CARDCODE=000204040015606 - //P_CARD_APPLPRICE=1000 - #endregion - vm.Pay.cardquota = resultMap["P_RMESG2"]; - vm.Pay.cardquotatype = GetInt(resultMap["P_CARD_INTEREST"]); - vm.Pay.cardnum = resultMap["P_CARD_NUM"]; - vm.Pay.cardcode = resultMap["P_FN_CD1"]; - vm.Pay.cardbankcode = resultMap["P_CARD_ISSUER_CODE"]; - vm.Pay.cardprtccode = resultMap["P_CARD_PURCHASE_CODE"]; - vm.Pay.checkflag = resultMap["P_CARD_CHECKFLAG"]; - vm.Pay.vactname = resultMap["P_AUTH_NO"]; - } - vm.Pay.payresult = resultMap["P_STATUS"]; - vm.Pay.payresultmsg = resultMap["P_RMESG1"]; - vm.Pay.pgkey = resultMap["P_TID"]; - vm.Pay.uno = SUserInfo.UserNo; - vm.Pay.uip = GetUserIP(); - //상품구매완료 처리 (최소 3건 업데이트 (pay, paydata, payitem) - if (Dao.Save("pay.paylect", vm.Pay) < 3) - { - //vm.Pay.payresult = "0:구매완료 실패(E4)"; - vm.Pay = new Pay() { payno = 0, payresultmsg = "상품DB처리 중 오류발생" }; - throw new Exception("구매완료 실패(E4)"); - } - vm.Pay.payresult = "1:결제완료"; - try - { - vm.Pay.oid2 = vm.pginfo.Split('|')[4] + vm.Pay.payno; - vm.PayItemResults = Dao.Get("pay.payitems", vm.Pay.payno); - } - catch (Exception exresult) - { - SetError(exresult.StackTrace); - } - return View("PayReturn", vm); - } - } - } - catch (Exception ex2) - { - SetError("모바일결제오류망취소: " + noti.Split('|')[1] + ": " + ex2.Message); - //망취소요청 - try - { - vm.Pay = new Pay() { payno = 0, payresultmsg = "상품 DB처리중 오류발생" }; - //개발단 망취소 - System.Collections.Generic.Dictionary authMapCancel = new System.Collections.Generic.Dictionary(); - authMapCancel.Add("P_TID", parameters.Get("P_TID")); - authMapCancel.Add("P_MID", vm.pginfo.Split('|')[1]); - authMapCancel.Add("P_AMT", vm.Pay.payamt.ToString()); - authMapCancel.Add("P_OID", resultMap["P_OID"]); - authResultString = processHTTP(authMapCancel, parameters.Get("P_REQ_URL").Substring(0, parameters.Get("P_REQ_URL").Length - parameters.Get("P_REQ_URL").Split('/').Last().Length) + "payNetCancel.ini", true); - strReplace = authResultString.Replace(",", "&").Replace(":", "=").Replace("\"", "").Replace(" ", "").Replace("\n", "").Replace("}", "").Replace("{", ""); - System.Collections.Generic.Dictionary resultMapCancel = parseStringToMap(strReplace); - if ("00".Equals(resultMapCancel["P_STATUS"])) - { - Console.WriteLine(resultMapCancel["P_TID"] + ":" + resultMapCancel["P_RMESG1"]); - } - else - { - SetError("모바일망취소실패2: " + noti.Split('|')[1] + ": " + (resultMapCancel["P_RMESG1"] ?? "")); - } - } - catch (Exception ex3) - { - SetError("모바일망취소실패1: " + noti.Split('|')[1] + ": " + ex2.Message); - } - } - vm.Pay = new Pay() { payno = 1, payresultmsg = Request["P_RMESG1"] }; - } - else - { - //Dictionary secureMap = new Dictionary(); - //if (resultMap["resultCode"] == "R201") - //{ - vm.Pay = new Pay() { payno = GetLong(Request["P_NOTI"].Split('|')[2]), oid2 = GetConfig("pginfo").Split('|')[4] + GetLong(Request["P_NOTI"].Split('|')[2]) }; - vm.Pay.payresult = "1:결제완료"; - //기결제 건(새로고침) - vm.PayItemResults = Dao.Get("pay.payitems", vm.Pay.payno); - return View("PayReturn", vm); - //} - //SetError("모바일결제오류02: " + noti.Split('|')[1] + ": "); - //vm.Pay = new Pay() { payno = 0, payresultmsg = "결제사 승인오류발생" }; - } - } - catch (Exception ex) - { - SetError("모바일결제오류01: " + noti.Split('|')[1] + ": " + ex.Message); - vm.Pay = new Pay() { payno = 0, payresultmsg = "결제사 연결중 오류발생" }; - } - } - else - { - vm.Pay = new Pay() { payno = 0, payresultmsg = Request["P_RMESG1"] + "
결제완료화면에서 이전화면으로 돌아가면서 이동하면 발생하는 경우일 수 있습니다." }; - } + //2)API 요청실패 화면처리 + vm.Pay.payresult = "0:결제요청실패(" + xpay.m_szResCode + ")"; + vm.Pay.cancelresult = xpay.m_szResMsg; } } - return View("PayReturn", vm); + return View("ApplyComplete", vm); } } } diff --git a/FO/Views/Course/ApplyComplete.cshtml b/FO/Views/Course/ApplyComplete.cshtml index 274c3d4..c8c6539 100644 --- a/FO/Views/Course/ApplyComplete.cshtml +++ b/FO/Views/Course/ApplyComplete.cshtml @@ -1,86 +1,103 @@ - @*강좌번호*@ -
-

신청완료

-
- -

신청강좌

-
    -
  • -
      -
    • - @if (Model.CM.cshape == 0) - { -

      - } - else if (Model.CM.cshape == 1) - { -

      - } - else if (Model.CM.cshape == 2) - { -

      - } - - @if (Model.CM.applicableCM == "정상접수") - { - 정상접수 - } - else - { - 대기접수 - } -
    • -
    -
    - 결제금액 : @Model.CM.infee 원 -
    -
  • -
-@if (Model.CM.applicableCM == "정상접수") +@model NP.Model.VMPay +@*
+

신청@(Model.Pay.payresult.Substring(0, 1) == "1" ? "완료" : "실패")

+
*@ +@if (Model.Pay.payresult.Substring(0, 1) != "1") { -

결제정보

- - - - - - - - - - - - - - - - - - - - - - - -
구매금액
지불방법카드결제
입금계좌국민은행 | 계좌번호 | (주)이니시스
주문접수일2017-10-16 12ㅣ00 (만료일: 2018-10-16 12:00)
주문상태결제완료
+

결제실패

+
+ @(!string.IsNullOrEmpty(Model.Pay.cancelresult) ? Model.Pay.cancelresult : Model.Pay.payresult.Substring(1)) +
} else { -
-
위 강좌의 대기접수가 완료되었습니다.
-
(대기인원 : @Model.CM.standbyPerson명)
-

※ 결원 발생 시 대기신청 차례에 따라 교육생 연락처로 연락드릴 예정입니다.

-

※ 교육비 결제는 마이페이지 학습현황의 학습대기에서 가능하며 교육비결제 완료 후 학습을 시작할 수 있습니다.

-
-
    -
  • 마이페이지
  • -
  • 계속 신청하기
  • +

    신청강좌

    +
      +
    • +
        +
      • + @if (Model.CM.cshape == 0) + { +

        + } + else if (Model.CM.cshape == 1) + { +

        + } + else if (Model.CM.cshape == 2) + { +

        + } + + @*@if (Model.CM.applicableCM == "정상접수") + { + 정상접수 + } + else + { + 대기접수 + }*@ +
      • +
      +
      + 총 결제@(Model.Pay.isready==1?"예상":"")금액 : @Model.CM.infee.ToString("#,0") 원 +
      +
    + if (Model.Pay.isready == 0) + { +

    결제정보

    + + + + + + + + + + + @if (Model.Pay.ptype == 3) + { + + + + + + + + + } + + + + + +
    구매금액@Model.Pay.payamt.ToString("#,0") 원
    지불방법@Model.Pay.ptypename
    입금계좌 + @Model.Pay.vactbankname | @Model.Pay.vactnum | @Model.Pay.vactname +
    주문접수일@DateTime.Now.ToString("yyyy-MM-dd HH:mm") (만료일: @Model.Pay.paylimit.Value.ToString("yyyy-MM-dd HH:mm"))
    주문상태@Model.Pay.pstatusname
    + + } + else + { +
    +
    위 강좌의 대기접수가 완료되었습니다.
    +
    (대기인원 : @Model.Pay.ccount.ToString("#,0")명)
    +

    ※ 결원 발생 시 대기신청 차례에 따라 교육생 연락처로 연락드릴 예정입니다.

    +

    ※ 교육비 결제는 마이페이지 학습현황의 학습대기에서 가능하며 교육비결제 완료 후 학습을 시작할 수 있습니다.

    +
    + + } } - diff --git a/FO/Views/Course/ApplyPay.cshtml b/FO/Views/Course/ApplyPay.cshtml index 60e4018..9e04d4f 100644 --- a/FO/Views/Course/ApplyPay.cshtml +++ b/FO/Views/Course/ApplyPay.cshtml @@ -136,7 +136,8 @@ if (capResult.obj == 0) { var resultmsg = capResult.msg; if (resultmsg.indexOf("buyertel")) { - msg("개인정보에 휴대폰 번호를 입력해주세요."); + //msg("개인정보에 휴대폰 번호를 입력해주세요."); + msg(capResult.msg || "이미 신청한 강좌인지 확인해주세요."); } else { msg(capResult.msg); } diff --git a/FO/Views/Course/XpayREQ.cshtml b/FO/Views/Course/XpayREQ.cshtml index c6c8da6..d5ac701 100644 --- a/FO/Views/Course/XpayREQ.cshtml +++ b/FO/Views/Course/XpayREQ.cshtml @@ -43,7 +43,6 @@ else function payment_return() { var fDoc; fDoc = lgdwin.contentWindow || lgdwin.contentDocument; - alert(1); document.getElementById("LGD_PAYINFO").target = "_self"; if (fDoc.document.getElementById('LGD_RESPCODE').value == "0000") { document.getElementById("LGD_PAYKEY").value = fDoc.document.getElementById('LGD_PAYKEY').value; @@ -52,7 +51,7 @@ else } else { document.getElementById("rsMsg").value = fDoc.document.getElementById('rsMsg').value; - document.getElementById("LGD_PAYINFO").action = "/Course/PayOn"; + document.getElementById("LGD_PAYINFO").action = "/Course/ApplyPay"; closeIframe(); document.getElementById("LGD_PAYINFO").submit(); } diff --git a/FO/Views/Home/Index.cshtml b/FO/Views/Home/Index.cshtml index 310c8ff..f740a50 100644 --- a/FO/Views/Home/Index.cshtml +++ b/FO/Views/Home/Index.cshtml @@ -283,6 +283,9 @@ } } }); + if (@Model.isalreadyreq == 1) { + msg("이미 신청된 강좌입니다. 메인화면으로 이동되었습니다."); + } }); function schIpt(num, code, name) { $('#sch' + num).val(code); diff --git a/FO/Views/My/Ready.cshtml b/FO/Views/My/Ready.cshtml index 685c9f4..f92e1ee 100644 --- a/FO/Views/My/Ready.cshtml +++ b/FO/Views/My/Ready.cshtml @@ -6,7 +6,11 @@
    • 결제완료 이전의 신청과정은 즉시 취소하실 수 있습니다.
    • 결제완료 이후의 과정들은 결제현황 페이지에서 신청취소 및 환불요청을 해주셔야 합니다.
    • -
    • 결제대기중인 과정들은 결제를 완료하셔야 최종 신청이 완료됩니다.
    • +
    • 무통장입금(가상계좌)는 신청기간 내에 입금 완료 되어야 신청이 완료됩니다. (신청 기간이 지나면 자동 취소되고 결제대기 처리됩니다.)
    • +
    • + 교육일정 변경은 및 교육취소는 교육시작일 기준 5일전 까지만 가능 합니다.
      + 입교가 확정된 과정에 대하여 미 참석 하실 경우 다음 번 교육신청 시 제한이 될 수 있으니 교육취소 및 변경 기한이 지난 경우에는 교육원으로 연락하여 주시기 바랍니다(1544-77660) +
    @@ -31,17 +35,23 @@ @d.cshapename @Html.Raw(d.isrebate == 1 ? "환급" : "") @d.cname + @Html.Raw(d.pstatus == 21 ? string.Format("교육비납부", d.payno) : "")
    -
    @(d.pstatus == 51 ? "심사중" : d.pstatus == 21 ? "결제대기" : d.pstatus == 22 ? "입금대기" : d.pstatus == 1 && d.rfdstatus > 0 ? "환불요청" : d.pstatus == 1 ? "결제완료" : d.rstatus == 1 ? "부분환불" : d.rstatus == 2 ? "전액환불" : "-")
    - @Html.Raw(d.pstatus == 21 ? string.Format("
    결제하기
    ", d.payno):"") -
    신청(교육)기간 : @d.rstime.Value.ToString("yy/MM/dd") ~ @d.retime.Value.ToString("yy/MM/dd") (@d.sstime.ToString("yy/MM/dd") ~ @d.setime.ToString("yy/MM/dd"))
    +
    @(d.pstatus == 55 ? "대기신청" : d.pstatus == 51 ? "심사중" : d.pstatus == 21 ? "결제대기" : d.pstatus == 22 ? "입금대기" : d.pstatus == 1 && d.rfdstatus > 0 ? "환불요청" : d.pstatus == 1 ? "결제완료" : d.rstatus == 1 ? "부분환불" : d.rstatus == 2 ? "전액환불" : "-")
    +
    + 신청(교육)기간 : @d.rstime.Value.ToString("yy'/'MM'/'dd") ~ @d.retime.Value.ToString("yy'/'MM'/'dd") (@d.sstime.ToString("yy'/'MM'/'dd") ~ @d.setime.ToString("yy'/'MM'/'dd")) + @if (d.cshape == 2) + { + @:| 집체교육기간 : @(d.cmisno == null ? "미정" : ("[" + d.studyplacename + "]" + string.Format("{0}~{1}", d.cmiestart.ToString("yy'/'MM'/'dd"), d.cmieend.ToString("yy'/'MM'/'dd")))) + } +
    @(d.isgroup == 0 ? 1 : Model.PIs.Where(w=>w.payno == d.payno && w.itemno == d.itemno).Count())명 - @(d.pstatus==51||d.pstatus == 21 || d.pstatus == 22?"취소":"결제상세") + @(d.pstatus == 55 || d.pstatus==51||d.pstatus == 21 || d.pstatus == 22?"취소":"결제상세") if (d.isgroup == 1) { @@ -65,6 +75,20 @@ } +@section styles{ + +} @section scriptsHeader{ } diff --git a/FO/Web.config b/FO/Web.config index f8891c3..b652a79 100644 --- a/FO/Web.config +++ b/FO/Web.config @@ -69,7 +69,7 @@ - + diff --git a/Model/CM.cs b/Model/CM.cs index 5203225..406a95b 100644 --- a/Model/CM.cs +++ b/Model/CM.cs @@ -438,6 +438,7 @@ namespace NP.Model /// public int finalcut { get; set; } public String username { get; set; } + public Int64 lectnocheck { get; set; } } [Serializable] diff --git a/Model/Model.csproj b/Model/Model.csproj index 81e1ae6..52a78cc 100644 --- a/Model/Model.csproj +++ b/Model/Model.csproj @@ -65,6 +65,7 @@ + \ No newline at end of file diff --git a/Model/PPLog.cs b/Model/PPLog.cs index 935a47d..63517ea 100644 --- a/Model/PPLog.cs +++ b/Model/PPLog.cs @@ -52,6 +52,6 @@ namespace NP.Model public int? slevel { get; set; } public Int64 payno { get; set; } - + public int pstatus { get; set; } } } diff --git a/Model/Pay.cs b/Model/Pay.cs index 2eb39ad..23759a4 100644 --- a/Model/Pay.cs +++ b/Model/Pay.cs @@ -21,6 +21,10 @@ namespace NP.Model /// 결제방식 1:신용카드,2:계좌이체,3:가상계좌,4:현금,5:현금+카드,6:무료,7:대기신청,9:위탁계약 /// public int ptype { get; set; } + /// + /// 0:정상, 1:대기신청 + /// + public int isready { get; set; } public String ptypecode { get @@ -92,7 +96,7 @@ namespace NP.Model /// public int refunding { get; set; } /// - /// 가상계좌입금만료일 수강신청 또는 가상계좌유효기간 중 빠른시간 가상계좌는 발급일로부터 7일 + /// 가상계좌입금만료일 수강신청 또는 가상계좌유효기간 중 빠른시간 가상계좌는 발급일로부터 ?일 /// public DateTime? paylimit { get; set; } public String paylimitymd { get { @@ -211,7 +215,17 @@ namespace NP.Model public int iscanceled { get; set; } public int iscashrct { get; set; } public String cashrcthp { get; set; } - + + //public Xpay xpay { get; set; } + public String mid { get; set; } + /// + /// 무결성 검증 필드 + /// LGD_MID, LGD_TID, MertKey의 조합으로 생성된 인증문자열을 md5로 암호화한 값 + /// 인증문자열 생성: LGD_MID + LGD_TID + MertKey + /// md5로 인증문자열 암호화(authdata): md5(인증문자열) + /// + public String authdata { get; set; } + } public class PayItem : BaseModel @@ -466,6 +480,9 @@ namespace NP.Model public int? infee { get; set; } public int? outfee { get; set; } public int ispg { get; set; } + public String studyplacename { get; set; } + public DateTime cmiestart { get; set; } + public DateTime cmieend { get; set; } } /// @@ -724,6 +741,7 @@ namespace NP.Model public class PayItemResult : BaseModel { public Int64 payno {get;set;} + public Int64 itemno { get; set; } public int isgroup {get;set;} public int isexam { get; set; } public int isdvr {get;set;} diff --git a/Model/VMHome.cs b/Model/VMHome.cs index f22bd74..4a9d0ef 100644 --- a/Model/VMHome.cs +++ b/Model/VMHome.cs @@ -16,5 +16,6 @@ namespace NP.Model public IList CMsEtc { get; set; } public IList Datas { get; set; } public IList CMInnings { get; set; } + public int isalreadyreq { get; set; } } } diff --git a/Model/VMPay.cs b/Model/VMPay.cs index 4967a9a..4518537 100644 --- a/Model/VMPay.cs +++ b/Model/VMPay.cs @@ -59,5 +59,6 @@ namespace NP.Model public int iscashrct { get; set; } public String cashrcthp { get; set; } public System.Collections.Hashtable payParams { get; set; } + public CM CM { get; set; } } } diff --git a/Model/Xpay.cs b/Model/Xpay.cs new file mode 100644 index 0000000..e0989fa --- /dev/null +++ b/Model/Xpay.cs @@ -0,0 +1,301 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Text; +namespace NP.Model +{ + /// + /// 구LG 현 토스페이먼츠 + /// + [Serializable] + public class Xpay + { + /// + /// 토스페이먼츠 결제 서비스 선택(test:테스트, service:서비스) + /// + public String CST_PLATFORM { get; set; } + + /// + /// 상점아이디(토스페이먼츠으로 부터 발급받으신 상점아이디를 입력하세요) + /// + public String CST_MID { get; set; } + + /// + /// 상점아이디(자동생성) + /// 테스트 아이디는 't'를 반드시 제외하고 입력하세요. + /// + public String LGD_MID { get; set; } + + /// + /// 주문번호(상점정의 유니크한 주문번호를 입력하세요) + /// + public String LGD_OID { get; set; } + + /// + /// 결제금액("," 를 제외한 결제금액을 입력하세요) + /// + public String LGD_AMOUNT { get; set; } + + /// + /// 구매자명 + /// + public String LGD_BUYER { get; set; } + + /// + /// 상품명 + /// + public String LGD_PRODUCTINFO { get; set; } + + /// + /// 구매자 이메일 + /// + public String LGD_BUYEREMAIL { get; set; } + + /// + /// 타임스탬프 + /// + public String LGD_TIMESTAMP { get; set; } + + /// + /// 상점정의 결제수단 + /// + public String LGD_CUSTOM_USABLEPAY { get; set; } + + /// + /// 상점정의 결제창 스킨 (red, blue, cyan, green, yellow) + /// + public String LGD_CUSTOM_SKIN { get; set; } + + /// + /// 가상계좌 상점결과전송 NOTE_URL + /// + public String LGD_CASNOTEURL { get; set; } + + /// + /// 해쉬암호데이터 + /// + public String LGD_HASHDATA { get; set; } + + /// + /// 결제창 2.0 타입 + /// + public String LGD_CUSTOM_PROCESSTYPE { get; set; } + + /// + /// 응답수신페이지 + /// + public String LGD_RETURNURL { get; set; } + + /// + /// 사용타입 정보(수정 및 삭제 금지): 이 정보를 근거로 어떤 서비스를 사용하는지 판단할 수 있습니다. + /// + public String LGD_VERSION { get; set; } + + /// + /// 결제창 호출 방식 (수정불가) + /// + public String LGD_WINDOW_TYPE { get; set; } + + /// + /// 카드사 호출 방식 (수정불가) + /// + public String LGD_CUSTOM_SWITCHINGTYPE { get; set; } + + /// + /// 결제창 버전정보 + /// + public String LGD_WINDOW_VER { get; set; } + + /// + /// 응답코드: 0000(성공) 그외 실패 + /// 인증후 자동채움 (수정불가) + /// + public String LGD_RESPCODE { get; set; } + + /// + /// 응답메세지 + /// 인증후 자동채움 (수정불가) + /// + public String LGD_RESPMSG { get; set; } + + /// + /// 값 P: XPay 실행(PC 결제 모듈): PC용과 모바일용 모듈은 파라미터 및 프로세스가 다르므로 PC용은 PC 웹브라우저에서 실행 필요. "P", "M" 외의 문자(Null, "" 포함)는 모바일 또는 PC 여부를 체크하지 않음 + /// + public String LGD_OSTYPE_CHECK { get; set; } + + /// + /// 계좌이체 결제시 사용, ActiveX 사용 여부로 "N" 이외의 값: ActiveX 환경에서 계좌이체 결제 진행(IE) + /// + public String LGD_ACTIVEXYN { get; set; } + + /// + /// 환경파일 위치 + /// + public String configPath; + + public String LGD_DOMAIN_URL { get; set; } + + /// + /// 결제창 호출 문자 인코딩방식 + /// Form submit 방식으로 결제창 호출시 EUC-KR이외의 인코딩을 하는 경우만 사용 + /// + public String LGD_ENCODING { get; set; } + + /// + /// 결과수신페이지 호출 문자 인코딩방식 + /// UTF-8로 넘기면 UTF-8로 인코딩된 값을 LGD_NOTEURL, LGD_CASNOTEURL 에 전달 + /// + public String LGD_ENCODING_NOTEURL { get; set; } + + /// + /// 결과수신페이지 호출 문자 인코딩방식 + /// UTF-8로 넘기면 UTF-8로 인코딩된 값을 LGD_RETURNURL 에 전달 + /// + public String LGD_ENCODING_RETURNURL { get; set; } + + /// + /// 결제창 내 신용카드/계좌이체/가상계좌 결제수단을 다시 선택하기 위한 “뒤로가기” 버튼 + /// 'Y: 뒤로가기 버튼 사용 + /// N: 뒤로가기 버튼 사용하지 않음 + /// + public String LGD_BACKBTN_YN { get; set; } + + /// + /// 구매자명 자동채움 + /// 결제요청시 구매자명을 결제창에 자동으로 채움 (Y:사용함, 'N':사용안함) + /// + public String LGD_AUTOFILLYN_BUYER { get; set; } + + /// + /// 현금영수증발급사용여부 + /// Y:사용함, 'N':사용안함 + /// + public String LGD_CASHRECEIPTYN { get; set; } + + /// + /// LG유플러스에서 부여한 거래번호 + /// + public String LGD_TID { get; set; } + + /// + /// 결제수단코드 + /// + public String LGD_PAYTYPE { get; set; } + + /// + /// 거래일시(승인일시/이체일시) + /// + public String LGD_PAYDATE { get; set; } + + /// + /// 결제기관코드(은행코드) + /// + public String LGD_FINANCECODE { get; set; } + + /// + /// 결제기관이름(은행이름) + /// + public String LGD_FINANCENAME { get; set; } + + /// + /// 에스크로 적용여부 + /// + public String LGD_ESCROWYN { get; set; } + + /// + /// 계좌번호(무통장입금) + /// + public String LGD_ACCOUNTNUM { get; set; } + + /// + /// 입금총액(무통장입금) + /// + public String LGD_CASTAMOUNT { get; set; } + + /// + /// 현입금액(무통장입금) + /// + public String LGD_CASCAMOUNT { get; set; } + + /// + /// 무통장입금 플래그(무통장입금) - 'R':계좌할당, 'I':입금, 'C':입금취소 + /// + public String LGD_CASFLAG { get; set; } + + /// + /// 입금순서(무통장입금) + /// + public String LGD_CASSEQNO { get; set; } + + /// + /// 현금영수증 승인번호 + /// + public String LGD_CASHRECEIPTNUM { get; set; } + + /// + /// 현금영수증자진발급제유무 Y: 자진발급제 적용, 그외 : 미적용 + /// + public String LGD_CASHRECEIPTSELFYN { get; set; } + + /// + /// 현금영수증 종류 0: 소득공제용 , 1: 지출증빙용 + /// + public String LGD_CASHRECEIPTKIND { get; set; } + + /// + /// 입금자명 + /// + public String LGD_PAYER { get; set; } + + /// + /// 구매자 ID + /// + public String LGD_BUYERID { get; set; } + + /// + /// 구매자 주소 + /// + public String LGD_BUYERADDRESS { get; set; } + + /// + /// 구매자 전화번호 + /// + public String LGD_BUYERPHONE { get; set; } + + /// + /// 구매자 주민번호 + /// + public String LGD_BUYERSSN { get; set; } + + /// + /// 상품코드 + /// + public String LGD_PRODUCTCODE { get; set; } + + /// + /// 수취인 + /// + public String LGD_RECEIVER { get; set; } + + /// + /// 수취인 전화번호 + /// + public String LGD_RECEIVERPHONE { get; set; } + + /// + /// 배송지 + /// + public String LGD_DELIVERYINFO { get; set; } + + public String LGD_HASHDATA2 { get; set; } + + public String LGD_CLOSEDATE { get; set; } + + public String CST_WINDOW_TYPE { get; set; } + public String LGD_PCVIEWYN { get; set; } + public String LGD_CUSTOM_FIRSTPAY { get; set; } + public String LGD_KVPMISPAUTOAPPYN { get; set; } + public String LGD_MTRANSFERAUTOAPPYN { get; set; } + + } +}