Magento API Bestellungen Exportieren / API Test / Zugriff Verweigert aber Magento 1.7

Gepostet am Januar 16, 2013

Mit folgenden Script kann im Magento eine Bestellung über die API Exportiert werden. Ab Magento 1.7 wird der API User nicht mehr über die normale Berechtigung definiert! Hier wurde eine neue Benutzer Verwaltung für API User integriert.

API User anlegen und Benutzer Testen

Bei Magento < 1.7 wurde die Gruppe und der User genauso angelegt, nur über "System -> Berechtigungen“.

Schritt 1:

Benutzergruppe anlegen: „System -> Web Services -> SOAP/XML-RPC – Berechtigungen“
Wichtig: Gruppenberechtigung Quellen auf „Alle stellen“

Schritt 2:

Benutzer Anlegen: „System -> Web Services -> SOAP/XML-RPC – Benutzer“
Achtung: Hier einen Benutzer anlegen und als Gruppe die unter Schritt 1 angelegte Gruppe verwenden.

Schritt 3:

PHP Datei im Root erstellen „api_test.php“ und folgenden Inhalt einfügen:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php
/* config */
define('pfad', 'http://www.domain.com/test-shop/');
$apiUser = 'api_user';
$apiKey = 'api_user4562x';
 
/* test api */
try {
	$client = new SoapClient(pfad.'api/?wsdl');
	try {
		$sessionId = $client->login($apiUser, $apiKey);
	} catch (Exception $e) {
		echo " ==> Bei der Anmeldung ist ein Fehler aufgetreten" .$e->getMessage();
		exit();
	}
	$mode = 1;
 
} catch (Exception $e) {
	$client = new SoapClient(pfad.'index.php/api/v2_soap/?wsdl');
	try {
		$sessionId = $client->login($apiUser, $apiKey);
	} catch (Exception $e) {
		echo " ==> Bei der Anmeldung ist ein Fehler aufgetreten" .$e->getMessage();
		exit();
	}
	$mode = 2;
}
 
echo "Login korrekt!";
 
exit;
?>

API Export Script für Bestellungen

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
<?php
/* -----------------------------------------------------------------------------------------
   Magento Commerce ab Vers. 1.4 (SOAP API V2)
----------------------------------------------------------------------------------------- */
 
if (ini_get('display_errors')) ini_set('display_errors', false);
if (ini_get('display_startup_errors')) ini_set('display_startup_errors',false);
 
$mageFilename = 'app/Mage.php';
 
if (file_exists($mageFilename)) {
	require_once 'app/Mage.php';
    $mgVers = Mage::getVersion();
}
define('pfad', 'http://www.domain.com/test-shop/');
define('maxOrders', 0);
define('CHARSET','iso-8859-1');
 
//Header setzen
header ("Last-Modified:". gmdate("D, d M Y H:i:s"). " GMT" );
header ("Cache-Control: no-cache, must-revalidate");
header ("Pragma: no-cache");
header ("Content-type: text/xml");
 
$setorder = array (	'1' => 'pending',  		// Bezeichnung für offene Bestellungen
			'2' => 'Processing',    // Bezeichnung für in Bearbeitung gesetzte Bestellungen
			'3' => 'Complete');		// Bezeichnung für versendete Bestellungen
/* ----------------------------------------------------------------------------------------- */
 
$version_major = 3;
$version_minor = 2;
 
 
$apiUser = 'api_user';
$apiKey = 'api_user4562x';
$_GET['action']='orders_export'; // Als Beispiel
 
 
if ($_GET['action'] == 'read_version') {
	echo '<?xml version="1.0" encoding="' . CHARSET . '"?>' . "\n" .
	       "<STATUS>\n" .
	       "  <STATUS_DATA>\n" .
	       "    <SCRIPT_VERSION_MAJOR>$version_major</SCRIPT_VERSION_MAJOR>\n" .
	       "    <SCRIPT_VERSION_MINOR>$version_minor</SCRIPT_VERSION_MINOR>\n" .
	       "	<MAGENTO_VERSION>$mgVers</MAGENTO_VERSION>\n".
	       "  </STATUS_DATA>\n" .
	       "</STATUS>\n\n";
}
 
