After Australia made a respectable 288 for six off their allotted 50 overs, South Africa looked to be cruising to victory for much of their innings at Warner Park in Basseterre, on the Caribbean island of St Kitts.
However, a persistent Australian bowling attack finally took its toll and South Africa collapsed from 210/3 in the 38th over to lose their final seven wickets for only 42 runs and were all out for 252 off 47.4 overs.
Warner made 109 from 157 balls on a pitch that, initially at least, was far more conducive to runs than the slow, low surface that hosted the first three games of the series in Guyana.
It was his sixth ODI century, with his previous five coming on home soil.
He later injured a finger diving for a catch and left the field for treatment.
The result leaves Australia with two wins from three matches, while South Africa has one win from three.
West Indies have one win from two matches, ahead of their game against Australia in St. Kitts on Monday.
Fast bowlers Mitchell Starc and Josh Hazlewood and spinner Adam Zampa took three wickets each for Australia.
Hazlewood picked up the prized wicket of South African captain AB de Villiers (39) with a superb delivery that swung late, beat the inside edge and collected middle stump.
It proved to be the turning point of the match as de Villiers departed to leave South Africa 210/4, after which it all went awry for the Proteas.
“We played pretty good cricket for most of the day,” de Villiers said in an on-field interview. “Unfortunately we lost our way with the bat. We had some promising starts, good partnerships.
“It was a chaseable total and the wicket played pretty well throughout the game. We’ve got no excuses. We just didn’t bat well enough.”
Australian skipper Steve Smith, who made 52 not out, said the pitch had slowed as the day progressed.
“We knew if we stuck in there with our bowling and fielding it would be difficult to score at the end, and it turned out that way,” he said.