一. 在 點擊跳轉 這里拿到自己的 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 文件放到單獨一個文件夾中