Python Djangoフレームワーク--アリペイの支払い機能を追加

5580 ワード

Python Djangoフレームワーク--アリペイの支払い機能を追加
アリペイはPython SDKを提供していません.プリペイドオーダーの生成にはSHA 1 withRSA署名が必要で、署名の生成が面倒でエラーが発生しやすい.ここでは、Pythonの開発プロセスを簡素化するための簡単なライブラリを提供しています.
 
インストール&開発ドキュメントの説明
pythonドッキングアリペイSDKインストール:pip install python-alipay-sdk --upgradepythonドッキングアリペイ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 ------------------------