Luciano Spalletti's team, backed by Russian energy giant Gazprom, only needed a draw in the top-of-the-table clash to clinch a third domestic title since 2007 and fourth in total.
Zenit midfielder Roman Shirokov fired the home side in front on the half-hour and fellow Russia international Alexander Kerzhakov doubled the lead from the spot six minutes later.
Moldova defender Alexandru Epureanu pulled one back for the visitors just before the break but Zenit held on for a deserved win to stretch their lead over Dynamo to 15 points.
Zenit had to play with 10 men for most of the second half after their Russia midfielder Konstantin Zyryanov was sent off after picking up a second booking.
In Moscow, Serbia winger Zoran Tosic scored twice to lead CSKA to a 2-1 win over city rivals Spartak as the army side leapfrogged their opponents into third place.
CSKA, who recorded their first victory in six matches since they beat Spartak by the same score last month, are now level with Dynamo on 69 points. Spartak are fourth a point behind.
Cameroon striker Samuel Eto'o scored twice and set up another goal as wealthy Anzhi Makhachkala, coached by former Russia boss Guus Hiddink, beat Lokomotiv Moscow 3-1 to move into fifth spot with 66 points.
Lokomotiv and Russia striker Roman Pavlyuchenko was forced to leave the game midway through the second half after suffering a leg injury.
"Roman will probably miss the rest of the season," Lokomotiv coach Jose Couceiro told reporters. "As for his Euro 2012 chances, that is up to Russia coaches to decide."