Australia's Rohan Dennis (BMC) retained the overall race leader's yellow jersey after the longest stage of the race, a 228km ride from Anneyron to Sisteron.
Bouhanni (Cofidis), edged out Jonas Van Genechten (lotto-Soudal) and Luka Mezgec (Giant-Alpecin) by just over half a bike's length to follow up his win in Monday's second stage and claim a fifth win of the season.
The stage was always going to be one decided by a sprint finish but that did not dissuade Martijn Keizer (LottoNL-Jumbo) and Tosh Van der Sande (Lotto-Soudal) from grabbing some TV time with a break - their efforts ending with 12km to go.
A flurry of activity cosed out the race with Tim Wellens (Lotto-Soudal), Wilco Kelderman (LottoNL-Jumbo), Julian Alaphilippe (Etixx-Quick Step) and Vincenzo Nibali (Astana) all testing their legs before the sprint.
"It was really hard. It became very complicated at the end, because of the attacks in the last hill," Bouhanni said. "Without Julien Simon, it would have been impossible for me to win today because Tony Gallopin wouldn't have been caught. We brought him back thanks to Julien.
"Now we'll enter the second phase of the race, which is mountainous. Our leader is Dani Navarro."
The fifth stage will follow the 161km route from Digne-les-Bains to Pra-Loup that will also make up the 17th stage of the Tour de France in July. It contains five categorized climbs and a mountain top finish.
"Tomorrow I think there'll be a lot of… let say fresh legs for a fight for GC," Dennis said. "I'm not going to give it up without a fight but Tejay is our GC guy here. If he's comfortable, I'm going to bury myself for him. I hope he'll take if not the jersey the stage as well. I'll definitely help him."
Stage 4: 228km, Anneyron - Sisteron.
1 Nacer Bouhanni (FRA) Cofidis 5hr 30min 53sec
2 Jonas Vangenechten (BEL) IAM
3 Luka Mezgec (SLO) Giant-Alpecin
4 Edvald Boasson Hagen (NOR) MTN-Qhubeka
5 Aleksei Tsatevich (RUS) Katusha
6 Julian Alaphilippe (FRA) Etixx-QuickStep
7 Samuel Dumoulin (FRA) AG2R
8 Tiesj Benoot (BEL) Lotto-0Soudal
9 Kévin Reza (FRA) FDJ
10 Nathan Haas (AUS) Cannondale-Garmin
1 Rohan Dennis (AUS) BMC 13hr 31min 30sec
2 Tejay Van Garderen (USA) BMC
3 Andriy Grivko (UKR) Astana 0:00:04
4 Vincenzo Nibali (ITA) Astana
5 Lieuwe Westra (NED) Astana
6 Michele Scarponi (ITA) Astana
7 Rein Taaramae (EST) Astana
8 Gorka Izagirre (ESP) Movistar 0:00:05
9 Alejandro Valverde (ESP) Movistar
10 John Gadret (FRA) Movistar