It seems to me that part of the difficulty here is in choosing a good descriptive name that encompasses everything that a method does. The problem naturally is that sometimes you have a lot of complicated logic that you can't easily describe with a simple name.
In the case posed in your code example, I'd be tempted to simplify the name of the method itself to something a little more generalized:
Receipt Transaction(long amount, long cardNumber)
{
buy(amount);
accumulatePoints(cardNumber);
return generateReceipt();
}
So what about this logic problem I mentioned? That itself boils down to whether or not your method is very fixed in what it does. If it is only possible to complete the transaction using the Buy->Points->Receipt sequence, then a simpler name works, but so does the more descriptive name, and a fluent interface may be a reasonable alternative.
What about those cases where the customer doesn't have a rewards card, or doesn't wish to have a receipt? What about those situations where several items might be purchased in a single transaction - assuming of course that the buy method might represent a purchase item and not simply a total that was calculated elsewhere? Once you start introducing questions/choices into the sequence, the design becomes a little less obvious and the naming a lot harder. You certainly wouldn't want to use a crazy long name like:
BuyAndAddPointsIfTheCustomerHasACardAndReturnAReceiptIfTheCustomerAsksForIt(...)
Sure, it tells you exactly what it does, but it also highlights a potential problem in that the method is possibly responsible for too many things, or that it might be hiding a more complex code smell behind one of the methods that it calls. Likewise a simple method name like "Transaction" could be oversimplifying a complex problem that needs to be better understood.
A fluent interface can be of great benefit here provided it guides the developer to make sensible decisions about how to apply the fluent methods being called. If the calling sequence is important, you need to restrict the return types to the next choices in the sequence. If the calling sequence is less important, then you can use a return type with a more generalized interface that allows a selection of methods to be called in any sequence.
As to whether or not to use a fluent interface at all, I don't think it should be decided merely as a means to decompose difficult to name methods. You are making a design choice that you are going to need to live with for the lifetime of the product, and from a maintenance perspective, I've found that fluent interfaces can make the design more difficult to visualize and to organize and maintain in your code. Ultimately you need to decide if this is something you can live with as a trade-off against the benefits it gives you. For me, I usually start by asking if the use-case combinations are fixed and simple, or if they are relatively endless. If the latter, a fluent interface may help to keep your code cleaner and easier to use in multiple scenarios. I would also consider whether the code belongs to a more generalized layer such as an API for example where a fluent interface may work nicely, or something more specialized.