Please note that sharing your code is not allowed. I am deleting it after this reply.
For Z[i,h,w,c], you have to call conv_single_step function with proper arguments. No need to use sum or multiply.
Also, your weights implementation is wrong. It should be [everything, everything, everything, that one]. In Python, for everything, we use : and for that one, I mean that loop (for example, c).
Moreover, your vert_start, vert_end , horiz_start, and horiz_end are wrong. You forget the stride factor.
maybe this guide helps you further.
Best,
Saif.