After a 1-1 draw in the first leg in the Netherlands, Kevin-Prince Boateng fired the Italians into an early lead.
Mario Balotelli doubled their lead before Boateng added a third late on.
There was an early scare for Milan fter eight minutes when Tim Matavz got behind Cristian Zapata for a header, but Christian Abbiati was at full stretch.
Moments later, the Rossoneri took the lead, Boateng found space from 20 metres and unleashed a right-foot daisy-cutter that squirmed into the far bottom corner despite Jeroen Zoet getting a hand to it.
Stephan El Shaarawy curled over the bar, then tried to dribble into the box and Zoet smothered at his feet.
Adam Maher almost scored a sensational goal, as his shot on the volley from distance was dipping towards the far top corner, but Abbiati flew to palm it away.
Zoet was again quick off his line to stop El Shaarawy going clear, then Riccardo Montolivo blasted just wide from a Boateng assist.
El Shaarawy could not have gone closer on 32 minutes. He volleyed from a De Sciglio cross and it ricocheted off the underside of the crossbar, hit the line and bounced back out.
Memphis Depay drilled just past the upright, while Balotelli should’ve done better on a Montolivo cross, mistiming his jump for the wayward header.
Willems went extremely close to an equaliser just before half-time, as his cross-shot floated over Abbiati and landed on the crossbar. In stoppages Abbiati grabbed a deflected Matavz attempt and Balotelli’s powerful but central free kick was smothered.
Straight after the restart Wijnaldum was left completely unmarked at the back post and Abbiati performed a stunning save, making himself big to deflect it over the bar from point-blank range.
El Shaarawy felt he should’ve scored on 53 minutes when he pounced on a defensive error, but under pressure he couldn’t adjust his aim and prodded wide of an open goal.
Milan did extend their advantage moments later when Philippe Mexes flicked on an El Shaarawy corner for Balotelli to volley in from seven yards. It was his first European goal in a Rossoneri jersey.
Balotelli also received a yellow card for a mistimed tackle, meaning he has been booked in all three of Milan’s competitive games this season.
El Shaarawy’s attempt at an overhead kick from Balotelli’s chipped pass was ill-conceived, then Abbiati flew to fingertip a fierce Stijn Schaars shot over the bar from a tight angle.
Milan added a third to put the result beyond doubt with Boateng’s second of the night. Balotelli sparked the move, carried on by substitute Andrea Poli and the Ghanaian’s scuffed left-foot finish rolled into the far bottom corner past Zoet’s outstretched hand.