Home captain Bavuma hit a belligerent format-best 144 but received no support from the other end as his team were bowled out for 287 chasing a stiff target of 336.
The Proteas batting unit will be disappointed with the manner of their dismissals while the skipper was seeing it big.
Quinton de Kock and Bavuma put on 76 inside the first nine overs to give the hosts a good platform with the former striking a breezy 48 off 26 balls before being trapped lbw by seamer Kyle Mayers.
The Proteas had four debutants, including three batters in the top six and the inexperienced showed.
Ryan Rickelton (14) and Tony De Zorzi (27) both got in but then were undone by spin while the third batting green-horn Tristan Stubbs (6) top-edged a half-tracker bowled by seamer Odean Smith.
Bavuma though was carrying on his merry way on the side and even though wickets were falling around him, brought up his fourth international hundred in the 50-over format.
The game looked to be over when the fourth debutant Gerald Coetzee was run-out to leave the home side on 238-8 with 14 overs still remaining.
Bavuma though combined with Lungi Ngidi to add a 49-run partnership with the skipper swinging his bat lustily to strike some telling blows, with his innings including 11 fours and seven towering sixes.
Just as the Proteas thought they had a sniff, Bavuma gloved fast bowler Alzarri Joseph (3-53) down the leg-side to spark wild celebrations from the visitors and effectively end the contest.
Earlier, Windies captain Shai Hope played a magnificent innings of his own, hitting an unbeaten 128 off 115 deliveries before his side posted a total of 335/8.
Hope received good support from Rovman Powell (46) and Nicholas Pooran (39) while the opening pair of Brandon King (30) and Mayers (36) also chipped in.
The Proteas bowlers were on the expensive side but Coetzee did well in his 50-over bow, finishing with figures of 3-57 in his 10 overs.
After the first ODI was washed out on Thursday, West Indies lead the three-match series 1-0 with the final game to be played in Potchefstroom on Tuesday.