Ways to pay

Stripe payments

Accept one-time card payments from compatible agent wallets through MPP. Your service advertises a Stripe payment option, the buyer supplies a Stripe Shared Payment Token, and InFlow processes the charge through your connected Stripe account.

This page covers MPP’s stripe method with the charge intent. It is separate from charging a card saved in an InFlow buyer account, covered in Linked cards, and from the Visa CARD method.

Accept a Stripe payment through MPP

Suppose your service sells a report for $1.00 USD. An unpaid request receives an MPP challenge describing the price and your Stripe Profile. A compatible wallet obtains the buyer’s authorization and supplies a Shared Payment Token for that purchase. The buyer returns the token in an MPP payment credential, rather than sending card details to your service.

Your seller integration submits the credential to InFlow for processing. After payment succeeds, the response includes a payment receipt and your service delivers the report. The payment is recorded in the connected seller’s Stripe account; it is not an InFlow balance transfer.

A Shared Payment Token is a limited grant to use a payment method, not proof that a charge succeeded. See Stripe’s machine payments documentation for the token model. The InFlow integration described here supports one-time USD charges, not every payment capability offered by Stripe.

Connect the seller account

Use an InFlow Seller account in the environment where your application will run. Open Sandbox Stripe settings for testing or production Stripe settings for live payments.

  • Select Connect with Stripe and sign in to Stripe.
  • Authorize the merchant account that should receive your service’s payments. Check the selected business before continuing.
  • Return to InFlow and confirm that Stripe account shows the expected account ID and Connection shows Connected.
  • Check Payments and MPP Stripe Profile before configuring a paid route.

Your application authenticates to InFlow with this Seller account’s InFlow API key. Do not put a merchant Stripe secret key in the application’s seller SDK configuration. InFlow uses the authorized connection to process payments for the seller.

Check payment and profile readiness

A saved Stripe connection does not by itself mean the account can accept an MPP payment. Check these three items on the InFlow Stripe settings page:

ItemReady stateWhat it establishes
ConnectionConnected, with the intended account IDInFlow has a saved connection to that merchant account.
PaymentsEnabledStripe reports that the account can accept charges.
MPP Stripe ProfileA Stripe Profile ID is displayedInFlow found the profile used to identify the seller in Stripe payment challenges.

If payments are disabled

Review the missing-information categories shown in InFlow and select Open Stripe profile settings. Complete the required information for the connected business in Stripe, then reload the InFlow page. Stripe can also be reviewing information you already submitted. A pending review is not a reason to unlink and reconnect the account.

If the profile is missing

When MPP Stripe Profile says Not found, select Create Stripe Profile. In Stripe, confirm the intended account and environment, complete the profile setup, and reload InFlow. A Stripe Profile identifies the business for these payments; creating one does not replace Stripe’s account verification requirements.

If a check is unavailable

Unable to check or Unable to verify means InFlow could not confirm that status. It does not establish that payments are disabled or the profile is missing. Keep the existing connection, reload the page, and contact InFlow support if the check continues to fail. Do not create a second account or profile to resolve a failed status check.

Add a Stripe offer

Set a USD price of at least $0.50 in whole cents. The fragments below use $1.00 and adapt the route in Accept MPP. Keep that route’s challenge signing, payment acceptance, receipt handling, and application lifecycle; these fragments are not standalone servers.

The seller SDK reads the Stripe Profile and supported payment methods from InFlow’s seller configuration. Do not invent or hardcode a profile ID. These offer builders take decimal dollars and prepare the amount for the payment challenge; 1.00 means one dollar, not one cent.

In the Go route, replace the charge offer with this Stripe offer. Pass it to the same protected route’s Offers list. Keep the client configured with your Sandbox InFlow Seller API key.

description := "A report"
offer := seller.Offer{Stripe: &seller.StripeOffer{
    Amount:      "1.00",
    Description: &description,
}}

In Node.js, await the Stripe method factory during application setup. Here, app is your Express application; apiKey and secretKey come from private configuration. Keep the payment transport and JSON receipt handling from Accept MPP.

import { Mppx } from 'mppx/express';
import { stripe, paymentHttpTransport } from '@inflowpayai/mpp-seller';

