Have your customers shown you that they have money in their account, even though you're receiving an insufficient funds error?
To determine why the bank returned this code, the cardholder will need to contact their bank directly and ask about the specific charge -- for example, each bank's system for making funds available varies; it may be possible that the user had the correct amount of funds in their account, but these were pending rather than available. The only way to obtain additional context into this would be to speak to their bank directly and ask why they returned a insufficient funds code to Stripe.
In regards to the generic declines, collecting more card information may help with this! I've noticed that the more card details that are passed along to Stripe, the more likely a charge is to be successful because the bank has more to check against. As you are only checking CVC that is provided, I recommend collecting Cardholder Name and Zip as well!