예제 #1
0
파일: Libpriv.cs 프로젝트: Nick1965/Xgate
 public unsafe void closeKey()
 {
     if (ppkey != (byte *)IntPtr.Zero)
     {
         IPriv.closeKey(this);
         handle.Free();
         ppkey = (byte *)IntPtr.Zero;
     }
 }
예제 #2
0
파일: Libpriv.cs 프로젝트: Nick1965/Xgate
        /// <summary>
        /// Проверка подписи ответа
        /// </summary>
        /// <param name="src"></param>
        /// <param name="pubkey"></param>
        /// <param name="serial"></param>
        public static void VerifyMessage(string src, string pubkey, string serial)
        {
            IPrivKey PublicKey = null;

            IPriv.Initialize();
            PublicKey = IPriv.openPublicKey(pubkey, Convert.ToUInt32(serial));

            // Проверить подпись
            PublicKey.verifyText(src);

            // Закрыть крипто-провайдер
            PublicKey.closeKey();
            IPriv.Done();
        }
예제 #3
0
파일: Libpriv.cs 프로젝트: Nick1965/Xgate
        /// <summary>
        /// Подписать сообщение в строке в кодировке 1251
        /// </summary>
        /// <param name="src">Исходное сообщение в кодировке UTF-8</param>
        /// <param name="trg">Сообщение в кодировке 1251 упакованное UrlEncode</param>
        /// <param name="s_text">Сообщение с подписью в кодировке UTF-8 (для лога)</param>
        /// <returns>0 - OK; 1 - ошибка криптопровайдера; -1 - системная ошибка</returns>
        public static void SignMessage(string src, out string trg, out string s_text,
                                       string secret, string passwd)
        {
            trg    = "";
            s_text = "";
            IPrivKey SecretKey = null;

            if (string.IsNullOrEmpty(src))
            {
                throw new IPrivException(-101);
            }

            IPriv.Initialize();
            SecretKey = IPriv.openSecretKey(secret, passwd);

            // Подписать сообщение в кодировке 1251
            s_text = SecretKey.signText(src);

            // Закрыть крипто-провайдер
            SecretKey.closeKey();
            IPriv.Done();

            trg = "inputmessage=" + HttpUtility.UrlEncode(s_text, Encoding.GetEncoding(1251));
        }
