After the German hosts sat deep to frustrate Barca in the first half, Alexis Sanchez’s first Champions League goal, scored in the 41st minute, separated the teams at the break.
But Leverkusen came out with a much more positive outlook after the break, levelling through Michal Kadlec and then having several chances before Sanchez’s second and a late Lionel Messi strike gave Barca victory.
Messi was the provider for the opening goal, flicking a pass over the defence for Alexis to race through and slip the ball through the legs of Bernd Leno and into the bottom corner.
Leverkusen were level in the 52nd minute as Vedran Corluka crossed for Kadlec to head in.
But parity lasted only four minutes before Alexis got his second, latching on to a wonderful threaded ball from Fabregas to round the goalkeeper and finish.
Leverkusen had a great chance to level in the 64th minute when Gonzalo Castro raced onto the ball and powered a low shot at goal, but Valdes used fingertips to push it onto the post.
Messi was the next to find the woodwork, racing in from the right wing and then dinking a shot over the onrushing Leno from a tight angle, only to see it come back off the upright.
But Barca got what could be a killer third goal two minutes from time, with Messi the creator and finisher as he slipped Dani Alves through and the Brazilian selflessly squared for the Argentinian to find the net.
BAYER LEVERKUSEN: Leno, Corluka (Da Costa 90), Schwaab, Friedrich, Kadlec, Reinartz, Rolfes (Kiessling 77), Bender, Castro, Schurrle (Bellarabi 90), Renato Augusto.
BARCELONA: Valdes, Dani Alves, Mascherano, Puyol, Abidal, Fabregas, Busquets, Iniesta (Thiago 60), Sanchez (Cuenca 85), Messi, Adriano (Pedro 69).
Referee: Craig Thomson (Scotland).