Reputation: 1045
I am new to CRM. I had implemented OAuth for application. I am using web api approach to access specific CRM user data. I had implemented web api successfully for "Get User Opportunities", "Update User Opportunity". But i am unable to do same for "close opportunity" or "win opportunity".
Note: I am not using OrganizationService proxy while accessing user data. I am using OAuth token and calling specific API request 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?
Ex: Get Opportunities
Request URL : https://testdevcrm.crm8.dynamics.com/api/data/v9.1/opportunities
Header:
Authorization:Bearer (accessToken)
Accept:application/json
OData-MaxVersion:4.0
OData-Version:4.0
Method Type : 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
Upvotes: 0
Views: 2155
Reputation: 1045
Finally I implemented C# code using web api for opportunity as 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 + "','[email protected]':'" + opportunitiesURL + "'}}";
}
else
{
jsonBody = "{'Status':3,'OpportunityClose':{'subject':'" + wonsubject + "','actualrevenue':" + actualrevenue + ",'actualend':'" + actualend + "','description':'" + wondesc + "','[email protected]':'" + 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
Upvotes: 0
Reputation: 5531
Well There is an Specific Action which can be called from WebAPI to Close opportunity as WIN or LOSS. It's called
WinOpportunity
LoseOpportunity
Now how do you call it via 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.
var parameters = {};
var opportunityclose = {};
opportunityclose.activityid = "00000000-0000-0000-0000-000000000000"; //Delete if creating new record
opportunityclose["@odata.type"] = "Microsoft.Dynamics.CRM.opportunityclose";
opportunityclose["[email protected]"] = "/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["[email protected]"] = "/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));
Upvotes: 1