Bott and Tu do this completely, in the de Rham theoretic setting of course.
Here's an alternate proof I have used when I teach this material, which I find slightly more clean and direct than using Thom classes in de Rham theory (which require choice of tubular neighborhood theorem, etc): and works over the integers.
Definition: Given a collection $S = \{W_i\}$ of submanifolds of a manifold $X$, define the smooth chain complex transverse to $S$, denoted ${C^S}_*(X)$, by using the subgroups of the singular chain groups in which the basis chains $\Delta^n \to X$ are smooth and transverse to all of the $W_i$.
Lemma: The inclusion ${C^S}_*(X) \to C_*(X)$ is a quasi-isomorophism, for any such collection $S$.
Now if $W \in S$ then "count of intersection with $W$" gives a perfectly well-defined element $\tau_W$ of ${\rm Hom}(C^S_*(X), A)$ and thus by this quasi-isomorphism a well-defined cocycle if the $W$ is proper and has no boundary. It is immediate that this cocycle evaluates on cycles which are represented by closed submanifolds through intersection count.
There are two approaches to show that cup product agrees with intersection on cohomology. Briefly, one is to take $W, V$ over $M$ and consider the special case of $W \times M$ and $M \times V$ over $M \times M$. There some work with the K"unneth theorem leads to direct analysis in this case. But this case is "universal" - cup products in $M$ are pulled back from ``external'' cup products over $M \times M$. A second proof given in https://arxiv.org/abs/2106.05986 uses a variant of the theory, where one fixes a triangulation or cubulation, and assumes $W, V$ transverse to those. There we explicitly see that these products do not agree at the cochain level (they can't since intersection is commutative, but non-commutativity of cup product is reflected in Steenrod operations), but Friedman, Medina and I show a vector field flow leads to a cobounding of the difference.