예제 #4
0
        /// <summary>
        /// Разбор ответа
        /// </summary>
        /// <param name="stResponse">Блок ответа</param>
        /// <summary>
        /// Разбор ответа
        /// </summary>
        /// <param name="stResponse">Блок ответа</param>
        public override int ParseAnswer(string stResponse)
        {
            // int pos;
            // int begin;

            // Разбор ответа
            if (string.IsNullOrEmpty(stResponse))
            {
                errDesc = Properties.Resources.MsgEmptyAnswer;
                errCode = 1;
                state   = state == 1 ? (byte)0 : (byte)3;
                return(1);
            }

            Log($"{Session} Получен ответ:\r\n-----------------------------------------------------\r\n{stResponse}\r\n=====================================================");

            // Проверка подписи сервера
            try
            {
                lock (TheLock)
                {
                    IPriv.VerifyMessage(stResponse, public_key_path, serial);
                }

                // Log("Подпись проверена");

                // Ответы Киберплат.ком
                // BEGIN

                /*
                 * Код сессии (SESSION);
                 * Номер транзакции (TRANSID);
                 * Внешний номер платежа (RRN);
                 * Дата и время платежа в системе дилера (DATE);
                 * Код авторизации провайдера (AUTHCODE);
                 * Номер телефона (NUMBER);
                 * Номер счета (ACCOUNT);
                 * Сумма платежа (AMOUNT);
                 * Код ответа КиберПлат (ERROR, если ответ был получен);
                 * Результат операции (RESULT), по мнению дилера (0 — успех, 1 — ошибка).
                 */
                // NameValueCollection nav = new NameValueCollection();
                string s = "";
                if (GetAnswer() == 0)
                {
                    // Код ошибки
                    if (!Int32.TryParse(GetValue("Error"), out errCode))
                    {
                        errCode = 400;
                        errDesc = "Невозможно разобрать ответ провайдера";
                        state   = 12;
                        return(100);
                    }

                    // Возвращаемый номер сессии
                    session = GetValue("session");

                    // Результат обработки
                    if (!Int32.TryParse(GetValue("Result"), out result))
                    {
                        errCode = 400;
                        errDesc = "Невозможно разобрать ответ провайдера";
                        state   = 12;
                        return(100);
                    }

                    // Код авторизации платежа
                    if (string.IsNullOrEmpty(acceptCode))
                    {
                        acceptCode = GetValue("authcode");
                    }

                    // Код транзакции в Кибере
                    if (string.IsNullOrEmpty(outtid))
                    {
                        outtid = GetValue("transID");
                    }

                    // Дата проведения платежа
                    if (acceptdate == DateTime.MinValue)
                    {
                        DateTime.TryParse(GetValue("Date"), out acceptdate);
                    }

                    // Дополнительная информация о ПУ
                    if (string.IsNullOrEmpty(addinfo))
                    {
                        addinfo = HttpUtility.UrlEncode(GetValue("addinfo"));
                    }

                    // Номер счета у ПУ
                    if (string.IsNullOrEmpty(account))
                    {
                        account = GetValue("account");
                    }

                    // Остаток на счете
                    if (limit == decimal.MinusOne)
                    {
                        if (!string.IsNullOrEmpty(s = GetValue("rest")))
                        {
                            decimal.TryParse(s, System.Globalization.NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out limit);
                        }
                    }
                    if (limit == decimal.MinusOne)
                    {
                        if (!string.IsNullOrEmpty(s = GetValue("restlimit")))
                        {
                            decimal.TryParse(s, System.Globalization.NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out limit);
                        }
                    }

                    // Наименование ПУ
                    if (string.IsNullOrEmpty(opname))
                    {
                        opname = GetValue("opname");
                    }

                    // Требуемая сумма
                    if (price == decimal.MinusOne)
                    {
                        if (!string.IsNullOrEmpty(s = GetValue("price")))
                        {
                            decimal.TryParse(s, System.Globalization.NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out price);
                        }
                    }

                    errMsg = GetValue("errmsg");
                    return(0);
                }
            }
            catch (ApplicationException ae)
            {
                // Если платёж новый - отменяем и забываем. Иначе надо разбираться
                errCode = 400;
                errDesc = ae.Message;
                state   = State == 1 ? (byte)0 : (byte)3;
                RootLog($"{tid} {Number}{Card} {Account} {Provider}/{Service}/{Gateway}\r\n{ErrDesc}");
            }
            catch (IPrivException ie)
            {
                ErrCode = ie.code;
                ErrDesc = string.Format("({0}) {1}", ie.code, ie.ToString());
                state   = state == 1 ? (byte)0 : (byte)3;
                RootLog($"{tid} {Number}{Card} {Account} {Provider}/{Service}/{Gateway}\r\n{ErrDesc}");
            }
            catch (Exception ex)
            {
                ErrCode = 6;
                ErrDesc = $"ParseAnswer: ({errCode}) {ex.Message}";
                RootLog($"{tid} {Number}{Card} {Account} {Provider}/{Service}/{Gateway}\r\n{ex.ToString()}");
                state = 12;
            }

            return(errCode);
        }
예제 #5
0
        /// <summary>
        /// Создание запроса CHECK/PAY/STATUS
        /// </summary>
        /// <returns></returns>
        public int MakeRequest(bool status = false)
        {
            // ParamBuilder pb = new ParamBuilder(null, true);
            StringBuilder prm    = new StringBuilder();
            string        s_text = "";

            try
            {
                prm.AppendLine("SD", SD);
                prm.AppendLine("AP", AP);
                prm.AppendLine("OP", OP);
                prm.AppendLine("SESSION", "OLDIGW" + tid.ToString());

                if (!status)
                {
                    if (!string.IsNullOrEmpty(ben))                     // Бенефициар
                    {
                        //1839361
                        GetReason();
                        prm.AppendLine("NUMBER", "");
                        prm.AppendLine("ACCOUNT", fio);
                        StringBuilder purpose = new StringBuilder();
                        purpose.Append("BENTYPE-corporate");
                        if (!string.IsNullOrEmpty(ben))
                        {
                            purpose.AppendFormat("||BEN-{0}", ben);
                        }
                        if (!string.IsNullOrEmpty(inn))
                        {
                            purpose.AppendFormat("||BENINN-{0}", inn);
                        }
                        if (!string.IsNullOrEmpty(kpp))
                        {
                            purpose.AppendFormat("||BENKPP-{0}", kpp);
                        }
                        if (!string.IsNullOrEmpty(account))
                        {
                            purpose.AppendFormat("||BENACC-{0}", account);
                        }
                        if (!string.IsNullOrEmpty(bik))
                        {
                            purpose.AppendFormat("||BENBANKBIK-{0}", bik);
                        }
                        if (!string.IsNullOrEmpty(reason))
                        {
                            purpose.AppendFormat("||REASON-{0}", reason);
                        }
                        if (tax != -1)
                        {
                            purpose.AppendFormat("||REASON_FAT-{0}", tax == 0 ? "no_FAT" : tax == 10 ? "FAT10" : "FAT18");
                        }
                        if (!string.IsNullOrEmpty(address))
                        {
                            purpose.AppendFormat("||PAYER_ADDRESS-{0}", address);
                        }
                        purpose.Append("||PRIORITY-05");
                        if (!string.IsNullOrEmpty(kbk))
                        {
                            purpose.AppendFormat("||KBK-{0}", kbk);
                        }
                        if (!string.IsNullOrEmpty(okato))
                        {
                            purpose.AppendFormat("||OKTMO-{0}", okato);
                        }
                        prm.AppendLine("PURPOSE", purpose.ToString());
                    }
                    else
                    {
                        prm.AppendLine("NUMBER", number);
                        prm.AppendLine("CARD", card);
                        prm.AppendLine("FIO", fio);
                        prm.AppendLine("INN", Inn);
                        if (Gateway == "3477" && !string.IsNullOrEmpty(Account) && Account == "-1")
                        {
                            prm.Append("ACCOUNT=\r\n");
                        }
                        else
                        {
                            prm.AppendLine("ACCOUNT", Account);
                        }

                        prm.AppendLine("DOCNUM", docnum);
                        prm.AppendLine("DOCDATE", docdate);
                        prm.AppendLine("PURPOSE", purpose);
                        prm.AppendLine("ADDRESS", address);
                    }

                    // Если установлены дополнительные процедуры для шаблона - использовать их
                    if (Attributes != null && Attributes.Count > 0)
                    {
                        StringBuilder sb = new StringBuilder();
                        sb.Append("Дополнительные атрибуты: ");
                        foreach (string key in Attributes.Keys)
                        {
                            string name  = key;
                            string value = Attributes[key];
                            if (!string.IsNullOrEmpty(value))
                            {
                                prm.AppendLine(key.ToUpper(), value);
                                sb.AppendFormat("{0}={1};", key.ToUpper(), value);
                            }

                            /*
                             * switch(key.ToLower())
                             *      {
                             *      case "payer_fio":
                             *              prm.AppendLine("PAYER_FIO", value);
                             *              sb.AppendFormat("{0}={1};", "PAYER_FIO", value);
                             *              break;
                             *      case "payer_address":
                             *              prm.AppendLine("PAYER_ADDRESS", value);
                             *              sb.AppendFormat("{0}={1};", "PAYER_ADDRESS", value);
                             *              break;
                             *      case "payer_doc":
                             *              prm.AppendLine("PAYER_DOC", value);
                             *              sb.AppendFormat("{0}={1};", "PAYER_DOC", value);
                             *              break;
                             *      }
                             */
                        }
                        Log(sb.ToString());
                    }

                    prm.AppendLine("INN", Inn);
                    prm.AppendLine("CONTACT", contact);
                    prm.AppendLine("AMOUNT", XConvert.AsAmount(amount));
                    prm.AppendLine("AMOUNT_ALL", XConvert.AsAmount(amountAll));
                    prm.AppendLine("COMMENT", Comment);
                    if (agree != 0)
                    {
                        prm.AppendLine("AGREE", agree);
                    }
                }

                prm.AppendLine("ACCEPT_KEYS", ProvidersSettings.Cyber.BankKeySerial);

                lock (TheLock)
                {
                    IPriv.SignMessage(prm.ToString(), out stRequest, out s_text, secret_key_path, passwd);
                }

                /*
                 *              if (Settings.LogLevel.IndexOf("REQ") != -1)
                 *                      Log("\r\nПодготовлен запрос:\r\n{0}\r\n", s_text);
                 */

                Log($"{Session}\r\n=====================================================\r\n{prm.ToString()}");
                Log($"-----------------------------------------------------\r\n{stRequest}\r\n---------------------------------------");

                errCode = 0;
                errDesc = null;
                return(0);
            }
            catch (IPrivException ie)
            {
                errDesc = string.Format("IPRIV: Sign={0} {1}", ie.code, ie.ToString());
                if (ie.code == -13)
                {
                    if (status)
                    {
                        state   = 3;
                        errCode = 1;
                    }
                    else
                    {
                        state   = 0;
                        errCode = 7;
                    }
                    return(0);
                }
                else
                {
                    errCode = ie.code;
                    state   = 11;
                }
            }
            catch (Exception ex)
            {
                // errCode = 11;
                errDesc = ex.Message;
                // if (state == 1)
                // state = 0;
                errCode = -1;
                state   = 11;
            }

            RootLog($"{tid} {Number}{Card} {Account} {Provider}/{Service}/{Gateway}\r\n{ErrDesc}");

            return(1);
        }
예제 #6
0
파일: Libpriv.cs 프로젝트: Nick1965/Xgate
 public string verifyText(string src)
 {
     return(IPriv.verifyText(src, this));
 }
예제 #7
0
파일: Libpriv.cs 프로젝트: Nick1965/Xgate
 public byte[] SignText(string src)
 {
     return(IPriv.SignText(src, this));
 }
예제 #8
0
파일: Libpriv.cs 프로젝트: Nick1965/Xgate
 public string signText(string src)
 {
     return(IPriv.signText(src, this));
 }