When attempting to cancel a service or setting, "cancel" is the default action. What should the normal "cancel" button be called?
Redbox uses a playful "just kidding", which may not be appropriate in all circumstances.
Here's what Facebook does when cancelling a payment subscription (Facebook subscription API).
There's no reliance on Yes/No. There's no misleading use of the word cancel. Clear explanation and buttons that clearly define the impending action.
Then they clearly confirm what just happened.
Skype on the other hand shows what not to do. Much confusion!
Edit: Microsoft have since changed Skype's Cancel button to say Close. It's a pretty lazy effort at improving the situation, but at least it doesn't say Cancel any more!
Name the buttons for what they do. If the default is "cancel", then cancel the cancel should be something simple like "Don't cancel".
I know that it's not ideal to use the word 'cancel' in both of them, but it's the clearest option in this unique situation, and clarity is far more important.
Edit: Some good suggestions from the comments below are to specify what it is that you are cancelling, and to use a term that doesn't include the word cancel - such as "Keep Subscription".
I would try my very, very best to avoid using the term 'cancel' for terminating the subscription. Cancel is generally considered to be a safe action. Here, you are using it in a more destructive sense, thus causing the confusion you noticed.
If you manage to avoid the term 'cancel' for the actual activity, you can resume to use it for the cancel action on the dialog. In the mockup below, I used "Unsubscribe", but you can also consider other ways to express this like "terminate", "end", "remove" or "stop" subscription.
Alternatively, you could consider getting rid of the confirmation message completely. Instead, you could display something like this:
You could then also send the users a message by email saying essentially the same thing, and also allowing them to change their mind for a limited time.
Avoid generic defaults (Cancel/Ok, Yes/No): label the buttons with what they actually do!
Pretend users do not like to read the dialog-text and with luck perhaps 5 or 7 syllables per button. Be short, be clear, use positive imperatives. Avoid negation like "do not cancel my unsubscription" or "don't cancel". Place visual highlight on the option that the user requested, as it is done by UX itself (compare Save Edits and Cancel).
Explanation Other answers already questioned the usefulness of this dialog in the first place, since your question specifically ask for the button text I will forgo this discussion and just point out that offering an undo is often a better option than a confirmation dialog.
My observation is that people often scan or quick-read instead of really studying the text on screen. This is also discussed in this UX thread Should alert boxes be avoided at any cost? Minor and not so minor details are often overlooked, such as a little "not".
Apart from just overlooking the little words on screen, it has been shown that negative statements are notoriously difficult to understand. For examples senior citizen have trouble when medicine comes with instructions as of what not to do, children are bound to do what you tell them not to do, or see the Debunking Handbook why you should not repeat what not to say.
Generic Yes/No buttons can become very confusing, when considering questions such as "Don't you have password?" As you observed a similar reasoning holds for Cancel and Ok buttons.
Finally consider that your audience might have their attention reduced, so keep the button text short, clear and simple. Consider someone stressed and tired: have mercy and be parsimonious with words. This may result in a certain tension between accurate and clear labels on one side and being short, sharp and simple on the other, here a certain finickiness is required to find the right words for a good compromise.
“I didn't have time to write a short letter, so I wrote a long one instead.” -- Mark Twain
I would like to propose a different approach to subscription cancellation.
Instead of confirming that they want to unsubscribe, assume that they were acting intentionally:
If the user doesn't click on any buttons on the dialog, they should be unsubscribed in an hour or five. If they dismiss the dialog with the "goodbye" or "(x)" buttons, they should also be unsubscribed in an hour or five.
If the user clicks on the "oops..." button, they should not be unsubscribed. This allows the user to make the fewest number of steps to unsubscribe from whatever service they're subscribed to.
More often than not I find myself having to sort out how to unsubscribe from annoying marketing emails, and it would be wonderful if I could spend less time confirming that "yes [insert service here]'s email is a spammy pile of junk and I no longer want to receive it"
The other important point to make, is that this is your opportunity to win people back. If someone's leaving because of a small bug that can be easily fixed, it's better to find out sooner rather than later.
I believe "Yes" and "No" buttons would be best, provided that the title of the window is clear. For example:
"Yes" and "No" buttons would be very clear in this case.
Why is this better than other options?
tl;dr Never use the word «Cancel».
Why is the word «Cancel» so problematic?? «Cancel» can be understood differently in different conceptual levels:
What happens when the two levels have contradicting, exactly opposite meanings? Examples:
Solution: Don't use the word «Cancel». Examples:
See https://ux.stackexchange.com/a/35844/28034, a very similar answer of mine.
You can use a less seen and most spoken "Forget It" or "Leave It"
An end user is always confused of buttons, whether OK, UPDATE, CLOSE, CANCEL etc. For example, if he goes to an "Edit Profile" page and sees a button cancel, he might think that he is going to cancel his account as such. So colloquial words would be more appropriate than conventional as far as websites are concerned.