Logan Ondrusek (5-5) stranded two runners in the sixth inning to earn the win in relief of starter Homer Bailey, who tossed five innings, allowing four runs on nine hits and a walk while striking out seven.
Francisco Cordero put two runners on with no outs in the ninth, but worked out of the jam to earn his 36th save of the year.
Tim Byrdak (2-1) allowed two hits before Josh Stinson gave up Heisey's homer.
Jose Reyes went 3-for-4 with two RBI and a run scored as the Mets dropped their second straight contest.
"Tomorrow or the next day is going to be tough for me. I'm going to have a lot of stuff going through my head but I'm going to stay focused like always," said Reyes, who will be a free agent at the end of the season and is playing his final home games of the year.
Willie Harris led off the ninth with a double before Cordero hit David Wright with a pitch to put the go-ahead runs on the bases with no outs. But Cordero got the force at third on a Nick Evans bunt back to the mound and Josh Thole grounded into a 4-6-3 double play to end the game.
Brandon Phillips led off the game with a double, advanced to third on Edgar Renteria's sacrifice bunt and crossed the plate on a Joey Votto sacrifice fly to give the Reds an early lead.
Devin Mesoraco's RBI double in the second plated Dave Sappelt to make it a 2-0 game.
With runners on first and second and two outs in the third, Wright singled up the middle to score Reyes from second. Evans stepped up next and sent a two- run double into the right-field corner, giving the Mets a 3-2 lead.
The Reds quickly tied the game in the fourth on Sappelt's run-scoring base hit to right.
But Jason Pridie tripled with one out in the home half of the frame and came home on Reyes' sacrifice fly to put the Mets back on top.
Reliever Ryota Igrashi allowed New York to escape a bases-loaded, no-out jam in the sixth.
Stinson took the mound with runners on first and second and one out in the seventh. Heisey hammered Stinson's first pitch over the left-field fence to put the Reds ahead 6-4.
"Fortunately enough I hit the ball on a line and it got up over that big fence in left," Heisey said about his homer.
Mike Baxter walked and came around to score on Reyes' double into the right- field corner in the eighth to make it a one-run game.
Chris Schwinden allowed three runs -- two earned -- on five hits and a walk through five innings in the start for the Mets...New York went 2-for-11 with runners in scoring position and left 10 men on base...The Reds went 3-for-11 with runners in scoring position and stranded eight.