Битрикс24 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;
}
Поддержка 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,
},
};
Я решил проблему с этим кодом:
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();
}