1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/fastsource-alipay

Клонировать/Скачать
README.zh-hans.md 19 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 08.06.2025 21:14 f42c668

python-alipay-sdk

PyPI version codecov travis-ci

НесофиISTICальный Python SDK для Alipay

Мы поддерживаем все способы оплаты, которые должны иметь тип подписи RSA или RSA2. В настоящее время реализованы следующие функции:

Детали реализации подписей можно найти в этой статье. Если вы не хотите углубляться в технические детали, вы можете прочитать ниже инструкции по использованию.## Инструкции по использованию

Установка

# Установка python-alipay-sdk
pip install python-alipay-sdk --upgrade
# Для Python 2, пожалуйста, установите версию ниже 2.0: pip install python-alipay-sdk==1.1

Генерация ключевых файлов

openssl
OpenSSL> genrsa -out app_private_key.pem 2048  # Приватный ключ
OpenSSL> rsa -in app_private_key.pem -pubout -out app_public_key.pem # Экспорт публичного ключа
OpenSSL> exit

Ключ публичного ключа, загруженного с Alipay, представляет собой строку. Вам необходимо добавить маркеры в начале и конце строки:

-----BEGIN PUBLIC KEY----- и -----END PUBLIC KEY-----

для корректной работы. Формат сертификата вы можете посмотреть здесь

Инициализация

from alipay import AliPay, DCAliPay, ISVAliPay
from alipay.utils import AliPayConfig
app_private_key_string = open("/path/to/your/private/key.pem").read()
alipay_public_key_string = open("/path/to/alipay/public/key.pem").read()

app_private_key_string == """
    -----BEGIN RSA PRIVATE KEY-----
    base64 encoded content
    -----END RSA PRIVATE KEY-----
"""

alipay_public_key_string == """
    -----BEGIN PUBLIC KEY-----
    base64 encoded content
    -----END PUBLIC KEY-----
"""

alipay = AliPay(
    appid="",
    app_notify_url=None,  # по умолчанию используется стандартный URL-адрес обратного вызова
    app_private_key_string=app_private_key_string,
    # публичный ключ от АлиПей для проверки сообщений от АлиПей, не ваш собственный публичный ключ
    alipay_public_key_string=alipay_public_key_string,
    sign_type="RSA",  # RSA или RSA2
    debug=False,  # по умолчанию False
    config=AliPayConfig(timeout=15)  # необязательный параметр, время ожидания запроса
)
``````markdown
dc_alipay = DCAliPay(
    appid="appid",
    app_notify_url="http://example.com/app_notify_url",
    app_private_key_string=app_private_key_string,
    app_public_key_cert_string=app_public_key_cert_string,
    alipay_public_key_cert_string=alipay_public_key_cert_string,
    alipay_root_cert_string=alipay_root_cert_string
)

# Если вы не знакомы с ISV, то вам не нужно читать следующую часть
# app_auth_code или app_auth_token необходимо заполнить одним из них
isv_alipay = ISVAliPay(
    appid="",
    app_notify_url=None,  # по умолчанию используется стандартный URL-адрес обратного вызова
    app_private_key_string="",
    # публичный ключ от АлиПей для проверки сообщений от АлиПей, не ваш собственный публичный ключ
    alipay_public_key_string="",
    sign_type="RSA",  # RSA или RSA2
    debug=False,   # по умолчанию False
    app_auth_code=None,
    app_auth_token=None
)

Различия между AliPay, DCAliPay и ISVAliPay

  • AliPay: Использует собственный приватный ключ для проверки сообщений
  • DCAliPay: Использует сертификаты ключей для проверки сообщений
  • ISVAliPay: Предназначен для управления несколькими приложениями АлиПей

Некоторые интерфейсы должны использовать DCAliPay

Основные правила названия интерфейсов

Для вызова интерфейса АлиПей, например alipay.trade.page.pay, используется следующий синтаксис: alipay.api_alipay_trade_page_pay(). То есть, мы выполняем следующую конвертацию:

```Алипай для запроса biz_content использует некоторые обязательные параметры и некоторые необязательные. Обязательные параметры обычно четко определены в параметрах функции. Необязательные параметры обычно передаются через kwargs и затем добавляются в biz_content. Например, `alipay.trade.page.pay` можно вызвать следующим образом:
```python
alipay.api_alipay_trade_page_pay(
    subject="Тестовый заказ",
    out_trade_no="2017020101",
    total_amount=100
)
```Также можно вызвать:
```python
alipay.api_alipay_trade_page_pay(
    subject="Тестовый заказ",
    out_trade_no="2017020101",
    total_amount=100,
    goods_type=0,  # Необязательный параметр
    timeout_express="90m"  # Необязательный параметр
    ...
)
```#### <a name="alipay.trade.page.pay"></a>Платеж на веб-сайте [alipay.trade.page.pay](https://docs.open.alipay.com/270/105900/)

```python
# Если вы используете Python 2 (рекомендуется обновиться до Python 3), убедитесь, что строки с не-ASCII символами закодированы в utf8:
subject = u"Тестовый заказ".encode("utf8")
# Если вы используете Python 3, используйте стандартные строки
subject = "Тестовый заказ"

