ORCHARD PARK, N.Y. -- LeSean McCoy scored twice and safety Aaron Williams returned a botched field-goal snap 53 yards for a touchdown in leading the Buffalo Bills to a 33-18 win over the Arizona Cardinals on Sunday.
Quarterback Tyrod Taylor also scored on a 20-yard run at a time the Rex Ryan-coached Bills spent the past week taking the brunt of criticism after opening the season 0-2.
The win also came on the heels of Ryan firing offensive coordinator Greg Roman and replacing him with running backs coach Anthony Lynn.
McCoy scored on 24- and 5-yard runs, and finished with 110 yards rushing after combining for just 117 in his first two games. Taylor had 76 yards rushing, including a 49-yarder, the longest by a quarterback in team history.
Ryan's defense also bounced back after allowing 493 yards in 37-31 loss to the New York Jets on Sept. 15. The Bills limited Arizona to 348 yards and intercepted Carson Palmer on each of Arizona's final four possessions.
Stephon Gilmore had two interceptions.
Arizona (1-2) unraveled a week after a 40-7 win over Tampa Bay, and had a five-game road winning streak snapped going back to last season.
The Cardinals combined for just 2 yards net offense and no first downs on their first five possessions. Palmer finished 26 of 50 for 264 yards and was sacked five times.
David Johnson scored on 4- and 22-yard runs for Arizona.
The Bills took control in building a 30-7 lead on Williams' fumble return with 2:25 left in the third quarter.
With Chandler Catanzaro lining up to attempt a 32-yard field goal, Kameron Canaday's snap sailed high and through the hands of holder Drew Butler. Catanzaro missed in an attempt to fall on the ball, and the ball squirted loose. Catanzaro missed a last-minute field goal in the opener against New England because of a poor snap.
Trailing 30-16 midway through the fourth quarter, the Cardinals had a golden opportunity slip through their fingers.
Safety Tyrann Mathieu batted down quarterback Tyrod Taylor's backward pitch intended for Robert Woods for a fumble. Mathieu failed twice attempting to scoop up the ball and instead kicked it out of bounds into the Cardinals sideline.
The Bills' defense then secured the victory on Arizona's next possession, when Gilmore intercepted Palmer's pass up the left sideline intended for John Brown. The turnover led to Buffalo putting the game away with Dan Carpenter hitting a 45-yard field goal.
Catanzaro was forced to take over the punting duties after Drew Butler hurt his left ankle on the final play of the first quarter. Backed up in his own end zone, Catanzaro's first punt traveled 47 yards.
He then shanked his next punt early in the third quarter. It traveled just 19 yards and bounced out of bounds at the Cardinals 47.
Catanzaro did hit a 60-yard field goal , the longest in a Bills home game. The previous record was Bills kicker Steve Christie hitting a 59-yarder in 1993.
Larry Fitzgerald finally made a catch in Orchard Park.
The Cardinals receiver extended the NFL's longest active reception streak to 182 consecutive games with a 3-yard catch on a crossing pattern midway through the first quarter. Fitzgerald's streak began during his rookie season and after he failed to make a catch in a 38-14 loss at the Bills on Oct. 31, 2004. It stands as the only game of his career he's not had a reception. He finished with seven catches for 60 yards.
Injuries continue to hamper the Bills, who were down three starters. And that doesn't include starting defensive tackle Marcell Dareus, who is suspended for the first four games of the season for violating the NFL's substance abuse policy, or defensive end Shaq Lawson (offseason shoulder surgery) and linebacker Reggie Ragland (torn knee in training camp).
Watkins has been bothered by a sore left foot he had surgically repaired in April. He then aggravated the injury when a teammate stepped on his foot during a walk-through last week. Also out were cornerback Ronald Darby (hamstring) and left tackle Cordy Glenn, who missed his second consecutive game after aggravating an injury to his left ankle.