try {
	$client = new SoapClient(pfad.'api/?wsdl');
	try {
		$sessionId = $client->login($apiUser, $apiKey);
	} catch (Exception $e) {
		echo " ==> Bei der Anmeldung ist ein Fehler aufgetreten" .$e->getMessage();
		exit();
	}
	$mode = 1;
 
} catch (Exception $e) {
	$client = new SoapClient(pfad.'index.php/api/v2_soap/?wsdl');
	try {
		$sessionId = $client->login($apiUser, $apiKey);
	} catch (Exception $e) {
		echo " ==> Bei der Anmeldung ist ein Fehler aufgetreten" .$e->getMessage();
		exit();
	}
	$mode = 2;
}
 
if ($mode == 1) {
	try {
		if ($_GET['action']=='orders_export') {
			if (isset($_GET['order_from'])) $order = $_GET['order_from'];
			else $order = 1;
			echo '<?xml version="1.0" encoding="' . CHARSET . '"?>' . "\n";
			echo "<ORDERS>\n";
				$filters =  array(array('order_id'=>array('gteq'=>$order)));
				$result_list= $client->call($sessionId, 'sales_order.list', $filters);
				//	Bestelldetails abrufen (Übergabe als array)
				foreach ($result_list as $array) {	
	 				$result_detail=$client->call($sessionId, 'sales_order.info',$array['increment_id'],array());
		  			//	Datumformat ändern
					$od_array=explode("-",substr($result_detail['created_at'],0,10));
					$result_detail['created_at']=$od_array[2].".".$od_array[1].".".$od_array[0];
					//	zur XML Ausgabe
					echo "<ORDER>\n";
					echo print_r_xml($result_detail);
	  				echo "</ORDER>\n";
 
				}
			echo "</ORDERS>\n";
		}
	} catch (Exception $e) {
	  	echo " ==> Beim Auftragsabruf ist ein Fehler aufgetreten: ".$e->getMessage();
	  	exit();
	}
 
} elseif ($mode == 2) {
	try { 
		if ($_GET['action']=='orders_export') {
			if (isset($_GET['order_from'])) $order = $_GET['order_from'];
			else $order = 1;
			echo '<?xml version="1.0" encoding="' . CHARSET . '"?>' . "\n";
			echo "<ORDERS>\n";
			$filters = array( 'complex_filter' => array( 
					array( 'key' => 'order_id', 'value' => 
					array( 'key' => 'gteq', 'value' => $order )))); 
			$array = $client->salesOrderList($sessionId, $filters);
			foreach ($array as $key => $obj) {
				$array[$key] = (array)($obj);
				$orderIncrementId = $array[$key]['increment_id'];
				$arrayInfo = $client->salesOrderInfo($sessionId, $orderIncrementId);
				$arr[$key] = umwandeln($arrayInfo);
				//Datumformat ändern created_at->2012-05-25 06:56:07
				$od_array=explode("-",substr($arr[$key]['created_at'],0,10));
				$arr[$key]['created_at']=$od_array[2].".".$od_array[1].".".$od_array[0];
				echo "<ORDER>\n";
				echo print_r_xml($arr[$key]);
				echo "<customer_note>".$array[$key]['customer_note']."</customer_note>\n";
				echo "</ORDER>\n";
			}
			echo "</ORDERS>\n";
		}
	} catch (Exception $e) {
			echo " ==> Beim Auftragsabruf ist ein Fehler aufgetreten: " .$e->getMessage();
			exit();
	}
 
} else 
	echo "Auftragsabruf ist nicht möglich <br/>";
 
