【问题标题】:How to close CRM opportunity entity using C# web api如何使用 C# web api 关闭 CRM 机会实体
【发布时间】:2019-09-05 06:47:22
【问题描述】:

我是 CRM 新手。我已经为应用程序实现了 OAuth。我正在使用 web api 方法来访问特定的 CRM 用户数据。我已经成功地为“获取用户机会”、“更新用户机会”实现了 web api。但我无法为“关闭机会”或“赢得机会”做同样的事情。

注意:我在访问用户数据时没有使用 OrganizationService 代理。我正在使用 OAuth 令牌并调用特定的 API 请求 URL。

请指导我实现同样的目标。如果有人可以在代码中展示任何示例以及如何在邮递员中进行测试,那将是非常值得赞赏的。

我的查询:

1) 是否可以使用 OAuth 令牌,我们可以在不传递用户凭据的情况下连接到 OrganizationServiceProxy 吗?

例如:获得机会

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

标题:

授权:承载(accessToken)

接受:应用程序/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

【问题讨论】:

  • 你的问题解决了吗?
  • 您没有使用 MS SDK 的任何原因?
  • @AnkyUser,我发布了非常适合我的答案。
  • @daryl,你的意思是 CRM 的 nuget 包吗?
  • 是的。如果您使用的是 .Net 框架,那么他们为什么不使用它呢?

标签: c# asp.net-web-api dynamics-crm dynamics-crm-2011 crm


【解决方案1】:

嗯,有一个特定的操作可以从 WebAPI 调用来关闭机会,如 WIN 或 LOSS。这叫

赢机会

失去机会

现在如何通过 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】:

    最后,我使用 web api 实现了 C# 代码,以获得 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
    

    【讨论】:

      猜你喜欢
      • 2012-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-24
      • 1970-01-01
      相关资源
      最近更新 更多