public unsafe void closeKey() { if (ppkey != (byte *)IntPtr.Zero) { IPriv.closeKey(this); handle.Free(); ppkey = (byte *)IntPtr.Zero; } }
/// <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(); }
/// <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)); }
/// <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); }
/// <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); }
public string verifyText(string src) { return(IPriv.verifyText(src, this)); }
public byte[] SignText(string src) { return(IPriv.SignText(src, this)); }
public string signText(string src) { return(IPriv.signText(src, this)); }