Happ (5-3) struck out 10 while pitching two-hit ball. The left-hander also singled twice and walked in his first multihit game since 2011, when he had two hits for Houston at Citi Field.
Toronto was 0-12 against the Mets in New York, the longest such skid against one team in interleague history, according to the Elias Sports Bureau.
New York's Brandon Nimmo homered off Danny Barnes with two outs in the ninth and Wilmer Flores added a double before Barnes finished Toronto's four-hitter.
Justin Smoak, Teoscar Hernandez and Richard Urena each homered and drove in three runs as Toronto piled up 15 hits. The Blue Jays improved to 22-21 and haven't fallen below .500 since being 1-2 on March 31.
Toronto had averaged 2.8 runs over its past 11 games, batting .211 with a .630 OPS while going 3-8.
Smoak sparked the breakout performance by smashing a homer to right off Zack Wheeler (2-3) in the first inning. Wheeler was otherwise sharp early on, striking out six prior to a brief rain delay during the bottom of the third inning.
A steady drizzle fell throughout, but the rain picked up in the middle of the third. Moments after Wheeler's bat slipped from his hands and nearly hit first base coach Ruben Amaro Jr., umpires asked the grounds crew to rake the field.
Blue Jays players returned to the dugout during the roughly 15-minute break, and SNY reported the Mets used between 80 and 100 bags of Diamond Dry in that stretch alone. The crew returned to the field with rakes and shovels regularly throughout the game.
Wheeler fell apart after the delay. Hernandez put Toronto up 3-0 with a two-run shot in the fourth, and then Smoak ripped a two-run double during a three-run fifth inning.
Wheeler was charged with six runs in four-plus innings, bringing his ERA to 5.92.
Toronto continued to pound away against New York's bullpen, including three runs off AJ Ramos in the sixth inning. The Blue Jays sent 24 batters to the plate over the fourth, fifth and sixth innings, getting eight runs, nine hits and four walks in that span. By comparison, New York batted 26 players in the first eight innings.
CESPEDES TO DL
New York placed outfielder Yoenis Cespedes on the 10-day disabled list with a strained right hip flexor, retroactive to Monday. Cespedes spent about a week trying to play through his latest lower-body injury before getting an MRI on Tuesday, which revealed the strain.
It is Cespedes' fourth DL stint for a leg injury in the past three seasons, despite an offseason focus on better caring for his lower half. Manager Mickey Callaway said Cespedes has done ''everything we asked of him'' this year to keep his legs healthy. The 32-year-old was limited to 81 games last season due to leg injuries after signing a $110 million, four-year contract in November 2016.
Phillip Evans was recalled from Triple-A Las Vegas and started in left field. Evans said he arrived in New York at 6:30 a.m., 6 1/2 hours before first pitch. He struck out three times.
Mets reliever Buddy Baumann batted in the eighth inning for the 17th plate appearance for New York's bullpen this season. It had 18 total last year.
Toronto prospect Vladimir Guerrero Jr. had four hits for Double-A New Hampshire on Wednesday. The 19-year-old is batting .415 with seven homers in 35 games with the Fisher Cats.
Toronto recalled right-hander Danny Barnes from Triple-A Buffalo and optioned right-hander Deck McGuire to its top farm club.
Mets: Callaway would not commit to activating INF Todd Frazier (strained left hamstring) from the DL when he is eligible Friday, saying the team was taking his recovery day to day.
Blue Jays: Host Oakland on Thursday, with RHP Aaron Sanchez (2-3, 4.08 ERA) opposing A's RHP Andrew Triggs (3-1, 5.31).
Mets: New York gets Thursday off before beginning a stretch of 18 games in 17 days. RHP Jacob deGrom (3-0, 1.83 ERA) starts Friday at home against Arizona RHP Zack Godley (4-2, 4.08 ERA).
More AP baseball: https://apnews.com/MLBbaseball