If a card was saved to Stripe before it expired, it sometimes can continue to be charged after its expiration date has passed. The decision to allow the charge to go through is entirely up to the issuing bank, and they often sometimes let these charges succeed to avoid unnecessary disruptions for the customer (who may be using the card for recurring charges/subscriptions and they haven’t gotten a chance to update it yet).
In the event that a charge is declined with the expired_card
decline code, this does not necessarily mean that the expiration date tied to the card has passed. It can also mean that the card in question was reported lost/has been replaced, so the issuer is rejecting all charges made with the old card number (since they expect all charges to be made with the new card they sent as a replacement).
If a customer is getting an expired_card
decline code with what they believe is a valid card, they should contact the card issuer.