I never worked on a system with recurring invoices. We paid everything all at once on the systems I worked on, so maybe I'm missing something here but here is what I would do...
The invoice would not be related necessarily to exactly what was added to a cart.
You add 3 products with 3 different recurring period types, you have 3 different invoices. You could relate those invoices to a cart or an order or whatever you want to call it.
Now, you don't want the customer to pay 3 different real invoices the same day, it should be all in one invoice if it's the case.
The way I would do it is only with the "algorithm" that sends the invoices. It would take all the invoices due today, if there are more than 1 for the same customer, you send him only one "real invoice". The way to handle this is maybe by adding another table/object like grouped invoices? When the user pays his "grouped invoice", you mark the invoices as paid like you would if they were individually paid.
You create the next invoice each time an invoice is paid. So, you have an invoice that contains 3 products. When it's paid, you check the invoice's products and if there are products that must be paid in a recurring fashion, you create the new "next invoices" with its due date.
About your last question, you will need a table between invoice and products, like INVOICE_PRODUCT with the fields PRODUCT_ID and INVOICE_ID (and possibly PRICE). The primary key of the table should be both PRODUCT_ID with INVOICE_ID. So that's a many to many relationship. That way, you can find out what products was bought for what invoice.
Now, you have to think carefully about "time". What happens if the price of the product changes over time? Will the payment process still work? Is there a "show last invoices" screen for the user? That's why I would probably copy the price in the relationship table. On system I worked on, all the product information was always copied into the invoices. If the product changes, is deleted, etc... the "invoice history" will still work and you'll still be able to run reports.