I have a users table and a payments table, for each user, those of which have payments, may have multiple associated payments in the payments
There are two problems with your query:
INNER JOIN (SELECT ...) AS p ON .... Assuming there are no ties for payments.date, try:
SELECT u.*, p.*
FROM (
SELECT MAX(p.date) AS date, p.user_id
FROM payments AS p
GROUP BY p.user_id
) AS latestP
INNER JOIN users AS u ON latestP.user_id = u.id
INNER JOIN payments AS p ON p.user_id = u.id AND p.date = latestP.date
WHERE u.package = 1