Les Bleus looked set to win after Alexandre Lacazette scored a brace, with Timo Werner having equalised for the hosts in between.
However Stindl turned in a flick from fellow-substitute Mario Götze deep into stoppage time to snatch a draw.
Lacazette scores as French pressure tells
Both Joachim Löw and Didier Deschamps continued their preparations for next year’s FIFA World Cup in Russia, where their sides will be amongst the favourites, by shuffling their packs from respective matches against England and Wales on Friday. Löw changed six with only Mats Hummels and the front four keeping their places for Germany, with Deschamps making five alterations, as Anthony Martial and Lacazette in a front three alongside Kylian Mbappé.
Neither side was willing to sit back early on. Germany had the first chance, with a Mesut Özil shot saved by Steve Mandanda – although it would have been disallowed with Werner offside – however France quickly rattled up the shots. After efforts from Lucas Digne and Blaise Matuidi, Lacazette came the closest, having his shot sent wide by Kevin Trapp after a good run forward.
Germany were second best, and Özil had another chance blocked, this time by Samuel Umtiti. France then broke on the counter, with Martial blocked on the edge of the box and Mbappé given offside as he fired over. The Paris Saint-Germain striker then had another big chance though, denied at close range by club mate Trapp.
A French goal was no surprise when it came. A diagonal ball from Matuidi found Digne on the left. He passed to Martial, who left Nikas Süle for dead before setting up Lacazette who, from behind Trapp, had a simple tap in. A scrumptious goal.
The hosts responded well, with two chances for Werner. Firstly, he tried to get the ball past Mandanda with a dummy after a ball from Julian Draxler, however Raphäel Varnae got to back to clear. He had an even better chance shortly after, but again Varane denied him with a well-timed challenge. Werner could get a shot away in the end, but it was easily saved by Mandanda.
It could then have been 2-0 before half-time after Özil gave the ball away, however Mbappé could only shoot wide.
Stindl denies a French win at the very death
Despite that late chance for Mbappé, the world champions had regained momentum by the end of the half and they continued to build it up after the resumption. The best chance of the opening ten minutes fell to Antonio Rüdiger, the Chelsea defender getting forward regularly after coming on for Mats Hummels, but after he was found by Draxler he put wide, a case of the wrong man in the right position.
They got the equaliser they craved a few minutes letter. Ilkay Gündogan disposed Adrien Rabiot, allowing Özil to break. He found Werner, who timed his run perfectly, with a peach of a pass, and the striker scored through the legs of Mandanda, his seventh goal for Die Mannschaft.
Just moments before France would regain the lead, Toni Kroos came millimetres away from putting the hosts in front instead. Draxler had drawn a foul from Lacazette, and the Real Madrid man stepped up to put the resulting free-kick into the bar. Mandanda got a touch before Werner tried to head in the rebound, but he failed to come close.
The second French goal, much like the one before, was a well-worked effort. Corentin Tolisso, now based in Germany with Bayern Munich, found Mbappé who passed through to Lacazette. The Arsenal man’s finish was similar to Werner’s 15 minutes earlier, slotting coolly through the legs of the keeper, Trapp.
The game began to peter out in the last 20 minutes, with a pitch invader giving the fan something to cheer in the final moments. However Germany were still to have the final say. Özil again was involved, picking out a pass to Götze, playing his first international for a year. His flick found another substitute in Stindl, who put it into the back of the net to seal a draw with the last meaningful kick of the game.