動作要件
- Python 3.9+
- pip
インストール
python -m pip install "waffo==0.3.0b0"
# または最新のプレリリース版をインストール
python -m pip install --pre waffo
Python SDK は現在 beta 版です。本番環境へ移行する前に PyPI で最新バージョンを確認してください。
初期化
from waffo import Environment, Waffo, WaffoConfig
config = WaffoConfig(
api_key="your-api-key",
private_key="your-base64-encoded-private-key",
waffo_public_key="waffo-public-key",
merchant_id="your-merchant-id",
environment=Environment.SANDBOX,
)
waffo = Waffo(config)
決済
from uuid import uuid4
payment_request_id = uuid4().hex
response = waffo.order().create(
{
"paymentRequestId": payment_request_id,
"merchantOrderId": f"ORDER_{payment_request_id}",
"orderCurrency": "HKD",
"orderAmount": "100.00",
"orderDescription": "Test Product",
"notifyUrl": "https://your-site.com/webhook",
"userInfo": {
"userId": "user_123",
"userEmail": "user@example.com",
"userTerminal": "WEB",
},
"paymentInfo": {"productName": "ONE_TIME_PAYMENT"},
"goodsInfo": {"goodsUrl": "https://your-site.com/product/001"},
}
)
if response.is_success():
data = response.get_data()
print("Redirect action:", data.order_action if data else None)
print("Acquiring Order ID:", data.acquiring_order_id if data else None)
照会
response = waffo.order().inquiry({"paymentRequestId": payment_request_id})
サブスクリプション
response = waffo.subscription().create({ ... })
inquiry = waffo.subscription().inquiry({"subscriptionId": "..."})
waffo.subscription().cancel({"subscriptionId": "..."})
返金
response = waffo.order().refund(
{
"refundRequestId": "ref_...",
"acquiringOrderId": "ACQ...",
"refundAmount": "50.00",
"refundReason": "Customer requested",
}
)
inquiry = waffo.refund().inquiry({"refundRequestId": "ref_..."})
Webhook 処理
from fastapi import FastAPI, Header, Request, Response
from waffo import Waffo
app = FastAPI()
waffo = Waffo.from_env()
waffo.webhook().on_payment(
lambda notification: print(notification.get("result", {}).get("acquiringOrderId"))
)
@app.post("/webhook")
async def webhook(request: Request, x_signature: str | None = Header(default=None)) -> Response:
body = (await request.body()).decode("utf-8")
result = waffo.webhook().handle_webhook(body, x_signature)
return Response(
content=result.response_body,
media_type="application/json",
headers={"X-SIGNATURE": result.response_signature},
status_code=200 if result.success else 400,
)
エラーハンドリング
from waffo import WaffoError, WaffoUnknownStatusError
try:
response = waffo.order().create({ ... })
except WaffoUnknownStatusError:
# 重要: 決済が成功している可能性があります。照会 API で確認してください
inquiry = waffo.order().inquiry({"paymentRequestId": payment_request_id})
except WaffoError:
# クライアント側のエラー(設定、署名など)。修正後に再試行してください
raise