With qbXML, the order of XML nodes IS IMPORTANT.
So, if the Intuit XSD/QuickBooks OSR tells you the order of nodes should be:
<SalesDesc >STRTYPE</SalesDesc> <!-- optional -->
<SalesPrice >PRICETYPE</SalesPrice> <!-- optional -->
<IncomeAccountRef> <!-- optional -->
<ListID >IDTYPE</ListID> <!-- optional -->
<FullName >STRTYPE</FullName> <!-- optional -->
</IncomeAccountRef>
<PurchaseDesc >STRTYPE</PurchaseDesc> <!-- optional -->
<PurchaseCost >PRICETYPE</PurchaseCost> <!-- optional -->
<COGSAccountRef> <!-- optional -->
<ListID >IDTYPE</ListID> <!-- optional -->
<FullName >STRTYPE</FullName> <!-- optional -->
</COGSAccountRef>
<PrefVendorRef> <!-- optional -->
<ListID >IDTYPE</ListID> <!-- optional -->
<FullName >STRTYPE</FullName> <!-- optional -->
</PrefVendorRef>
<AssetAccountRef> <!-- optional -->
<ListID >IDTYPE</ListID> <!-- optional -->
<FullName >STRTYPE</FullName> <!-- optional -->
</AssetAccountRef>
<ReorderPoint >QUANTYPE</ReorderPoint> <!-- optional -->
<QuantityOnHand >QUANTYPE</QuantityOnHand> <!-- optional -->
Then you MUST provide the nodes in that order.
In your case, you're sending QuantityOnHand before IncomeAccountRef, COGSAccountRef, etc., which will be rejected. Also note that PurchaseCost comes after the IncomeAccountRef node.
There's a bit more information on our QuickBooks integration wiki - FAQ section and our QuickBooks wiki in general.
Hope that helps!