How to best structure Internal bitcoin payments within a webapp?
The Block.io api supports accounts for similar usage.

With Block.io, you can create wallet addresses for users inside your games, auction sites, stores, etc.
To create a user's wallet on your account, create addresses for them using get_new_address. You should specify a sequence of labels for that user. For instance, if we wish to create a number of addresses for User A, we'd want to call get_new_address with label=userAx{address_number} as many times as wish to create a new address for User A.
Once we have addresses for User A, we can query balances for their addresses, and send coins on the user's behalf.