if (isset($_POST['action']) && ($_POST['action']=='order_update')) {
	try {
		$newstatus = $_POST['Status'];
		$orderId = $_POST['Order_id'];
		echo '<?xml version="1.0" encoding="' . CHARSET . '"?>' . "\n";  
		if ($mode == 2) { 
			$filters = array( 'complex_filter' => array( 
			array( 'key' => 'order_id', 'value' => 
			array( 'key' => 'eq', 'value' => $orderId )))); 
			$result_list= $client->salesOrderList($sessionId, $filters);
			foreach ($result_list as $k => $v) {
				$arr = umwandeln($v);
 
			}
			$orderIncrementId = $arr['increment_id'];
			$result = $client->salesOrderAddComment($sessionId, $orderIncrementId, $setorder[$newstatus]);
			echo "<STATUS><STATUS_DATA><MESSAGE>OK SOAP API V$mode </MESSAGE></STATUS_DATA></STATUS>";
		} elseif ($mode ==1) {
			$result_list= $client->call($sessionId, 'sales_order.list', array(array('order_id'=>$orderId)));
			foreach ($result_list as $array) {	
 				$client->call($sessionId, 'sales_order.addComment', array($array[increment_id], $setorder[$newstatus]));
			}
			echo "<STATUS><STATUS_DATA><MESSAGE>OK SOAP API V$mode </MESSAGE></STATUS_DATA></STATUS>";		
 
		} else 
			echo "<STATUS><STATUS_DATA><MESSAGE>Nicht OK </MESSAGE></STATUS_DATA></STATUS>";
	} catch (Exception $e) {
		echo " --> Bei dem Auftragsstatus-Setzen ist ein Fehler aufgetreten" .$e->getMessage();
		exit();
	}		
}	
 
$client->endSession($sessionId);
function umwandeln($obj) {
	$arr = array();
	$arr1 = array();
	$arr2 = array();
	foreach($obj as $key => $val) {
		if (is_array($val)) {
			if ($key == 'items') {
				foreach ($val as $k => $v) {
					$arr2['items'][$k] = (array)($v);
				}
			} elseif ($key == 'status_history') {
				foreach ($val as $k => $v) {
					$arr2['status_history'][$k] = (array)($v);
				}
			}	
		}
		elseif (is_object($val)) {
			$arr1[$key] = (array)($val);
		} else {
			$arr1[$key] = $val;
		}
	}
	$arr = array_merge($arr1,$arr2);
 
	return $arr;		
}
 
function print_r_xml($arr, $first=true) {
	$output = "";
	foreach($arr as $key => $val) {
		if (is_numeric($key)) $key = "item"; 
			if (is_array($val)) {
		  		$output .= "<".htmlspecialchars($key).">".print_r_xml($val,false)."</".htmlspecialchars($key).">\n"; 
			} else {
		  		$output .= "<".htmlspecialchars($key).">".utf8_decode(htmlspecialchars($val))."</".htmlspecialchars($key).">\n"; 
 
			}
	  }
	  return $output;
}	
?>

Tags: ,

4 Antworten bis “Magento API Bestellungen Exportieren / API Test / Zugriff Verweigert aber Magento 1.7”

  1. Kruno
    Mrz 13, 2013
    Reply

    Was muss man ober in der Test PHP statt „Pfad“ angeben?


  2. kenny
    Dez 06, 2013
    Reply

    Hallo, ich möchte unter der Änderung des Datumsformat auch die SKU ändern von xxxx-xx in xxxx
    Dazu habe ich $result_detail[sku] = (count(explode(„-„, $result_detail[sku])) > 1) ? explode(„-„,
    $result_detail[sku] )[0] : $result_detail[sku];

    eingefügt. Das führt leider zu einem Server Error 500,
    Was mache ich da falsch ?
    Danke


    • Marcel
      Dez 06, 2013
      Reply

      Naja die Ausgabe ist einfach falsch:
      $result_detail[sku] = ‚xxxx-xxx‘;
      echo explode(„-„, $result_detail[sku])[0]; // <-- Zeiger auf Funktion nicht auf Array Du kannst nicht einfach hinter eine Funktion ein Zeiger setzen, du kannst den Zeiger nur auf ein Array setzen. PHP korrigiert zwar im Gegensatz zu C++ viele Schreibweisen, aber das geht einfach nicht.



Leave a Reply

 

Posts of Current Category



Facebook: