Python Djangoフレームワーク--アリペイの支払い機能を追加
5580 ワード
Python Djangoフレームワーク--アリペイの支払い機能を追加
アリペイはPython SDKを提供していません.プリペイドオーダーの生成にはSHA 1 withRSA署名が必要で、署名の生成が面倒でエラーが発生しやすい.ここでは、Pythonの開発プロセスを簡素化するための簡単なライブラリを提供しています.
インストール&開発ドキュメントの説明
pythonドッキングアリペイSDKインストール:
アリペイ開発ドキュメントのクイックアクセス:https://docs.open.alipay.com/270/105899/
アクセスステップ
1.アプリケーションの作成
アリペイ開発者として登録し、アプリケーションを作成してAPPIDを取得します.
2.アプリケーションの公開鍵&秘密鍵の生成
次のコマンドを使用して、アプリケーションの公開鍵&鍵ファイルを作成し、アプリケーションの公開鍵をalipayに設定し、alipayの公開鍵をアプリケーションファイルにコピーします(payサブアプリケーションでkeysディレクトリを作成し、アプリケーションの秘密鍵&alipay公開鍵をそれぞれ格納します).
3 .構築&構成開発環境(砂箱環境のテスト開発使用)
4.開発ドキュメント&アリペイドッキングプロセスにより、インタフェースを呼び出す
具体的なコードは以下の通りです.
-------------------------- END ------------------------
アリペイはPython SDKを提供していません.プリペイドオーダーの生成にはSHA 1 withRSA署名が必要で、署名の生成が面倒でエラーが発生しやすい.ここでは、Pythonの開発プロセスを簡素化するための簡単なライブラリを提供しています.
インストール&開発ドキュメントの説明
pythonドッキングアリペイSDKインストール:
pip install python-alipay-sdk --upgrade
pythonドッキングアリペイSDK:https://github.com/fzlee/alipay/blob/master/README.zh-hans.md アリペイ開発ドキュメントのクイックアクセス:https://docs.open.alipay.com/270/105899/
アクセスステップ
1.アプリケーションの作成
アリペイ開発者として登録し、アプリケーションを作成してAPPIDを取得します.
2.アプリケーションの公開鍵&秘密鍵の生成
次のコマンドを使用して、アプリケーションの公開鍵&鍵ファイルを作成し、アプリケーションの公開鍵をalipayに設定し、alipayの公開鍵をアプリケーションファイルにコピーします(payサブアプリケーションでkeysディレクトリを作成し、アプリケーションの秘密鍵&alipay公開鍵をそれぞれ格納します).
openssl
#
genrsa -out app_private_key.pem 2048
#
rsa -in app_private_key.pem -pubout -out app_public_key.pem
3 .構築&構成開発環境(砂箱環境のテスト開発使用)
# -
ALIPAY_APPID = "20160917xxx" # appid
ALIPAY_URL = "https://openapi.alipaydev.com/gateway.do" #
ALIPAY_DEBUG = True # DEBUG
#
APP_PRIVATE_KEY_PATH = os.path.join(BASE_DIR, 'apps/pay/keys/app_private_key.pem')
#
ALIPAY_PUBLIC_KEY_PATH = os.path.join(BASE_DIR, 'apps/pay/keys/alipay_public_key.pem')
4.開発ドキュメント&アリペイドッキングプロセスにより、インタフェースを呼び出す
具体的なコードは以下の通りです.
from alipay import AliPay
from rest_framework import status
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework.permissions import IsAuthenticated
from mall import settings
from orders.models import OrderInfo
from pay.models import Payment
class AlipayView(APIView):
"""
-
:
GET /pay/orders/(?P/d+)/
: order_id
: alipay_url
"""
permission_classes = [IsAuthenticated]
def get(self, request, order_id):
user = request.user
# 1. order_id,
try:
order = OrderInfo.objects.get(pk=order_id, user=user,
status=OrderInfo.ORDER_STATUS_ENUM['UNPAID'])
except OrderInfo.DoesNotExist:
return Response(status=status.HTTP_400_BAD_REQUEST)
# 2. alipay , order_string, alipay url
app_private_key_string = open("apps/pay/keys/app_private_key.pem").read()
alipay_public_key_string = open("apps/pay/keys/alipay_public_key.pem").read()
alipay = AliPay(
appid=settings.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="RSA2", # RSA RSA2
debug = settings.ALIPAY_DEBUG, # False
)
# Python 3 ,
subject = " "
# , https://openapi.alipay.com/gateway.do? + order_string
order_string = alipay.api_alipay_trade_page_pay(
out_trade_no=order_id, # order_id
total_amount=str(order.total_amount), # , str , JSON Decimal
subject=subject,
return_url='http://www.DJ.com:8080/pay_success.html', #
notify_url=None # , notify url
)
# url
alipay_url = settings.ALIPAY_URL + '?' + order_string
# alipay_url
return Response({'alipay_url': alipay_url})
class AlipayStatusView(APIView):
"""
-
POST /pay/payment/status/?
:
1. data, signature
2. alipay , data & signature ,
3. , & , ( - ), &
4. ,
"""
def post(self, request):
# , , signature
data_dict = request.query_params.dict()
signature = data_dict.pop('sign')
# alipay , data & signature ,
app_private_key_string = open("apps/pay/keys/app_private_key.pem").read()
alipay_public_key_string = open("apps/pay/keys/alipay_public_key.pem").read()
alipay = AliPay(
appid=settings.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="RSA2", # RSA RSA2
debug=settings.ALIPAY_DEBUG, # False
)
success = alipay.verify(data_dict, signature)
if success:
order_id = data_dict.get('out_trade_no') #
trade_id = data_dict.get('trade_no') #
# , & , ( - )
Payment.objects.create(order_id=order_id, trade_id=trade_id)
OrderInfo.objects.filter(pk=order_id).update(
status=OrderInfo.ORDER_STATUS_ENUM['UNSEND'])
return Response({'trade_id':trade_id}, status=status.HTTP_200_OK)
else:
return Response({'message':' '}, status=status.HTTP_400_BAD_REQUEST)
-------------------------- END ------------------------