#c# #asp.net-mvc #api #ssl #payment-gateway
#c# #asp.net-mvc #API #ssl #платежный шлюз
Вопрос:
Я пытаюсь добавить платежи на свой веб-сайт, используя платежный шлюз Pin Payments. Мой сайт разрабатывается на MVC, и я использую библиотеку PinPayments C #, которая предлагается в документации API.
Я читал, что документация api, в которой указано, принимает только безопасные соединения. Поэтому я включил SSL в своем решении. Затем я убедился, что самозаверяющий сертификат, который генерирует IIS Express, добавлен к моим доверенным сертификатам. Это сработало один раз после того, как я доверял сертификату. Но с тех пор он продолжал терпеть неудачу. И он чередуется со следующими сообщениями об ошибках. Без внесения каких-либо изменений в код.
Существующее соединение было принудительно закрыто удаленным хостом
и
Сбой аутентификации, поскольку удаленная сторона закрыла транспортный поток.
Вот мой код, который выполняет запрос. Карта и плата создаются без ошибок, и затем выполняется строка ChargeResponse response = ps.Charge(зарядка);. Затем он переходит к коду запроса библиотеки pinpayments (ниже).
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult CreditCard (CreditCardPayment model)
{
if (ModelState.IsValid)
{
// get application
Application application = db.Applications.Find(model.ApplicationdId);
if (application != null)
{
PinService ps = new PinService(ConfigurationManager.AppSettings["Secret_API"]);
var card = new Card();
card.CardNumber = model.Number;
card.CVC = model.Cvn;
card.ExpiryMonth = model.ExpiryMonth;
card.ExpiryYear = model.ExpiryYear;
card.Name = model.Name;
card.Address1 = model.AddressLine1;
card.City = model.City;
card.Country = model.Country;
var charge = new PostCharge();
charge.Description = "Visa Application " application.Destination;
charge.Amount = Convert.ToInt64(application.Total) * 100; // Pin payments requires the value in cents
charge.Card = card;
charge.Currency = application.CurrencyCode;
charge.Email = application.Customer.Email;
charge.IPAddress = "127:0:0:1"; //Request.UserHostAddress;
ChargeResponse response = ps.Charge(charge);
if (response.Charge != null amp;amp; response.Charge.Success)
{
// Update application with payment details.
}
else
{
// Do error stuff
}
}
}
return View(model);
}
Вот код, который находится в библиотеке Pin Payments, по которому запрос не выполняется. Он переходит к запуску первой строки, но затем переходит к строке var requestStream = request.GetRequestStream(); с сообщением об ошибке.
private static WebRequest GetWebRequest(string url, string method, string postData)
{
var request = HttpWebRequest.Create(url) as HttpWebRequest;
request.Method = method;
request.ContentType = "application/x-www-form-urlencoded";
request.UserAgent = "C# API Wrapper v001";
string apiKey = PinPaymentsConfig.GetApiKey();
request.Headers["Authorization"] = "Basic " Convert.ToBase64String(Encoding.Default.GetBytes(apiKey ":"));
if (postData != "")
{
var paramBytes = Encoding.UTF8.GetBytes(postData);
request.ContentLength = paramBytes.Length;
var requestStream = request.GetRequestStream();
requestStream.Write(paramBytes, 0, paramBytes.Length);
}
return request;
}
Ответ №1:
Pin Payments прекратили поддержку TLS 1.0 в своем тестовом API и добавят его в свой живой API в январе 2017 года. Можете ли вы подтвердить, что вы подключаетесь через TLS 1.1 или выше?
Обратите внимание, поддержка TLS 1.1 и 1.2 была добавлена только в .NET 4.5.
Не стесняйтесь обращаться к нам по адресу support@pin.net.au для дальнейшей поддержки.
Комментарии:
1. Спасибо Pin-платежам. Это была проблема. Мне пришлось перестроить библиотеку как .net 4.5 и принудительно использовать метод GetWebRequest для использования TLS 1.2