You need to manually change the length of the payments array when setting it.
payments[payments.length++] = Payment(address, amt);
For setting the payments array in Purchase, instead of creating an array and trying to set it to the Purchase.payments you can do the following:
uint purchase_id = purchases.length++;
purchases[purchase_id].product_id = product_id;
purchases[purchase_id].complete = false;
Extending the purchases length will automatically create the new attributes. Then you can set them manually.