python實(shí)現(xiàn)支付寶當(dāng)面付(掃碼支付)功能
本文實(shí)例為大家分享了python實(shí)現(xiàn)支付寶當(dāng)面付示的具體代碼,供大家參考,具體內(nèi)容如下
一、配置信息準(zhǔn)備
登錄螞蟻金服開(kāi)放平臺(tái):https://open.alipay.com/platform/home.htm
開(kāi)發(fā)資料閱讀:https://docs.open.alipay.com/194/106078
創(chuàng)建好應(yīng)用,配置好密鑰等信息后,就可以開(kāi)發(fā)了。
二、開(kāi)發(fā)支付寶支付工具類
1:相關(guān)配置信息
# ========支付相關(guān)配置信息=========== ALIPAY_INPUT_CHARSET = 'utf-8' # 商戶ID,以2088開(kāi)頭的16位純數(shù)字 ALIPAY_PARTNER = '2088************' # 服務(wù)商支付寶賬號(hào) ALIPAY_SELLER_EMAIL = '' # 支付結(jié)果回調(diào)地址 ALIPAY_NOTIFY_URL = "商家后臺(tái)回調(diào)接口地址" # 訪問(wèn)模式,根據(jù)自己的服務(wù)器是否支持ssl訪問(wèn),若支持請(qǐng)選擇https;若不支持請(qǐng)選擇http ALIPAY_TRANSPORT = 'https' #簽名加密方式 SIGN_TYPE = "SHA-1" #應(yīng)用id APP_ID = '************' #下單api precreate_GATEWAY=https://openapi.alipay.com/gateway.do?
2.三個(gè)輔助函數(shù):
#1:生成下單請(qǐng)求參數(shù)字符串 def make_payment_request(self,params_dict): """ 構(gòu)造支付請(qǐng)求參數(shù) :param params_dict: :return: """ query_str = self.params_to_query(params_dict,) # 拼接參數(shù)字符串 sign = self.make_sign(query_str) # 生成簽名 sign = urllib.quote(sign, safe='') #解決中文參數(shù)編碼問(wèn)題 res = "%s&sign=%s" % (query_str, sign) return res def params_to_query(self,params): """ 生成需要簽名的字符串 :param params: :return: """ """ :param params: :return: """ query = "" dict_items = {} for key, value in params.items(): if isinstance(value, dict) == True: dict_items[key] = value params[key] = "%s" all_str = '' for key in sorted(params.keys()): #把參數(shù)按key值排序:這是支付寶下單請(qǐng)求的參數(shù)格式規(guī)定 all_str = all_str + '%s=%s&' % (key, params[key]) all_str = all_str.rstrip('&') biz_content_dict = dict_items['biz_content'] content_str = '' for key in sorted(biz_content_dict.keys()): if isinstance(biz_content_dict[key], basestring) == True: content_str = content_str + '"%s":"%s",' % (key, biz_content_dict[key]) else: content_str = content_str + '"%s":%s,' % (key, biz_content_dict[key]) content_str = content_str.rstrip(',') content_str = '{' + content_str + '}' query = all_str % content_str return query def make_sign(self,para_str): """ 生成簽名 :param message: :return: """ private_key = OpenSSL.crypto.load_privatekey(OpenSSL.crypto.FILETYPE_PEM, open( './路徑/private_key.txt').read()) #把私鑰存到一個(gè)文件里,加載出來(lái)【嘗試過(guò)用rsa模塊的方法加載私鑰字符串,會(huì)報(bào)格式錯(cuò)誤。查看源碼得知,需要從文件流加載】 import sys reload(sys) sys.setdefaultencoding('utf-8') #這三句:解決簽名方法編碼報(bào)錯(cuò) sign = base64.encodestring(OpenSSL.crypto.sign(private_key, para_str, 'sha256')) return sign
3.下單
#獲取二維碼url def getAlipayUrl(self,orderid,goodsName,goodsPrice,**kwargs): # 構(gòu)建公共參數(shù) params = {} params['method'] = 'alipay.trade.precreate' params['version'] = '1.0' params['app_id'] = self.APP_ID params['timestamp'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S') params['charset'] = self.ALIPAY_INPUT_CHARSET params['notify_url'] = self.ALIPAY_NOTIFY_URL params['sign_type'] = 'RSA2' # 構(gòu)建訂單參數(shù) biz_content = {} biz_content['out_trade_no'] = orderid # 訂單號(hào) biz_content['subject'] = goodsName #商品名 biz_content['total_amount'] = goodsPrice # 價(jià)格 params['biz_content'] = biz_content #由參數(shù),生成簽名,并且拼接得到下單參數(shù)字符串 encode_params = self.make_payment_request(params) #下單 url = self.precreate_GATEWAY + encode_params response = requests.get(url) #提取下單響應(yīng) body = response.text #解析下單響應(yīng)json字符串 body_dict = json.loads(body) return_msg = body_dict['alipay_trade_precreate_response']['msg'] if return_msg == "Success": code_url = body_dict['alipay_trade_precreate_response']['qr_code'] return code_url else: print "fail msg=============" + return_msg
三、在controller端,接收客戶端傳過(guò)來(lái)的訂單號(hào)、商品名、商品價(jià)格,調(diào)用支付工具類,得到二維碼鏈接,根據(jù)鏈接生成二維碼,傳給客戶端。
(此處同微信掃碼支付模式二)
四、在controller端,編寫(xiě)支付結(jié)果回調(diào)函數(shù)
def aliQRCodeNotify(self, request, *args,**kwargs): out_trade_no = kwargs.get("out_trade_no") trade_status = kwargs.get("trade_status") #根據(jù)trade_status,判斷交易結(jié)果:交易成功 or 交易關(guān)閉 #根據(jù)out_trade_no 更新訂單記錄信息
五、客戶端輪詢
同微信掃碼支付模式二客戶端輪詢思路。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python?Celery動(dòng)態(tài)添加定時(shí)任務(wù)生產(chǎn)實(shí)踐指南
elery是一種異步任務(wù)隊(duì)列,如果還不熟悉這個(gè)開(kāi)源軟件的請(qǐng)先看看官方文檔,快速入門,下面這篇文章主要給大家介紹了關(guān)于Python?Celery動(dòng)態(tài)添加定時(shí)任務(wù)生產(chǎn)實(shí)踐的相關(guān)資料,需要的朋友可以參考下2022-08-08Python3操作讀寫(xiě)CSV文件使用包過(guò)程解析
這篇文章主要介紹了Python3操作CSV文件使用包過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04python多線程請(qǐng)求帶參數(shù)的多個(gè)接口問(wèn)題
這篇文章主要介紹了python多線程請(qǐng)求帶參數(shù)的多個(gè)接口問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03如何把外網(wǎng)python虛擬環(huán)境遷移到內(nèi)網(wǎng)
這篇文章主要介紹了如何把外網(wǎng)python虛擬環(huán)境遷移到內(nèi)網(wǎng),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05python實(shí)現(xiàn)批量修改圖片格式和尺寸
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)批量修改圖片格式和尺寸的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06Python 3.x對(duì).CSV數(shù)據(jù)按任意行、列讀取的過(guò)程
這篇文章主要介紹了Python 3.x對(duì).CSV數(shù)據(jù)按任意行、列讀取的過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。2022-05-05Python線程池ThreadPoolExecutor使用方式
這篇文章主要介紹了Python線程池ThreadPoolExecutor使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02