======B2C電商網站======
先後端分離,前端採用Vue框架,後端採用DRF框架,接口採用RESTAPI html
---》 不分離:視圖中調用模板,生成html字符串返回
分離:視圖中構造json數據返回。 優勢:先後端耦合度較低,便於維護。前端
開發REST API接口時,在視圖中作的最核心的事是:
--將數據庫數據序列化爲前端須要的格式,並返回。
--將前端發送的數據反序列化爲模型類對象,保存到數據庫中。
==1.用戶:
1.Django認證系統,自定義Django認證後端類
2.JWT認證機制
3.雲通信發送短信驗證碼
4.celery異步任務隊列
5.QQ第三方登陸
6.郵箱激活
7.緩存
==2.商品:
1.FDFS文件存儲系統
2.自定Django文件存儲類
3.頁面靜態化
4.定時任務
5.Django Admin界面修改數據處理過程
6.ES搜索引擎&haystack全文檢索框架
==3.購物車:
1.購物車記錄存儲(登陸和未登陸)
2.購物車記錄合併
==4.訂單:
1.訂單保存(基本流程)
2.訂單事務(Django事務)
3.訂單支付(支付寶支付)java
===1.用戶部分===python
==1.1 Django認證系統的功能及在項目中的使用
-
Django框架提供了一個用戶認證系統,能夠完成用戶信息的存儲,登陸用戶信息的校驗,用戶權限控制等功能,認證系統中提供了一個User模型類,在執行遷移時默認會依據此模型類生成對應的用戶數據表。
User包含字段:username,password,email,is_staff,is_active,last_login等等 經常使用方法:set_password(),check_password()
在項目中,能夠自定義User模型類來補充一些 默認User類 沒有的字段。自定義User模型類須要在配置文件中指定AUTH_USER_MODEL= 'users.User'--》'應用名.模型類名',這樣執行遷移時會依據自定義User模型類生成 用戶數據表。
在用戶的註冊和登陸中,都用到了Django認證系統所提供的函數:create_user():建立新用戶 authenticate():認證用戶,檢驗帳號和密碼git
-登陸簽發jwt:
JWT提供的登陸視圖obtain_jwt_token接收post請求,獲取用戶名,密碼 ,
而後調用django.contrib.auth模塊中的authenticate()方法,
authenticate()方法再調用配置中指定的認證後端類,其中定義了authenticate()方法,進行驗證,
驗證完成後,爲用戶簽發jwt,把jwt做爲屬性賦給用戶對象,服務器在響應時將jwt返回給客戶端,客戶端保存jwt,完成狀態保持,登陸成功。(obtain_jwt_token默認只返回jwt,能夠修改該視圖以增長返回值)
以後客戶端在請求服務器的過程當中,在每次須要進行用戶的認證時,都要將jwt token數據經過請求頭傳遞給服務器,服務器驗證token值,並返回數據。
默認的認證後端是ModelBackend,默認實現是根據用戶名查詢對象,再驗證密碼
若需支持用戶名和手機號都能登陸,需:
1.自定義Django的認證後端類,重寫authenticate()方法
a.判斷是否爲手機號,若是是則按照mobile查詢
b.若是不是則按照username查詢
c.判斷密碼是否正確
d.返回
2.配置,指定認證後端
-
==1.2 jwt toekn認證機制
-
jwt token認證機制是對session認證機制的替代
session認證機制存在的問題:
1.session信息存儲在服務器端,若是登陸用戶過多,會佔用過多的服務器的空間;
2.session依賴於cookie,session信息的標識保存在cookie中,若是cookie被截獲,可能會形成CSRF(跨站請求僞造攻擊);
3.擴展性差:用戶認證以後,服務器端作認證記錄,若是認證的記錄被保存在內存中,用戶下次請求還必須請求在這臺服務器上,才能拿到受權的資源。
這樣在分佈式應用中,相應的限制了負載均衡器的能力。這也意味着限制了應用的擴展能力。
jwt token使用:
1.在用戶登陸時,服務器驗證用戶信息,驗證經過後,服務器會生成一個jwt token字符串;
2.服務器在響應時將jwt token數據返回給客戶端,客戶端保存jwt token數據;
3.以後客戶端在請求服務器過程當中,在每次須要進行用戶的認證時,都要將jwt token數據經過請求頭傳遞給服務器,服務器驗證token值,並返回數據。
包含3部份內容,用 . 拼接:
頭部(header):包含token類型和加密算法信息,使用base64編碼生成字符串。
載荷(payload):保存有效的數據,一般包含token的有效期,使用base64編碼生成字符串。因爲base64可解密,不建議存放用戶的敏感信息。
簽名(signature):防止jwt token被僞造,由服務器在生成jwt token時,將base64加密後的header和payload用 . 拼接,而後使用祕鑰加密生成。
在Django中生成jwt_token:
1.在配置文件中配置jwt;
2.在建立用戶系列化器中增長token屬性;
3.用頭部指定的加密方法,將須要加密的用戶的非敏感信息加密生成payload,再生成token,保存並返回;
4.前端將返回的token保存在localstorege或sessionstorage中。
特色: 1.構成簡單,字節佔用很小,便於傳輸; 2.保存在客戶端,不佔用服務器的存儲空間;
3.適合於分佈式站點的應用場景。 4.服務器端的密鑰須要保存好,泄露密鑰以後jwt token數據能夠被隨意僞造。
-
==1.3 發送短信驗證碼流程
-
-1.先判斷帳號和手機號是否註冊過,若註冊過,提示已註冊;
-2.用戶點擊 ‘獲取短信驗證碼’按鈕,瀏覽器向後端API服務器發起跨域請求;
-3.後端API服務器進行業務處理,發出發送短信驗證碼的任務消息,而後直接給客戶端返回應答,客戶端進行倒計時操做;
-4.Celery的worker收到任務消息,調用發送短信的任務函數,使用雲通信給指定的手機號發送短信驗證碼。
-
==1.4 用celery發短信
-
說明:定義任務函數的文件tasks.py,文件名是固定的
實現步驟:
1.在項目目錄下,新建包celery_tasks
2.新建config.py,指定代理人
3.新建main.py,建立celery對象,配置自動識別任務
4.新建包,如sms_code
5.建立tasks.py
6.定義方法,封裝耗時代碼,添加裝飾器
7.在main.py中註冊
8.啓動工人,若是代碼發生改變,須要重啓任務
9.在視圖函數中調用:任務方法.delay(參數)
在實際開發中,一、二、3作一次便可
若是發現耗時代碼,則重複步驟4-9
-
==1.5 QQ登陸
-
python標準模塊urllib.parse:
urlopen(url,data=None)-->發送http請求,能夠經過read()獲取bytes類型的響應體數據 data=None,GET請求;data不爲None,POST請求
urlencode(字典)-->生成查詢字符串
parse_qs(查詢字符串)-->生成字典github
第三方包itsdangerous: 將字典加密,解密,經過私鑰保證安全性
tjwss=TimedJSONWebSignatureSerializer(私鑰,過時時間)
tiwss.dumps(字典)-->加密字符串
tjwss.loads(加密字符串)-->字典ajax
-1.用戶點擊QQ登陸按鈕時,瀏覽器發起ajax請求,django服務器生成受權網址,返回給瀏覽器,
瀏覽器在ajax的回調函數中打開受權網址,請求QQ服務器,QQ服務器返回受權頁面算法
-2.用戶填寫帳號密碼,點擊受權並登陸,QQ服務器驗證經過後,將用戶的瀏覽器重定向到設置好的回調網址,同時在回調網址後攜帶code.docker
-3.瀏覽器運行js,發起ajax請求,後端API進行業務處理,根據code請求QQ服務器獲取access token,再根據token請求QQ服務器獲取openID,
而後根據openID進行處理,若是openID已經綁定過網站用戶,直接簽發jwt token數據並進行返回;數據庫
-4.若openID未綁定過網站用戶,說明是第一次用QQ登陸,將openid加密並返回給客戶端,展現綁定頁面
-5.用戶填寫手機號,密碼,短信驗證碼等,點擊'綁定',提交數據
-6.根據手機號查詢用戶對象,若用戶存在,判斷密碼是否正確,若正確,新建QQ受權對象,保存綁定信息,登陸成功,若錯誤,提示綁定失敗
-7.若用戶不存在,新建用戶對象,新建QQ受權對象,而後簽發jwt token數據並返回。
-
==1.6 郵箱激活
-
-設置郵箱: 修改當前登陸用戶的郵箱屬性
1.用戶輸入郵箱,點擊進行設置,瀏覽器請求後端API接口;
2.後端進行業務處理:
a.接收參數email並進行校驗
b.設置用戶郵箱,併發出 發送驗證激活郵件 的任務消息(celery的worker收到任務消息,調用 發送郵件任務函數 進行激活驗證郵件的發送)
c.返回應答
-發激活郵件:
1.定義任務。發郵件:用Django的django.core.mail模塊的send_mail()方法
2.在修改郵箱序列化器中 調用任務
-激活郵箱:
當用戶點擊郵箱裏的連接時,進入到success_verify_email.html頁面。在該頁面中,請求 網址中用於驗證的token 發送給後端接口,
判斷token的有效性,若token有效,修改郵箱的驗證狀態,並將處理結果返回給前端展現給用戶。
修改郵箱用戶的is_active屬性:
a.接受密文,
b.解密,
c.查詢對象,
d.修改屬性。
-
==1.7 緩存(省市區)
-
-做用:緩存是對網站進行優化的一種方式,能夠將常常被用戶訪問的數據從數據庫中獲取以後存放到緩存中,當用戶來訪問時直接從緩存中返回數據,
只有在緩存中獲取不到時再去查詢數據庫,以此來減小數據庫的查詢,從而減輕數據庫壓力,提高網站性能。
-使用:
1.需安裝drf-extensions包
2.讓視圖繼承CacheResponseMixin,由於省市區查詢時只用到ReadOnlyModelViewSet(ListModelMixin(查省)和RetrieveModelMixin(查市縣)),
ListCacheResponseMixin:
用於緩存返回列表數據的視圖,與ListModelMixin擴展類配合使用,實際是爲list方法添加了cache_response裝飾器
RetrieveCacheResponseMixin:
用於緩存返回單一數據的視圖,與RetrieveModelMixin擴展類配合使用,實際是爲retrieve方法添加了cache_response裝飾器
CacheResponseMixin:
爲視圖集同時補充List和Retrieve兩種緩存,與ListModelMixin和RetrieveModelMixin一塊兒配合使用。
3.在配置文件中設置有效期和存儲地址(能夠存Redis)
-
===2.商品部分===
==2.1 FDFS(分佈式文件存儲系統)
-
fastDFS是用c語言編寫的一款開源的分佈式文件存儲系統。
充分考慮了冗餘備份,負載均衡,現行擴容等機制,並注重高可用,高性能等指標,能夠搭建一套高性能的文件服務器集羣提供上傳,下載等服務。
fastDFS架構包括Tracker server 和Storage server:
Tracker(追蹤/調度 服務器):負載均衡和調度。管理集羣,收集storage集羣的狀態。tracker也能夠實現集羣。每一個tracker節點地位平等。
Storage(存儲服務器):文件存儲。分爲多個組,每一個組之間保存的文件是不一樣的。在組內,每一個組成員的地位一致、內部保存的內容同樣,沒有主從的概念。
Storage server沒有實現本身的文件系統而是利用操做系統的文件系統來管理文件。
上傳文件的流程:
client 發送上傳,下載請求到tracker,tracker去查詢storage存儲節點是否有位置,查詢到以後給client一個準確地、具體地storage節點的ip和路徑
client直接上傳文件到該路徑,storage返回一個文件ID給client,須要進行保存。
-
==2.2 Docker
-
容器與管理程序虛擬化不一樣,容器是直接運行在操做系統內核之上的用戶空間,直接調用硬件資源。管理程序虛擬化是經過中間層將一臺或者多臺獨立 的機器虛擬運行與物理硬件之上。
容器啓動完成後,就能夠在容器中安裝本身須要的軟件或服務,容器中能夠運行多個進程。鏡像是docker生命週期中的構建或者打包階段,而容器則是啓動或者執行階段。
做用:
在開發階段,會使用多種軟件,在服務器部署時,一樣須要這些軟件。能夠將須要的軟件安裝在docker中,並完成配置,直接將docker拷貝到服務器,在服務器中運行。
鏡像(image):Docker 把應用程序及其依賴,打包在 image 文件裏面。只有經過這個文件,才能生成 Docker 容器。image是二進制文件。
image文件在各臺電腦上是通用的。開發中,從網上的image倉庫(Docker Hub)中下載image文件,再加上本身的個性化設置。
容器(container):運行鏡像,生成容器。docker根據image文件生成容器的實例,同一個image文件,能夠生成多個同時運行的容器實例。
安裝:
添加私鑰:sudo apt-key add gpg
安裝:sudo dpkg -i docker-ce_17.03.2~ce-0~ubuntu-xenial_amd64.deb
增長管理員權限:sudo usermod -a -G docker $USER
docker服務命令:
sudo service docker start/stop/restart
鏡像命令:
查看:docker image ls
下載:docker image pull 鏡像名稱
刪除:docker rm 名稱或ID
容器命令:
查看正在運行的容器:docker container ls
查看全部:docker container ls -a
刪除:docker container rm 容器名或容器id
docker container start/stop/kill 名稱或id 若沒法從新運行storage,能夠刪除/var/fdfs/storage/data目錄下的fdfs_storaged.pid 文件,從新運行。
使用:
1.將容器保存爲鏡像:
docker commit 容器名 鏡像名
2.將鏡像打包成文件:
docker save -o 保存的文件名 鏡像名
3.將鏡像加載到本地:
docker load -i 保存的文件名
4.建立容器(運行鏡像):
docker run 參數 鏡像名稱 向啓動容器中傳入的命令
用docker安裝fastDFS:
1.拷貝fastdfs_docker.tar文件到Ubuntu桌面
2.進入桌面,執行命令:docker load -i fastdfs_docker.tar docker image ls -a
3.建立目錄:進入/var/,mkdir fdfs 進入fdfs,建立tracker,storage
4.建立容器(運行鏡像),啓動Tracker:
docker run -dti --network=host --name 新建容器名稱 -v 本地目錄:容器目錄 鏡像名 tracker
參數: t---在最後指定命令 d---後臺運行(守護式容器。在容器內部exit退出時,容器也不會中止。) i---交互
tracker-----前面指定了t,在容器運行後執行此命令。當前爲tracker,表示容器啓動後,運行tracker命令,即啓動軟件tracker
5.啓動storage:
docker run -dti --network=host --name 容器名稱 -e TRACKER_SERVER=本機IP:端口 -v 本地目錄:容器目錄 鏡像名 storage
參數: -e TRACKER_SERVER=本機ip:端口---指定環境變量,fastdfs不容許本機IP寫爲127.0.0.1。當前是指定tracker服務器的IP和端口。
自定義文件存儲:
1.定義類,繼承自Storage
2.重寫save()方法,調用fastdfs_client中的類,完成上傳
3.重寫url()方法,返回完整的url(服務器域名+文件名)用於讀取文件
4.配置,指定django上傳文件使用的類型
-
==2.3 CKEditor富文本編輯器
後臺運營人員編輯商品信息時,商品詳情信息可能包含html語法格式的字符串。爲了能在頁面中編輯帶格式的文本,引入富文本編輯器。富文本即具有豐富樣式格式的文本。
1.安裝:pip install django-ckeditor
2.添加應用
3.添加設置
4.添加路由
5.爲模型類添加字段:RichTextField 不支持富文本字段 RichTextUploadingField 支持富文本字段
6.遷移
-
==2.4 頁面靜態化
-
做用: 網站優化
將頁面用到的數據從數據庫中查詢出來,生成一個html文件,放到靜態文件服務器中,用戶訪問時,直接訪問處理好的html靜態文件。
登陸時,在用戶請求完html頁面後,經過ajax向後端發送請求,獲取用戶的數據。
首頁:定時更新:在配置文件中配置定時任務
1.提早準備一個模板文件
2.在配置中配置生成靜態頁面的路徑
3.定義任務函數,生成靜態首頁
3.1從數據庫中查詢所需數據
3.2生成html字符串
3.3寫文件,給模板文件傳遞數據,進行模板渲染(將模板文件中變量進行替換)
詳情頁:
定義celery任務。管理員經過Admin界面修改數據時纔會更新對應商品的詳情頁。
在admin.py中,定義管理類,管理類中包括save_model()、delete_model()
當添加、修改對象時,會執行save_model()方法
當刪除對象時,會執行delete_model()方法
定時任務:
1.安裝包
2.註冊應用
3.配置:指定任務,支持中文
4.命令:python manage.py crontab add/show/remove
-
==2.5 Python腳本
將python文件作成可執行腳本
做用:在後臺批量導入數據,生成詳情頁靜態文件。
實現:製做python可執行文件
1.分權限:chmod +x 文件名.py
2.在第一行指定Python解釋器:#!/usr/bin/env python
3.執行:./文件名.py
-
==2.6 es搜索引擎+haystack全文檢索框架
優勢:1.查詢速度快;2.支持中文分詞。
es搜索引擎:
Elasticsearch(簡稱es)是java語言實現的一個開源的搜索引擎,是目前全文檢索的首選。
經過搜索引擎進行數據查詢時,搜索引擎並非直接在數據庫中進行查詢,而是會對數據庫中的數據進行一遍預處理,單獨創建起一份索引結構數據。
在經過搜索引擎搜索時,搜索引擎將關鍵字在索引數據中進行快速對比查找,進而找到數據的真實存儲位置。
搜索引擎在對數據構建索引時,須要進行分詞處理。Elasticsearch 不支持中文分詞,須要配合擴展elasticsearch-analysis-ik來實現中文分詞。
使用Docker安裝Elasticsearch及其擴展:
獲取鏡像:docker image pull delron/elasticsearch-ik:2.4.6-1.0
配置:修改ip地址
建立docker容器運行:docker run -dti --network=host --name=elasticsearch -v /home/python/elasticsearch-2.4.6/config:/usr/share/elasticsearch/config delron/elasticsearch-ik:2.4.6-1.0
haystack全文檢索框架:
python中的全文檢索框架,支持多種搜索引擎。在django中能夠經過使用haystack來調用Elasticsearch搜索引擎。
Haystack爲Django提供了模塊化的搜索。它的特色是統一的,熟悉的API,可讓你在不修改代碼的狀況下使用不一樣的搜索後端。
做用: 1.幫助開發者利用搜索引擎創建數據表的索引數據。
2.幫助開發者利用搜索引擎進行關鍵詞搜索,獲取對應的索引數據。
3.利用索引數據查找到對應數據表的數據。
開發:
1.安裝
2.註冊
3.配置,能夠修改ip、庫名稱
4.創建索引類:可修改模型類、查詢集
5.創建模板:search/indexes/應用名稱/模型類小寫_text.txt
6.定義可搜索的屬性:{{object.屬性名稱}}
7.生成初始索引數據:python manage.py rebuild_index
8.定義序列化器:指定object使用的序列化器,object表示查詢到的對象,當前爲SKU對象
9.定義視圖:指定模型類
10.調用查詢
-
===3.購物車===
-
==3.1 購物車記錄
-
身份驗證:
當類繼承自APIView,進行請求時,perform_authentication()方法會進行身份驗證
根據請求報文獲取身份信息:
若沒有身份信息,則是匿名用戶
有身份信息,則調用配置中的類,進行身份認證,正確則返回用戶對象
解決身份認證問題:重寫方法
def perform_authentication(self, request):
'''
在視圖方法執行前,再也不進行身份認證
'''
pass
登陸用戶購物車記錄:
保存在Redis中,每一個用戶的購物車數據採用兩條數據保存。
hash:{user_id:{sku_id:count}}
set:{user_id:{sku_id,sku_id,...}}
未登陸用戶購物車記錄:
保存在cookie。
在cookie中只能保存字符串數據。能夠用pickle將Python數據序列化爲bytes類型,並使用base64編碼,再用decode()轉爲字符串。
pickle+base64:
1.轉換效率高 2.數據加密,安全
pickle模塊是Python標準模塊,能夠將Python數據轉換爲bytes類型,序列化速度比json模塊高。
pickle.dumps(字典)---->bytes
pickle.loads(bytes)----->字典
python標準庫中提供了base64模塊
base64.b64encode(bytes)---->base64編碼
base64.b64decode(編碼後bytes)---->解碼
-
==3.2 合併購物車
-
當用戶登陸時,把cookie中的購物車數據合併到登陸用戶的Redis購物車記錄中。
在登陸的API接口執行合併過程便可。
-
===4.訂單===
==4.1 訂單保存
-
流程:
1.獲取當前下單用戶
2.生成訂單編號
3.保存訂單基本信息orderinfo
4.從Redis中獲取購物車結算商品數據
5.遍歷結算商品
判斷商品庫存是否充足
減小商品庫存,增長商品銷量
保存訂單商品數據
6.在Redis購物車中刪除已結算商品數據
訂單事務:
邏輯:選中多個商品統一下單時,若是發現某個商品庫存不足,則下單失敗
在訂單信息保存的過程當中,涉及到數據庫的操做,都放在同一個事務中,下單過程當中任何一個地方出錯,訂單相關表中都不該該添加數據。
-
==4.2 數據庫事務
-
事務:ACID 原子性,一致性,隔離性,持久性
對於數據庫的操做,要麼一次性提交成功,要麼所有放棄。
使用:from django.db import transaction
方法1.裝飾器:@transaction.atomic
方法2.with transaction.atomic():
sid=transaction.savepoint()===》開啓事務=======》begin
transaction.savepoint_commit(sid)===》提交事務===》commit
transaction.savepoint_rollback(sid)===》回滾事務===》rollback
事務隔離級別:在處理同一個數據的多個事務中,一個事務什麼時候能看到其餘事務修改後的數據的結果。
低級別的隔離級通常支持更高的併發處理,且系統開銷低。
MySQL事務隔離級別:
串行化(Serializable):事務挨個執行。級別最高。 在每條數據上加上共享鎖,可能致使大量的超時現象和鎖競爭。
可重複讀(Repeatable read):MySQL默認隔離級別。本事務中看到的數據值始終不受其餘事務影響。會致使 幻讀。
InnoDB存儲引擎經過多版本併發控制機制解決幻讀。
讀取已提交(Read committed):大多數數據庫默認隔離級別。本事務能讀取到其餘事務提交的修改後的數據值。支持 不可重複讀。
讀取未提交(Read uncommitted)(髒讀):本事務能看到其餘事務修改但未提交的數據值。
幻讀:在一個事務的兩次查詢中 數據行 不一致。多是兩次查詢過程當中其餘事務在該被查詢範圍內插入了新的數據行。
不可重複讀:在一個事務的兩次查詢中 數據 不一致。多是兩次查詢過程當中其餘事務更新了被查詢的數據。
髒讀:A事務已更新一份數據,B事務在此時讀取了同一份數據,若A事務Rollback了操做,則B事務所讀取的數據就會是不正確的。
InnoDB 是MySQL的數據庫存儲引擎之一,是一套放在 MySQL後臺的完整數據庫系統。最大特點是支持了ACID兼容的事務功能。
-
==4.3 併發
-
解決辦法:
1.悲觀鎖:當查詢到某條數據時,讓數據庫爲該記錄加鎖,使別人沒法操做。相似於在多線程中的互斥鎖,容易出現死鎖。
2.樂觀鎖:虛擬的鎖。在更新數據的時候先判斷數據是不是以前查詢出的數據,若未被修改,更新數據;若被修改,再也不執行數據更新。
# 根據原始庫存條件更新,返回更新的條目數,樂觀鎖
ret = SKU.objects.filter(id=sku.id, stock=origin_stock).update(stock=new_stock, sales=new_sales)
if ret == 0:
continue
MySQL事務隔離級別默認爲:可重複讀(Repeatable read)。使用樂觀鎖時,應修改成:讀取已提交(Read committed)
3.將下單的邏輯放到任務隊列中(如celery),將並行轉爲串行,全部人排隊下單。好比開啓只有一個進程的celery,挨個處理訂單。
-
==4.4 支付寶
-
流程:
1.用戶點擊 去支付 按鈕,請求後端API,後端API進行業務處理,返回支付寶支付網址及參數(回調頁面);
2.客戶端訪問支付寶支付網址,支付寶平臺進行處理,調用下單支付接口,返回登陸支付頁面;
3.用戶登陸支付寶,選擇支付方式,輸入支付密碼,點擊確認付款;
4.付款成功後,支付寶返回回調頁面和流水號;
5.客戶端訪問回調頁面,在頁面加載時請求後端API接口並攜帶流水號;
6.後端API根據流水號向支付寶獲取支付狀態,支付成功則修改訂單狀態。
實現:
1.新建應用,配置
2.成爲開發者,進入沙箱環境,設置應用公鑰:
1.選用支付寶提供的生成應用公鑰的工具:openssl
2.在桌面上建立目錄alipay,進入此目錄
3.進入openssl命令:openssl
3.生成私鑰genrsa -out app_private_key.pem 2048
4.生成公鑰rsa -in app_private_key.pem -pubout -out app_public_key.pem
5.在alipay目錄中會生成文件,複製須要的兩個文件到項目的apps/payments/keys中,根據要求條件只把公鑰文件中的 公鑰部分 剪切到支付寶上,再把支付寶生成的支付寶公鑰複製到項目的公鑰文件中
6.配置
ALIPAY_APPID = "2016095200590063"
ALIPAY_URL = "https://openapi.alipaydev.com/gateway.do?"
ALIPAY_DEBUG = True # 調試,使用沙箱必須設置成True
ALIPAY_KEY_PATH = os.path.join(BASE_DIR, 'apps/payments/keys')
ALIPAY_RETURN_URL = 'http://www.meiduo.site:8080/pay_success.html'
7.python對接支付寶SDK:https://github.com/fzlee/alipay/blob/master/README.zh-hans.md
安裝包:pip install python-alipay-sdk --upgrade
1.獲取支付地址 1.建立alipay對象 2.調用方法生成支付參數 3.拼接支付地址2.驗證支付流水號 1.接收支付寶返回的數據,轉字典 2.彈出sign 3.建立alipay對象 4.調用verify方法,進行驗證 5.判斷是否支付成功 6.若是支付成功則修改訂單狀態,保存流水號,返回流水號