I wrote a small sample showing how one can accepts cycles donation from ICP users.
It showcases that the frontend code is free to create any identities and call into the ledger canister.
The current limitation is that the canister itself has no idea of how many cycles it has received from the user. Although the frontend can perhaps calculate it, the backend canister still cannot verify such claims with a proof. So it is only suitable for accepting donations, not payments.