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

OSCHINA-MIRROR/fastsource-alipay

Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

python-alipay-sdk

PyPI версия codecov travis-ci

Документация на китайском

https://github.com/fzlee/alipay/blob/master/README.zh-hans.md

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

На данный момент поддерживаются следующие функции:

Если вас интересуют детали подписи запросов на оплату, ознакомьтесь с этим руководством.

РУЧЕДИЕ

Установка

# установка
pip install python-alipay-sdk --upgrade
# Для Python 2 используйте: 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
```Публичный ключ, загруженный с open.alipay.com, представляет собой строку, которую напрямую не распознает эта библиотека, убедитесь, что он окружен

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


Также есть [пример](https://github.com/fzlee/alipay/blob/master/tests/certs/ali/ali_public_key.pem) для вашего ознакомления

#### Инициализация
```python
from alipay import AliPay, DCAlipay, ISVAliPay
from alipay.utils import AliPayConfig

Убедитесь, что ваш файл ключа соответствует стандартам.

вы можете найти примеры в tests/certs/ali/ali_private_key.pem

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, # стандартный уведомительный путь app_private_key_string=app_private_key_string, # публичный ключ alipay, не используйте свой собственный публичный ключ! alipay_public_key_string=alipay_public_key_string, sign_type="RSA", # RSA или RSA2 debug=False, # по умолчанию False config=AliPayConfig(timeout=15) # опционально, таймаут запроса )

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 не должны быть None

isv_alipay = ISVAliPay( appid="", app_notify_url=None, # стандартный уведомительный путь app_private_key_string="", # публичный ключ alipay, не используйте свой собственный публичный ключ! alipay_public_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: подписывает запрос с вашим приватным ключом, несколько API Alipay недоступны
  • DCAliPay: подписывает запрос с сертификатом
  • ISVAliPay: используется, когда вам нужно размещать несколько сервисов Alipay

DCAliPay необходим для некоторых API Alipay

Конвенция именования

Для функции Alipay, например alipay.trade.page.pay, мы определяем соответствующую функцию alipay.api_alipay_trade_page_pay()

Обычно мы делаем такую трансформацию: function_name = "api_" + alipay_function_name.replace(".", "_")

Согласно документации Alipay, некоторые параметры в biz_content являются необязательными, а некоторые — обязательными. Мы определяем функции таким образом, чтобы вы могли добавлять эти необязательные параметры в kwargs:

def api_alipay_xxx(self, out_trade, total_amount, **kwargs):
    ...
    biz_content.update(kwargs)

alipay.trade.page.pay

# Для пользователей Python 2 (вы должны подумать о переходе на Python 3),
# убедитесь, что строки с не-ASCII символами закодированы в utf-8
subject = u"тестовый заказ".encode("utf8")
# Для пользователей Python 3, просто используйте стандартную строку
subject = "测试订单"

# Оплата через веб, откройте этот URL в вашем браузере: 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" # этот параметр необязателен
)
```#### <a name="alipay.trade.wap.pay"></a>[alipay.trade.wap.pay](https://docs.open.alipay.com/60/104790)

```python
# Оплата через WAP, откройте этот URL в вашем браузере: 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="http://example.com",
    notify_url="https://example.com/notify" # этот параметр необязателен
)

alipay.trade.app.pay

# Оплата через приложение, просто передайте order_string в ваш Android или iOS клиент
order_string = alipay.api_alipay_trade_app_pay(
    out_trade_no="20161112",
    total_amount=0.01,
    subject=subject,
    notify_url="https://example.com/notify" # этот параметр необязателен
)

alipay.trade.create

# Оплата через мини-программу
alipay.api_alipay_trade_create(
    out_trade_no="20161112",
    total_amount=0.01,
    subject=subject,
    buyer_id="",
    notify_url="https://example.com/notify" # этот параметр необязателен
)

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

После оплаты заказа будет отправлен POST-запрос, содержащий информацию об этом заказе. Вот простой пример для flask веб-сервера:

import json
from flask import Flask
from flask import request
app = Flask(__name__)

@app.route('/', methods=["GET", "POST"])
def hello_world():
    data = request.form.to_dict()
    # подпись должна быть удалена
    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("транзакция успешна")
    return 'Привет, Мир!'
```И также пример для Django
```python

def hello_world(request):
    # для пользователей Django
    data = request.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("транзакция успешна")
    return 'Привет, мир!'

Вот более общий пример для проверки

# сбор всех параметров, отправленных от сервера Alipay, и помещение их в словарь под названием data
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("транзакция успешна")

alipay.trade.pay

alipay = AliPay(appid="", ...)
``````markdown
result = alipay.api_alipay_trade_pay(
    out_trade_no="out_trade_no",
    scene="bar_code/wave_code",
    auth_code="auth_code",
    subject="тема",
    discountable_amount=10,
    total_amount=20,
    notify_url="https://example.com/notify" # это необязательно
)
``````python
if result["code"] == "10000":
    print("Заказ оплачен")
```#### <a name="alipay.trade.precreate"></a>[alipay.trade.precreate/alipay.trade.cancel/alipay.trade.query](https://docs.open.alipay.com/194/105203/)
```python
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

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

result = {
    'code': '10000',
    'msg': 'Success',
    'out_request_no': '20171120',
    'out_trade_no': '20171120',
    'refund_amount': '20.00',
    'total_amount': '20.00',
    'trade_no': '2017112021001004070200297107'
}

alipay.trade.order.settle

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

alipay.trade.close```python

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

result = { "code": "10000", "msg": "Success", "trade_no": "2013112111001004500000675971", "out_trade_no": "YX_001" }


#### <a name="alipay.fund.trans.toaccount.transfer"></a>[alipay.fund.trans.toaccount.transfer](https://docs.open.alipay.com/api_28/alipay.fund.trans.toaccount.transfer)
```python
# перевод средств на алипай аккаунт
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': 'Success', 
    '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="20170626152216"
)
print(result)

Интеграция ISV

Прежде чем приступить к работе, ознакомьтесь с подробностями, иначе это может вызвать проблемы.

alipay.open.auth.token.app

isv_alipay = ISVAliPay(
    ...
    app_auth_code="app_auth_code"
)

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"
}

alipay.open.auth.token.app.query

response = isv_alipay.alipay_open_auth_token_app_query()

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

python -m unittest discover

Или вы можете выполнить тестирование вручную следующим образом, debug=True направит ваш запрос в среду тестирования:

alipay = AliPay(..., debug=True)
```## [Журнал изменений](https://github.com/fzlee/alipay/blob/master/CHANGELOG.md)

Комментарии ( 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