# Для платежа на веб-сайте необходимо перейти по ссылке https://openapi.alipay.com/gateway.do? + order_string
order_string = alipay.api_alipay_trade_page_pay(
    out_trade_no="20161112",
    total_amount=0.01,
    subject=subject,
    return_url="https://example.com",
    notify_url="https://example.com/notify" # Необязательный параметр, если не указан, используется стандартный notify url
)

Платеж на мобильном сайте alipay.trade.wap.pay

# Для платежа на мобильном сайте необходимо перейти по ссылке https://openapi.alipay.com/gateway.do? + order_string
order_string = alipay.api_alipay_trade_wap_pay(
    out_trade_no="20161112",
    total_amount=0.01,
    subject=subject,
    return_url="https://example.com",
    notify_url="https://example.com/notify" # Необязательный параметр, если не указан, используется стандартный notify url
)

Платеж в приложении alipay.trade.app.pay

# Для платежа в приложении необходимо вернуть order_string приложению
order_string = alipay.api_alipay_trade_app_pay(
    out_trade_no="20161112",
    total_amount=0.01,
    subject=subject,
    notify_url="https://example.com/notify" # Необязательный параметр, если не указан, используется стандартный notify url
)
```#### <a name="alipay.trade.create"></a>Платеж в маленьком приложении [alipay.trade.create](https://opendocs.alipay.com/mini/introduce/pay)
```python
# Платеж в маленьком приложении
alipay.api_alipay_trade_create(
    out_trade_no="20161112",
    total_amount=0.01,
    subject=subject,
    buyer_id="",
    notify_url="https://example.com/notify" # Необязательный параметр
)

Проверка уведомлений

Вот простой пример проверки на основе Flask:

from flask import Flask
from flask import request
app = Flask(__name__)
@app.route('/', methods=["GET", "POST"])
def hello_world():
    data = request.form.to_dict()
    # sign не должен участвовать в подписи
    signature = data.pop("sign")

    print(json.dumps(data))
    print(signature)

    # проверка
    success = alipay.verify(data, signature)
    if success and data["trade_status"] in ("TRADE_SUCCESS", "TRADE_FINISHED"):
        print("trade succeed")

Джанго-версия:

def hello_world(request):
    # для пользователей Django
    data = request.POST.dict()
    # для пользователей rest_framework
    data = request.data

    signature = data.pop("sign")

    # проверка
    success = alipay.verify(data, signature)
    if success and data["trade_status"] in ("TRADE_SUCCESS", "TRADE_FINISHED"):
        print("trade succeed")
    return 'Hello, World!'
```Обычно можно проверить обратные уведомления следующим образом:
```python
# Проверка асинхронных уведомлений от alipay, данные получены из POST-запроса от alipay, в формате словаря.
data = {
    "subject": "Тестовый заказ",
    "gmt_payment": "2016-11-16 11:42:19",
    "charset": "utf-8",
    "seller_id": "xxxx",
    "trade_status": "TRADE_SUCCESS",
    "buyer_id": "xxxx",
    "auth_app_id": "xxxx",
    "buyer_pay_amount": "0.01",
    "version": "1.0",
    "gmt_create": "2016-11-16 11:42:18",
    "trade_no": "xxxx",
    "fund_bill_list": "[{\"amount\":\"0.01\",\"fundChannel\":\"ALIPAYACCOUNT\"}]",
    "app_id": "xxxx",
    "notify_time": "2016-11-16 11:42:19",
    "point_amount": "0.00",
    "total_amount": "0.01",
    "notify_type": "trade_status_sync",
    "out_trade_no": "xxxx",
    "buyer_logon_id": "xxxx",
    "notify_id": "xxxx",
    "seller_email": "xxxx",
    "receipt_amount": "0.01",
    "invoice_amount": "0.01",
    "sign": "xxx"
}
signature = data.pop("sign")
success = alipay.verify(data, signature)
if success and data["trade_status"] in ("TRADE_SUCCESS", "TRADE_FINISHED"):
    print("Транзакция успешна")
