c# - services - Cómo configuro la autenticación basada en token del objeto API SOAP de Magento 2.0 en la aplicación.NET
magento web service tutorial (1)
Estoy tratando de consumir la API SOAP Magento 2.0 recientemente introducida en la aplicación .Net. pero según los puntos finales recién estructurados, los cambios de wsdl, la ejecución de llamadas de función son un poco diferentes de la versión anterior.
¿Alguien tiene manos en el consumo y la llamada de la API web Función de objeto de jabón de Magento 2.0 en la aplicación .Net?
En caso afirmativo, puede proporcionar algún fragmento de código del mismo.
¡Gracias por adelantado!
Finalmente conseguí que Magento 2 SOAP API y .NET hablaran entre ellos. Aquí está el paso por paso que funcionó para mí:
En el backend de Magento 2
Sistema> Integraciones> Agregar nueva integración
Solo complete el nombre y el correo electrónico aquí, ya que solo queremos publicar en nuestra tienda y dejar que Magento guarde los tokens y las claves para usted. No olvides configurar tus permisos para la integración en la pestaña separada.
NOTA: Si está usando una máquina virtual, asegúrese de que su archivo / etc / hosts tenga una entrada por sí mismo, ya que el servidor web se publicará solo.
Debería tener un token de acceso mostrado en la respuesta. Haga una nota para más tarde.
En Visual Studio 2013
En su proyecto Solution Explorer, haga clic con el botón derecho en Referencias y seleccione Agregar referencia de servicio. La dirección será algo así como:
Donde services = es seguido por una lista delimitada por comas de los servicios que consumirá.
Para ver todos los servicios disponibles, visite la siguiente url en su tienda:
http://MyMagentoStore.com/soap/default?wsdl_list=1
No recomendaría elegirlos todos, ya que hará que las URL de las llamadas SOAP sean extremadamente largas. Terminé agrupando los servicios en secciones como catálogoProducto, cliente, etc. y creando referencias de servicios individuales para cada conjunto.
Construya su URL y péguelo en el cuadro de diálogo Agregar referencia de servicio y haga clic en Ir.
Si eligió separar los servicios como yo, simplemente déle a cada servicio un buen espacio de nombres. Fui con Magento2Soap.Customer, Magento2Soap.CatalogProduct, etc. En cualquier caso, elija un espacio de nombres en la parte inferior del cuadro de diálogo y haga clic en Aceptar. Esto generará el código para conectarse a Magento.
En realidad hablando con Magento con éxito
Ahora es la parte más difícil de entender: realmente hacer que funcione.
Debe usar las bibliotecas WCF para agregar el Encabezado de autorización apropiado en sus llamadas SOAP. Hacer esto no fue obvio. Aquí hay un fragmento:
var client = new customerCustomerRepositoryV1PortTypeClient();
client.Endpoint.Binding = new BasicHttpBinding();
HttpRequestMessageProperty hrmp = new HttpRequestMessageProperty();
hrmp.Headers.Add("Authorization", "Bearer " + yourAccessToken);
OperationContextScope contextScope = new OperationContextScope(client.InnerChannel);
OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = hrmp;
CustomerCustomerRepositoryV1GetByIdResponse response = client.customerCustomerRepositoryV1GetById(
new CustomerCustomerRepositoryV1GetByIdRequest() {
customerId = 1
}
);
Console.WriteLine(response.result.firstname);
Tenga en cuenta que deberá agregar una referencia de proyecto a System.ServiceModel. Para ello, haga clic con el botón derecho en Referencias en el Explorador de soluciones y luego Agregue referencia. Estará en la lista de bibliotecas centrales.
Nunca encontré una forma excelente de usar el polimorfismo para cada tipo de llamada ya que las clases generadas no heredan de ninguna clase o interfaz común, y no me iba a acercar al tipo dinámico. Terminé haciendo una clase estática para simplificar las cosas:
public static class MagentoSOAP {
private static BasicHttpBinding GetBinding() {
return new BasicHttpBinding();
}
private static void AddAuthorizationHeader(IClientChannel clientChannel) {
HttpRequestMessageProperty hrmp = new HttpRequestMessageProperty();
hrmp.Headers.Add("Authorization", "Bearer " + Constants.MAGENTO_SOAP_ACCESS_TOKEN);
OperationContextScope contextScope = new OperationContextScope(clientChannel);
OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = hrmp;
}
public static customerCustomerRepositoryV1PortTypeClient Customer {
get {
var client = new customerCustomerRepositoryV1PortTypeClient();
client.Endpoint.Binding = GetBinding();
AddAuthorizationHeader(client.InnerChannel);
return client;
}
}
public static catalogProductRepositoryV1PortTypeClient Product {
get {
var client = new catalogProductRepositoryV1PortTypeClient();
client.Endpoint.Binding = GetBinding();
AddAuthorizationHeader(client.InnerChannel);
return client;
}
}
}
Y en la práctica:
var product = MagentoSOAP.Product.catalogProductRepositoryV1Get(new Magento2SOAP.CatalogProduct.CatalogProductRepositoryV1GetRequest() {
sku = "My Product SKU"
});
int id = product.result.id;
Espero que esto sea útil. Doy la bienvenida a cualquier mejora o sugerencia.