Вызов Exchange_Token с клиентом .net в Plaid API завершается ошибкой с исключением

Я пытаюсь вызвать тестовую среду Plaid для интеграции Stripe с Plaid с помощью клиента C#.

Однако я не могу обменять токен, тогда как я могу успешно сделать это с помощью клиента curl. Код супер простой.

    public async Task<string> ExchangeToken(string publicToken, string accountId)
    {
        string bankAccountToken = null;

        try
        {
            var parameters = new Dictionary<string, string>()
            {
                {"client_id", this.clientId},
                {"secret", this.clientSecret},
                {"public_token", publicToken},
                {"account_id", accountId}
            };

            using (var client = new HttpClient())
            {
                var request = new HttpRequestMessage()
                {
                    RequestUri = new Uri(this.BaseAddress, "exchange_token"),
                    Method = HttpMethod.Post,
                    Content = new FormUrlEncodedContent(parameters)

                };


                var requestResult = await client.SendAsync(request);
                var stringResponse = requestResult.Content.ReadAsStringAsync();
            }



        }
        catch (Exception ex)
        {
            Trace.TraceError("PlaidHelper::ExchangeToken() hit error " + ex.Message);
        }

        return bankAccountToken;
    }

Вызов завершается с ошибкой ввода-вывода, в которой говорится, что удаленная сторона закрыла соединение, внутреннее сообщение об исключении: "Authentication failed because the remote party has closed the transport stream."

У кого-нибудь есть идеи? Я готов рвать на себе волосы..

Вот соответствующий curl вызов, который завершился успешно.

$ curl -v https://tartan.plaid.com/exchange_token -d client_id="XXXXX" -d 
secret="XXXXXXXXXXXXXXXX" -d public_token="XXXXXXXXXXX" -d account_id="XXXXX"

> POST /exchange_token HTTP/1.1
> Host: tartan.plaid.com
> User-Agent: curl/7.50.3
> Accept: */*
> Content-Length: 263
> Content-Type: application/x-www-form-urlencoded
>
} [263 bytes data]
* upload completely sent off: 263 out of 263 bytes
{ [5 bytes data]
< HTTP/1.1 200 OK
< Content-Type: application/json; charset=utf-8
< Date: Thu, 27 Oct 2016 04:55:53 GMT
< Vary: X-HTTP-Method-Override, Accept-Encoding
< X-Request-Id: 65af9ef1009c46f5b9f484b5c6aee975
< Content-Length: 295
< Connection: keep-alive
<
{ [295 bytes data]
* Curl_http_done: called premature == 0
100   558  100   295  100   263    262    233  0:00:01  0:00:01 --:--:--   273{
  "access_token": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
  "account_id": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
  "stripe_bank_account_token": "btok_XXXXXXXXXXX"
}
* Connection #0 to host tartan.plaid.com left intact

person Sandeep Phadke    schedule 27.10.2016    source источник
comment
Возможно, вам потребуется явно включить TLS 1.2 для исходящего соединения с Plaid. Этот ответ StackOverflow должен помочь: stackoverflow.com/a/35321007/5307473   -  person Ywain    schedule 27.10.2016
comment
Ты был прав! Пожалуйста, добавьте это как ответ, и я отмечу это так.   -  person Sandeep Phadke    schedule 28.10.2016
comment
Я бы предложил использовать Plaid.net Тайлера Дженсена (ищите его в диспетчере пакетов NuGet), чтобы вы могли получить тот же результат с меньшим количеством строк кода. Вы также можете увидеть его здесь: nuget.org/packages/Plaid.Net.   -  person joalcego    schedule 15.02.2017


Ответы (1)


Вероятно, вы используете .NET 4.5, в котором TLS 1.2 не включен по умолчанию, поэтому вам нужно явно включить TLS 1.2 для исходящих подключений в коде C#. Вы можете сделать это с помощью:

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls

(Источник: https://stackoverflow.com/a/35321007/5307473)

person Ywain    schedule 28.10.2016