一:瞭解對接支付寶支付沙箱環境過程:

支付寶批量付款文件模板 java實現方法_python


支付寶批量付款文件模板 java實現方法_python_02

二:準備工作:

1: 創建應用payment:

1:創建應用
python3 ../manage.py startapp payment
2:註冊應用dev.py:
INSTALLED_APPS = [
    'apps.payment',
]
3:註冊總路由和子路由:
urlpatterns = [
    path("", include('apps.payment.urls')),
]
urlpatterns = [
  
]

2:安裝alipay第三方包:

pip install python-alipay-sdk==1.8.0 -i https://pypi.tuna.tsinghua.edu.cn/simple

3:配置RSA2公私密鑰:
3.1:在payment裏面創建keys文件夾專門存儲密鑰:
3.2:生成美多商城公私密鑰:

(django_env) python@ubuntu:~/Desktop/meimei_project/meiduo_mall/apps$ cd payment/keys
(django_env) python@ubuntu:~/Desktop/meimei_project/meiduo_mall/apps/payment/keys$ openssl
OpenSSL> genrsa -out app_private_key.pem 2048 
Generating RSA private key, 2048 bit long modulus
........................................................................................................................................................+++
................................................+++
e is 65537 (0x10001)
OpenSSL> rsa -in app_private_key.pem -pubout -out app_public_key.pem 
writing RSA key
OpenSSL> exit

3.3:密鑰交換:

支付寶批量付款文件模板 java實現方法_django_03


支付寶批量付款文件模板 java實現方法_django_04


3.4:增加配置信息:

# 對接支付寶
ALIPAY_APPID = '自己的ID' # 應用ID
ALIPAY_DEBUG = True # 調試模式,對接沙箱應用時為True,對接正式應用時為False
ALIPAY_URL = 'https://openapi.alipaydev.com/gateway.do' # 對接支付寶的網關,如果對接沙箱應用就是測試網關
ALIPAY_RETURN_URL = "http://www.meiduo.site:8080/pay_success.html" # 支付成功後的回調地址

三:視圖實現:

1:編輯apps/payment/views.py實現視圖

# 支付接口1:掃碼支付頁面url獲取
import os

from alipay import AliPay
from django.conf import settings
from django.http import JsonResponse
from django.views import View

from apps.orders.models import OrderInfo


class PaymentView(View):
    def get(self, request, order_id):
        # 1、提取參數
        # 2、校驗參數
        # 3、業務處理 —— 調用支付寶sdk獲取掃碼支付url
        # (1)、構建alipay支付對象
        alipay = AliPay(
            settings.ALIPAY_APPID,  # 支付應用id
            app_notify_url=None,  # 支付成功之後,支付寶回調地址
            app_private_key_path=os.path.join(
                os.path.dirname(os.path.abspath(__file__)),
                'keys/app_private_key.pem'
            ),
            alipay_public_key_path=os.path.join(
                os.path.dirname(os.path.abspath(__file__)),
                'keys/alipay_public_key.pem'
            ),
            sign_type='RSA2',
            debug=settings.ALIPAY_DEBUG

        )

        try:
            order = OrderInfo.objects.get(pk=order_id)
        except OrderInfo.DoesNotExist as e:
            print(e)
            return JsonResponse({'code': 400, 'errmsg': '訂單不存在'})

        # (2)、找對象裏面的方法獲取支付參數
        # api_alipay_trade_page_pay:獲取網頁端支付頁面url參數
        query_params = alipay.api_alipay_trade_page_pay(
            subject='美多商城支付%s' % order_id,
            out_trade_no=order_id,
            total_amount=float(order.total_amount),
            return_url=settings.ALIPAY_RETURN_URL,  # 用户支付成功,請求美多的頁面
        )

        # 掃碼支付要麼鏈接是:'https://openapi.alipaydev.com/gateway.do?<支付參數>'
        # (3)、拼接支付掃碼頁面url
        alipay_url = settings.ALIPAY_URL + '?' + query_params

        # 4、構建響應
        return JsonResponse({'code': 0, 'errmsg': 'ok', 'alipay_url': alipay_url})

2:路由:

from django.urls import re_path
from . import views

urlpatterns = [
  	# 支付接口1:獲取掃碼支付頁面url
    re_path(r'^payment/(?P<order_id>\d+)/$', views.PaymentView.as_view()),

]

3:編輯apps/payment/models.py新建模型類遷移建表

from django.db import models
from apps.orders.models import OrderInfo
from meiduo_mall.utils.models import BaseModel

class Payment(BaseModel):
    """支付信息"""
    order = models.ForeignKey(OrderInfo, on_delete=models.CASCADE, verbose_name='訂單')
    trade_id = models.CharField(max_length=100, unique=True, null=True, blank=True, verbose_name="支付編號")

    class Meta:
        db_table = 'tb_payment'

4:遷移建表:

python3 manage.py makemigrations
python3 manage.py migrate

5:編輯apps/payment/views.py實現視圖

# 接口二:支付成功,訂單號綁定
class PaymentStatusView(View):

    def get(self, request):
        alipay = AliPay(
            settings.ALIPAY_APPID,  # 支付應用id
            app_notify_url=None,  # 支付成功之後,支付寶回調地址
            app_private_key_path=os.path.join(
                os.path.dirname(os.path.abspath(__file__)),
                'keys/app_private_key.pem'
            ),
            alipay_public_key_path=os.path.join(
                os.path.dirname(os.path.abspath(__file__)),
                'keys/alipay_public_key.pem'
            ),
            sign_type='RSA2',
            debug=settings.ALIPAY_DEBUG

        )

        # 1、校驗支付寶參數
        data = request.GET # Django查詢字符串參數,類型是QueryDict
        data = data.dict() # QueryDict  轉化成  dict
        sign = data.get('sign') # 簽名 --> 使用該簽名參數校驗支付數據的有效性

        if not alipay.verify(data, signature=sign):
            # 校驗失敗,參數有誤
            return JsonResponse({'code': 400, 'errmsg': '支付有誤'})

        out_trade_no = data.get('out_trade_no') # 接口1中傳遞的order_id
        trade_no = data.get('trade_no') # 支付寶訂單流水號

        try:
            Payment.objects.create(
                order_id=out_trade_no, # 美多訂單號
                trade_id=trade_no # 支付寶訂單流水號
            )
        except Exception as e:
            print(e)
            return JsonResponse({'code': 500, 'errmsg': '新建支付訂單失敗'})

        order = OrderInfo.objects.get(pk=out_trade_no)
        order.status = OrderInfo.ORDER_STATUS_ENUM['UNSEND']
        order.save()


        # 2、綁定美多商城訂單
        return JsonResponse({'code': 0, 'errmsg': 'ok', 'trade_id': trade_no})

6:配置路由:

from django.urls import re_path
from . import views

urlpatterns = [
  	# 支付接口2:綁定支付訂單
    re_path(r'^payment/status/$', views.PaymentStatusView.as_view()),
]