python - alipay sdk 使用 及 注意點


一. 在 點擊跳轉 這里拿到自己的 appid  和  支付寶公鑰 ,

   如果想要得到 支付寶的公鑰 就需要獲取 應用的公鑰,具體獲取方式 :

    獲取應用公鑰和私鑰

  a. 應用私鑰和支付寶公鑰 獲取 和 配置 過程:  

  1. 下載后打開文件夾  點擊  RSA簽名驗簽工具.bat   然后生成密鑰 , 然后退出就行了

  2. 找到 RSA密鑰 的文件夾 , 將里面的 應用公鑰 復制一下 , 然后在 沙箱應用 中點擊 查看應用公鑰,

   點擊修改,將剛才的 應用公鑰 粘貼上去,然后保存,此刻你會多一個支付寶公鑰 ( 注: 當你修改應用公鑰后,支付寶公鑰會自動生成 )

  3. 准備兩個文本文件名為( 文件名隨意,注意規范 ) :

      alipay_public_2048.txt (存放支付寶公鑰) 和 app_private_2048.txt (存放應用私鑰)

     這里注意兩點 :

     1. 應用私鑰指的是 剛剛 RSA密鑰 文件夾中 的應用私鑰 ,而 公鑰指的是 剛剛上傳 應用公鑰后給你自動生成的 應用公鑰

     2. 將應用私鑰和支付寶公鑰保存在 文本中的時候 要添加 一個標識 ( 必須加 ):

       - 打開 alipay_public_2048.txt(存放支付寶公鑰) 這個空文本 格式是這樣的:

           -----BEGIN PUBLIC KEY-----

           中間放入你的支付寶公鑰

        -----END PUBLIC KEY-----

         - 打開 app_private_2048.txt (存放應用私鑰)這個空文本 格式是這樣的:

        -----BEGIN RSA PRIVATE KEY-----

            中間放你的應用私鑰

        -----END RSA PRIVATE KEY-----

 

  b. 下載工作

  1. 配置服務端 sdk -- 官方鏈接 :https://pypi.org/project/alipay-sdk-python/

pip install python-alipay-sdk --upgrade

   2. 導入加密模塊

pip install Crypto 

 

二:示例代碼

   - Url

urlpatterns=[
    url(r"^index/$",views.index),   # 商品頁面 API
    url(r"^back_url/$",views.back_url),    # 支付成功后的重定向 API
    url(r"^update_order/$",views.back_url),    # 支付成功后的異步POST請求 API
]

 

  - Views

from django.shortcuts import render,HttpResponse,redirect
from django.views.decorators.csrf import csrf_exempt    # 取消 csrf組件
import time
from alipay import AliPay

def Alipay():
    alipay = AliPay(
        appid='2016092800613180',  # appid (詳細在你的沙箱應用中的 APPID)
        app_notify_url='http://127.0.0.1:8045/update_order/',  # 異步回調url(回調地址需是服務器地址,否則接收不到回調結果)
        app_private_key_path='app_test/app_private_2048.txt',   # 應用私鑰
        alipay_public_key_path='app_test/alipay_public_2048.txt', # 支付寶公鑰
        sign_type="RSA2",  # RSA 或者 RSA2 -- 這里注意一點:2018年1月5日后創建的應用只支持RSA2的格式;
        debug=True,  # 默認False -- 設置為True則是測試模式,正式上線的話改為 False就行了
    )
    return alipay

def index(request):
   """
      # 這里發起POST的支付請求 
    """
    if request.method == 'GET':
        return render(request,'index.html')
    alipay = Alipay()
    out_trade_no = "x2" + str(time.time())
    order_string = alipay.api_alipay_trade_page_pay(
        out_trade_no=out_trade_no,  # 訂單號 - 注 : 每次的訂單號不能一致
        total_amount=0.01,  #  商品價格
        subject='shop_name',  # 商品名稱
        return_url = 'http://127.0.0.1:8045/back_url/',     # 支付成功后 - 重定向自己的網站
        notify_url='http://127.0.0.1:8045/update_order/'    # 支付成功后 - 異步發送支付結果到回調地址(地址需是服務器地址,否則無法接收到回調結果)
    )

    pay_url = "https://openapi.alipaydev.com/gateway.do?{}".format(order_string)
                                    # 注 :這里結尾不能加 /
    return redirect(pay_url)

def back_url(request):
    """
     # 支付成功后的回調函數 -- 重定向自己的網站
   # 同時在重定向之前會校驗此次支付信息是否正確
    :param request:
    :return:
    """
    params = request.GET.dict()
    sign = params.pop('sign', None)
    print(params)
    alipay = Alipay()
    status = alipay.verify(params, sign)    # 返回 True or False
    if status:
        return HttpResponse('支付成功')
    return HttpResponse('支付失敗')



@csrf_exempt
def update_order(request):
    """
    支付成功后,支付寶向該地址發送的POST請求(用於修改訂單狀態)
    :param request:
    :return:
    """
    if request.method == 'POST':
        from urllib.parse import parse_qs

        body_str = request.body.decode('utf-8')
        post_data = parse_qs(body_str)

        post_dict = {}
        for k, v in post_data.items():
            post_dict[k] = v[0]

        alipay = Alipay()

        sign = post_dict.pop('sign', None)
        status = alipay.verify(post_dict, sign)
        if status:
            # 1. 獲取訂單號(獲取的訂單號是你上面的參數: out_trade_no)
            out_trade_no = post_dict.get('out_trade_no')
            print(out_trade_no)
            # 2. 根據訂單號將數據庫中的數據進行更新(修改訂單狀態)
            return HttpResponse('success')
       # 3. 最終需要返回 "success" 字符給支付寶,否則支付寶將一直請求該地址並發送回調結果(具體看官方文檔) return HttpResponse('success')  

 

 - AliPay 中的加密配置(本身就是配置好的,但是如果驗證出問題了,看看這里對不對): 
from datetime import datetime
from Crypto.PublicKey import RSA
from Crypto.Signature import PKCS1_v1_5
from Crypto.Hash import SHA256
from urllib.parse import quote_plus
from urllib.parse import urlparse, parse_qs
from base64 import decodebytes, encodebytes
import json
 
        

 三:最后總結一點容易出現的錯誤 和 一些方法的說明

    - return_url :支付成功后 - 重定向自己的網站

  - notify_url :支付成功后 - 發送的POST訂單驗證消息(異步)

  - out_trade_no :這個是訂單號 -- 注意一點,千萬不要測試的時候每次使用一個同一個訂單號,否則會出現支付頁面無法打開的問題

  - debug = True / False :如果等於 True 的話就是測試環境的支付,如果是 False 就是正式環境的支付

  - app_private_key_path :后面寫 應用的私鑰 路徑位置

  - alipay_public_key_path : 后面寫 支付寶的公鑰 路徑位置

  - sign_type = "RSA2" :可以使用  RSA 或者 RSA2 ,

        這里注意下 :2018年1月5日后創建的應用只支持RSA2的格式;          

  - "https://openapi.alipaydev.com/gateway.do?{}".format(order_string)  --  結尾不要加 / (反斜杠)

    帶 dev 則是測試用的接口,但是不帶 dev 就是真正的支付接口

 - 最后說一點規范:
    1. 建議把 AliPay 下面的 appid 什么的信息 寫在 settings 中,
      然后導入 settings 在通過 settings.APPID 拿到信息
    2. 將存放 應用密鑰 和 支付寶公鑰 的 txt 文件放到單獨一個文件夾中

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM