जावास्क्रिप्ट के साथ मूल ग्राहक से Magento एपीआई का उपयोग कैसे करें


9

मुझे एक स्थानीय जावास्क्रिप्ट आधारित एप्लिकेशन (टाइटेनियम डेस्कटॉप) से मैगेंटो एपीआई का उपयोग करने की आवश्यकता है और सोच रहा है कि ऐसा करने का सबसे अच्छा तरीका क्या है।

मुझे अब तक क्या पता चला है:

  • एकमात्र प्रमाणीकरण तंत्र OAuth है, इसलिए उपयोगकर्ता को साइट पर अपनी साख दर्ज करनी होगी
  • एक जावास्क्रिप्ट क्लाइंट लाइब्रेरी है: https://code.google.com/p/oauth/source/browse/#svn%2Fcode%2Fjavascript
  • OAuth क्लाइंट के रूप में देशी ऐप्स के लिए, OAuth 2 उपयोगकर्ता एजेंट फ्लो की सिफारिश की जाती है।
  • रीडायरेक्ट URL को एक स्थानीय पृष्ठ की ओर इशारा करना होता है, जहाँ से टोकन को निकालना या कॉपी करना और चिपकाना होता है

प्रशन:

  • क्या यह एचएमएसी आधारित प्रमाणीकरण जैसे कि आवेदन कुंजी और गुप्त के साथ प्रमाणीकरण तंत्र का आदान-प्रदान करना संभव है? क्या सिद्ध उपाय भी हैं?
  • यदि नहीं, तो क्या मैथेंटो के साथ OAuth यूजर एजेंट फ्लो संभव है? प्रलेखन में इसका उल्लेख नहीं है।
  • क्या उपयोगकर्ता से अधिकांश प्राधिकरण प्रक्रिया को छिपाने के लिए AJAX (क्रॉस-ओरिजिन-पॉलिसी यहां कोई समस्या नहीं है) के साथ उपयोगकर्ता क्रेडेंशियल्स सबमिट करना संभव है? पहुँच टोकन तब संभवतः प्रतिक्रिया से सीधे निकाला जा सकता है।

ठीक है, मुझे पता चला कि मैं भी REST पर केंद्रित था, SOAP एपीआई को मेरी समस्या का समाधान करना चाहिए, हालांकि जावास्क्रिप्ट के साथ SOAP बोझिल है। टाइटेनियम के लिए एक पुस्तकालय है ( github.com/kwhinnery/Suds ), मैं इसे आजमाऊंगा और यहां परिणाम पोस्ट करूंगा।
फाबियान शेंगलर

जवाबों:


8

संपादित करें: बेहतर तरीका मिला, नीचे समाधान 2 देखें

जैसा कि टिप्पणी में उल्लेख किया गया है, सोप एपीआई जाने का रास्ता है।

समाधान 1:

सूद ने मेरे लिए मामूली संशोधन ( Titanium.Network.HTTPClientइसके बजाय उपयोग XMLHttpRequest) के साथ काम किया , लेकिन यह कॉल के लिए SOAP लिफाफा बनाने और पूरे XML प्रतिक्रिया को वापस करने से ज्यादा नहीं है।

प्रूफ ऑफ़-कॉन्सेप्ट इम्प्लीमेंटेशन , रिक्वेस्ट फॉर जीनिंग डीफ्रेड्रेड फॉर रिक्वेस्ट चेनिंग:

Service.MagentoClient = function()
{
    var self = this;
    var suds = new SudsClient({
        endpoint : "http://the-magento-host/api/v2_soap/",
        targetNamespace : "urn:Magento",
    });

    self.login = function() {
        var deferred = new $.Deferred();
        var args = {
            username : 'the-username',
            apiKey: 'the-api-key'
        };
        suds.invoke("login", args, function(xmlDoc) {
            self.sessionId = $(xmlDoc).find("loginReturn").text();
            deferred.resolve({});
            //TODO reject if no sessionid returned
        });
        return deferred;
    };

    self.setStatus = function(orderId, status, comment, notify) {
        var deferred = new $.Deferred();
        if (!self.sessionId) {
            deferred.reject({ error: 'Login not successful.' });
            return;
        }
        var args = {
            sessionId        : self.sessionId,
            orderIncrementId : orderId,
            status           : status,
            comment          : comment,
            notify           : notify
        }
        suds.invoke("salesOrderAddComment", args, function(xmlDoc) {
            var success = $(xmlDoc).find("salesOrderAddCommentResponse").text();
            if (success) {
                deferred.resolve({});
            } else {
                deferred.reject({ error: 'Update not successful.' });
            }

        });
        return deferred;
    };
};

उपयोग उदाहरण:

        var magento = new Service.MagentoClient();
        magento.login().then(function() {
            magento.setStatus('100000029', 'complete', 'soap test');
        }).then(function() {
            alert('Update successful');
        }, function(reject) {
            alert('Update failed: ' + reject.error);
        });

समाधान 2:

पता चला कि स्वयं एपीआई एडेप्टर लिखना वास्तव में आसान हो सकता है। के उदाहरण के साथयह कोर-हैक(मृत लिंक) मैं JSON-RPC एडाप्टर के लिए एक स्वच्छ मॉड्यूल लिखने में सक्षम था Zend_Json_Server। यह SOAP और XML-RPC API के समान प्रमाणीकरण और ACL का उपयोग करता है।

