Buffalo (2-8) scored 35 straight points in the second half to win going away.
Johnson made eight catches for 137 yards and Ryan Fitzpatrick went 21-for-34 passing for 316 yards, four touchdowns and two interceptions in the comeback victory.
Fred Jackson added a pair of rushing touchdowns, finishing with 116 yards on 21 carries.
The Bills also scored when Drayton Florence returned a Cedric Benson fumble 27 yards for a touchdown.
Carson Palmer compiled 230 yards, tossing two touchdowns and yielding two interceptions for the Bengals (2-8), who dropped their seventh straight.
Benson carried the ball 25 times for 124 yards and a score for Cincinnati.