Битрикс24 Rest API post запрос с использованием ASP.NET

Битрикс24 Rest API post запрос с использованием ASP.NET

27.02.2017 12:32:42 Просмотров 119 Источник

Bitrix24 CRM имеют функцию webhook для добавления лидов (клиентов) в CRM. Вся документация написана на php, но я хочу использовать ASP.NET. вот как они это делают на php:

$queryUrl  = 'https://restapi.bitrix24.ru/rest/1/31uhq2q855fk1foj/crm.lead.add.json';
$queryData = http_build_query(array(
    'fields' => array(
        "TITLE" => "NEW LEAD"
    ),
    'params' => array(
        "REGISTER_SONET_EVENT" => "Y"
    )
));

$curl = curl_init();
curl_setopt_array($curl, array(
    CURLOPT_SSL_VERIFYPEER => 0,
    CURLOPT_POST => 1,
    CURLOPT_HEADER => 0,
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_URL => $queryUrl,
    CURLOPT_POSTFIELDS => $queryData
));

$result = curl_exec($curl);
curl_close($curl);

$result = json_decode($result, 1);

Я пытаюсь сделать то же самое с помощью ASP.NET, но получить ошибку 400 в качестве ответа. Я почти уверен, что проблема заключается в параметрах запроса, строка const string data = @"[{""fields"":{""title"":""Test""}}]";. Я пробовал тонны комбинаций, но ничего не получалось.

const string url = @ "https://companyname.bitrix24.ru/rest/14/31uhq2q855fk1foj/crm.lead.add.json";
const string data = @"[{""fields"":{""title"":""Test""}}]";

HttpClient client = new HttpClient();
client.BaseAddress = new Uri(url);
byte[] cred = Encoding.UTF8.GetBytes("email:password");
client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(cred));
client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));

HttpContent content = new StringContent(data, Encoding.UTF8, "application/json");
HttpResponseMessage messge = client.PostAsync(url, content).Result;
string description;
if (messge.IsSuccessStatusCode) {
    string result = messge.Content.ReadAsStringAsync().Result;
    description = result;
}
У вопроса есть решение - Посмотреть?

Ответы - Битрикс24 Rest API post запрос с использованием ASP.NET / Bitrix24 Rest API post request using ASP.NET

Является ответом!
Dmitry

27.02.2017 01:33:52

Поддержка Bitrix24 очень "счастлива" с php и не знает о других языках : (после некоторых исследований я нашел способ с анонимными объектами и json.net. ваш образец должен выглядеть так:

var data = new {
  fields = new {
    TITLE = "NEW LEAD"
  },
  @params = new {
    REGISTER_SONET_EVENT = "Y"
  }
};
var contentText = JsonConvert.SerializeObject(data);

var content = new StringContent(contentText, Encoding.UTF8, "application/json");
// and so on with HttpClient

Обновление 13 Декабря:

Иногда вы не можете (или не хотите) помещать имена полей непосредственно в анонимный объект. Таким образом, словарь может быть использован:

var data = new
{
    ID = someId,
    FIELDS = new Dictionary<string, object>()
    {
        [options.SomeFieldName] = fieldValue,
    },
};
Александр Зинков

30.01.2019 09:56:37

Я решил проблему с этим кодом:

public void CreateLead( string title, decimal opportunity, string contactName, string phoneNumber, string email )
    {
        try
        {                
            string accessToken = GetNewAccessToken();

            string url = string.Format( "https://{0}/rest/crm.lead.add.json", portal_name );

            var data = new
            {
                fields = new
                {
                    TITLE = title,
                    CURRENCY_ID = "RUB",
                    STATUS_ID = "NEW",
                    OPENED = "Y",
                    OPPORTUNITY = opportunity,
                    ASSIGNED_BY_ID = 46,
                    COMPANY_TITLE = contactName,
                    PHONE =  new List<PHONE>() { new PHONE() { VALUE_TYPE = "WORK", TYPE_ID = "PHONE", VALUE = phoneNumber } }.ToArray(),
                    EMAIL = new List<EMAIL>() { new EMAIL() { VALUE_TYPE = "WORK", TYPE_ID = "EMAIL", VALUE = email } }.ToArray()
                },
                @params = new
                {
                    REGISTER_SONET_EVENT = "Y"
                }
            };

            BitrixLead lead = new BitrixLead();

            lead.TITLE = title;
            lead.CURRENCY_ID = "RUB";
            lead.STATUS_ID = "NEW";
            lead.OPENED = "Y";
            lead.OPPORTUNITY = opportunity.ToString();                

            if (!string.IsNullOrEmpty( contactName ))
                lead.COMPANY_TITLE = contactName;

            if (!string.IsNullOrEmpty( phoneNumber ))
                lead.PHONE = new List<PHONE>() { new PHONE() { VALUE_TYPE="WORK", TYPE_ID="PHONE", VALUE = phoneNumber }}.ToArray();

            if (!string.IsNullOrEmpty( email ))
                lead.EMAIL = new List<EMAIL>() { new EMAIL() { VALUE_TYPE = "WORK", TYPE_ID = "EMAIL", VALUE = email } }.ToArray();


            PostToAPI( url, accessToken, data );
        }
        catch (Exception exc)
        {
        }
    }

private void PostToAPI( string url, string token, object data )
    {
        string json = Newtonsoft.Json.JsonConvert.SerializeObject( data );

        var http = (HttpWebRequest)WebRequest.Create( new Uri( url ) );
        http.Accept = "application/json; charset=utf-8";
        http.ContentType = "application/json; charset=utf-8";
        http.Method = "POST";            
        http.Headers.Add( "Authorization", "Bearer " + token );

        UTF8Encoding encoding = new UTF8Encoding();
        Byte[] bytes = encoding.GetBytes( json );

        Stream newStream = http.GetRequestStream();
        newStream.Write( bytes, 0, bytes.Length );
        newStream.Close();

        var response = http.GetResponse();            
    }
https://stackoverflow.com/questions/42482134/bitrix24-rest-api-post-request-using-asp-net/54434871#comment95679222_54434871
Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, как и/или почему он решает проблему, улучшит долгосрочную ценность ответа.Прочтите это .
Помочь в развитии проекта:
Закрыть X