प्रवेश बिंदु का उपयोग करने के लिए /api/jsonrpc, नए नियंत्रक को apiमार्ग में जोड़ना होगा :

<config>
    <frontend>
        <routers>
            <api>
                <args>
                    <modules>
                        <my_jsonrpc before="Mage_Api">My_JsonRpc_Api</my_jsonrpc>
                    </modules>
                </args>
            </api>
        </routers>
    </frontend>
</config>

अद्यतन 02/2015: उपरोक्त लिंक अब मृत है, इसलिए मैंने अपने JSON-RPC एडॉप्टर को पूर्ण एक्सटेंशन के रूप में खोला है: https://github.com/sgh-it/jsonrpc

मेरा जेएस क्लाइंट अब इस तरह दिखता है (फिर से JQuery.Deferred के साथ, लेकिन एपीआई के लिए कोई अतिरिक्त 3 पार्टी लाइब्रेरी नहीं):

/**
 * Client for the Magento API
 */
Service.MagentoClient = function()
{
    var self = this;

    /**
     * @param string   method    the remote procedure to call
     * @param object   params    parameters for the RPC
     * @param callback onSuccess callback for successful request. Expects one parameter (decoded response object)
     * @param callback onError   callback for failed request. Expects one parameter (error message)
     * 
     * @return void
     */
    self.jsonRpc = function(method, params, onSuccess, onError) {
        var request = {
            method : method,
            params : params,
            jsonrpc : "2.0",
            id : 1
        };

        var options = {
            entryPoint : config.magentoClient.entryPoint,
            method: 'post',
            timeout: config.magentoClient.timeout
        };

        var httpClient = Titanium.Network.createHTTPClient();
        httpClient.onload = function(e) {
            try {
                var response = JSON.parse(this.responseText);
            } catch (jsonError) {
                return onError(jsonError);
            }
            if (response.error) {
                if (response.error.code == 5) { // session expired
                    self.sessionId = null;
                }
                return onError(response.error.message);
            }
            onSuccess(response);
        };
        httpClient.onerror = function(e) {
            onError(e.error + '; Response:' + this.responseText);
        };
        httpClient.setTimeout(options.timeout);

        if (httpClient.open(options.method, options.entryPoint)) {
            httpClient.setRequestHeader("Content-type", "application/json");
            httpClient.send(JSON.stringify(request));
        } else {
            onError('cannot open connection');
        }

    }
    /**
     * Retrieve session id for API
     * 
     * @return JQuery.Deferred deferred object for asynchronous chaining
     */
    self.login = function() {
        var deferred = new $.Deferred();
        if (self.sessionId) {
            deferred.resolve();
            return deferred;
        }
        var loginParams = config.magentoClient.login;
        try {
            self.jsonRpc('login', loginParams, function(response) {
                if (response && response.result) {
                    self.sessionId = response.result;
                    deferred.resolve();
                } else {
                    deferred.reject('Login failed.');
                }
            }, function(error) {
                deferred.reject(error);
            });
        } catch (rpcError) {
            deferred.reject(rpcError);
        }
        return deferred;
    };
    /**
     * Updates order states in Magento
     *
     * @param string method   name of the remote method
     * @param object args     arguments for the remote method
     * 
     * @return JQuery.Deferred deferred object for asynchronous chaining
     */
    self.call = function(method, args) {
        var deferred = new $.Deferred();
        if (!self.sessionId) {
            deferred.reject('No session.');
            return;
        }
        var callParams = {
            sessionId : self.sessionId,
            apiPath   : method,
            args      : args
        };
        try {
            self.jsonRpc('call', callParams, function(response) {
                deferred.resolve(response.result);
            }, function(error) {
                deferred.reject(error);
            });
        } catch (rpcError) {
            deferred.reject(rpcError);
        }

        return deferred;
    };
};

ध्यान दें कि लॉगिन के बाद के सभी तरीकों से गुजरता है callmethodपैरामीटर की तरह कुछ है sales_order.list, argsपैरामीटर किसी सरणी या विधि तर्क के साथ वस्तु।

उपयोग उदाहरण:

        var filters = [];
        var magento = new Service.MagentoClient();
        magento.login().then(function() {
            magento.call('sales_order.list', [filters]).then(
                function(orders) {
                    // do something with the response
                }, function(error) {
                    alert('Magento API error: ' + error);
                }
            );
        });

अपनी स्क्रिप्ट में एंडपॉइंट को कैसे कॉन्फ़िगर करें?
अक्र्रामो

आपको फ्रंटएंड राउटर की परिभाषा को बदलना होगा config.xml(यदि आप apiमार्ग का उपयोग नहीं करना चाहते हैं , तो आप इसके बजाय एक कस्टम मार्ग का भी उपयोग कर सकते हैं, इसे परिभाषित करें जैसे कि आप किसी अन्य Magento मॉड्यूल में करेंगे
Fabian Schmengler

जहाँ मैं इस कोड को magento में डाल सकता हूँ
er.irfankhan11

स्थापना निर्देश हैं: github.com/sgh-it/jsonrpc
Fabian Schmengler

और जावास्क्रिप्ट कोड स्पष्ट रूप से Magento में नहीं है, लेकिन बाहरी ग्राहक में
Fabian Schmengler
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.