tables for different sources of payments
I normally go with modified version of (2). 

payment_type (payment_type_id, PK(payment_type_id) );
payments(payment_id , payment_type_id, [other_attrubutes],
  PK(payment_id), UNIQUE(payment_id,payment_type_id), FK(payment_type_id) 
);

paypal_payment(payment_id , payment_type_id, [paypal_attributes], 
 PK(payment_id), FK(payment_id , 
payment_type_id)   REFERENCES payments(payment_type_id,payment_type), 
 CHECK  (payment_type_id='paypal')
)
manual_payment(payment_id , payment_type, [manual_attributes], 
 PK(payment_id), FK(payment_id , 
payment_type_id)   REFERENCES payments(payment_type_id,payment_type), 
 CHECK  (payment_type_id='manual')
)


Check constraints on each detail table ensures that manual table details never go into paypal table, and vice versa. Unique constraint allows detail tables to have a reference to 2 columns.

(3) is also not so bad, but I don't like exclusive arcs - adding new payment type will require changes to payments, and trigger used to enforce that only one of columns is not null.