I've implemented bitcoin accepting on my web service by generating many addresses on my local machine and uploading them to the database for associating with each new order. After that payment script just check the address balance every few minutes and delivers order if success. Is there a similar way to accept ether payments? (without using external services) Can I pregenerate many pairs (private key / address) and check balances with blockchain explorer? What problems has this approach? Is it easy to sweep all these account's ether into one? Thanks!
You can do something similar to what you're doing with Bitcoin, but with Ethereum. The simplest way may be to run your own Ethereum node (since you don't want to use external services). From here, you can generate an account/address on-demand. For example, you can do this from the
geth console using
[personal.newAccount("passphrase")] or with nethereum. You can then poll the account balances until the desired amount is received (you might want to use a back-off algorithm like this or simply put a deadline for payment receipt) and then do the rest of your backend stuff to fulfill the order. If you accept payments this way, you can easily send the received amount into a master account. The downside to this is, unless you have replication, if your backend system goes down, you might lose the private keys for the accounts you just created. Also, hot wallets are involved, so theft is made easier (but if someone can compromise the backend, they can just have payments sent to their own accounts, anyway).
You can avoid this by pre-generating a set of accounts, as you suggested, using an automated method as described above. You are still able to check the balances of the accounts for payment purposes, but you won't be able to sweep the ether automatically. Instead of using a plain account, you could potentially create a contract to do that automatically, but would need to spend more gas (either you or your clients). If you use this method, you don't need to run your own node and can use something like a public blockchain explorer. The downside is you now need to trust the explorer to a) not give you false data, b) maintain good uptime, and c) not change their API all of a sudden.