You're going to want to make your collision checks continuous on your rigidbodies. You'll also want to probably put your collision for the spikes in "OnCollisionStay" instead of "OnCollisionEnter" because inorder to take damage again on the spikes you have to move. You're also definitely going to want to add "coyote time" on your jumping, because if you're not jumping perfectly while grounded then you don't jump at all. You want to give your players a little bit of leeway while jumping off of a platform.
So your script probably looks like
if(keydown && isGrounded)
{
jump();
}
But you want it so that you can jump for 0.3 of a second even after the groundcheck is false.