Having been on the back foot throughout the first half, PSG took the lead at the start of the second period when Lionel Messi’s deflected cross was finished by Kylian Mbappe.
But the lead lasted little more than 10 minutes as City equalized through Raheem Sterling’s poked shot from close range — just reward for City, which had dominated possession for most of the match.
And with 15 minutes remaining, Gabriel Jesus grabbed the winner for the home side after he was teed up by Bernardo Silva inside the PSG box.
RB Leipzig’s 5-0 win against Club Brugge in the group’s other game means that both PSG and City go through to the knockout stages.
The entertaining contest in Manchester — which pitted two of the Champions League’s best sides against each other, both of whom reached the final of the competition in the past two seasons — came to life in the second half after City had controlled the first 45 minutes.
Pep Guardiola’s side could have taken the lead in the game’s opening minutes, but Rodri’s header was cleared off the line by Presnel Kimpembe.
Then midway through the first half, Man City had further chances as Ilkay Gundogan’s powerful shot rattled off the post and Riyad Mahrez had an attempt saved by PSG goalkeeper Keylor Navas.
PSG had few chances and was suffocated by City’s passing and high press, but with Messi, Mbappe and Neymar in attack, a breakaway goal always seemed a possibility.
That’s exactly what happened at the start of the second half when Messi broke down the left and crossed to Mbappe, who slid a shot through the legs of Ederson to give PSG the lead with his ninth goal of the season.
Man City continued to attack the PSG goal and hit back through Sterling after Kyle Walker’s cross went past Jesus and found the England forward at the back post.
Neymar had a golden opportunity to give PSG the lead on 73 minutes after a slaloming run through the Man City defense, but he pushed his shot wide.
It proved a costly miss, as moments later City took the lead through Jesus’ goal, handing his side a deserved victory.
The result means City has 12 points and is guaranteed to finish top of the group with PSG on eight points.
“We’re very happy — very happy with the three points, very happy because we qualified first in the group, which is very important for us, and very happy as well because our fans deserved a good performance and a good win,” Silva told BT Sport after the match.
Buildup to the game had been dominated by speculation linking PSG manager Mauricio Pochettino with City’s rival Manchester United, which parted ways with Ole Gunnar Solskjaer at the weekend.
But Pochettino, whose contract with PSG runs until 2023, declined to get drawn into the rumors.
“We cannot talk about that (because of) my respect to my club, to Paris Saint-Germain, my respect to another club. What another club are doing in that moment is not my business, is not my problem,” he told reporters ahead of the game.
“I need to be focused on Paris Saint-Germain. I’m not going to make the mistake to talk … I am so happy at Paris Saint-Germain and I am focused on trying to give my best like I’m doing.”