Circulation problems are not just a generalization of max-flow, there is a reduction backwards as well. Suppose we have some directed graph $G = (V, E)$ with edge costs and capacities.
Any edge $u to v$ in $G$ with we can replace with two nodes $s, t$ and two edges $s to v$ and $u to t$ where one of the edges has the original cost/capacities and the other is free and unlimited. Call this graph $G'(e)$, where $e = uto v$ is the edge that was replaced.
Then if a flow with a certain cost exists in $G'(cdot)$, it must also exist as a circulation in $G$ with the same cost. Vice versa, if a circulation exists in $G$ and it uses edge $u to v$, then that flow also exists in $G'(uto v)$ with the same cost.
Therefore to solve the circulation problem we can pick an arbitrary edge $e$, calculate $G'(e)$ and use a traditional network flow algorithm to find the optimal flow. By the traditional arguments, this optimal flow is integral. We then pick another edge (avoiding edges that were part of a previous optimal flow) and repeat, keeping the best solution, until no more unknown edges are left.
Since in the worst case this adds a factor of $|E|$ to the complexity of the polynomial complexity, this is still polynomial. And of course the optimum from all integral flows found is itself integral.