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",  # 正式环境必传
)

全部 11 个端点

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

方法 端点
pay_create(...) /merchant/pay/create
pay_query(order_no=, out_order_no=) /merchant/pay/query
pay_methods_query(country=) /merchant/pay-methods/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-1.1.2.tar.gz (17.7 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-1.1.2-py3-none-any.whl (15.9 kB view details)

Uploaded Python 3

File details

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

File metadata

File hashes

Hashes for bebebus_merchant_openapi_sdk-1.1.2.tar.gz
Algorithm Hash digest
SHA256 cbf57c10820884a7e3da2a309ffa82a55b88755c3cd8c02b09d27217a272034a
MD5 0d3bb3bd8a2da3b481283f86e4929de6
BLAKE2b-256 c7d59f49c11f355e40f06af9ca276dbc4299a69b3ff469e29f04222a4b0b316a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bebebus_merchant_openapi_sdk-1.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 78507a75d12a6cc13e8241d14d6da4ff23fb4a2ffabb4b82b84b87bf01a81ca2
MD5 30dee243c2248ac21b3bff26f2713370
BLAKE2b-256 efdeb7b984a368eb160cb753f7c7826203b3232d8a7add1cb7a3b2507d1fe204

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