The 24-year-old from Timaru threw 21.36m to beat fourth-placed Franck Elemba of Congo by 16cm.
Fellow Kiwi Jacko Gill failed to make the final cut, finishing ninth with a throw of 20.50m.
American Ryan Crouser won the event, throwing an Olympic record 22.52m, while Joe Kovacs, also of the USA, was second with 21.78m.