1. 程式人生 > >djangoB2C電商功能模塊

djangoB2C電商功能模塊

pda 並行 解密 服務器集群 ubunt atomic pickle 詳情 top

======B2C電商網站======
前後端分離,前端采用Vue框架,後端采用DRF框架,接口采用RESTAPI

---》 不分離:視圖中調用模板,生成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.訂單支付(支付寶支付)

===1.用戶部分===

==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():認證用戶,檢驗賬號和密碼

-登錄簽發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(參數)
在實際開發中,1、2、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(查詢字符串)-->生成字典

第三方包itsdangerous: 將字典加密,解密,通過私鑰保證安全性
  tjwss=TimedJSONWebSignatureSerializer(私鑰,過期時間)
  tiwss.dumps(字典)-->加密字符串
  tjwss.loads(加密字符串)-->字典

-1.用戶點擊QQ登錄按鈕時,瀏覽器發起ajax請求,django服務器生成授權網址,返回給瀏覽器,
  瀏覽器在ajax的回調函數中打開授權網址,請求QQ服務器,QQ服務器返回授權頁面

-2.用戶填寫賬號密碼,點擊授權並登錄,QQ服務器驗證通過後,將用戶的瀏覽器重定向到設置好的回調網址,同時在回調網址後攜帶code.

-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.如果支付成功則修改訂單狀態,保存流水號,返回流水號

djangoB2C電商功能模塊