An own goal from Michael Parensen had given the hosts the lead just before half-time, but Steven Skrzybski scored with a stunning touch moments after coming on to send the game in extra time.
Neither side could find a winner in the extra 30 minutes, allowing Weidenfeller to take central stage. He saved Union’s first two penalties, and Dortmund scored each of their three, before Philipp Hosiner hit the bar to end the shootout.
Dortmund will play the other team from Berlin, Hertha BSC, in the last 16.
Six changes apiece
Both Thomas Tuchel and Jens Keller took the chance to rotate their squads, with six changes each from their respective league games at the weekend.
The headline picks for Tuchel were giving Nuri Sahin a first start of the season and handing a debut to 18-year-old Danish winger Jacob Bruun Larsen. Weidenfeller remained in goal, with Roman Bürki rested for the Pokal games.
Damir Kreilach and Skrzybski, scorers against Erzgebirge Aue on Sunday, were left out of the Union team, although the players coming in included captain Felix Kross, who missed that game with muscular problems.
They players were left to wait an extra 15 minutes though, after attempts by Union fans to storm the entrance caused serious delays.
Larsen assists own goal on debut
Unsurprisingly Dortmund saw more of the ball, although good defending from the visitors limited their clear cut opportunities. Adrián Ramos gave an easy chance for Daniel Mesenhöler to save, with Mario Götze had a shot deflected out off of Toni Leistner.
Union did look to take the game to Dortmund though when they had the chance, but they were just lacking the crucial final ball. The closest they came was when a poor back-pass from Felix Passlack almost presented the ball to Collin Quaner, but Weidenfeller came out to sweep away the ball.
Dortmund though started to get closer themselves later in the half, with two excellent saves from Mesenhöler. First Götze tested him with an excellent strike from the edge of the box, which he sent wide, before having to make a two-handed save to keeper out a Sahin shot from even further out.
They took the lead in the minute before half time with an excellently worked goal. Gonzalo Castro found Götze, who passed to Larsen on the right. At first it looked like he had shot straight into the net for a goal on his debut, but it had in fact taken a vital deflection of Parensen.
Skrzybski stars again for Union
After the start of the second half was delayed by a pyro display in the away end, Dortmund toiled to break down Union’s sturdy defence, unable to create any clear chances. Larson shot wide from an offside position, whilst Emre Mor was trying more than most to make something happen, without any luck.
Eroll Zejnullahu meanwhile shot wide at the other end early in the half, but they would go on to have a goal disallowed. Kristian Pedersen beat Weidenfeller with his cross to Roberto Puncec, but Pedersen had clearly moved too early and was rightly given offside.
With ten minutes left, Skrzybski was introduced. A Kroos corner was headed out by Julian Weigl, but Skrzybski picked it up on the corner of the box, and fired through the backed box to beat Weidenfeller.
Mor was the brightest of Dortmund’s players still, and he came closest to sparing them from extra time. A fantastic run into the box was followed by the shot, which hit the post via the slightest touches from Mesenhöler. With the Turk the main creator, Dortmund kept trying, but extra time it would be.
Union unable to Weidenfeller in the shootout
Extra time ran its predictable course. In the first period, Dortmund had to make do with a Götze free-kick, which went well over the bar, and Mesenhöler denied Ramos, but at the other end Weidenfeller was almost the villain. Coming out of his goal, he was rounded by Skrzybski, but he couldn’t get a shot away and Zejnullahu ended up taking it out of touch.
Castro hadn’t had much luck in front of goal but he was getting closer. In the second period of extra time he was just over the bar with a shot, whilst at the other end Mesenhöler took a botched save before Ramos could make him pay.
So it went to penalties. It couldn’t have gone any better. In front of the Yellow Wll, Ousmane Dembélé put them in the lead, before Weidenfeller guessed the right way with Kroos’s spot kick. Matthias Ginter put them further ahead, before Weidenfeller saved again, this time from Stehan Fürnster.
Götze scored Dortmund’s third penalty in succession, leaving Hosiner with little choice but to score. However he smashed his penalty into the crossbar, and Union’s Pokal dreams were over just like that.