Как закрыть объект возможностей CRM с помощью C # web api

#c# #asp.net-web-api #dynamics-crm #dynamics-crm-2011 #crm

#c# #asp.net-web-api #dynamics-crm #динамика-crm-2011 #crm

Вопрос:

Я новичок в CRM. Я реализовал OAuth для приложения. Я использую подход web api для доступа к конкретным пользовательским данным CRM. Я успешно внедрил веб-api для «Получения пользовательских возможностей», «Обновления пользовательских возможностей». Но я не могу сделать то же самое для «закрыть возможность» или «выиграть возможность».

Примечание: я не использую прокси-сервер OrganizationService при доступе к пользовательским данным. Я использую токен OAuth и вызываю определенный URL-адрес запроса API.

Пожалуйста, помогите мне добиться того же. Очень ценно, если кто-нибудь может показать какие-либо примеры кода и / или как протестировать его в postman.

Мои запросы:

1) Возможно ли с помощью токена OAuth подключиться к OrganizationServiceProxy без передачи учетных данных пользователя?

Пример: получить возможности

URL-адрес запроса: https://testdevcrm.crm8.dynamics.com/api/data/v9.1/opportunities

Заголовок:

Авторизация: предъявитель (доступ открыт)

Принять: application / json

OData-максимальная версия: 4.0

OData-Версия: 4.0

Тип метода: ПОЛУЧИТЬ

Код

   #region FectchUserOpportunities
    public async Task<JToken> FectchUserOpportunities(string systemuserid,string bearerToken)
    {
        JToken jResu = null;
        try
        {
            var httpClient = new HttpClient();

            httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", bearerToken);
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
            string filter = "amp;$filter=_createdby_value eq '"   systemuserid   "' and opportunityid ne null and statuscode eq 1amp;$orderby=createdon ascamp;$top=5";
            string opportunitiesURL = string.Concat(GenericMethods.GetAppSetting("FetchCRMOpportunitiesAPI"), filter);
            var result = httpClient.GetAsync(opportunitiesURL).Resu<

            if (result != null)
            {
                var opporJSON = await result.Content.ReadAsStringAsync();
                JToken jsonResult = JsonConvert.DeserializeObject<JObject>(opporJSON);
                jResu = jsonResult["value"];
            }
            else
            {
                jResu = null;
            }
        }
        catch (Exception ex)
        {
        }
        return jResu;
    }

    #endregion
 

Комментарии:

1. Ваша проблема решена?

2. По какой-либо причине вы не используете MS SDK?

3. @AnkyUser, я опубликовал ответ, который отлично работает для меня.

4. @дэрил, ты имеешь в виду пакет nuget для CRM?

5. ДА. Если вы используете .Net Framework, то почему, черт возьми, вы бы его не использовали?

Ответ №1:

Ну, есть определенное действие, которое можно вызвать из WebAPI, чтобы закрыть возможность как ВЫИГРЫШНУЮ или ПРОИГРЫШНУЮ. Он называется

WinOpportunity

Потеря возможности

Теперь, как вы вызываете это через Webapi. Вот пример кода со стороны интерфейса для его вызова. Вы можете легко повторить это с помощью Postman и посмотреть, как это помогает.

 var parameters = {};
var opportunityclose = {};
opportunityclose.activityid = "00000000-0000-0000-0000-000000000000"; //Delete if creating new record 
opportunityclose["@odata.type"] = "Microsoft.Dynamics.CRM.opportunityclose";
opportunityclose["opportunityid@odata.bind"] = "/opportunities(8CA20837-715F-E911-A83A-000D3A3852A3)";
parameters.OpportunityClose = opportunityclose;
parameters.Status = 0;

var req = new XMLHttpRequest();
req.open("POST", Xrm.Page.context.getClientUrl()   "/api/data/v9.1/WinOpportunity", false);
req.setRequestHeader("OData-MaxVersion", "4.0");
req.setRequestHeader("OData-Version", "4.0");
req.setRequestHeader("Accept", "application/json");
req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
req.onreadystatechange = function() {
    if (this.readyState === 4) {
        req.onreadystatechange = null;
        if (this.status === 204) {
            //Success - No Return Data - Do Something
        } else {
            Xrm.Utility.alertDialog(this.statusText);
        }
    }
};
req.send(JSON.stringify(parameters));
 

 var parameters = {};
