2011-12-15 15 views
5

Estoy tratando de usar SOAP con C#. Magento 1.4.2.Magento API v2 Error de PHP

http://localhost/api/v2_soap/?wsdl 

Aquí puedo ver el método catalogProductCreate

así que trato de conectar con:

$proxy = new SoapClient('http://localhost/api/v2_soap/?wsdl'); 

$sessionId = $proxy->login('xxx', 'xxxxxx'); // user with full access 

$newProductData      = new stdClass(); 
$newProductData->name    = 'Product Name'; 
$newProductData->description  = 'Description'; 
$newProductData->short_description = 'Short Description'; 
$newProductData->websites   = array(138); 
$newProductData->categories   = array(7,15); 
$newProductData->status    = 1; 
$newProductData->price    = 45; 
$newProductData->tax_class_id  = 2; 
$newProductData->weight    = 1; 


$result = $proxy->catalogProductCreate(
    $sessionId,   // Soap Session 
    'simple',   // Product Type 
    4,     // Attribute Set Id (Default) 
    'product-sku',  // Product Sku 
    $newProductData  // Product Data 
); 

Pero recibe esta salida:

Fatal error: Uncaught SoapFault exception: [4] Resource path is not callable.

+0

¿Qué parte del error no entiendes exactamente? ¿Puedes elaborar? – hakre

+0

http: // localhost/api/v2_soap /?wsdl ábrelo en tu navegador para ver si hay un método como catalogProductCreate –

+0

Sé que esto significa que no puedo encontrar ese método ... pero puedo verlo en el xml ... ¿Cómo puedo solucionar esto? – Ste

Respuesta

1

Asegurarse de que pueda ella, el recurso wsdl es correcto, pero también me encontré con ese problema cuando no tenía el usuario configurado hasta los permisos correctos bajo el rol.

15

(detalles son 1.6.x Magento específica, pero las técnicas, si no los detalles, deberían ser aplicables a otras versiones)

Asumo, basado en su ejemplo de código, que está utilizando el código de cliente PHP para probar la existencia de un método, que luego puede aplicar a una llamada desde su aplicación C#?

Suponiendo que ese sea el caso, significa que conoce PHP, por lo que querrá depurar esto en el nivel de PHP del servidor de jabón de Magento. El archivo de clase única que produce que la culpa es

app/code/core/Mage/Api/Model/Server/Handler/Abstract.php 

agregue el siguiente registro temporal y directamente a ese archivo, o deje caer una copia del archivo de clase en

app/code/local/Mage/Api/Model/Server/Handler/Abstract.php 

para una anulación codepool.

Buscar en el archivo de clase para la siguiente excepción

throw new Mage_Api_Exception('resource_path_not_callable') 

Esto es lo que hace que el servidor de jabón Magento a la respuesta con la que falla. Hay cuatro lugares en los que esto sucede en ese archivo. Agregue las llamadas de registro sobre cada uno.

Mage::Log(sprintf('Line %s in file %s',__LINE__, __FILE__)); 
throw new Mage_Api_Exception('resource_path_not_callable'); 

Esto le permitirá saber qué falla está causando su problema, desde la cual puede depurar y registrar más. Hay dos lugares en los que esto puede suceder (cuatro en total en el archivo, uno para una llamada normal, otro para la llamada múltiple).

En orden de aparición, con posibles causas en los comentarios.

//here magento is attempting to instantiate the "API Model" that will perform 
//the work of your API call. Upon instantiation, it discovers that the model 
//doesn't inherit from Mage_Api_Model_Resource_Abstract, and bails. 
//This is rare for a non-custom API call, but might be caused by a class rewrite 
//gone amuck, or a very hacked system 
try { 
    $model = Mage::getModel($modelName); 
    if ($model instanceof Mage_Api_Model_Resource_Abstract) { 
     $model->setResourceConfig($resources->$resourceName); 
    } 
} catch (Exception $e) { 
    Mage::Log(sprintf('Line %s in file %s',__LINE__, __FILE__)); 
    throw new Mage_Api_Exception('resource_path_not_callable'); 
} 


//Here Magento's been able to instantiate the $model, and is checking if the method is 
//callable. If not, it bails. Again, for a standard, stock API call this shouldn't 
//be happening, but could be the result of a rewrite gone wrong, or someone hacking an 
//api class to make the method non accesible, or someone hacking the method mapping in api.xml 
if (is_callable(array(&$model, $method))) { 
    if (isset($methodInfo->arguments) && ((string)$methodInfo->arguments) == 'array') { 
     return $model->$method((is_array($args) ? $args : array($args))); 
    } elseif (!is_array($args)) { 
     return $model->$method($args); 
    } else { 
     return call_user_func_array(array(&$model, $method), $args); 
    } 
} else { 
    Mage::Log(sprintf('Line %s in file %s',__LINE__, __FILE__)); 
    throw new Mage_Api_Exception('resource_path_not_callable'); 
} 

Descubre por qué Magento está arrojando el error de la API. A menudo apunta a un tipo en su llamada de jaula, O le apunta hacia lo que ha sido pirateado en su sistema PHP

+0

2011-12-16T10: 39: 12 + 00: 00 DEPURACIÓN (7): Línea 295 en el archivo /usr/www/app/code/core/Mage/Api/Model/Server/Handler/Abstract.php – Ste

+0

Log get_class ($ modelo) y $ método. Tal vez no tienes ese método en este modelo. –

+0

Tengo el mismo problema aquí (segundo si). Inicié sesión en el Modelo y mi método está en la lista del Modelo de método, pero aparentemente no se puede llamar. Reglas de permiso para TODO. –

0

Coloque este archivo en la carpeta raíz de magento/project para que pueda acceder a todo el método de magento.

Disfrute de la idea ...

1

intenta crear un usuario de servicio web con el papel y les asigna a un rol que tiene acceso a ‘todos’. opción en el menú de recursos del rol en la información del rol.

Cuestiones relacionadas