feat: Airwallex 发卡管理后台完整实现
- 后端: FastAPI + SQLAlchemy + SQLite, JWT认证, 代理支持的AirwallexClient - 前端: React 18 + Vite + Ant Design 5, 中文界面 - 功能: 卡片管理, 持卡人管理, 交易记录, API令牌, 系统设置, 审计日志 - 第三方API: X-API-Key认证, 权限控制 - Docker部署: docker-compose编排前后端
This commit is contained in:
183
airwallex-sdk/README.md
Normal file
183
airwallex-sdk/README.md
Normal file
@@ -0,0 +1,183 @@
|
||||
# UNOFFICIAL Airwallex Python SDK
|
||||
|
||||
A simple SDK for interacting with the [Airwallex API](https://www.airwallex.com/docs/api).
|
||||
|
||||
## Features
|
||||
|
||||
- SOMEWHAT Comprehensive implementation of the Airwallex API
|
||||
- Both synchronous and asynchronous client support
|
||||
- Automatic authentication and token refresh
|
||||
- Built-in rate limiting and retry logic
|
||||
- Type checking with Pydantic models
|
||||
|
||||
## Installation
|
||||
|
||||
```bash
|
||||
pip install airwallex-sdk
|
||||
```
|
||||
|
||||
## Quick Start
|
||||
|
||||
### Payments API
|
||||
|
||||
#### Synchronous Usage
|
||||
|
||||
```python
|
||||
from airwallex import AirwallexClient
|
||||
from airwallex.models.payment import PaymentCreateRequest, PaymentAmount
|
||||
|
||||
# Initialize the client
|
||||
client = AirwallexClient(
|
||||
client_id="your_client_id",
|
||||
api_key="your_api_key"
|
||||
)
|
||||
|
||||
# List accounts
|
||||
accounts = client.accounts.list()
|
||||
for account in accounts:
|
||||
print(f"Account: {account.account_name} ({account.id})")
|
||||
|
||||
# Fetch a specific account
|
||||
account = client.accounts.fetch("account_id")
|
||||
print(account.show()) # Print a formatted representation
|
||||
|
||||
# Create a payment
|
||||
payment_request = PaymentCreateRequest(
|
||||
request_id="unique_request_id",
|
||||
amount=PaymentAmount(value=100.00, currency="USD"),
|
||||
source={
|
||||
"type": "account",
|
||||
"account_id": "account_id"
|
||||
},
|
||||
beneficiary={
|
||||
"type": "bank_account",
|
||||
"id": "beneficiary_id"
|
||||
},
|
||||
payment_method="swift"
|
||||
)
|
||||
|
||||
payment = client.payments.create_from_model(payment_request)
|
||||
print(f"Payment created with ID: {payment.id}")
|
||||
|
||||
# Use generator to iterate through all payments
|
||||
for payment in client.payments():
|
||||
print(f"Payment {payment.id}: {payment.amount.value} {payment.amount.currency}")
|
||||
```
|
||||
|
||||
#### Asynchronous Usage
|
||||
|
||||
```python
|
||||
import asyncio
|
||||
from airwallex import AirwallexAsyncClient
|
||||
from airwallex.models.beneficiary import BeneficiaryCreateRequest, BankDetails
|
||||
|
||||
async def main():
|
||||
# Initialize the async client
|
||||
client = AirwallexAsyncClient(
|
||||
client_id="your_client_id",
|
||||
api_key="your_api_key"
|
||||
)
|
||||
|
||||
# List accounts
|
||||
accounts = await client.accounts.list_async()
|
||||
|
||||
# Create a beneficiary
|
||||
beneficiary_request = BeneficiaryCreateRequest(
|
||||
name="John Doe",
|
||||
type="bank_account",
|
||||
bank_details=BankDetails(
|
||||
account_name="John Doe",
|
||||
account_number="123456789",
|
||||
swift_code="ABCDEFGH",
|
||||
bank_country_code="US"
|
||||
)
|
||||
)
|
||||
|
||||
beneficiary = await client.beneficiaries.create_from_model_async(beneficiary_request)
|
||||
print(f"Beneficiary created with ID: {beneficiary.id}")
|
||||
|
||||
# Async generator to iterate through all beneficiaries
|
||||
async for ben in client.beneficiaries.paginate_async_generator():
|
||||
print(f"Beneficiary: {ben.name}")
|
||||
|
||||
await client.close()
|
||||
|
||||
# Run the async function
|
||||
asyncio.run(main())
|
||||
```
|
||||
|
||||
### Issuing API
|
||||
|
||||
#### Working with Cardholders and Cards
|
||||
|
||||
```python
|
||||
from airwallex import AirwallexClient
|
||||
from airwallex.models.issuing_cardholder import CardholderCreateRequest, Individual, Name, Address
|
||||
from airwallex.models.issuing_card import CardCreateRequest, AuthorizationControls, CardProgram
|
||||
|
||||
# Initialize the client
|
||||
client = AirwallexClient(
|
||||
client_id="your_client_id",
|
||||
api_key="your_api_key"
|
||||
)
|
||||
|
||||
# Create a cardholder
|
||||
cardholder_request = CardholderCreateRequest(
|
||||
email="john.doe@example.com",
|
||||
individual=Individual(
|
||||
name=Name(
|
||||
first_name="John",
|
||||
last_name="Doe",
|
||||
title="Mr"
|
||||
),
|
||||
date_of_birth="1982-11-02",
|
||||
address=Address(
|
||||
city="Melbourne",
|
||||
country="AU",
|
||||
line1="44 Example St",
|
||||
postcode="3121",
|
||||
state="VIC"
|
||||
),
|
||||
cardholder_agreement_terms_consent_obtained="yes",
|
||||
express_consent_obtained="yes"
|
||||
),
|
||||
type="INDIVIDUAL"
|
||||
)
|
||||
|
||||
cardholder = client.issuing_cardholder.create_cardholder(cardholder_request)
|
||||
print(f"Cardholder created with ID: {cardholder.cardholder_id}")
|
||||
|
||||
# Create a virtual card
|
||||
card_request = CardCreateRequest(
|
||||
cardholder_id=cardholder.cardholder_id,
|
||||
request_id="unique-request-id",
|
||||
created_by="API User",
|
||||
form_factor="VIRTUAL",
|
||||
is_personalized=True,
|
||||
authorization_controls=AuthorizationControls(
|
||||
allowed_currencies=["USD", "AUD"],
|
||||
allowed_transaction_count="MULTIPLE"
|
||||
),
|
||||
program=CardProgram(
|
||||
id="your_program_id",
|
||||
name="Default Program"
|
||||
)
|
||||
)
|
||||
|
||||
card = client.issuing_card.create_card(card_request)
|
||||
print(f"Card created with ID: {card.card_id}")
|
||||
|
||||
# Get card details
|
||||
card_details = client.issuing_card.get_card_details(card.card_id)
|
||||
print(f"Card Number: {card_details.card_number}")
|
||||
print(f"CVV: {card_details.cvv}")
|
||||
print(f"Expiry: {card_details.expiry_month}/{card_details.expiry_year}")
|
||||
```
|
||||
|
||||
## Documentation
|
||||
|
||||
For detailed documentation, see [https://www.airwallex.com/docs/api](https://www.airwallex.com/docs/api).
|
||||
|
||||
## License
|
||||
|
||||
This project is licensed under the MIT License - see the LICENSE file for details.
|
||||
Reference in New Issue
Block a user