Zenit, who haven't played a competitive fixture in over two months, started poorly and Dortmund capitalised with two quick goals in the opening five minutes.
After a superb run by Marco Reus, the ball found the feet of Armenia's Henrikh Mkhitaryan who fired in the opening goal.
Jurgen Klopp's side scored another just 70 seconds later, with Reus adding his name to the score-sheet after slotting the ball into the bottom right corner of Yuri Lodygin's goal.
Zenit looked fired up after half-time and managed to pull a goal back through Oleg Shatov, who drilled in from 10 yards after Jose Rondon had hit the post.
With the Russians looking increasingly dangerous, Dortmund broke away on the counter-attack and added a third through Robert Lewandowski.
Zenit managed to pull another goal back through an emphatic Hulk penalty, but Luciano Spalletti's side switched off again and let Lewandowski score his second of the game after he slotted the ball under Lodygin.
In the fourth minute of the game, Reus stayed strong to muscle his way through the Zenit defence and, when he was finally stopped, Mkhitaryan latched on to the loose ball and fired home.
It got worse for Zenit with Mkhitaryan this time playing a supporting role as his cross found Kevin Grosskreutz, who knocked the ball down for Reus to lash home and make it 2-0.
And the bad news kept on coming for the hosts, with Andrey Arshavin forced off the pitch after 15 minutes with an apparent hamstring problem, replaced by veteran Ukraine international Anatoliy Tymoschuk.
Lewandowski had a shot from a narrow angle saved by Lodigin as the German side went for a third, while Zenit's best chance of the half came in the form of a Hulk strike from distance which went wide.
It looked like more of the same at the start of the second half when Lewandowski's effort was turned behind for a corner by Lodigin, but the hosts hauled themselves back into the game just before the hour, albeit in inelegant fashion.
A scramble in the Dortmund box saw the ball fall to Rondon. His effort struck the post, but the loose ball ended up at the feet of Shatov, who had a simple task to convert.
It was only temporary respite, though, as Lewandowski restored the two-goal lead for Dortmund, playing a neat exchange with compatriot Lukasz Piszczek and managing to dig the ball out from under his feet to slide it past Lodigin.
Piszczek turned villain in the 69th minute when he was adjudged, somewhat harshly, to have fouled Viktor Faitzulin in the box, and Hulk made no mistake from the spot.
But again Dortmund made an immediate response, as Lewandowski netted from a narrow angle having been played in by Reus.
It was no less than the visitors deserved and Jurgen Klopp's men will be confident of taking another step towards emulating last year's heroics when the tie heads back to Germany next month.