Harden (3-2) made his longest start since July 16 in an injury-shortened season, surrendering five hits with two walks while striking out eight as the A's won for third straight time.
Andrew Bailey tossed a scoreless ninth to collect his 14th save.
Willingham's two-run blast in the sixth wiped out a 1-0 deficit and Kurt Suzuki also homered for the A's.
Toronto's Brett Cecil (4-5) allowed three runs on four hits over seven frames to absorb the loss.
Edwin Encarnacion clouted a solo shot for the Blue Jays, losers of four of their last six games.