> Seriously, what the heck? Is this normal for an employer to do?

No, this is *completely* unacceptable. Sure, the interview didn't work out, but screwing the candidate because of that is just so, so bad.

> Do I have any recourse against this employer?

As a legal question which is going to depend on your jurisdiction and that of the employer. You'd need to talk to an actual lawyer.

As others have commented, independent of the legal aspect, "naming and shaming" is an option. I would very rarely advocate that behaviour, but in this case I think it's worth making other candidates aware of the risk they take interviewing with this company. However:

1. Make at least a nominal attempt to reconcile things with the company first.
2. Stack Exchange is not the platform to name and shame on.

> The more I think about, the more I'm thinking I must have said something offensive to somebody in an interview. Is there any way to ask them what I said (so that I can avoid this mistake in the future)?

You can ask, at which point there are two possibilities:

1. This was actually a mistake and/or more sensible heads have prevailed at the company, in which case I'd hope they'd refund your expenses and the like.
2. They seriously meant to do this, in which case I doubt they'll answer.

I honestly cannot think of anything which would cause me to act in this way towards a candidate; there's plenty you could say which would cause me to terminate the interview on the spot and walk you out the door, but I'm not going to screw someone in a way which would reflect so negatively on the company for any future candidates.