def get_payment_method_billing_country(payment_method_id):
payment_method = stripe_client.v1.payment_methods.retrieve(payment_method_id)
billing_country = payment_method.billing_details.address.country
likely_currency = country_to_currency.get(billing_country, 'Unknown')
return {
'billing_country': billing_country,
'likely_currency': likely_currency
}
def estimate_conservative_fees(amount, currency="usd"):
"""
Estimate fees with a conservative approach that covers most scenarios
"""
# Use highest possible rate to avoid undercollecting
percentage_fee = 0.039 # 3.9% (international rate)
fixed_fee = 30 # $0.30
fx_buffer = 0.01 # 1% buffer for possible FX conversion
# Calculate with buffer
stripe_fee = int(amount * (percentage_fee + fx_buffer)) + fixed_fee
return stripe_fee
def process_payment_with_adjustment(amount, currency, connected_account_id, platform_fee_percentage):
"""
Process payment with post-payment fee adjustment
"""
# Step 1: Calculate your platform fee
platform_fee = int(amount * platform_fee_percentage)
# Step 2: Add conservative Stripe fee estimate
estimated_stripe_fee = estimate_conservative_fees(amount, currency)
total_fee = platform_fee + estimated_stripe_fee
# Step 3: Process payment with conservative fee
payment = create_payment(amount, currency, connected_account_id, total_fee)
# Step 4: After payment completes, get actual Stripe fee
actual_stripe_fee = get_actual_stripe_fee(payment.id)
# Step 5: If we overestimated, issue partial refund of difference
fee_difference = estimated_stripe_fee - actual_stripe_fee
if fee_difference > 50: # Only refund if difference is meaningful (e.g., >$0.50)
issue_fee_adjustment(payment.id, fee_difference)
return payment
# After payment completion, retrieve the actual Stripe fee
if intent.status == "succeeded" and intent.latest_charge:
charge = stripe_client.v1.charges.retrieve(intent.latest_charge)
balance_tx = stripe_client.v1.balance_transactions.retrieve(charge.balance_transaction)
# Get actual Stripe fee
actual_stripe_fee = balance_tx.fee
# Now create a transfer from the connected account to your platform to cover Stripe's fee
stripe_client.v1.transfers.create(
params={
"amount": actual_stripe_fee,
"currency": currency,
"destination": "your_platform_account_id", # Your platform account
"description": "Stripe fee reimbursement",
"source_transaction": intent.latest_charge,
}
)
print(f"Collected actual Stripe fee of {actual_stripe_fee}")
return intent, actual_stripe_fee
def process_payment_with_fee_adjustment(stripe_client, amount, currency, customer_id, payment_method_id, connected_account_id, platform_fee_percent):
"""
Process payment with accurate fee handling
"""
# Calculate your platform fee only (not including Stripe's fee)
platform_fee = int(amount * platform_fee_percent)
# Create the payment intent with just your platform fee
intent = stripe_client.v1.payment_intents.create(
params={
"amount": amount,
"currency": currency,
"customer": customer_id,
"payment_method": payment_method_id,
"off_session": True,
"confirm": True,
"on_behalf_of": connected_account_id,
"application_fee_amount": platform_fee, # Only your platform fee
"transfer_data": {"destination": connected_account_id},
}
)
# After payment completion, retrieve the actual Stripe fee
if intent.status == "succeeded" and intent.latest_charge:
charge = stripe_client.v1.charges.retrieve(intent.latest_charge)
balance_tx = stripe_client.v1.balance_transactions.retrieve(charge.balance_transaction)
# Get actual Stripe fee
actual_stripe_fee = balance_tx.fee
# Now create a transfer from the connected account to your platform to cover Stripe's fee
stripe_client.v1.transfers.create(
params={
"amount": actual_stripe_fee,
"currency": currency,
"destination": "your_platform_account_id", # Your platform account
"description": "Stripe fee reimbursement",
"source_transaction": intent.latest_charge,
}
)
print(f"Collected actual Stripe fee of {actual_stripe_fee}")
return intent, actual_stripe_fee