[英]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.