Hola TrendyTim,
The 'problem' that we're running into with the credit cards isn't so much whether or not it is PCI compliant to store the expiration dates, because we know we can if we 'follow the rules' and dont store the full credit card number as well.
Where we're kind of stuck is that we have no way to actually 'get' the expiration date to begin with when we're using an AuthNet hosted API.
Sure, we can ask the customer for the expiration date of their cards in a separate form on our site.. but that would mean explaining to them why they have to provide that information twice (once when they fill out the actual purchase form on AuthNet's site, and again when we ask them for the expiration date on our site).
There are two reasons we actually need the expiration date.
1. So we can be sure not to let a customer, who is using the CIM system for payments, use an expired credit card.
2. So we can send the customer a message to let them know they need to update their payment details when a card expires, and/or warn them that a card is about to expire.
Without the actual expiration date within our own records, or even some alternate response from AuthNet when an expired card is discovered, there is no way to do either of those things.
With the alternative being the additional form a customer would have to fill out to tell us the expiration dates on their CIM stored credit card, even that has it's potential problems.
Even if a customer did fill out a form like that, and told us that their card expires 2011-08.. then we send them a 'reminder' to update their credit card information on the CIM - we stil have no way to verify that they actually did update the information, because all we get back from AuthNet is XXXX.
I've made the suggestion for a minor change in that. AuthNet would still be following their own understanding of how PCI needs them to treat expiration dates, and we would all have something we could actually USE to keep customers from using expired cards.
The answer: If the card isn't expired, continue to send 'XXXX' as the value of the expirationDate
It the card is expired, send 'EXPD' or 'NNNN' or anything other than 'XXXX' as the value of expirationDate.
The expiration date would still be masked.. the system would still not send the actual expiration date.. we have something we can actually use. Seems simple enough to me :)