```#### <a name="alipay.trade.pay"></a>Платеж при личной встрече (сканирование штрих-кода) [alipay.trade.pay](https://docs.open.alipay.com/api_1/alipay.trade.pay)

Вот пример платежа при личной встрече:
```python
alipay = AliPay(appid="", ...)

result = alipay.api_alipay_trade_pay(
    out_trade_no="out_trade_no",
    scene="bar_code/wave_code",
    auth_code="auth_code",
    subject="subject",
    discountable_amount=10,
    total_amount=20,
    notify_url="https://example.com/notify" # необязательно, если не указано, используется по умолчанию notify url
)
if result["code"] == "10000":
    print("Заказ оплачен")

Предварительное создание транзакции (сканирование для оплаты) alipay.trade.precreate

alipay = AliPay(appid="", ...)

# создание заказа
alipay.api_alipay_trade_precreate(
    subject="test subject",
    out_trade_no="out_trade_no",
    total_amount=100
)

# проверка статуса заказа
оплачен = False
for i in range(10):
    # проверка каждые 3 секунды, всего 10 раз
    print("ожидание 3 секунды")
    time.sleep(3)
    result = alipay.api_alipay_trade_query(out_trade_no="out_trade_no")
    if result.get("trade_status", "") == "TRADE_SUCCESS":
        оплачен = True
        break
    print("не оплачен...")

# если заказ не оплачен в течение 30 секунд, отменить заказ
if оплачен is False:
    alipay.api_alipay_trade_cancel(out_trade_no=out_trade_no)

Возврат alipay.trade.refund

Параметры для возврата описаны в официальной документации

result = alipay.api_alipay_trade_refund(out_trade_no="xxx", refund_amount="xxx", ...)

if result["code"] == "10000":
    print("успешно")

Проверка возврата alipay.trade.fastpay.refund.query```python

result = alipay.api_alipay_trade_fastpay_refund_query("20171120", out_trade_no="20171120")

result = { 'code': '10000', 'msg': 'Успех', 'out_request_no': '20171120', 'out_trade_no': '20171120', 'refund_amount': '20.00', 'total_amount': '20.00', 'trade_no': '2017112021001004070200297107' }


#### <a name="alipay.trade.order.settle"></a>Унифицированный расчет транзакций [alipay.trade.order.settle](https://docs.open.alipay.com/api_1/alipay.trade.order.settle/)

```python
result = alipay.api_alipay_trade_order_settle(
    out_request_no,
    trade_no,
    royalty_parameters
)

Унифицированный закрытие транзакции alipay.trade.close

result = alipay.api_alipay_trade_close(
    trace_no="xxx",
    out_trade_no="xxx",
    operator_id="this is optional"
)

result = {
     "code": "10000",
     "msg": "Успех",
     "trade_no": "2013112111001004500000675971",
     "out_trade_no": "YX_001"
}

Перевод средств на支付宝账户接口 alipay.fund.trans.toaccount.transfer

# transfer money to alipay account
result = alipay.api_alipay_fund_trans_toaccount_transfer(
    datetime.now().strftime("%Y%m%d%H%M%S"),
    payee_type="ALIPAY_LOGONID/ALIPAY_USERID",
    payee_account="csqnji8117@sandbox.com",
    amount=3.12
)
result = {'code': '10000', 'msg': 'Успех', 'order_id': '', 'out_biz_no': '', 'pay_date': '2017-06-26 14:36:25'}

查询转账订单接口 alipay.fund.trans.order.query

result = alipay.api_alipay_fund_trans_order_query(
    out_biz_no="2bk20170626152216"
)
print(result)

ISV 集成

在开始前,请务必阅读官方文档

生成app_auth_code alipay.open.auth.token.app

isv_alipay = ISVAliPay(
    ...
    app_auth_code="app_auth_code"
)
``````markdown
Тип документа для перевода: markdown
Язык исходного текста: китайский и английский
Язык финального текста: русский

# alipay

## Установка

```bash
pip install alipay

Пример использования

response = isv_alipay.api_alipay_open_auth_token_app()
response = {
    "code": "10000",
    "msg": "Success",
    "app_auth_token": "201708xxx",
    "app_refresh_token": "201708xxx",
    "auth_app_id": "appid",
    "expires_in": 31536000,
    "re_expires_in": 32140800,
    "user_id": "2088xxxxx"
}

Получение токена авторизации приложения

response = isv_alipay.alipay_open_auth_token_app_query()

Тестирование

python -m unittest discover

или вы можете передать debug=True для ручного тестирования

alipay = AliPay(..., debug=True)

История изменений


Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/fastsource-alipay.git
git@api.gitlife.ru:oschina-mirror/fastsource-alipay.git
oschina-mirror
fastsource-alipay
fastsource-alipay
master