I want my canister to invoke plug wallet or so to transfer ICP to an account

I want my canister has functions of deposit and withdraw.
the withdraw function works quite well. But when comes to deposit, is that true I can only wait for the user to transfer to my canister themself and add the balance?
I want my canister invoke the wallet which users used(plug wallet), and and they just need to signed the transaction from the wallet, the accountIdentifier and the amount are dealt by my canister backend. just like the ether smart contract send(_from, _to, _amount).
I know the ledger.transfer function can only call by my canister to transfer from canister itself, not from anyone specific. what can i do