Chasing 281 to win the match and level the three-match series, India were dismissed for 146 runs after another superb all-round effort from the hosts.
Reduced to 34/4 in the ninth over, the tourists never recovered as the relentless Proteas pace attack tore through their batting line-up.
Lonwabo Tsotsobe (4/25), Dale Steyn (3/17) and Morne Morkel (2/34) combined well to wrap up a comfortable win for the hosts.
Suresh Raina, who made 36 runs off 50 balls, provided the strongest resistance from a struggling Indian side.
Earlier, opening batsmen Quinton de Kock and Hashim Amla shone again, playing anchor roles in South Africa’s innings after they lost the toss and were sent in to bat, guiding the Proteas to 280/6.
De Kock, who made a century in the opening match at the Wanderers on Thursday, smashed 106 runs off 118 balls before he swept a Ravichandran Ashwin delivery straight into the hands of Rohit Sharma in the 36th over.
He shared a first-wicket partnership of 194 runs with Amla, who stuck around for another eight overs.
Amla eventually got an edge off a bouncer from paceman Mohammed Shami, one ball after reaching his 12th career ton, and was caught behind for 100 runs from 117 deliveries.
Shami was the best of the Indian bowlers, who were far more composed after struggling to contain the hosts at the Wanderers, taking 3/48.
The third ODI, a dead rubber, will be played in Centurion on Wednesday.