issue in stripe connected account to bank transfer - stripe-payments

i have an issue in transfer.
my stripe connected account available bal is $200.00 and i have an transfer my $200.00 and pandding balance is $150.00 balance to my bank account.
to showing error insuficient funds in your stripe connected account
see my code:
\Stripe\Stripe::setApiKey($_REQUEST['secret_id']);
$transfer = \Stripe\Transfer::create(array(
"amount" => 20000,
"currency" => "usd",
"destination" => "default_for_currency",
"description" => $_REQUEST['description'],
"source_type" => "bank_account"
));
see output :
{
msg = "You have insufficient funds in your Stripe account for this transfer. Your ACH balance is too low. You can use the the /v1/balance endpoint to view your Stripe balance (for more details, see stripe.com/docs/api#balance).";
status = 0;
}
i need solution please.

Your account actually has more than one balance -- funds are split by payment source type.
If you send a balance retrieval request, you will get a result similar to this:
{
"available": [
{
"amount": 20000,
"currency": "usd",
"source_types": {
"card": 12000,
"bank_account": 8000
}
}
],
"livemode": false,
"object": "balance",
"pending": [
{
"amount": 0,
"currency": "usd",
"source_types": {
"card": 0,
"bank_account": 0
}
}
]
}
When you create a transfer, you should specify the source type via the source_type attribute. E.g. in PHP, you'd do something like this:
\Stripe\Transfer::create(array(
"amount" => 8000,
"currency" => "usd",
"destination" => "default_for_currency",
"source_type" => "bank_account"
));
On an unrelated note, it seems you're setting the API key via a client-side parameter:
\Stripe\Stripe::setApiKey($_REQUEST['secret_id']);
You should never share the secret API key with your client-side code. It would be very easy for an attacker to retrieve it and use it to issue API requests on your behalf. They'd be able to look at your transactions, delete saved customers, etc.

When any charge is succeeded in stripe, it takes some time to actually available it in stripe account.
If You want to create the transfer based on any amount collected by any charge, then you can directly use the charge id.
So your code should be like:
\Stripe\Stripe::setApiKey("your_secret_key");
$transfer = \Stripe\Transfer::create(array(
"amount" => 1000,
"currency" => "usd",
"source_transaction" => "{CHARGE_ID}",
"destination" => "{CONNECTED_STRIPE_ACCOUNT_ID}",
));
By using source_transaction, the transfer request succeeds regardless of your available balance and the transfer itself only occurs once the charge’s funds become available.
It is documented here

Related

How to list all the fees charged by Stripe via API for accounting purpose?

Unfortunately Stripe does not issue its own invoices for US accounts as per the following documentation:
https://support.stripe.com/questions/download-vat-or-gst-invoices-for-stripe-fees
Therefore it is harder to bulk reconcile processing fees and payouts in the US than in the EU.
Some accountants suggest to use the information summed up under Balances > Payouts > Payout (item)
It would indeed be convenient to collect the fees via the payout object however the API doesn't seem to include processing fees in:
https://stripe.com/docs/api/payouts
Here are some of the line items that our monthly Tax invoice contains in the EU:
Stripe Processing Fees
Refunded Fees
Dispute Fees
Dispute Fees Refunded
Chargeback Protection Stripe Fees
Radar Stripe Fees...
How to list all the fees charged by Stripe via API for accounting purpose?
The section about balance transactions contains all the relevant information. Furthermore all balance types are listed here.
Code example in php
$stripe = new \Stripe\StripeClient(
'sk_................'
);
try{
$transactions = $stripe->balanceTransactions->all(array(
'limit' => 100,
//'type' => 'stripe_fee',
));
}
catch(Stripe\Error\Base $e) {
//echo $e->getMessage();
}
Object Sample
{
"id": "txn_1AznDOBVdKJBvdqlJZmzAT6P",
"object": "balance_transaction",
"amount": 406,
"available_on": 1505433600,
"created": 1504879934,
"currency": "eur",
"description": null,
"exchange_rate": null,
"fee": 37,
"fee_details": [
{
"amount": 37,
"application": null,
"currency": "eur",
"description": "Stripe processing fees",
"type": "stripe_fee"
}
],
"net": 369,
"reporting_category": "charge",
"source": "ch_1AznDOBVdKJBvdqlKp5lunlU",
"status": "available",
"type": "charge"
}
Note
Webhooks can be setup for all the relevant datapoints in order to fetch balance information.
If the type is "stripe_fee" get the amount directly from the field "amount" otherwise from "fee" or "fee_details"
If connected accounts are used the process also requires to use the connected "account_ids" for fetching data.
References
https://stripe.com/docs/api/balance_transactions
https://stripe.com/docs/reports/balance-transaction-types#balance_related
https://www.reddit.com/r/stripe/comments/qcooyu/how_to_list_the_stripe_processing_fees_via_api/

