...
private ControllerColliderHit _contact;  
...

        bool hitGround = false;
        RaycastHit hit;
        if (_vertSpeed < 0 &&
            Physics.Raycast(transform.position, Vector3.down, out hit)) {
            float check =                                        
                (_charController.height + _charController.radius) / 1.9f;
            hitGround = hit.distance <= check;
        }

        if (hitGround) {                    
            if (Input.GetButtonDown("Jump")) {
                _vertSpeed = jumpSpeed;
            } else {
                _vertSpeed = minFall;
            }
        } else {
            _vertSpeed += gravity * 5 * Time.deltaTime;
            if (_vertSpeed < terminalVelocity) {
                _vertSpeed = terminalVelocity;
            }

            if (_charController.isGrounded) {         
                if (Vector3.Dot(movement, _contact.normal) < 0) {   
                    movement = _contact.normal * moveSpeed;
                } else {
                    movement += _contact.normal * moveSpeed;
                }
            }
        }
        movement.y = _vertSpeed;

        movement *= Time.deltaTime;
        _charController.Move(movement);
    }

    void OnControllerColliderHit(ControllerColliderHit hit) {   
        _contact = hit;
    }
}
