The Russian outfit completed the signing of the Belgium international on Monday evening and have handed him the number 28 shirt.
The transfer fee Zenit had to pay Benfica was Witsel's €40m (£31.7m) release clause, the Portuguese giants confirmed on their official website.
"It's now official," Zenit spokesman Dmitry Tsimmerman is quoted as saying by Reuters. "Both players had signed five-year deals.
"We were trying to sign them before the September 3 deadline for the Champions League so they can play for us in that competition as well as in the Russian league."
Zenit have been drawn against AC Milan, Anderlecht and Malaga in Group C of the Champions League.