Как закрыть сущность возможности CRM с помощью веб-интерфейса C # - PullRequest
0 голосов
/ 15 апреля 2019

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

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

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

Мои запросы:

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

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

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

Заголовок:

Авторизация: Носитель (accessToken)

Accept: приложения / JSON

OData-MaxVersion: 4,0

OData-версия: 4,0

Тип метода: GET

Код

  #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 = "&$filter=_createdby_value eq '" + systemuserid + "' and opportunityid ne null and statuscode eq 1&$orderby=createdon asc&$top=5";
            string opportunitiesURL = string.Concat(GenericMethods.GetAppSetting("FetchCRMOpportunitiesAPI"), filter);
            var result = httpClient.GetAsync(opportunitiesURL).Result;

            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

Ответы [ 2 ]

1 голос
/ 15 апреля 2019

Ну, есть определенное действие, которое можно вызвать из WebAPI, чтобы закрыть возможность как WIN или LOSS.Он называется

WinOpportunity

LoseOpportunity

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

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));
0 голосов
/ 18 апреля 2019

Наконец-то я реализовал код C #, используя web api для возможности как WON.

Код:

    #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).Result;
          //  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
...