Skip to main content

中文 | English

商户支付 OpenAPI — Python SDK

PyPI License: MIT

零第三方依赖的 Python 3 SDK:HTTP 用 urllib.request,签名用 hmac/hashlib,测试用标准库 unittest。无需 pip install 任何运行时依赖。

签名算法与服务端签名实现逐字节一致,单测对 ../test-vectors.json 全量复现 basesign

引入(无需安装依赖)

openapi_sdk/ 目录放进你的项目(或把本目录加入 sys.path / PYTHONPATH)即可:

import sys
sys.path.insert(0, "/path/to/python")

from openapi_sdk import Client, Config, Environment

可选地用标准打包安装(仍零依赖):

cd python
pip install .        # 或 python3 -m build;本身不拉任何第三方运行时依赖

快速开始

from openapi_sdk import Client, Config, Environment, ApiError, TransportError

config = Config(
    merchant_no="M00000001",
    api_key="ak_xxx",
    api_secret_pay="sk_pay_xxx",        # pay 类接口 + 代收/退款回调
    api_secret_payout="sk_payout_xxx",  # payout 类接口 + 代付回调
    environment=Environment.SANDBOX,    # 或 Environment.PRODUCTION(须显式传 base_url)
)
client = Client(config)

try:
    # 金额是最小单位整数:10000 = 1 元
    order = client.pay_create(
        out_order_no="ORD1", amount=10000, currency="PHP",
        pay_method="gcash", country="PH",
        notify_url="https://m.example.com/api/notify/pay",
    )
    print(order["pay_url"])
except ApiError as e:        # 业务失败 code != 0
    print(e.code, e.message, e.data)
except TransportError as e:  # HTTP / 网络 / 超时
    print(e, e.status_code)

双环境与自定义基址

环境 基址
Environment.PRODUCTION 无内置基址,必须显式传 base_url
Environment.SANDBOX http://127.0.0.1:3090/api/open/v1

正式环境地址请向服务商获取(形如 https://api.<service_domain>/api/open/v1),用 base_url= 显式传入。选 PRODUCTION 又不传 base_url 会抛 ValueError(提示 baseUrl is required):

config = Config(
    merchant_no="M00000001", api_key="ak_xxx",
    api_secret_pay="...", api_secret_payout="...",
    base_url="https://api.service.example.com/api/open/v1",  # 正式环境必传
)

全部 12 个端点

代收(密钥 api_secret_pay,自动选用):

方法 端点
pay_create(...) /merchant/pay/create
pay_query(order_no=, out_order_no=) /merchant/pay/query
pay_methods_query(country=, biz_type=, currency=) /merchant/pay-methods/query
groups_query(biz_type=, currency=, country=) /merchant/groups/query(兼容别名)
balance_query(currency=) /merchant/balance/query
pay_test_complete(result=, ...) /merchant/pay/test/complete(仅测试密钥)

代付(密钥 api_secret_payout,自动选用):

方法 端点
payout_create(...) /merchant/payout/create
payout_query(payout_no=, out_payout_no=) /merchant/payout/query
payout_banks_query(pay_method=, country=, currency=) /merchant/payout/banks/query
payout_proof_query(payout_no=, out_payout_no=) /merchant/payout/proof/query
payout_receipt_query(..., inline=) /merchant/payout/receipt/query
payout_test_complete(result=, ...) /merchant/payout/test/complete(仅测试密钥)

约定:

  • 每请求自动注入 merchant_no/api_key/timestamp(Unix 秒)/唯一 noncesign
  • 值为 None 的参数不放入请求体、也不参与签名。
  • payout_receipt_queryinline 以整数 1/0 发送(True→1 内联 base64 图片;False→0 返回带 token 的 URL)。
  • 金额是最小单位整数(10000 = 1 元),用 int 类型传入。
  • 成功返回 data(dict);code != 0ApiError(携带 code/message/data);HTTP/网络错误抛 TransportError
  • 需要原始信封时用 client.call_raw(path, body, secret)(不因 code != 0 抛异常)。

签名工具(可单独使用)

from openapi_sdk import build_sign_base, sign, verify_callback

base = build_sign_base(payload, secret)   # 逐字节可断言的签名 base
sig  = sign(payload, secret)              # HMAC-SHA256 -> hex 小写
ok   = verify_callback(callback, secret)  # 时序安全(hmac.compare_digest),字段无关

回调验签 + 处理

examples/callback_verify.py:解析原始 body → verify_callback(时序安全)→ 按 status 幂等处理(success/failed)→ 应答 HTTP 200 + 纯文本 success。代收回调用 api_secret_pay、代付回调用 api_secret_payout,示例各演示一次。验签失败不回成功;同一订单可能再次收到回调。处理务必幂等(同一订单可能多次回调)。

示例

cd python
python3 examples/pay_create.py
python3 examples/payout_create.py
python3 examples/callback_verify.py   # 自演示:造签名回调 -> 验签 -> 应答 -> 篡改反例

跑测试

cd python
python3 -m unittest discover -s tests

测试包含:

  • 读取 ../test-vectors.json,对每个向量断言 build_sign_base == basesign == sign
  • 回调验签正例 + 篡改一字节反例(含错误密钥、缺 sign);
  • 客户端请求构建(通用字段注入、None 过滤、密钥选择、inline 整数化、信封解析与异常分类)。

Download files

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

Source Distribution

bebebus_merchant_openapi_sdk-2.0.0.tar.gz (19.3 kB view details)

Uploaded Source

Built Distribution

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

bebebus_merchant_openapi_sdk-2.0.0-py3-none-any.whl (16.2 kB view details)

Uploaded Python 3

File details

Details for the file bebebus_merchant_openapi_sdk-2.0.0.tar.gz.

File metadata

File hashes

Hashes for bebebus_merchant_openapi_sdk-2.0.0.tar.gz
Algorithm Hash digest
SHA256 ddc9d4ba1e8c1689f86a2da61efeabb49784497b4889bb1fe63c0b420ae4d907
MD5 f44762b03381db29d2a14d39a1fe69d7
BLAKE2b-256 6b5adfe0490a10875cb1a387ab5f76ca5cef4712138332d6d1dba34273c4c80a

See more details on using hashes here.

File details

Details for the file bebebus_merchant_openapi_sdk-2.0.0-py3-none-any.whl.

File metadata

File hashes

Hashes for bebebus_merchant_openapi_sdk-2.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 524c1d6d37135f9ef7ffc5c479129087b9f96985c3e9fd4197131655c369e32e
MD5 e87769517144a998eb574623ecf2c733
BLAKE2b-256 3a5dc5ca297852ecd6d6bceb214863c681065a750306cfd21d8b5aa4f220a39b

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 Sentry Error logging StatusPage Status page