G+

Convert code from php to c#

Программирование Asp.net
Предыдущий Следующий

 Для интеграции с одним из банком мне был предоставлен пример PHP кода.

$ch = curl_init();
curl_setopt($curl, CURLOPT_URL, $this->server_url);
curl_setopt($curl, CURLOPT_HEADER, FALSE);
curl_setopt($curl, CURLOPT_POST, TRUE);
curl_setopt($curl,CURLOPT_USERAGENT,
                       "User-Agent=Mozilla/5.0 Firefox/1.0.7");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($curl, CURLOPT_SSLCERT, $this->pem_file);   //path_file.pem
curl_setopt($curl, CURLOPT_SSLKEY, $this->key_file);    //path_file.key
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, TRUE);
curl_setopt($curl, CURLOPT_CAINFO, $this->chain_file);  //path_file.crt
curl_setopt($curl, CURLOPT_POSTFIELDS, $this->post);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
$result_curl = curl_exec($ch);
curl_close($ch);
echo $result_curl;

Мое приложение работает на asp.net C# и по этому пришлось переделывать код. Я сгенерил запрос (два файла *.key и *.req) и отправил банк. В ответ я получил файлы *.pem и *.crt. Исходя из скрипта, у меня были все файл. Начал переделывать код, и столкнулся с проблемой, что C# не предусматривает передачу *.key файла. И это логично, ведь это закрытый ключ! Как работает php и так открыто передает ключ я лично не понимаю. Для моего кода нужно перегенерить файлы в формат *.pkcs12 или *.pfx (в защищенный паролем файл). Для создания такого файла от банка было получено еще пару *.crt. И с помощью программы openssl.exe было сделано преобразование

openssl pkcs12 -export -inkey path_file.key -in path_file.pem -certfile 
path_file.crt -out path_file.pkcs12 -name name_file

Теперь можно писать C# код. При нажатию например на кнопку, нужно выполнять вот такой код:

var url = "https://bank.com/api";
ServicePointManager.ServerCertificateValidationCallback 
             += OnValidateCertificate;

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";

X509Certificate2 Cert = 
     new X509Certificate2("path_file.pkcs12", "password", 
               X509KeyStorageFlags.MachineKeySet);
request.ClientCertificates.Add(Cert);

var postData = String.Format("data for post");
byte[] byteArray = Encoding.UTF8.GetBytes(postData);
request.ContentLength = byteArray.Length;

using (Stream writeStream = request.GetRequestStream())
{
    writeStream.Write(byteArray, 0, byteArray.Length);
}

string responseFromServer;
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
      using (Stream readStream = response.GetResponseStream())
      {
         using (StreamReader reader = new StreamReader(readStream))
         {
             responseFromServer = reader.ReadToEnd();
             Console.WriteLine(responseFromServer);
         }
      }
}

Так же в этом коде используется:

private bool OnValidateCertificate(object sender,
           X509Certificate certificate, X509Chain chain, 
            SslPolicyErrors sslPolicyErrors)
{
   //Console.WriteLine("ServerCertificateValidation!");
 HttpWebRequest requestV = sender as HttpWebRequest;
 if (requestV != null)
 {
   if (requestV.RequestUri.ToString() == url_bank)
   {
   if (sslPolicyErrors==(SslPolicyErrors.RemoteCertificateNameMismatch))
   {
      return true;
   }
   }
   return false;
 }
 return false;
}
Комментарий:
Комментариев пока нету
Самостоятельный отпуск Опыт заказа вывоза мусора в Киеве