var opportunityclose = {};
opportunityclose.activityid = "00000000-0000-0000-0000-000000000000"; //Delete if creating new record 
opportunityclose["@odata.type"] = "Microsoft.Dynamics.CRM.opportunityclose";
opportunityclose["opportunityid@odata.bind"] = "/opportunities(8CA20837-715F-E911-A83A-000D3A3852A3)";
parameters.OpportunityClose = opportunityclose;
parameters.Status = 0;

    var req = new XMLHttpRequest();
    req.open("POST", Xrm.Page.context.getClientUrl()   "/api/data/v9.1/LoseOpportunity", false);
    req.setRequestHeader("OData-MaxVersion", "4.0");
    req.setRequestHeader("OData-Version", "4.0");
    req.setRequestHeader("Accept", "application/json");
    req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
    req.onreadystatechange = function() {
        if (this.readyState === 4) {
            req.onreadystatechange = null;
            if (this.status === 204) {
                //Success - No Return Data - Do Something
            } else {
                Xrm.Utility.alertDialog(this.statusText);
            }
        }
    };
    req.send(JSON.stringify(parameters));
 

Ответ №2:

Наконец, я реализовал код C # с использованием web api для opportunity как ВЫИГРАННЫЙ.

Код:

     #region UpdateUserOpportunityWon

    public async Task<string> UpdateUserOpportunityWon(string bearerToken, string opportunityid, string wonsubject, string actualend = "", int actualrevenue = 0, string wondesc = "")
    {
        string jResu = "";
        try
        {
            string opportunitiesURL = string.Format(GenericMethods.GetAppSetting("UpdateCRMOpportunityAPI"), opportunityid);
            var httpClient = new HttpClient();
            httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", bearerToken);
            httpClient.DefaultRequestHeaders.Add("OData-MaxVersion", "4.0");
            httpClient.DefaultRequestHeaders.Add("OData-Version", "4.0");
            httpClient.DefaultRequestHeaders.Add("Accept", "application/json");
            //httpClient.DefaultRequestHeaders.Add("Content-Type", "application/json; charset=utf-8");
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
            string jsonBody = "";
            if (String.IsNullOrEmpty(actualend))
            {
                jsonBody = "{'Status':3,'OpportunityClose':{'subject':'"   wonsubject   "','actualrevenue':"   actualrevenue   ",'description':'"   wondesc   "','opportunityid@odata.bind':'"   opportunitiesURL   "'}}";
            }
            else
            {
                jsonBody = "{'Status':3,'OpportunityClose':{'subject':'"   wonsubject   "','actualrevenue':"   actualrevenue   ",'actualend':'"   actualend   "','description':'"   wondesc   "','opportunityid@odata.bind':'"   opportunitiesURL   "'}}";
            }
            var content = new StringContent(jsonBody, Encoding.UTF8, "application/json");
            string opportunitiesWonURL = string.Format(GenericMethods.GetAppSetting("UpdateOpportunityWon"), opportunityid);

            var result = httpClient.PostAsync(opportunitiesWonURL, content).Resu<
          //  TelemetryHelper.Trace("API res", result.ToString());
            string statuscode = result.StatusCode.ToString();
            if (result != null)
            {
                var opporJSON = await result.Content.ReadAsStringAsync();
                if (statuscode.ToLower() == "nocontent")
                {
                    jResu = statuscode; //success
                }
                else
                {
                    JToken jsonResult = JsonConvert.DeserializeObject<JObject>(opporJSON);
                    if (jsonResult["error"] != null)
                    {
                        jResu = jsonResult["error"]["message"].ToString();
                    }
                }
            }
            else
            {
                jResu = Resources.CommonAPIError   statuscode;
            }
        }
        catch (Exception ex)
        {
            TelemetryHelper.Trace("API Ex", ex.Message.ToString());
        }
        return jResu;
    }

    #endregion