本文實例為大家分享了python實現支付寶當面付示的具體代碼,供大家參考,具體內容如下
一、配置信息準備
登錄螞蟻金服開放平臺:https://open.alipay.com/platform/home.htm
開發資料閱讀:https://docs.open.alipay.com/194/106078
創建好應用,配置好密鑰等信息后,就可以開發了。
二、開發支付寶支付工具類
1:相關配置信息
# ========支付相關配置信息=========== ALIPAY_INPUT_CHARSET = 'utf-8' # 商戶ID,以2088開頭的16位純數字 ALIPAY_PARTNER = '2088************' # 服務商支付寶賬號 ALIPAY_SELLER_EMAIL = '' # 支付結果回調地址 ALIPAY_NOTIFY_URL = "商家后臺回調接口地址" # 訪問模式,根據自己的服務器是否支持ssl訪問,若支持請選擇https;若不支持請選擇http ALIPAY_TRANSPORT = 'https' #簽名加密方式 SIGN_TYPE = "SHA-1" #應用id APP_ID = '************' #下單api precreate_GATEWAY=https://openapi.alipay.com/gateway.do?
2.三個輔助函數:
#1:生成下單請求參數字符串 def make_payment_request(self,params_dict): """ 構造支付請求參數 :param params_dict: :return: """ query_str = self.params_to_query(params_dict,) # 拼接參數字符串 sign = self.make_sign(query_str) # 生成簽名 sign = urllib.quote(sign, safe='') #解決中文參數編碼問題 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()): #把參數按key值排序:這是支付寶下單請求的參數格式規定 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()) #把私鑰存到一個文件里,加載出來【嘗試過用rsa模塊的方法加載私鑰字符串,會報格式錯誤。查看源碼得知,需要從文件流加載】 import sys reload(sys) sys.setdefaultencoding('utf-8') #這三句:解決簽名方法編碼報錯 sign = base64.encodestring(OpenSSL.crypto.sign(private_key, para_str, 'sha256')) return sign
新聞熱點
疑難解答