Proyecto de sitio web de Django fuera de línea pago de escaneo de código QR

1. Trabajo preliminar

 

 

  •  La forma de configurar la clave debe descargarse para generar una herramienta clave para Alipay: la dirección y el código de extracción del kit de herramientas:

    Enlace: https://pan.baidu.com/s/1AXK3s4SBowNp1K47Qc1QHw
    código de extracción: 2u04

 

  Ejecute el archivo .exe

  

 

  •  Copie el contenido de my_private_key.pem y asegúrese de que no contenga caracteres como espacios y saltos de línea; complete el contenido copiado en la configuración de la clave RSA2 en la primera imagen, y la clave pública Alipay se generará, copiará y almacenará en el archivo alipay_public_key.pem

Descarga del kit de herramientas del SDK de Python (es terrible)

  • Durante el proceso de descarga, Alipay proporcionó oficialmente el kit de herramientas SDK, ejecútelo en la línea de comando cmd: pip install alipay-sdk-pythoon. Si no hay errores durante el proceso de descarga, entonces tienes suerte; si informas de un error, felicitaciones por haber entrado en el pozo. No se preocupe, ya que dije eso, tengo la capacidad de ayudarlo a resolver problemas.

 

 

 

En el proceso de descarga, definitivamente se encontrará con la situación anterior. Cuando descargue el SDK, necesitará los tres paquetes de dependencia en el cuadro rojo de arriba. Para el primer y segundo, puede descargarlo usted mismo, o él lo ayudará Se ha descargado, pero parece que el tercer paquete no se puede descargar. Después de mi extensa búsqueda, parece estar descargando otro paquete similar a este. Este paquete es su pycryptodome de extensión. Entonces debes ir a pip install pycryptodome. Pero cuando descargue este paquete, seguirá informando el mismo error que el anterior. Por lo tanto, el paquete SDK que nos proporcionó la plataforma de desarrolladores de Alipay no se puede descargar.

  • Resolución de problemas: después de mi búsqueda hacia arriba y hacia abajo, accidentalmente vi otro método de descarga. Este método es usar el paquete de dependencia pycryptodome, luego puede descargarlo directamente:

pip install python-alipay-sdk

Esta descarga será correcta.

Crear aplicación de proyecto

  • Ingrese el directorio del proyecto y ejecute: python manage.py startapp payment
  • Luego cree el mismo directorio que la siguiente figura (solo mire el directorio de la aplicación de pago, el color del archivo no importa) pegue el archivo de clave pública de clave privada previamente guardado en el directorio de claves

 

 

 

  • Aquí, se omite la configuración de la url principal y se ingresa directamente la configuración de la url secundaria.
    • archivo urls.py
de django.urls importación camino
 de . importación ve 

APP_NAME = ' [Pago] ' 
los urlpatterns = [ 
    ruta ( " alipay / " , views.AliPayView.as_view (), name = " Alipay " ),    # Alipay 
    ruta ( " check_pay / "views.CheckPayView.as_view (), name = " check_pay " ),    # verifique el pago es completa 
]
  • El archivo de vista es muy importante
    • Cree estas dos clases por separado y defina primero los objetos Alipay fuera de la clase. Creo que todos han visto la creación de muchos objetos Alipay. Los parámetros de sus objetos de inicialización son diferentes. Debido a que no descargaron el kit de herramientas SDK, todos deberían ir a github y copiar una copia del kit de herramientas Alipay empaquetado por otros. Por lo tanto, llamar a métodos usando objetos es algo diferente. Si descargó el kit de herramientas del SDK, seguir mis pasos no será incorrecto. Todavía no puedo seguir ciegamente el código de otras personas, mira el código fuente y su implementación. No tiene mucho sentido, puse el código (lo escribí parte por parte aquí, lo cual es útil para comprender y me permite mejorar mi memoria, pero todo está en el mismo archivo views.py) P
    • El primer paso es inicializar los objetos de nuestra clase Alipay. Primero, echemos un vistazo al código fuente de la clase Alipay. Hereda la clase BasePay, así que mire directamente el código fuente de la clase BasePay. Iré directamente al uso y lugar actuales. Método: AliPay ——> BaseAliPay ——> Ver su método de inicialización __init__, principalmente ver dónde agrego comentarios, parece que no es para cargar el archivo de clave privada de la aplicación y el archivo de clave pública Alipay, la última oración es llamar para cargar estos dos archivos El método método-> _ load_key, los comentarios dentro son muy importantes, no se copian aquí, el contenido principal es que necesitamos el contenido del formato de archivo pem, y el encabezado y el final del archivo deben agregar ----- lenguaje descriptivo- ----. Cuando explore el método _load_key, sabrá por qué necesita el archivo pem y los estilos de encabezado y avance. Luego, al leer el archivo, también debe leerlo de la siguiente manera: por supuesto, si puede garantizar que el contenido obtenido sea el mismo, la forma de leer el archivo puede ser inconsistente.