BigCommerce API Webhook event payload with address created/updated is missing customer_id

From the WebHook documentation for a store/customer/address/updated/store/customer/address/created events should have following payload:
{
"scope": "store/customer/address/created",
"store_id": "1025646",
"data": {
"type": "customer",
"id": 60,
"address": {
"customer_id": 32
}
},
"hash": "416ca9c01779515de91824aa1cac9012ee691e7a",
"created_at": 1561481620,
"producer": "stores/{store_hash}"
}
However, in the logs we don't see the "address" part. The payload is always coming as:
{
created_at: 1573847377
data: {
id: 2246136
type: "customer"
}
hash: "%hash%"
producer: "%producer%"
scope: "store/customer/address/updated"
store_id: "%storeid%"
}
And the payload.data.id is not the customer id, as fetching customer by given ID always results in 404.
Fetching address with given id is also impossible, as the resource url should include customer_id which is absent in the response.
Contacted BigCommerce support already, but maybe someone had solved this issue already?
Saw relevant question in the BigCommerce's community, but it was also unanswered.
I have encountered a similar problem, and believe I have isolated the conditions under which it occurs.
I am building an app with MEAN stack that uses bigcommerce API/webhooks.
When I tried to create a customer address in-app, it makes an API request to BigCommerce and creates customer addresses in BigCommerce. Via the webhooks, I have implemented the store_customer_address_created hook event.
So there are two cases when the address webhook event is being triggered:
When the customer address is created in-app and it sends an address creation request via the API to BigCommerce.
When the customer address is directly created in the BigCommerce admin.
Here are the responses from those:
"scope": "store/customer/address/created",
"store_id": "1025646",
"data": {
"type": "customer",
"id": 60,
},
"hash": "416ca9c01779515de91824aa1cac9012ee691e7a",
"created_at": 1561481620,
"producer": "stores/{store_hash}"
}
{
"scope": "store/customer/address/created",
"store_id": "1025646",
"data": {
"type": "customer",
"id": 60,
"address": {
"customer_id": 32
}
},
"hash": "416ca9c01779515de91824aa1cac9012ee691e7a",
"created_at": 1561481620,
"producer": "stores/{store_hash}"
}
As you can see, the address field is not included when the customer address is being created by the API. I’m not sure if it is designed by the BigCommerce team, or a special case. But I think we can identify if the customer address is being created by the BigCommerce admin directly or via the API myself based on this distinction.
I believe you are encountering the first case on your end.
I hope this helps and please update me if you have any other opinions.
It is fairly strange to see this webhook response without the address field, and I haven't had any luck replicating this with scope for store/customer/address/updated. Are you working with any other code beyond this webhook or testing the webhook event specifically?

Does Stripe instant payout allow for an instant charge to payout?

I've been attempting to use Stripe Instant Payout to go from charge to a payout in "mere moments" as documented here : https://stripe.com/docs/connect/payouts#instant-payouts
This has proved to be confusing and difficult.
I currently have a Stripe account with a "Connect"ed Stripe profile. I create the charge for the Connect user, (which has an instant pay valid card) and then I create the payout. When I go to payout, using the method here, it fails, saying the balance isn't available.
Why is this? The balance is in pending, but the docs state "You can pay out an account’s available balance plus its pending balance"
#Newah when you place a charge to a Stripe Connect account that charge is not available for payout immediately. You can check when the charge will be available for payout using the balance transaction object https://stripe.com/docs/api/balance/balance_transaction. You can also get this when retrieving a charge by expanding the balance transaction.
{
"id": "txn_19XJJ02eZvKYlo2ClwuJ1rbA",
"object": "balance_transaction",
"amount": 999,
"available_on": 1483920000,
"created": 1483315442,
"currency": "usd",
"description": null,
"exchange_rate": null,
"fee": 59,
"fee_details": [
{
"amount": 59,
"application": null,
"currency": "usd",
"description": "Stripe processing fees",
"type": "stripe_fee"
}
],
"net": 940,
"source": "ch_19XJJ02eZvKYlo2CHfSUsSpl",
"status": "available",
"type": "charge"
}
The charge will be available for payout on the timestamp set in available_on.

Stripe testing subscription Lumen 5.1

