Inquiridor
Retorno Json -> ASpnet C#

Pergunta
-
Bom dia pessoal! Estou com um problemão, após dar post com as informações de pagamento para a locaweb, eles retornam alguns dados como abaixo no formato json, como eu devo proceder para pegar estes valores e passar para variaveis ou labels? No caso no post eu ja envio o nome da página de retorno no caso retorno.aspx, pelo o que eu entendo quando a informação chegar lá automaticamente a locaweb dará um post na minha página retorno.aspx com isto :
{ "transacao" : { "status" : "aguardando_pagamento", "meio_pagamento" : "cielo", "numero_pedido" : 6512, "id" : 163, "detalhes" : { "arp" : null, "lr" : null, "nsu" : null, "pan" : null, "tid" : "10017348980825651001" }, "erro" : null, "total" : "7630.00", "url_acesso" : "https://qasecommerce.cielo.com.br/web/index.cbmp?id=b817bc2ed8ac0009a1d6dc8199069b27" } }
Então eu preciso pegar estas informações e gravar em uma tabela minha...alguém sabe?
Douglas Bertelli
Todas as Respostas
-
-
-
public class Transacao{ public string Status{get;set;} public string Meio_Pagamento{get;set;} //etc } public class LocaWebReturn { public Transacao Transacao{get;set;} }
e na sua Action:
public ActionResult Post(LocaWebReturn locaweb) { }
http://www.linkedin.com/pub/murilo-kunze/44/191/455
- Sugerido como Resposta geraldo.lopes quarta-feira, 14 de novembro de 2012 12:09
- Não Sugerido como Resposta geraldo.lopes quarta-feira, 14 de novembro de 2012 12:30
-
namespace JsonTest { public class CIELO { public string Status { get; set; } public string meio_pagamento{ get; set; } } }
Seria mais ou menos isto?
No caso como eu sei que no meu json retornaria Status e meio_pagamento então é só colocar isto na classe e na page retorno.aspx eu chamo a classe do banco para gravar e digo xxx = {0}; yyy = {1}; é isto?
Douglas Bertelli
-
-
Não funcionaria.
Pensa no JSON como se fosse uma classe.
A classe só tem 3 atributos (erro, total e url_acesso) e dentro dela tem um objeto chamado transacao com 10 atributos (status, meio_pagamento, numero_pedido, id, detalhes, arp, lr, nsu, pan, tid)
No C# você cria uma classe correspondente aos atributos que você deseja que sejam mapeados.
No seu caso até funcionaria, mas se você fizesse o post passando apenas a transacao (objeto.transacao) ao inves de fazer o post do objeto inteiro, caso contrário, ele iria procurar o atributo Status no objeto do JSON e não iria conseguir mapear.
Se ainda tiver dúvidas, pergunte.
Abraço
-
Cara, infelizmente tenho muitas dúvidas =\ Primeira vez que faço isto de retorno tal.. está dificil de pegar o conceito, se não se importar vou postar completo aqui.
No post ainda manualmente (passando os valores fixos e não os dos campos do formulário), fiz desta forma:
//Enviando os dados para Localweb WebRequest request = WebRequest.Create("https://api-sandbox.gatewaylocaweb.com.br/v1/transacao"); request.Method = "POST"; ASCIIEncoding encoding = new ASCIIEncoding(); string defaultParameter = "{"; defaultParameter += "\"token\": \"b30c04e1-450d-4537-88de-b00df7853891\","; defaultParameter += "\"transacao\": {"; defaultParameter += "\"url_retorno\": \"http://www.ohyes.com.br/retorno.aspx\","; defaultParameter += "\"capturar\": \"true\","; defaultParameter += "\"pedido\": {"; defaultParameter += "\"numero\": \"12345689\","; defaultParameter += "\"total\": \"1.00\","; defaultParameter += "\"moeda\": \"real\","; defaultParameter += "\"descricao\": \"Carrinho de Compras\""; defaultParameter += "},"; defaultParameter += "\"pagamento\": {"; defaultParameter += "\"bandeira\": \"visa\","; defaultParameter += "\"meio_pagamento\": \"cielo\","; defaultParameter += "\"parcelas\": \"1\","; defaultParameter += "\"tipo_operacao\": \"credito_a_vista\""; defaultParameter += "},"; defaultParameter += "\"comprador\": {"; defaultParameter += "\"nome\": \"Bruna da Silva\","; defaultParameter += "\"documento\": \"12345678900\","; defaultParameter += "\"endereco\": \"Rua da Casa\","; defaultParameter += "\"complemento\": \"Ap 82\","; defaultParameter += "\"numero\": \"1\","; defaultParameter += "\"cep\": \"09710240\","; defaultParameter += "\"bairro\": \"Centro\","; defaultParameter += "\"cidade\": \"São Paulo\","; defaultParameter += "\"estado\": \"SP\""; defaultParameter += "}"; defaultParameter += "}"; defaultParameter += "}"; string teste = defaultParameter; byte[] byteArray = Encoding.UTF8.GetBytes(defaultParameter); request.ContentType = "application/x-www-form-urlencoded"; request.ContentLength = byteArray.Length; Stream dataStream = request.GetRequestStream(); dataStream.Write(byteArray, 0, byteArray.Length); dataStream.Close(); // Get the response. WebResponse response = request.GetResponse(); // Display the status. Console.WriteLine(((HttpWebResponse)response).StatusDescription); // Get the stream containing content returned by the server. dataStream = response.GetResponseStream(); // Open the stream using a StreamReader for easy access. StreamReader reader = new StreamReader(dataStream); // Read the content.string responseFromServer = reader.ReadToEnd (); // Clean up the streams. reader.Close(); dataStream.Close(); response.Close(); lblmsgError.Attributes["style"] = "color:#000;"; lblmsgError.Text = "Formulário enviado com sucesso!"; checkSave = "ok"; //##
Ou seja passei para eles no formato json, e sim está gravando perfeitamente no portal. Segundo eles, exatamente no momento que eu der o post eles já retornarão dando um post na minha página de retorno. Então no caso criei uma class chamada ReturnCielo.cs assim:
namespace Jalapao.App.CIELO { public class CIELO { //private private string status; private string meio_pagamento; private string numero_pedido; //public public string Status { get { return status; } set { status = value; } } public string Meio_pagamento { get { return meio_pagamento; } set { meio_pagamento = value; } } public string Numero_pedido { get { return numero_pedido; } set { numero_pedido = value; } } } }
Bom inseri somente estes campos na class mas estão todos, estes são só exemplos para vc entender o q estou fazendo..
Bom na página de retorno.aspx no caso em sua class interna, eu chamei a classe CIELO ci = new CIELO(); e agora preciso pegar o json e colocar no ci.meio_pagamento, e é nesta hora que estou travado =(
Douglas Bertelli
-
public class Detalhes { public object arp { get; set; } public object lr { get; set; } public object nsu { get; set; } public object pan { get; set; } public string tid { get; set; } } public class Transacao { public string status { get; set; } public string meio_pagamento { get; set; } public int numero_pedido { get; set; } public int id { get; set; } public Detalhes detalhes { get; set; } public object erro { get; set; } public string total { get; set; } public string url_acesso { get; set; } } public class ObjetoRetorno { public Transacao transacao { get; set; } }
Usando estas classes, gerei utilizando o site http://json2csharp.com/, que gera automático.
Depois disso, você tem uma string que é o retorno da locaweb certo? Então vamos mapear a string (json) deles para dentro de uma classe:
using System.Web.Script.Serialization; (Vai precisar disso)
var entity = new JavaScriptSerializer().Deserialize<ObjetoRetorno>(responseFromServer);
Depois disso vai conseguir usar o retorno como se fosse uma classe, já com os valores dentro dela.
Isso resolve o problema? Me corrija se eu estiver errado.
Abraço
-
Bom vou tentar fazer desta forma, vamos ver se da certo aqui. obrigado.. aí eu posto aqui daqui 30 minutos dizendo se funcionou, mas vou ter q ver como funcionar esse "var entity = new JavaScriptSerializer().Deserialize<ObjetoRetorno>(responseFromServer);" não tenho nem idéia de como usar.
Douglas Bertelli
-
Geraldo, você disse:
"Depois disso, você tem uma string que é o retorno da locaweb certo? Então vamos mapear a string (json) deles para dentro de uma classe:"Eu não tenho uma string, esta é a questão ... Eu não consigo entender isto.. eles vao me mandar esta "classe" json.. cheio de informações eu não sei como colher estas informações.
Douglas Bertelli
-
Na verdade só é necessária essa linha, o método Deserialize vai converter toda a string do JSON passada por parâmetro em um objeto do tipo ObjetoRetorno.
A variavel "responseFromServer" é a que possui a string de retorno da locaweb, certo?
Acho até que ficou comentada a linha ali no seu bloco de código no comentário acima.
-
Douglas, põe aquela classe ObjetoRetorno que o Geraldo postou na sua action.
É só isso.. o MVC automaticamente vai converter(se o post do json estiver certo) os dados postados pela locaweb no formato JSON para um objeto do tipo ObjetoRetorno.
http://www.linkedin.com/pub/murilo-kunze/44/191/455
-
Bom vamos a página de retorno, estou na class dela então retorno.aspx.cs dentro dela está assim:
using System.Web.Script.Serialization;
public partial class retorno : System.Web.UI.Page
{
var entity = new JavaScriptSerializer().Deserialize<ObjetoRetorno>("AKI o que eu devo colocar?");
protected void Page_Load(object sender, EventArgs e)
{
}
public class Detalhes
{
public string arp { get; set; }
public string lr { get; set; }
public string nsu { get; set; }
public string pan { get; set; }
public string tid { get; set; }
}
public class Transacao
{
public string status { get; set; }
public string meio_pagamento { get; set; }
public int numero_pedido { get; set; }
public int id { get; set; }
public Detalhes detalhes { get; set; }
public object erro { get; set; }
public string total { get; set; }
public string url_acesso { get; set; }
}
public class ObjetoRetorno
{
public Transacao transacao { get; set; }
}
}
Até então está é a página e na retorno.aspx não tem nada está em branco, não coloquei nada nela. somente na .cs
Douglas Bertelli
-
Douglas.. seu projeto é em WebForms.. nós estamos te dizendo o que fazer em MVC auhahuaua
No webforms você precisa pegar o valor postado pela LocaWeb através de Request.Form["name"].. agora tem que descobrir qual string usar no 'name'.
http://www.linkedin.com/pub/murilo-kunze/44/191/455
-
Hahaha.. tenso esse negócio cara... Mas vamos lá.. vamos conseguir.. então assim.
{ "transacao": { "id" : 163, "status": "paga", "meio_pagamento" : "cielo", "numero_pedido" : 12345, "detalhes" : { "arp": "776655", "lr": null, "nsu": "998877", "pan": "887766", "tid": "10017348980826441001" }, "erro": null, "total": "189.00", "url_acesso": "https://qasecommerce.cielo.com.br/web/index.cbmp?id=671387a5190760b7c9e0fa8ccbaf72c4" } }
Este será o post da locaweb na minha página de retorno, Se eu criar uma classe CIELO aqui e fizer CIELO ci = new CIELO(); e depois ci.status = Request.Form["meio_pagamento"]; estará certo?
Douglas Bertelli
-
Não. Afinal você está usando MVC ou Webforms?
http://www.linkedin.com/pub/murilo-kunze/44/191/455
- Editado Murilo Kunze quarta-feira, 14 de novembro de 2012 13:09
-
Ah, seu projeto não é MVC? haha
protected void Page_Load(object sender, EventArgs e) { string postLocaweb = Request.Form["post"]; var entity = new JavaScriptSerializer().Deserialize<ObjetoRetorno>(postLocaWeb); }
Fica tipo isso mas, como o Murilo disse, só tem que ver o que é no lugar do "post", acho que a locaweb pode te dar esta informação.
-
Então Murilo, eu não sei muito bem como funciona o MVC eu trabalho da seguinte maneira neste projeto, criei o projeto website
Dentro da APPCODE tem uma Class UI e uma Class DAL, acredito que isto não seja MVC não é?
Geraldo, então no meu caso eu farei isto que você disse, na locaweb eles não dizem nada cara, é triste o negócio la.
Bom se não for POST é GET é isso? rsrs eu troco caso de errado, mas depois do:
var entity = new JavaScriptSerializer().Deserialize<ObjetoRetorno>(postLocaWeb);
O que devo fazer? para pegar estes valores separadamente? Eu preciso muito salvar isto no banco =( huahuaha meu Deus não pode ser tão complexo isso rsDouglas Bertelli
-
-
-
=( não rolou ..
fiz assim:
using System.Web.Script.Serialization; using Jalapao.App.DAL; public partial class retorno : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { string postLocaweb = Request.Form["post"]; var entity = new JavaScriptSerializer().Deserialize<ObjetoRetorno>(postLocaweb); string Status_Pag = entity.transacao.status; int Ped = entity.transacao.numero_pedido; DALpedidos dp = new DALpedidos(); dp.UpdateStatusPag(Status_Pag, Ped); } public class Detalhes { public string arp { get; set; } public string lr { get; set; } public string nsu { get; set; } public string pan { get; set; } public string tid { get; set; } } public class Transacao { public string status { get; set; } public string meio_pagamento { get; set; } public int numero_pedido { get; set; } public int id { get; set; } public Detalhes detalhes { get; set; } public object erro { get; set; } public string total { get; set; } public string url_acesso { get; set; } } public class ObjetoRetorno { public Transacao transacao { get; set; } } }
Douglas Bertelli
-
-
-
-
-
-
Então.. no meu modo de ver,, eles mandam isto como retorno.
{ "transacao" : { "status" : "aguardando_pagamento", "meio_pagamento" : "cielo", "numero_pedido" : 6512, "id" : 163, "detalhes" : { "arp" : null, "lr" : null, "nsu" : null, "pan" : null, "tid" : "10017348980825651001" }, "erro" : null, "total" : "7630.00", "url_acesso" : "https://qasecommerce.cielo.com.br/web/index.cbmp?id=b817bc2ed8ac0009a1d6dc8199069b27" } }
Preciso entender como isto chega para eu colocar na string =( rsrss q Osso véio.
Douglas Bertelli
-
-
-
-
Pelo oque entendi vc quer salvar no seu banco esses dados que eles devolvem via Json?
Ao receber na função do Controller faz algo assim:
Function Save(ByVal Items As String) As JsonResult If ModelState.IsValid Then Dim model As PessoaModel = JsonConvert.DeserializeObject(Of PessoaModel)(Items) db.SeuModel.Add(model) db.SaveChanges() If (Not (model) Is Nothing) Then Return Json(True) Else Return Json(False) End If End If End Function
- Editado Paulo M Dalbosco quarta-feira, 14 de novembro de 2012 16:18
-
-
Não, você usa isso em foreach:
foreach(var key in Request.Form.Keys){ Response.Write(key); }
Assim você vai ver todos os parametros.
Mas faça isso em uma tela de teste se o seu sistema tiver clientes usando.
http://www.linkedin.com/pub/murilo-kunze/44/191/455
-
-
-
-
Só para entender, como eles te devolvem isso?
Por um XML?
Se usa o "Post" e o "Get" tente usar o Request.QueryString
Por Exemplo, eu uso esse cara para pegar um "token"
Dim gidToken As Guid = System.Guid.Parse(Request.QueryString("ClienteFuncionarioToken").ToString().Trim())
-
-
Oi Paulo então, trata-se de um projeto website em C# eles me retornam em json eles me respondem assim:
{ "transacao" : { "status" : "aguardando_pagamento", "meio_pagamento" : "cielo", "numero_pedido" : 6512, "id" : 163, "detalhes" : { "arp" : null, "lr" : null, "nsu" : null, "pan" : null, "tid" : "10017348980825651001" }, "erro" : null, "total" : "7630.00", "url_acesso" : "https://qasecommerce.cielo.com.br/web/index.cbmp?id=b817bc2ed8ac0009a1d6dc8199069b27" } }
o Murilo / Gustavo me ensinaram a deserilizar porém para fazer isto preciso entender como receber isto tdo e jogar dentro de uma variavel.
Douglas Bertelli
-
Então, esse "pacote de dados" do Json eh um XML, correto?
Vc terá que receber ele em uma View com JavaScript, esse JavaScript vai criar uma "lista" e vai enviar para sua função.
Não seria isso? Eu não sei se ele consegue receber isso direto na função.
Baixe esta exemplo e tente endenter como o Json funciona, quem sabe assim vc consegue.
http://code.msdn.microsoft.com/Grid-Temporria-em-JS-b48e837f
function salvar() { var dados = $.toJSON(Items); //Posting them to server with ajax $.ajax({ url: '@Url.Content("~/Pessoa/Save")', data: { Items: dados }, dataType: 'json', type: 'POST', success: function (result) { if (result) { alert(result); window.location.href = "/Pessoa/index"; } else { alert('Failure'); } } }); }
Aqui no caso eu peguei o "items" que seria uma lista de todos os campos que queria pegar na view e mandei para a função via Json.
- Editado Paulo M Dalbosco quarta-feira, 14 de novembro de 2012 18:00
-
Então , mas a questão é quando a locaweb der o retorno, o pacote dele ter que cair em qual função para ler estes dados. Qual é a primeira linha ?
string TESTE = XXXXX preciso saber quem é o XXXX que será o responsavel pela transação para a minha variável.
Douglas Bertelli
-
Ex:
protected void Page_Load(object sender, EventArgs e)
{
string postLocaweb = Request.Form["xxx"];
var entity = new JavaScriptSerializer().Deserialize<ObjetoRetorno>(postLocaweb);
string Status_Pag = entity.transacao.status;
string Ped = Convert.ToString(entity.transacao.numero_pedido);
DALpedidos dp = new DALpedidos();
dp.UpdateStatusPag(Status_Pag, Ped);
}
}
No lugar do xxx o que devo colocar?
Douglas Bertelli
-
https://qasecommerce.cielo.com.br/web/index.cbmp?id=b817bc2ed8ac0009a1d6dc8199069b27
Analisando o seu "get"
b817bc2ed8ac0009a1d6dc8199069b27 Isto seria seu "token da Cielo"
cria uma variável para receber o token, e faz a função receber ela
-
-
Por isso mesmo, ele vai receber um id diferente cada vez, por isso cria-se uma variável para receber.
eu faria algo como
Guid gidToken = System.Guid.Parse(Request.QueryString("id").ToString().Trim());
ele vai entender que após o "id" é o valor que ele tem q receber
- Editado Paulo M Dalbosco quarta-feira, 14 de novembro de 2012 18:47
-
-
Tentou fazer algo assim?
protected void Page_Load(object sender, EventArgs e) { string recebeCielo = System.Guid.Parse(Request.QueryString("id").ToString().Trim());
string postLocaweb = Request.Form["recebeCielo"]; var entity = new JavaScriptSerializer().Deserialize<ObjetoRetorno>(postLocaweb); string Status_Pag = entity.transacao.status; string Ped = Convert.ToString(entity.transacao.numero_pedido); DALpedidos dp = new DALpedidos(); dp.UpdateStatusPag(Status_Pag, Ped); } }
-
-
-
-
coloquei assim:
protected void Page_Load(object sender, EventArgs e) { string postLocaweb = (Request.QueryString["id"].ToString().Trim()); var entity = new JavaScriptSerializer().Deserialize<ObjetoRetorno>(postLocaweb); int id = entity.transacao.id; Response.Redirect("https://qasecommerce.cielo.com.br/web/index.cbmp?id="+ id); //string Ped = Convert.ToString(entity.transacao.numero_pedido); //DALpedidos dp = new DALpedidos(); //dp.UpdateStatusPag(Status_Pag, Ped); }
Douglas Bertelli
-
-
Uma pergunta.. se quando eu envio meus dados a locaweb aciona a minha página www.ohyes.com.br/retorno.aspx se eu colocar um response.redirect mandando para qualquer página só para saber se realmente está funcionando esta coisa de resposta deles, a página faria o redirecionamento mesmo sem pegar as informaçoes?
Douglas Bertelli
-
-
Ja tentou carregar
"url_acesso"
?- Editado Paulo M Dalbosco quarta-feira, 14 de novembro de 2012 19:20