Skip to main content

Pine Labs Online P3P Server SDK — x402 Pine Labs Online P3P server middleware (Python)

Project description

Pine Labs Online P3P Server SDK (Python)

Python SDK for Pine Labs Online P3P server integrations. It mirrors @pine-labs-online/p3p-server-sdk, creates mandates, generates HTTP 402 payment challenges, verifies client credentials, captures payments through P3P, and builds Payment-Receipt headers.

Installation

pip install pinelabs-p3p-server-sdk[flask]
pip install pinelabs-p3p-server-sdk[fastapi]

Import module: pinelabs_p3p_server. Requires Python 3.9 or newer.

Config

from pinelabs_p3p_server import (
    P3PEnvironment,
    PaymentGateway,
    PaymentMethod,
    PineLabsOnlineServerConfig,
)

config = PineLabsOnlineServerConfig(
    clientId="...",
    clientSecret="...",
    env=P3PEnvironment.SANDBOX,
    paymentGateway=PaymentGateway.PineLabsOnline,
    availablePaymentMethods=[PaymentMethod.UPI_RESERVE_PAY, PaymentMethod.Crypto],
)

clientId and clientSecret are used internally for POST /api/auth/v1/token. The local challenge HMAC key is derived internally from clientSecret with a stable SDK prefix, so there is no separate challenge-signing config field. The SDK caches and refreshes bearer tokens before expiry. env selects the Pine Labs host used for auth and /mpp/v1/* service calls.

Mandates

from pinelabs_p3p_server import Amount, CreateMandateOptions, PineLabsOnlineP3P

p3p = PineLabsOnlineP3P.create(config)
mandate = p3p.create_mandate(CreateMandateOptions(
    mobileNumber="9876543210",
    customerReference="9876543210",
    amount=Amount(value=100000, currency="INR"),
    paymentMethod=PaymentMethod.UPI_RESERVE_PAY,
    validityInDays=20,
))

This maps to POST /mpp/v1/pre-authorize and sends customer.mobile_number.

Paid Resource Flow

from flask import Flask, jsonify
from pinelabs_p3p_server import Amount, ChargeOptions
from pinelabs_p3p_server.flask_mw import payment_required

app = Flask(__name__)

@app.get("/api/premium")
@payment_required(config, ChargeOptions(
    amount=Amount(value=50000, currency="INR"),
    resource="/api/premium",
))
def premium():
    return jsonify({"data": "premium content"})

The middleware reads P3P-Credential: Payment <payload>, not Authorization, so it does not conflict with application bearer auth.

Capture

from pinelabs_p3p_server import CaptureOptions

result = p3p.capture(CaptureOptions(
    token="MPP_TOK_123",
    amount=Amount(value=50000, currency="INR"),
    paymentMethod=PaymentMethod.UPI_RESERVE_PAY,
    customerReference="9876543210",
    mobileNumber="9876543210",
    challengeId="ch_123",
    merchantOrderReference="order-123",
))

The debit body uses customer.mobile_number, payment_amount, payment_token, and challenge_id. The SDK sends Idempotency-Key and does not send Merchant-ID.

Generic Middleware Helper

from pinelabs_p3p_server.server.middleware import decide_payment

decision = decide_payment(
    credential_header=request.headers.get("P3P-Credential"),
    config=config,
    charge_options=ChargeOptions(
        amount=Amount(value=50000, currency="INR"),
        resource="/api/premium-data",
    ),
)

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pinelabs_online_p3p_server_sdk-0.1.2.tar.gz (25.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

File details

Details for the file pinelabs_online_p3p_server_sdk-0.1.2.tar.gz.

File metadata

File hashes

Hashes for pinelabs_online_p3p_server_sdk-0.1.2.tar.gz
Algorithm Hash digest
SHA256 97f34e8c51191bded5fff5c9f0a2fa5abdae7b3540aa2c0b744b0f261f6a8548
MD5 52006a95cae291d30957caf71b6ad591
BLAKE2b-256 4a2388c0222944331da0b47db410669f60ee5685a4110dc3467ef8bb2acebb0f

See more details on using hashes here.

File details

Details for the file pinelabs_online_p3p_server_sdk-0.1.2-py3-none-any.whl.

File metadata

File hashes

Hashes for pinelabs_online_p3p_server_sdk-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 06cbd918a57cd839f34fe58be50eaf12467bdf88a799d16a8db91b6e609ab76c
MD5 94cc27e5b0287af68fc6a5b27340e3f6
BLAKE2b-256 87052da073705e04974163612e179346356a91f175774bb2f4c9594f3a6a6bb6

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page