PSG also advanced to the last 16 thanks to Leipzig's win over Club Brugge but the loss highlighted their continued problems in finding an effective way to harness their star-studded attack.
For the opening 45 minutes, City dominated playing with their usual invention and verve while PSG's front three of Lionel Messi, Neymar and Kylian Mbappe too often watched on from afar.
Ilkay Gundogan hit the post in the 32nd minute and Riyad Mahrez twice went close while the most Paris managed before the interval was a breakaway which ended with Mbappe curling a shot over the bar.
Four minutes after the break, however, PSG grabbed the lead, Mbappe drilling the ball home at the back post after Messi's cross had deflected off Kyle Walker into the French forward's path.
City drew level when Raheem Sterling poked home at the back post after a lovely ball from Rodri had set up Walker for a trademark low cross.
Neymar had a great chance to restore his side's lead when he weaved his way through the penalty area but he looked somewhat disorientated as he put his shot well wide of Ederson's right post.
Man City always looked the more likely to win the game, with Mahrez and Bernardo Silva asking plenty of questions and Gundogan taking charge in midfield in the absence of Kevin De Bruyne, who missed the game after testing positive for Covid.
It was Mahrez who created the winner, floating a ball to Silva at the far post and the Portuguese midfielder showed a deft touch to cushion the ball to Jesus who picked his spot.
With one round of games remaining, City lead Group A on 12 points with PSG on eight and Leipzig and Brugge, both on four points, left to compete for third place and a spot in the Europa League.