Accept payments on someone else's behalf without being able to spend them
This is entirely possible with an optional additon to Bitcoin called BIP32. Unfortunately, BIP32 is not implemented by the standard client, but there are other clients that do implement it.


Ask your customer to download the latest version of Electrum, then have them give you their extended public key.

(As I said above, there are multiple clients that can do this, I'm just most familiar with Electrum.)
Include this code in your BitcoinJ application:

String serialized_xpub = "xpub.....";
unsigned int address_num = 4;
NetworkParameters params = MainNetParams.get();
DeterministicKey root_xpub = DeterministicKey.deserializeB58(null, serialized_xpub, params);

// Derive m/0/&lt;n&gt;, Electrum's BIP32 path
DeterministicKey receiving = HDKeyDerivation.deriveChildKey(root_xpub, new ChildNumber(0, false));
DeterministicKey new_address_key = HDKeyDerivation.deriveChildKey(receiving, new ChildNumber(address_num, false));
String new_address = new_address_key.toAddress().toString();


You will generate the same address as long as you use the same xpub and address_num. Make sure that you don't skip five or more addresses, though. If you do end up doing this, then your customer can generate addresses until they see the new payments.

Also, note that you don't have the private key for this address. If your customer loses their wallet, those coins are gone.
Put that address on the invoice.
The money will show up in their wallet. 


Best of luck with your application!