const payments = Mppx.create({
  methods: [await stripe({ apiKey, environment: 'sandbox' })],
  secretKey,
  transport: paymentHttpTransport(),
});

app.get('/api/report',
  payments.charge({ amount: '1.00', description: 'A report' }),
  (_request, response) => {
    response.set('Cache-Control', 'no-store');
    response.json({ report: 'Your sample report is ready.' });
  },
);

In Python, select Stripe when creating the Seller client and use its Stripe request builder. Here, api_key is your Sandbox InFlow Seller API key. Use these terms in the same payment decorator shown in Accept MPP. Keep the client open while serving requests and close it during application shutdown.

seller = await Seller.create(
    ClientOptions(api_key=api_key, environment="sandbox"),
    method="stripe",
)
terms = seller.stripe_request({
    "amount": "1.00",
    "description": "A report",
})

In Rust, select the Stripe method when building the offer. Here, seller is initialized with the Sandbox InFlow Seller API key. Use this offer in the existing handler that returns challenges, accepts credentials, and attaches receipts.

let offer = seller.offer(
    Method::Stripe,
    json!({"amount": "1.00", "description": "A report"}),
    ChallengeOptions::default(),
)?;

This configuration offers a one-time purchase. It does not create a subscription or meter usage. For several payment options on the same resource, follow Prices and offers rather than placing consecutive payment checks in front of the handler.

Use a compatible buyer

The buyer needs a wallet that can issue a Stripe Shared Payment Token for your MPP challenge. Link Agent Wallet provides this capability; its command-line guide covers setup, authorization, and MPP payments. Select the Shared Payment Token flow, not a virtual card number intended for a checkout form.

InFlow’s buyer SDKs do not issue Stripe Shared Payment Tokens. An InFlow API key or a card saved in InFlow is not a replacement for that token. If your buyers use InFlow-linked cards, offer the separate instrument payment option described in Linked cards.

The external wallet handles its buyer’s payment authorization. This Stripe method does not send the buyer through InFlow’s approval or allowance flow. Your service’s own login or AEP requirements still apply: permission to charge a card does not authenticate a user to your application.

Verify payment and delivery

Use Sandbox with a buyer tool that supports the corresponding Stripe test credentials. Selecting Sandbox in the seller SDK does not turn a live wallet credential into a test credential. Receiving a 402 challenge confirms only that your route advertises payment; complete a $1.00 test purchase to verify the full integration.

  • Make an unpaid request and confirm a Stripe charge offer for $1.00 USD with the intended seller’s profile.
  • Submit a compatible test payment credential. Confirm the successful payment in the connected seller’s Stripe account, the Payment-Receipt response header, and delivery of the purchased result.
  • Test a declined payment. Confirm that no paid result or success receipt is returned.
  • Test an interrupted response after payment submission. Keep the original payment reference and credential while establishing the outcome; do not immediately create a new purchase.
  • Test an identical credential replay. Confirm that recovery refers to the original payment rather than creating a second charge, and that your application does not repeat an irreversible delivery action.

Payment deduplication does not automatically make report generation, order creation, or fulfillment idempotent. Follow Deliver paid results to decide what your application returns when a paid request is repeated. Treat credentials as secrets while retaining the references needed to investigate a payment.

Maintain the connection

Recheck the InFlow Stripe settings page after changing business information or payment setup. If Stripe is reviewing submitted information, wait for that review and check the status again instead of reconnecting. After an account or profile change, recreate your application’s seller clients and route offers, for example by restarting the application. This reloads the seller configuration rather than continuing to serve offers prepared for the previous account.

To connect a different Stripe account, select Unlink Stripe first. Unlinking revokes InFlow’s access and can make payments fail. Stop offering the Stripe option before changing accounts, then confirm the replacement account’s readiness before restoring it. Unlinking does not delete the Stripe account or refund earlier payments.

Continue your integration

Deliver paid results

Coordinate payment acceptance, response delivery, and repeated requests.

Test your integration

Test your application’s successful purchases, failures, and recovery.

Troubleshooting

Identify account, configuration, and payment errors before repeating a purchase.