简体   繁体   English

如何使用C#Web API关闭CRM机会实体

[英]How to close CRM opportunity entity using C# web api

I am new to CRM. 我是CRM的新手。 I had implemented OAuth for application. 我已经为应用程序实现了OAuth。 I am using web api approach to access specific CRM user data. 我正在使用Web API方法来访问特定的CRM用户数据。 I had implemented web api successfully for "Get User Opportunities", "Update User Opportunity". 我已经成功地为“获取用户机会”,“更新用户机会”实现了Web api。 But i am unable to do same for "close opportunity" or "win opportunity". 但是我无法为“接近机会”或“获胜机会”做同样的事情。

Note: I am not using OrganizationService proxy while accessing user data. 注意:访问用户数据时,我没有使用OrganizationService代理。 I am using OAuth token and calling specific API request URL. 我正在使用OAuth令牌并调用特定的API请求URL。

Please guide me to achieve same. 请指导我实现相同目标。 Highly appreciable if anyone can show any samples on code and or how to test same in postman. 如果有人可以在代码上显示任何示例,或者如何在邮递员中进行测试,则非常感谢。

My queries: 我的查询:

1) Is it possible using OAuth token,can we connect to OrganizationServiceProxy without passing user credentials? 1)是否可以使用OAuth令牌,我们可以在不传递用户凭据的情况下连接到OrganizationServiceProxy吗?

Ex: Get Opportunities 例如:获得机会

Request URL : https://testdevcrm.crm8.dynamics.com/api/data/v9.1/opportunities 要求网址: https : //testdevcrm.crm8.dynamics.com/api/data/v9.1/opportunities

Header: 标题:

Authorization:Bearer (accessToken) 授权:承载者(accessToken)

Accept:application/json 接受:应用/ JSON

OData-MaxVersion:4.0 的OData-MAXVERSION:4.0

OData-Version:4.0 OData兼容版本:4.0

Method Type : GET 方法类型:GET

Code

  #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

Well There is an Specific Action which can be called from WebAPI to Close opportunity as WIN or LOSS. 嗯,有一个特定的动作,可以从WebAPI调用为WIN或LOSS的Close机会。 It's called 叫做

WinOpportunity WinOpportunity

LoseOpportunity LoseOpportunity

Now how do you call it via Webapi. 现在,您如何通过Webapi调用它。 Here is the sample Code From front end Side to call it. 这是从前端方调用它的示例代码。 You can easily replicate this using Postman and see how this helps. 您可以使用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));

Finally I implemented C# code using web api for opportunity as WON. 最后,我使用Web api实现了C#代码,以获取WON的机会。

Code: 码:

    #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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM