As I said, the subproblem should generate an optimality cut only if the value of the surrogate variable is wrong. Let's say that you have a minimization problem with variables x in the master and y in the subproblem, and original objective function c'x + d'y. With Benders, you will minimize c'x + z in the master and d'y in the subproblem, where z is a new variable that represents the d'y term. When CPLEX finds what it thinks is an incumbent (x*, z*), it will send that solution to the callback, where you solve for y. Call the solution y*. If d'y* > z*, then z* is too small. Even if x* is okay, (x*, z*) is not a feasible solution to the master, and you add an optimality cut forcing z to be larger when x = x*. Eventually, CPLEX will find a solution where z* = d'y*. When that happens, you callback should not (must not) generate a cut.
If your callback is generating optimality cuts even when x* is integer-feasible and z* = d'y*, then your code is wrong.
#CPLEXOptimizers#DecisionOptimization