An incredible 22-ball 57* from Eoin Morgan, including seven sixes, closed out what had seemed a tight chase in England's favour.
Having been set 223 to win, the early wicket of Jason Roy for 7, brilliantly caught by Tabraiz Shamsi running in from third man, was a major blow to England's chances. But Jos Buttler and Jonny Bairstow combined for a 91-run partnership in 8.1 overs to put the visitors on top as they approached the halfway stage of the innings.
Buttler had brought up his fifty from just 23 balls, but after reaching the landmark he stalled and was dismissed for 57 as he attempted to scoop a Dwaine Pretorious slower ball, succeeding only in sending it straight up.
Bairstow compensated for Buttler's dismissal by upping his own ante, playing the main role in a brief but productive 34-run partnership with Dawid Malan, who played in place of the ill Joe Denly. Both men fell in the space of seven balls though, leaving the game well balanced with 78 runs still needed from 38 balls.
Morgan began his innings with little indication of what was to come as he knocked his first four balls for singles, but after Bairstow's dismissal the assault began. The English skipper hit the first two of his seven maximums from Dwaine Pretorious's final over, adding another from the final ball of Dale Steyn's next over.
Despite the big-hitting, the required rate rose to more than 13 an over, but another pair of sixes – and a four from Ben Stokes who had been striking at less than a run a ball from his first seven deliveries faced – brought it down to 11 an over and, England would have felt, under control.
Stokes hit back-to-back deliveries from Phehlukwayo over the rope himself, before holing out from the first ball of the penultimate over with 17 runs still required. But any concerns of a repeat of the first T20I, where England had required seven runs from seven balls and went on to lose by one run, were quickly put to bed as Morgan lifted a pair of low full tosses from Ngidi over the boundary to bring up his fifty and leave just three runs required from seven balls. The second of those sixes also took him past fifty from just his 21st ball, equalling his own record for the fastest T20I fifty for England.
A boundary from Moeen Ali sealed the victory from the first ball of the final over, the first time in five T20Is at Centurion that the side batting second has won.
Having won the toss and chosen to bat first South Africa's openers, as they had in the first two matches in the series, got them off to a flyer. Temba Bavuma took the early lead before skipper Quinton de Kock hit three consecutive balls from Chris Jordan over the rope to bring up the fifty partnership from only 22 balls.
England's bowlers struck back though, taking the wickets of both openers in quick succession – de Kock caught in the deep off Ben Stokes for 35, and Bavuma bowled by a quicker ball from Adil Rashid for 49.
But after a relatively sedate period, Heinrich Klaasen launched into a blitz of his own, bringing up his fifty from 25 balls, ending up with a 33-ball 66 before he was dismissed by a fantastic catch by Stokes above the England all-rounder's head at long-off.
His dismissal prompted David Miller to kick off, and he finished the innings off by scoring 26 runs from his last 11 balls, ending with 35*. But it proved too little to prevent England's destructive batting line-up from easing home to take the three-match series 2-1.