chúng tôi muốn kết nối một đối tác thực hiện bên ngoài với Magento và muốn đăng nhập các yêu cầu API của họ.
Có bất kỳ trình ghi API miễn phí và mã nguồn mở nào không?
chúng tôi muốn kết nối một đối tác thực hiện bên ngoài với Magento và muốn đăng nhập các yêu cầu API của họ.
Có bất kỳ trình ghi API miễn phí và mã nguồn mở nào không?
Câu trả lời:
Tôi sẽ cắn vì tôi vừa mới làm điều này, tuy nhiên đó là một dịch vụ API REST, nhưng điều tương tự đối với yêu cầu SOAP là hoàn toàn có thể. Vì vậy, thay vì chi tiết, đặc biệt chỉ là tổng quan về quy trình tôi đã thực hiện:
1) TẠO MỘT MÔ HÌNH NGUỒN LỰC
Trước tiên, bạn sẽ muốn tạo một mô hình tài nguyên Magento mới, có rất nhiều ví dụ ngoài đó:
Dưới đây là một ví dụ về bảng tôi đang tạo trong quá trình cài đặt mô-đun của mình (rõ ràng điều chỉnh nó phù hợp với nhu cầu / yêu cầu của bạn).
CREATE TABLE IF NOT EXISTS mynamespace_mymodulename_logs (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`timestamp` datetime NOT NULL,
`requestUrl` varchar(255) DEFAULT NULL,
`method` varchar(10) DEFAULT NULL,
`returnHttpCode` varchar(10) DEFAULT NULL,
`returnError` TEXT NOT NULL,
`requestXML` TEXT NOT NULL,
`responseXML` TEXT NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Lưu ý: Tôi cũng đã tranh luận về việc lưu trữ XML yêu cầu và phản hồi theo định dạng gzip để bảo tồn không gian db và XML nén tốt. Tuy nhiên, lưới adminhtml của Magento sẽ cần một trình kết xuất tùy chỉnh, vì vậy tôi vẫn giữ XML được lưu trữ như hiện tại.
2) QUẦN ÁO REST HIỆN TẠI YÊU CẦU VIA PHP
Tôi thường sử dụng một lớp duy nhất, ví dụ: Rest.php với một cái gì đó tương tự cho các cuộc gọi API nhanh và không đau thông qua CURL trong mô-đun của tôi. Tôi tin rằng các tùy chọn lib / Varien và Zendframework cũng có thể là điều cần xem xét, tuy nhiên tôi đã thành công lớn với đoạn trích nhỏ dễ đọc này:
<?php
$url = 'https://www.google.com';
$method = 'POST';
# headers and data (this is API dependent, some uses XML)
$headers = array(
'Accept: application/json',
'Content-Type: application/json',
);
$data = json_encode(array(
'firstName'=> 'John',
'lastName'=> 'Doe'
));
$handle = curl_init();
curl_setopt($handle, CURLOPT_URL, $url);
curl_setopt($handle, CURLOPT_HTTPHEADER, $headers);
curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
curl_setopt($handle, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, false);
switch($method) {
case 'GET':
break;
case 'POST':
curl_setopt($handle, CURLOPT_POST, true);
curl_setopt($handle, CURLOPT_POSTFIELDS, $data);
break;
case 'PUT':
curl_setopt($handle, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($handle, CURLOPT_POSTFIELDS, $data);
break;
case 'DELETE':
curl_setopt($handle, CURLOPT_CUSTOMREQUEST, 'DELETE');
break;
}
$response = curl_exec($handle);
$code = curl_getinfo($handle, CURLINFO_HTTP_CODE);
Nguồn: http://singletonio.blogspot.com/2009/07/simple-php-rest-client-USE-curl.html
Tôi cũng sử dụng một thư viện riêng khác có tên Array2XML để xây dựng POST
các yêu cầu của mình được sử dụng với đoạn yêu cầu REST đơn giản này.
* @param type $method
* @param type $data
* @param type $url
* @param type $header
* @param type $topNode
* @return boolean|xml
*/
public function RESTRequest($method, $url, $header, $data = array(), $topNode = array()) {
Dưới đây là ví dụ sử dụng của lớp Rest.php của tôi: (LƯU Ý : $restUrl
, $apiKey
được điều khiển từ cấu hình).
// Available Invetory Product
$requestUrl = $restUrl . "inventory/item/test/111/111";
$inventory = Mage::getModel('mynamespace/mymodulename')->RESTRequest('GET', '', $requestUrl, $apiKey);
//zend_debug::dump($inventory->inventory_item->quantity_on_hand);
header("Content-Type: text/xml");
echo $inventory->asXML();
exit;
3) THÊM ĐĂNG NHẬP VÀO YÊU CẦU / TRÁCH NHIỆM
Sau đó bọc mô hình tài nguyên mới tạo của bạn xung quanh Rest.php
các lệnh gọi để thu thập dữ liệu trước và sau khi hoàn trả được thực hiện từ API của bên thứ 3.
Một cái gì đó như thế này trước đây curl_exec
:
if (Mage::helper('mymodulename')->getAPILoggingEnable()) {
$logModel->setData('timestamp', time())
->setData('requestUrl', $url)
->setData('method', $method)
->setData('requestXML', @$postFields);
}
...
Và sau khi các curl_exec
:
$xmlResponse = new SimpleXMLElement($response);
if ($xmlResponse->error) {
$logModel->setData('returnError', $xmlResponse->error->error_description);
}
if (Mage::helper('mymodulename')->getAPILoggingEnable()) {
$logModel->setData('returnHttpCode', $code)
->setData('responseXML', $xmlResponse->asXML())
->save();
}
Thay vì chỉ trả về đối tượng cURL, tôi sử dụng SimpleXMLEuity ($ reply) để chuyển đổi phản hồi API thành XML.
A try
/ catch
với a $logModel->save();
và a Mage::logException($e);
trong Rest.php có thể giúp gỡ lỗi tốt hơn mọi vấn đề với tích hợp. Vì các ngoại lệ gây tử vong sẽ vẫn được đăng nhập một phần trong mô hình tài nguyên của bạn nhưng cũng xuất hiện trongvar/log/excpetions.log
4) QUẢNG CÁO HTML
Bây giờ chỉ cần tạo một lưới Magento adminhtml tùy chỉnh mới vào bảng của bạn chứa dữ liệu nhật ký.
Nhấp chuột vào lưới của tôi về các chi tiết đơn hàng đi vào chi tiết cho một yêu cầu với dữ liệu XML Phản hồi và Yêu cầu vì việc hiển thị lượng dữ liệu lớn này trên Lưới có thể gặp vấn đề.
GHI CHÚ
Luôn thêm tùy chọn Hệ thống -> Cấu hình để bật / tắt đăng nhập vì với một số lượng lớn yêu cầu đi qua giao tiếp API, bảng có thể trở nên khá nặng và hiệu quả. Tôi thường sẽ vô hiệu hóa đăng nhập sau khi tích hợp đã hoạt động đúng một lúc.
Lý tưởng nhất là bạn có thể tận dụng Mage_Log và chỉ cần thêm bảng tùy chỉnh của mình vào danh sách các bảng sẽ được cắt theo từng khoảng để giữ cho nó mỏng, tuy nhiên tôi không chắc chắn về quy trình thích hợp cho các trường ngày / giờ cụ thể có thể được yêu cầu.
Bạn cũng có thể xem xét sử dụng các thuộc tính tùy chỉnh để lưu trữ dữ liệu quan hệ của mình giữa Magento và API của bên thứ 3.
Hy vọng rằng điều này sẽ giúp theo hướng chung trong việc loại bỏ sự tích hợp của bên thứ 3. Vì không phải tất cả các yêu cầu đều giống nhau. Tuy nhiên, với cơ chế ghi nhật ký API tổng quát có thể có lợi.