Пользовательские методы API
Как добавить методы в API soap? Я хочу добавить новый метод для получения некоторой дополнительной информации из salesOrderPaymentEntity и Salesorderentity. Я просмотрел несколько учебных пособий, но не могу заставить его работать.
2 answers
Вот пример того, как вы можете расширить существующую сущность api, чтобы она включала больше полей: https://magento.stackexchange.com/a/1331/146.
Пример приведен для продуктов, но идея одинакова для всех сущностей.
Если ваши новые поля должны содержать некоторую логику, вы можете расширить модели, которые их возвращают, и внедрить свою логику. Mage_Sales_Model_Order_Api_V2
для заказов, items
и info
методов. Я еще не нашел, что нужно изменить для оплаты. Но, скорее всего, это что-то в той же модели
Чтобы добавить новые методы, вам необходимо выполнить следующие действия:
1 - Создать модуль
Например, "APISALES"...
В etc/modules/Namespace_ApiSales.xml
<?xml version="1.0" encoding="UTF-8"?>
<config>
<modules>
<Namespace_ApiSales>
<active>true</active>
<codePool>local</codePool>
</Namespace_ApiSales>
</modules>
</config>
Создайте структуру папок для модуля в app/code/local/
Namespace
ApiSales
*etc
*Model
**Order
***Api
Внутри папки etc
создайте файл config.xml
с таким содержимым:
<?xml version="1.0"?>
<config>
<modules>
<Namespace_ApiSales>
<version>0.1.0</version>
</Namespace_ApiSales>
</modules>
<global>
<models>
<sales>
<rewrite>
<order_api_v2>Namespace_ApiSales_Model_Order_Api_V2</order_api_v2>
</rewrite>
</sales>
</models>
</global>
</config>
2- Определить api.xml
Создайте также файл api.xml
с таким содержимым:
<?xml version="1.0"?>
<config>
<api>
<resources>
<sales_order translate="title" module="sales">
<model>sales/order_api</model>
<title>Order API</title>
<acl>sales/order</acl>
<methods>
<list translate="title" module="sales">
<title>Retrieve list of orders by filters</title>
<method>items</method>
<acl>sales/order/info</acl>
</list>
<info translate="title" module="sales">
<title>Retrieve order information</title>
<acl>sales/order/info</acl>
</info>
<addComment translate="title" module="sales">
<title>Add comment to order</title>
<acl>sales/order/change</acl>
</addComment>
<hold translate="title" module="sales">
<title>Hold order</title>
<acl>sales/order/change</acl>
</hold>
<unhold translate="title" module="sales">
<title>Unhold order</title>
<acl>sales/order/change</acl>
</unhold>
<cancel translate="title" module="sales">
<title>Cancel order</title>
<acl>sales/order/change</acl>
</cancel>
<!-- Custom Method -->
<extendedInfo translate="title" module="sales">
<title>Get Extra info of order</title>
<method>extendedInfo</method>
<acl>sales/order/info</acl>
</extendedInfo>
<!-- Custom Method -->
</methods>
<faults module="sales">
<not_exists>
<code>100</code>
<message>Requested order not exists.</message>
</not_exists>
<filters_invalid>
<code>101</code>
<message>Invalid filters given. Details in error message.</message>
</filters_invalid>
<data_invalid>
<code>102</code>
<message>Invalid data given. Details in error message.</message>
</data_invalid>
<status_not_changed>
<code>103</code>
<message>Order status not changed. Details in error message.</message>
</status_not_changed>
</faults>
</sales_order>
<sales_order_shipment>
<title>Shipment API</title>
<model>sales/order_shipment_api</model>
<acl>sales/order/shipment</acl>
<methods>
<list translate="title" module="sales">
<title>Retrieve list of shipments by filters</title>
<method>items</method>
<acl>sales/order/shipment/info</acl>
</list>
<info translate="title" module="sales">
<title>Retrieve shipment information</title>
<acl>sales/order/shipment/info</acl>
</info>
<sendInfo translate="title" module="sales">
<title>Send shipment info</title>
<acl>sales/order/shipment/send</acl>
</sendInfo>
<create translate="title" module="sales">
<title>Create new shipment for order</title>
<acl>sales/order/shipment/create</acl>
</create>
<addComment translate="title" module="sales">
<title>Add new comment to shipment</title>
<acl>sales/order/shipment/comment</acl>
</addComment>
<addTrack translate="title" module="sales">
<title>Add new tracking number</title>
<acl>sales/order/shipment/track</acl>
</addTrack>
<removeTrack translate="title" module="sales">
<title>Remove tracking number</title>
<acl>sales/order/shipment/track</acl>
</removeTrack>
<getCarriers>
<title>Retrieve list of allowed carriers for order</title>
</getCarriers>
</methods>
<faults module="sales">
<not_exists>
<code>100</code>
<message>Requested shipment not exists.</message>
</not_exists>
<filters_invalid>
<code>101</code>
<message>Invalid filters given. Details in error message.</message>
</filters_invalid>
<data_invalid>
<code>102</code>
<message>Invalid data given. Details in error message.</message>
</data_invalid>
<order_not_exists>
<code>103</code>
<message>Requested order not exists.</message>
</order_not_exists>
<track_not_exists>
<code>104</code>
<message>Requested tracking not exists.</message>
</track_not_exists>
<track_not_deleted>
<code>105</code>
<message>Tracking not deleted. Details in error message.</message>
</track_not_deleted>
</faults>
</sales_order_shipment>
<sales_order_invoice>
<title>Invoice API</title>
<model>sales/order_invoice_api</model>
<acl>sales/order/invoice</acl>
<methods>
<list translate="title" module="sales">
<title>Retrieve list of invoices by filters</title>
<method>items</method>
<acl>sales/order/invoice/info</acl>
</list>
<info translate="title" module="sales">
<title>Retrieve invoice information</title>
<acl>sales/order/invoice/info</acl>
</info>
<create translate="title" module="sales">
<title>Create new invoice for order</title>
<acl>sales/order/invoice/create</acl>
</create>
<addComment translate="title" module="sales">
<title>Add new comment to shipment</title>
<acl>sales/order/invoice/comment</acl>
</addComment>
<capture translate="title" module="sales">
<title>Capture invoice</title>
<acl>sales/order/invoice/capture</acl>
</capture>
<void translate="title" module="sales">
<title>Void invoice</title>
<acl>sales/order/invoice/void</acl>
</void>
<cancel translate="title" module="sales">
<title>Cancel invoice</title>
<acl>sales/order/invoice/cancel</acl>
</cancel>
</methods>
<faults module="sales">
<not_exists>
<code>100</code>
<message>Requested invoice does not exist.</message>
</not_exists>
<invalid_filter>
<code>101</code>
<message>Invalid filter given. Details in error message.</message>
</invalid_filter>
<data_invalid>
<code>102</code>
<message>Invalid data given. Details in error message.</message>
</data_invalid>
<order_not_exists>
<code>103</code>
<message>Requested order not exists.</message>
</order_not_exists>
<status_not_changed>
<code>104</code>
<message>Invoice status not changed</message>
</status_not_changed>
</faults>
</sales_order_invoice>
<sales_order_creditmemo>
<title>Credit memo API</title>
<model>sales/order_creditmemo_api</model>
<acl>sales/order/creditmemo</acl>
<methods>
<list translate="title" module="sales">
<title>Retrieve list of credit memos by filters</title>
<method>items</method>
<acl>sales/order/creditmemo/list</acl>
</list>
<info translate="title" module="sales">
<title>Retrieve credit memo information</title>
<acl>sales/order/creditmemo/info</acl>
</info>
<create translate="title" module="sales">
<title>Create new credit memo for order</title>
<acl>sales/order/creditmemo/create</acl>
</create>
<addComment translate="title" module="sales">
<title>Add new comment to credit memo</title>
<acl>sales/order/creditmemo/comment</acl>
</addComment>
<cancel translate="title" module="sales">
<title>Cancel credit memo</title>
<acl>sales/order/creditmemo/cancel</acl>
</cancel>
</methods>
<faults module="sales">
<not_exists>
<code>100</code>
<message>Requested credit memo does not exist</message>
</not_exists>
<invalid_filter>
<code>101</code>
<message>Invalid filter given. Details in error message</message>
</invalid_filter>
<data_invalid>
<code>102</code>
<message>Invalid data given. Details in error message</message>
</data_invalid>
<order_not_exists>
<code>103</code>
<message>Requested order does not exist</message>
</order_not_exists>
<status_not_changed>
<code>104</code>
<message>Credit memo status not changed</message>
</status_not_changed>
<cannot_refund_to_storecredit>
<code>105</code>
<message>Money can not be refunded to the store credit account as order was created by guest</message>
</cannot_refund_to_storecredit>
<cannot_create_creditmemo>
<code>106</code>
<message>Credit memo for requested order can not be created.</message>
</cannot_create_creditmemo>
</faults>
</sales_order_creditmemo>
</resources>
<resources_alias>
<order>sales_order</order>
<order_shipment>sales_order_shipment</order_shipment>
<order_invoice>sales_order_invoice</order_invoice>
<order_creditmemo>sales_order_creditmemo</order_creditmemo>
</resources_alias>
<v2>
<resources_function_prefix>
<order>salesOrder</order>
<order_shipment>salesOrderShipment</order_shipment>
<order_invoice>salesOrderInvoice</order_invoice>
<order_creditmemo>salesOrderCreditmemo</order_creditmemo>
</resources_function_prefix>
</v2>
<rest>
<mapping>
<sales_order>
<delete>
<method>cancel</method>
</delete>
<post>
<resource>cart</resource>
<method>order</method>
</post>
</sales_order>
<sales_order_invoice>
<delete>
<method>cancel</method>
</delete>
</sales_order_invoice>
<sales_order_creditmemo>
<delete>
<method>cancel</method>
</delete>
</sales_order_creditmemo>
</mapping>
</rest>
<acl>
<resources>
<sales translate="title" module="sales">
<title>Sales</title>
<sort_order>2</sort_order>
<order translate="title" module="sales">
<title>Order</title>
<change translate="title" module="sales">
<title>Change status, add comments</title>
</change>
<info translate="title" module="sales">
<title>Retrieve orders info</title>
</info>
</order>
</sales>
</resources>
</acl>
</api>
</config>
3- Определить де wsdl.xml
Последнее создание файла wsdl.xml
В этот файл, который вам нужен, создает информационную структуру о необходимой вам информации, и вы будете показывать с помощью: определений, сообщений и привязок. В этом случае я покажу вам один пример:
<types>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:Magento">
<import namespace="http://schemas.xmlsoap.org/soap/encoding/"
schemaLocation="http://schemas.xmlsoap.org/soap/encoding/"/>
<!-- Information about order -->
<complexType name="pedidosTransmisionData">
<all>
<!-- Order attributes -->
<element name="increment_id" type="xsd:string" minOccurs="0" />
<element name="created_at" type="xsd:string" minOccurs="0" />
<element name="tax_amount" type="xsd:string" minOccurs="0" />
<element name="shipping_amount" type="xsd:string" minOccurs="0" />
<element name="fee_amount" type="xsd:string" minOccurs="0" />
<element name="discount_amount" type="xsd:string" minOccurs="0" />
<element name="subtotal" type="xsd:string" minOccurs="0" />
<element name="grand_total" type="xsd:string" minOccurs="0" />
<element name="shipping_method" type="xsd:string" minOccurs="0" />
<element name="customer_firstname" type="xsd:string" minOccurs="0" />
<element name="customer_lastname" type="xsd:string" minOccurs="0" />
<element name="order_id" type="xsd:string" minOccurs="0" />
<element name="num_operacion_tpv" type="xsd:string" minOccurs="0" />
<element name="zona_geografica" type="xsd:string" minOccurs="0" />
<element name="store_name" type="xsd:string" minOccurs="0" />
<element name="code_payment" type="xsd:string" minOccurs="0" />
<element name="code_payment_bank" type="xsd:string" minOccurs="0" />
<!-- Special attributes-->
<element name="dedicatoria" type="xsd:string" minOccurs="0" />
<element name="latitud" type="xsd:string" minOccurs="0" />
<element name="longitud" type="xsd:string" minOccurs="0" />
<!-- Items and address of order-->
<element name="items" type="typens:pedidosTransmisionItemDataArray" minOccurs="0" />
<element name="shipping_address" type="typens:pedidosTransmisionAddressData" minOccurs="0" />
<element name="billing_address" type="typens:pedidosTransmisionAddressData" minOccurs="0" />
</all>
</complexType>
<complexType name="pedidosTransmisionAddressData">
<all>
<element name="firstname" type="xsd:string" minOccurs="0" />
<element name="lastname" type="xsd:string" minOccurs="0" />
<element name="street" type="xsd:string" minOccurs="0" />
<element name="city" type="xsd:string" minOccurs="0" />
<element name="postcode" type="xsd:string" minOccurs="0" />
<element name="country_id" type="xsd:string" minOccurs="0" />
<element name="telephone" type="xsd:string" minOccurs="0" />
<element name="region_id" type="xsd:string" minOccurs="0" />
<element name="vat_id" type="xsd:string" minOccurs="0" />
</all>
</complexType>
<complexType name="pedidosTransmisionItemData">
<all>
<element name="item_id" type="xsd:string" minOccurs="0" />
<element name="product_id" type="xsd:string" minOccurs="0" />
<element name="es_tarjeta" type="xsd:string" minOccurs="0" />
<element name="qty_ordered" type="xsd:string" minOccurs="0" />
<element name="tipo_impuestos" type="xsd:string" minOccurs="0" />
<element name="subTotal" type="xsd:string" minOccurs="0" />
<element name="Impuestos" type="xsd:string" minOccurs="0" />
<element name="descuentoTotal" type="xsd:string" minOccurs="0" />
<element name="PrecioIvaIncl" type="xsd:string" minOccurs="0" />
</all>
</complexType>
<complexType name="pedidosTransmisionItemDataArray">
<complexContent>
<restriction base="soapenc:Array">
<attribute ref="soapenc:arrayType" wsdl:arrayType="typens:pedidosTransmisionItemData[]" />
</restriction>
</complexContent>
</complexType>
<!-- FIN PEDIDOS DE TRANSMISIÓN (Datos para enviar a AX) -->
<complexType name="interfloraItemData">
<all>
<element name="item_id" type="xsd:string" minOccurs="0" />
<element name="product_id" type="xsd:string" minOccurs="0" />
<element name="subTotal" type="xsd:string" minOccurs="0" />
<element name="Impuestos" type="xsd:string" minOccurs="0" />
<element name="descuentoTotal" type="xsd:string" minOccurs="0" />
<element name="PrecioIvaIncl" type="xsd:string" minOccurs="0" />
</all>
</complexType>
<complexType name="interfloraItemDataArray">
<complexContent>
<restriction base="soapenc:Array">
<attribute ref="soapenc:arrayType" wsdl:arrayType="typens:interfloraItemData[]" />
</restriction>
</complexContent>
</complexType>
</schema>
</types>
<!-- Messages -->
<message name="salesOrderExtendedInfoRequest">
<part name="sessionId" type="xsd:string"/> <!-- The information we Need -->
<part name="order_id" type="xsd:string"/> <!-- The information we Need -->
</message>
<message name="salesOrderExtendedInfoResponse">
<part name="result_info" type="typens:pedidosTransmisionData"/> <!-- The result of WS -->
</message>
<!-- / Messages -->
<portType name="{{var wsdl.handler}}PortType">
<operation name="salesOrderExtendedInfo">
<documentation>Extra info Order</documentation>
<input message="typens:salesOrderExtendedInfoRequest"/>
<output message="typens:salesOrderExtendedInfoResponse"/>
</operation>
</portType>
<binding name="{{var wsdl.handler}}Binding" type="typens:{{var wsdl.handler}}PortType">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="salesOrderExtendedInfo">
<soap:operation soapAction="urn:{{var wsdl.handler}}Action"/>
<input>
<soap:body namespace="urn:{{var wsdl.name}}" use="encoded"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</input>
<output>
<soap:body namespace="urn:{{var wsdl.name}}" use="encoded"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</output>
</operation>
</binding>
<service name="{{var wsdl.name}}Service">
<port name="{{var wsdl.handler}}Port" binding="typens:{{var wsdl.handler}}Binding">
<soap:address location="{{var wsdl.url}}"/>
</port>
</service>
4- Определите бизнес-логику вашего WS
И, наконец, внутри папки Model/Order/Api/
Нам нужно создать файл V2.php
с этим содержимым на основе примера:
<?php
class Namespace_ApiSales_Model_Order_Api_V2 extends Mage_Sales_Model_Order_Api_V2
{
/**
* Extended info about order
*/
public function extendedInfo($orderId)
{
$order = Mage::getModel('sales/order');
$order->load($orderId);
// Information about order, get attributes of order inside the $result
$result = $this->_getAttributes($order, 'order');
// Addresses
$result['shipping_address'] = $this->_getAttributes($order->getShippingAddress(), 'order_address');
$result['billing_address'] = $this->_getAttributes($order->getBillingAddress(), 'order_address');
//Specials attributes
$customOrder = Mage::getResourceModel('custom/custom_order_collection')
->addFieldToFilter('order_id',array('eq'=>$orderId))->getFirstItem();
$result['dedicatoria'] = $customOrder->getDedicatoria();
$result['latitud'] = $customOrder->getLatitud();
$result['longitud'] = $customOrder->getLongitud();
$code_payment = $order->getPayment()->getMethodInstance()->getCode();
$params = Mage::helper('serviredpro')->getOrderServiredParams($order);
if( $code_payment == "serviredpro") {
$result['code_payment'] = $code_payment;
$result['code_payment_bank'] = Mage::helper('serviredpro')->getBank();
$result['num_operacion_tpv'] = $params["Ds_Order"];
$result['num_comercio'] = $params["Ds_MerchantCode"];;
} elseif ($code_payment == "paypal_express") {
$result['code_payment'] = $code_payment;
$result['code_payment_bank'] = "paypal";
$result['num_operacion_tpv'] = $order->getPayment()->getLastTransId();
}
// ITEMS
$result['items'] = array();
$store_id = $order->getStoreId();
foreach ($order->getAllItems() as $item)
{
$dataItem = $this->_getAttributes($item, 'order_item');
$prod = Mage::getModel('catalog/product')->setStoreId($store_id)->load($dataItem['product_id']);
// Campos del item
$newItem = array();
$newItem['es_tarjeta'] = $prod->getData('cod_tarjeta');
$newItem['item_id'] = $dataItem['item_id'];
$newItem['product_id'] = $dataItem['product_id'];
$newItem['qty_ordered'] = $dataItem['qty_ordered'];
$newItem['subTotal'] = $dataItem['base_original_price'];
$newItem['tipo_impuestos'] = $dataItem['tax_percent'];
$newItem['Impuestos'] = $dataItem['base_tax_amount'];
$newItem['descuentoTotal'] = $dataItem['discount_amount'];
$newItem['PrecioIvaIncl'] = $dataItem['base_price_incl_tax'];
$result['items'][] = $newItem;
}
return $result;
}
}