如何在 .Net 应用程序中配置 Magento 2.0 SOAP API 对象的基于令牌的身份验证

问题描述 投票:0回答:1

我正在尝试在.Net应用程序中使用新引入的Magento 2.0 SOAP API。但根据新构造的端点 wsdl 的变化,函数调用执行与早期版本略有不同..

有人在.Net应用程序中亲自使用和调用Magento 2.0的Web API Soap对象函数吗?

如果可以,您可以提供一些相同的代码片段吗?

提前致谢!

c# magento soap wsdl magento-soap-api
1个回答
1
投票

我终于让 Magento 2 SOAP API 和 .NET 能够相互对话。这是对我有用的分步:

在 Magento 2 后端

系统 > 集成 > 添加新集成

仅在此处填写姓名和电子邮件,因为我们只想发回我们自己的商店并让 Magento 为您保存令牌和密钥。不要忘记在单独的选项卡上设置集成权限。

注意:如果您使用的是虚拟机,请确保您的 /etc/hosts 文件具有其自身的条目,因为 Web 服务器将回发给其自身。

您应该在响应中显示访问令牌。记下来供以后使用。

在 Visual Studio 2013 中

在项目解决方案资源管理器中,右键单击“引用”并选择“添加服务引用” 地址类似于:

http://MyMagentoStore.com/soap/default?wsdl=1&services=catalogProductAttributeGroupRepositoryV1,catalogProductAttributeManagementV1

其中 services= 后面是您将使用的服务的逗号分隔列表。

要查看所有可用的服务,请访问您商店中的以下网址:

http://MyMagentoStore.com/soap/default?wsdl_list=1

我不建议选择所有这些,因为这会使 SOAP 调用 URL 变得非常长。我最终将服务分组为目录产品、客户等部分,并为每组创建单独的服务引用。

构建您的 URL 并将其粘贴到“添加服务引用”对话框中,然后单击“开始”。

如果您确实像我一样选择将服务分开,只需为每个服务提供一个好的命名空间即可。我选择了 Magento2Soap.Customer、Magento2Soap.CatalogProduct 等。无论如何,请在对话框底部选择一个命名空间,然后单击“确定”。这将生成连接到 Magento 的代码。

实际上与Magento对话成功了

现在最难弄清楚的部分是:真正让它发挥作用。

您必须使用 WCF 库在 SOAP 调用中添加正确的授权标头。这样做并不明显。这是一个片段:

    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);

请注意,您需要添加对 System.ServiceModel 的项目引用。您可以通过右键单击“解决方案资源管理器”中的“引用”,然后单击“添加引用”来完成此操作。它将出现在核心库列表中。

我从未找到为每种不同类型的调用使用多态性的好方法,因为生成的类不继承自任何公共类或接口,并且我不打算接近动态类型。我最终创建了一个静态类来简化事情:

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;
        }
    }
}

在实践中:

var product = MagentoSOAP.Product.catalogProductRepositoryV1Get(new Magento2SOAP.CatalogProduct.CatalogProductRepositoryV1GetRequest() {
    sku = "My Product SKU"
});
int id = product.result.id;

我希望这有帮助。我欢迎任何改进或建议。

© www.soinside.com 2019 - 2024. All rights reserved.