Ricky Nolasco (1-0) came off the disabled list to allow one run and six hits in five innings for the Marlins. He was 0-3 with a 19.73 ERA in four previous appearances against New York.
Willingham tripled with the bases loaded in the first inning and hit a two-run homer off Aaron Heilman in the eighth after the Mets pulled within one. Willingham narrowly missed two more homers, flying out to the warning track in center twice.
Nolasco was backed by solid defense, especially from center fielder Alfredo Amezaga. Carlos Beltran hit a long fly to center in the fourth, but Amezaga leaped high to catch the drive near the top of the wall.
Amezaga was responsible for the final out of the inning, too. He easily threw out Carlos Delgado trying to score on Paul Lo Duca's single to get Nolasco out of the inning.
The Marlins also turned an unusual double play when the Mets attempted a double steal with runners on first and third in the first inning. Carlos Delgado took a called third strike and shortstop Hanley Ramirez cut off catcher Miguel Olivo's throw and threw back to the plate to get Jose Reyes.
Lee Gardner, Kevin Gregg and Taylor Tankersley combined to allow one run in three innings of relief for Florida. With heavy rain falling, former Mets prospect Henry Owens pitched the ninth for his third save and second in two days.
David Wright snapped out of a slump with three hits for New York, including his first home run of the season. Wright was 4-for-35 (.114) in his previous 10 games, including stranding six runners in an 0-for-5 performance in the series opener.
Florida took advantage of Mike Pelfrey's control problems in the first inning. Pelfrey hit Dan Uggla with a pitch with one out and issued back-to-back walks to Miguel Cabrera and Mike Jacobs to load the bases.
Willingham then sliced a first-pitch fastball into the right-field corner to give the Marlins a 3-0 lead. He was stranded at third when Pelfrey struck out Joe Borchard and Olivo popped out.
That was all Florida could manage against Pelfrey (0-3), who allowed five hits and struck out three in 6Q innings. The right-hander had struggled in his previous two starts, giving up 10 runs and 14 hits in eight innings.