目錄
再沒有三方支付平台之前,使用者發起支付請求的時候,使用者要去和銀行簽約(轉賬),特別的不方便,為了解決這些問題,就有了三方支付,三方平台去完成簽約,給使用者節省時間。
商戶拿到支付寶的公鑰、自己的私鑰(私鑰加密、公鑰解密),用私鑰請求支付寶,支付寶解密、驗籤、進行支付處理,支付寶將處理的返回值傳給商戶,當支付成功後,返還給商戶訂單號、金額、時間戳等訊息,支付失敗後同樣給商戶反饋結果。
支付寶開放平台:
登入支付寶開放平台–>點選控制台
點選沙箱(複製appid)
點選文件,找到開發助手,點選**加密。
獲取私鑰
點選應用公鑰
生成公鑰
現在已經拿到了需要的公鑰。
構建支付類
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 base64 import decodebytes, encodebytes
import json
class alipay:
"""支付寶支付介面(pc端支付介面)
"""def __init__(self, appid, app_notify_url, app_private_key_path,
alipay_public_key_path, return_url, debug=false):
self.appid = appid
self.app_notify_url = app_notify_url
self.app_private_key_path = app_private_key_path
self.app_private_key = none
self.return_url = return_url
with open(self.app_private_key_path) as fp:
self.app_private_key = rsa.importkey(fp.read())
self.alipay_public_key_path = alipay_public_key_path
with open(self.alipay_public_key_path) as fp:
self.alipay_public_key = rsa.importkey(fp.read())
if debug is true:
self.__gateway = ""
else:
self.__gateway = ""
def direct_pay(self, subject, out_trade_no, total_amount, return_url=none, **kwargs):
biz_content =
biz_content.update(kwargs)
data = self.build_body("alipay.trade.page.pay", biwww.cppcns.comz_content, self.return_url)
return self.sign_data(data)
def build_body(self, method, biz_content, return_url=none):
data =
if return_url is not none:
data["notify_url"] www.cppcns.com= self.app_notify_url
data["return_url"] = self.return_url
return data
def sign_data(self, data):
data.pop("sign", none)
unsigned_items = self.ordered_data(data)
unsigned_string = "&".join("=".format(k, v) for k, v in unsigned_items)
sign = self.sign(unsigned_stringwww.cppcns.com.encode("utf-8"))
quoted_string = "&".join("=".format(k, quote_plus(v)) for k, v in unsigned_items)
signed_string = quoted_string + "&sign=" + quote_plus(sign)
return signed_string
def ordered_data(self, data):
complex_keys =
for key, value in data.items():
if isinstance(value, dict):
complex_keys.append(key)
for key in complex_keys:
data[key] = json.dumps(data[key], separators=(',', ':'))
return sorted([(k, v) for k, v in data.items()])
def sign(self, unsigned_string):
key = self.app_private_key
signer = pkcs1_v1_5.new(key)
signature = signer.sign(sha256.new(unsigned_string))
sign = encodebytes(signature).decode("utf8").replace("\n", "")
return sign
def _verify(self, raw_content, signature):
key = self.alipay_public_key
signer = pkcs1_v1_5.new(key)
digest = sha256.new()
digest.update(raw_content.encode("utf8"))
if signer.verify(digest, decodebytes(signature.encode("utf8"))):
return true
return false
def verify(self, data, signature):
if "sign_type" in data:
data.pop("sign_type")
unsigned_items = self.ordered_data(data)
message = "&".join(u"{}={}".format(k, v) for k, v in unsigned_items)
return self._verify(message, signature)
例項化類
def init_alipay():
# 初始化alipay
alipay = alipay(
appid="appid",
app_notify_url="**位址",
return_url="**位址",
app_private_key_path="私鑰相對路徑",
alipay_public_key_path="公鑰相對路徑",
debug=true # 支付環境
)return alipay
apiasync def get(self):
alipay = init_alipay()
# 傳乙個標題 訂單號 訂單**
params = alipay.direct_pay("三方廣告平台", order_no, money)
url = f"?"
return self.write(ret_json(url))
# 構建乙個**位址,用於支付成功後**,在**位址中可以獲取訂單號(out_trade_no)、金額(total_amount)、時間戳(timestamp),然後進行處理業務邏輯。
支付包有自己的介面文件,以上是我在python環境下配置的,可以直接使用
沉默三分鐘
網上見此真情之文,藉以自表 原文 http www.hecaitou.net p 3018 沉默三分鐘是心祭。那麼多年了,國旗終於為平民而降。那麼多天了,全民哀悼終於實現。與此同時,火炬停止傳遞,因為這不是乙個歡慶的時刻。很多年後回顧2008年,我 也許寧可它從日曆中消失。還沒有哪一年和今年一樣,才...
三分鐘搞定python基礎
庫的匯入和新增 在機器學習和人工智慧為主導的工業4.0時代,python猶如一股龍捲風襲捲著一切。python作為一門解釋性的物件導向的語言雖然在運算速度上有不足,但是相比於程式運算速度,程式專案開發速度更為重要,而且在在這個裝備氪金時代,運算速度的缺憾完全可以拿硬體來補,何況python還支援並行...
《每天感恩三分鐘》
每天感恩三分鐘 有位104歲的老太太耳聰目明,老而彌堅。有人向她請教長壽秘訣,老太太笑了 我有一帖靈丹妙藥,那就是每天化三分鐘時間感恩。她說,化一分鐘感恩父母 丈夫 兒女 鄰居和陌生人 一分鐘感恩大自然給予的種種關懷和體貼 一分鐘感恩每乙個祥和 溫暖和快樂的日子 感恩使她心裡永遠流淌著幸福的泉水,有...