Im running Stripe in test mode.
I've created a Yearly billing plan for 100GBP amount, with a 7 days trial ( directly onto Stripe dashboard. )
However, to test the webhooks i've hardcoded the trial_end:
$trialEnd = new DateTime();
$trialEnd->setTimestamp(time()+120);
$user = Users::find($this->user()['user_id']);
$user->subscription($stripe_plan['stripe_plan'])->trialFor($trialEnd)->create($data['stripeToken'], [
'email' => $this->user()['email']
]);
$user->save();
Basically all goes well, but into stripe dashboard the first invoice for 0 GBP is shown, and after one minute i get the Subscription will end in a minute event. After all, the subscription become Active ( from Trialing ) state.
All the webhooks and even the first subscription add reponse i get the trial ends period instead subscription ends.
How can i get the subscription_ends_at timestamp ?
All webhook requests are having the following timestamps:
{
"id": "evt_18baRrIzJLF7fe6PMDPYD0NM",
"object": "event",
"api_version": "2016-07-06",
"created": 1469558315,
"data": {
"object": {
"id": "sub_8tNBbqy0AmSk8p",
"object": "subscription",
"application_fee_percent": null,
"cancel_at_period_end": false,
"canceled_at": null,
"created": 1469558268,
"current_period_end": 1469558384,
"current_period_start": 1469558268,
"customer": "cus_8tNB1tWYw3Jw7L",
"discount": null,
"ended_at": null,
"livemode": false,
"metadata": {
},
"plan": {
"id": "yearly_200",
"object": "plan",
"amount": 20000,
"created": 1469545724,
"currency": "gbp",
"interval": "year",
"interval_count": 1,
"livemode": false,
"metadata": {
},
"name": "Full Club Membership - Pay Anually",
"statement_descriptor": "FULL MEMBERSHIP",
"trial_period_days": 7
},
"quantity": 1,
"start": 1469558268,
"status": "trialing",
"tax_percent": null,
"trial_end": 1469558384,
"trial_start": 1469558268
}
},
"livemode": false,
"pending_webhooks": 1,
"request": null,
"type": "customer.subscription.trial_will_end"
}
So if you look at trial_start and trial_end is same with current_period_start and current_period_end.
I've though initially that if this is the current period.. fine, but after trial expires the current period shouldn't be trials one.
There is any method to take the subscription_ends_at field from Stripe api ? And also, after the trial period ends, shouldn't send a invoice with the real amount ?
Also, i created a subscription plan with no trial period. That plan after a client subscribed, i get the correct timestamps.
Thanks in advance!
It looks like you figured it out. Basically, the delay comes from the fact that when the timestamp passes for your trial expiration, your request to create a new Invoice on that billing cycle gets added to a queue. Typically the queue will create the new invoice ~immediately, but it can sometimes go several minutes before triggering.
The first Invoice will always have timestamps for the current_period_* that map to the trial_period_* ones. Whereas, the second Invoice (that shows up with the invoice.created-event) will have the accurate timestamps for the billing period.
Oh, now i understand .. i will explain maybe will help someone :D.
Basically if a subscription got a trial period when you subscribe you will get a invoice for 0. Then, even if you set the trial to expire in 2 minutes with the request , the first payment will occur in about 10 minutes :D ( with that payment (if you set a webhook url) you will get a "type": "customer.subscription.updated" event who will contain all desired informations. At that time you can update your subscription_ends_at .
I didn't wait 10 minutes to see if the new invoice will be triggered.. and created -> removed -> recreated -> removed and so on for 4 hours with different tests.

Figure out last completed payment via Accounts.payments: list in AdSense Management API v1.4

I am successfully using Google's AdSense API to retrieve payments. The AdSense account I am testing the app with does not have any completed payments.
I am using Accounts.payments:list to retrieve the payments and currently I am only getting one row with Id = "unpaid". This entry specifies the amount that is available for payment.
My question here is what are the other possible entries in the result? Specifically how can I find last completed payment?
Thank you for your help.
items[] description: "The list of Payments for the account. One or both of a) the account's most recent payment; and b) the account's upcoming payment".
As far I can see id can be "unpaid", or date of the last payment (probably the "payment issued" date):
{
"kind": "adsense#payments",
"items": [
{
"kind": "adsense#payment",
"id": "unpaid",
"paymentAmount": "***.**",
"paymentAmountCurrencyCode": "***"
},
{
"kind": "adsense#payment",
"id": "****-**-**",
"paymentDate": "****-**-**",
"paymentAmount": "***.**",
"paymentAmountCurrencyCode": "***"
}
]
}
how can I find last completed payment?
In my understanding, that is exactly what Accounts.payments:list is (or will be) returning:
your account current balance
last payment (if there was any)

Resources