def  __init__ ( 
        self, 
        appid, 
        app_notify_url, 
        app_private_key_string = None,     
        alipay_public_key_string = None,   
        sign_type = " RSA2 " , 
        debug = False 
    ): 
        "" " 
        初始化: 
        alipay = AliPay ( 
          appid =" ", 
          app_notify_url =" ejemplo .com ", 
          sign_type =" RSA2 " 
        ) 
        " "" 
        self._appid = str (appid) 
        self._app_notify_url= App_notify_url 

        #   es contenido my_private_key.pem dentro 
        self._app_private_key_string = app_private_key_string 

        #   es contenido alipay_public_key.pem dentro 
        self._alipay_public_key_string = alipay_public_key_string 

        self._app_private_key = Ninguno 
        self._alipay_public_key = Ninguno
         IF sign_type no  en ( " RSA " , " RSA2 " ):
             elevar AliPayException (Ninguno, " Tipo de signo no compatible {} ".format (sign_type)) 
        self._sign_type = sign_type 

        si la depuración es True: 
            self._gateway = " https://openapi.alipaydev.com/gateway.do " 
        else : 
            self._gateway = " https://openapi.alipay. com / gateway.do " 

        # carga el archivo de clave inmediatamente 

        #   Aquí está la clave, pero también la clave para 
        self._load_key ()
Método de inicialización AliPay __init__
from alipay import AliPay 

my_private_key = "" 
alipay_public_key = "" 
con open ( " ./payment/key/my_private_key.pem " ) como f1:
     para leer en f1.readlines (): 
        my_private_key + = leer 

con open ( " ./payment /key/alipay_public_key.pem " ) como f2:
     para leer en f2.readlines (): 
        alipay_public_key + = leer 
alipay = AliPay (appid = ' 2016102100732430 ', 
                app_notify_url = ' http://127.0.0.1:8000/payment/check_pay/ ' , 
                app_private_key_string = my_private_key, 
                alipay_public_key_string = alipay_public_key, 
                debug = True)
    • En este momento podemos emitir una solicitud en el front end, como hacer una solicitud como pago. El front end obtiene esa dirección y realiza una redirección.
clase AliPayView (ListAPIView):
     # aquí es definir un número de orden global 
    order_id = Ninguno 

    DEF GET (Ser, Request):
         "" " 
        pago de solicitud del código bidimensional adquirida Alipay 
        : solicitud param: Solicitud es 
        : rendimiento: contiene pagar dos Dirección de solicitud de código de dimensión 
        "" " 
        all_price = request.GET.get ( " all_price " ) 
        AliPayView.order_id = request.GET.get ( " order_id " ) 

        params = alipay.api_alipay_trade_page_pay ( 
            subject = " compra de productos " ,        # Nombre de cargo
            str = out_trade_no (uuid.uuid4 ()),    # número de orden del comerciante, único, más cómodo de usar UUID 
            TOTAL_AMOUNT = all_price,       # de frente calcular el precio de 
            # esto es clave, aquí es el tiempo para hacer frente a la necesidad de verificar una solicitud de pago 
            return_url = " http://127.0.0.1:8000/payment/check_pay/ " ,     
        ) 
        # dirección de pasarela de pago del tesoro: debug = Falso, ya que es la dirección de la caja de arena 
        url = alipay._gateway + " ? " + params 

        regresar la respuesta ( data = { " url " : url})
    • Cuando usamos el sandbox Alipay para escanear el código y el pago es exitoso, emitirá la solicitud de obtención de la dirección return_url anterior como el servidor, y llevará los parámetros de parámetros mencionados anteriormente, y habrá un inicio de sesión en los parámetros, que requiere que el objeto AliPay llame a la verificación de firma Método verificar, su valor de retorno es un valor booleano
clase CheckPayView (APIView): 

    def get (self, request):
         "" " 
        Verifique si el usuario ha pagado correctamente, debe modificar el estado del pedido si el pago se realizó correctamente 
        :: 
        param request: Solicitud obtenida 
        : devolución: redirigir a la página de pedido " "" 
        params = request.GET.dict () 
        sign = params.pop ( " sign " )
         if alipay.verify (params, sign): 
            order = Orders.objects.get (pk = AliPayView.order_id) 
            order.status = 2 
            order. save () 
        return redirect (reverse ( " operaciones: orden " ))
    • De esta forma se ha escrito el archivo views.py

 

Supongo que te gusta

Origin www.cnblogs.com/aitiknowledge/p/12699694.html
Recomendado
Clasificación