最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python實現(xiàn)銀聯(lián)支付和支付寶支付接入

 更新時間:2019年05月07日 10:51:41   作者:tinyid  
這篇文章主要為大家詳細(xì)介紹了python實現(xiàn)銀聯(lián)支付和支付寶支付的接入,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了python銀聯(lián)支付和支付寶支付接入的具體代碼,供大家參考,具體內(nèi)容如下

前置條件:需要安裝Python的OpenSSL模塊,我使用的版本是16.1.0,可以使用pip install pyopenssl來安裝

一、支付寶支付

1. 使用RSA公鑰加密系統(tǒng)進(jìn)行簽名和簽名驗證,需要自己生成一個RSA私鑰和對應(yīng)的一個RSA公鑰(在Linux下可以使用ssh-keygen命令來生成),公鑰需要上傳至支付寶,供支付寶對開發(fā)者發(fā)送的請求做簽名驗證使用;而同時支付寶會提供一個RSA公鑰給開發(fā)者,開發(fā)者使用這個公鑰來驗證支付寶的回調(diào)請求的合法性。

2. 整個接入過程最核心的工作就是構(gòu)建一個合法的請求報文,這個可以參考支付寶的相關(guān)文檔;其次是對請求報文的內(nèi)容進(jìn)行RSA簽名,并將簽名隨請求報文一并發(fā)送。

核心的簽名和報文構(gòu)建代碼如下:

import OpenSSL
import json
import time
import urllib
import base64
 
from django.conf import settings
 
def build_sign(param_map, sign_type="RSA"):
 '''
 Doc: https://doc.open.alipay.com/doc2/detail.htm?treeId=200&articleId=105351&docType=1
 '''
 # 將篩選的參數(shù)按照第一個字符的鍵值A(chǔ)SCII碼遞增排序(字母升序排序),如果遇到相同字符則按照第二個字符的鍵值A(chǔ)SCII碼遞增排序,以此類推。
 sort_param = sorted([(key, unicode(value, settings.ALIPAY_CHARSET).encode(settings.ALIPAY_CHARSET)) for key, value in param_map.iteritems()], key=lambda x: x[0])
 # 將排序后的參數(shù)與其對應(yīng)值,組合成“參數(shù)=參數(shù)值”的格式,并且把這些參數(shù)用&字符連接起來,此時生成的字符串為待簽名字符串。SDK中已封裝簽名方法,開發(fā)者可直接調(diào)用,詳見SDK說明。
 # 如自己開發(fā),則需將待簽名字符串和私鑰放入SHA1 RSA算法中得出簽名(sign)的值。
 content = '&'.join(['='.join(x) for x in sort_param])
 return base64.encodestring(OpenSSL.crypto.sign(settings.ALIPAY_APP_PRIVATE_KEY_OBJ, content, 'sha1'))
 
def build_params(out_trade_no, subject, body, total_amount):
 '''
 Doc:https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.MVkRGo&treeId=193&articleId=105465&docType=1
 將參數(shù)按照支付寶規(guī)定組織并簽名之后,返回
 '''
 params = {}
 # 獲取配置文件
 params['app_id']   = settings.ALIPAY_APPID
 params['method']   = settings.ALIPAY_METHOD
 params['format']   = settings.ALIPAY_FORMAT
 params['charset']   = settings.ALIPAY_CHARSET
 params['sign_type']   = settings.ALIPAY_SIGN_TYPE
 params['sign_type']   = settings.ALIPAY_SIGN_TYPE
 params['timestamp']   = time.strftime('%Y-%m-%d %H:%M:%S')
 params['version']   = settings.ALIPAY_VERSION
 params['notify_url']  = settings.ALIPAY_NOTIFY_URL
 
 # 業(yè)務(wù)參數(shù)
 params['biz_content'] = {}
 params['biz_content']['body']    = body   # 訂單描述、訂單詳細(xì)、訂單備注,顯示在支付寶收銀臺里的“商品描述”里
 params['biz_content']['subject']   = subject  # 商品的標(biāo)題/交易標(biāo)題/訂單標(biāo)題/訂單關(guān)鍵字等。
 params['biz_content']['out_trade_no']  = out_trade_no # 商戶網(wǎng)站唯一訂單號 
 params['biz_content']['total_amount']  = '%.2f' % (float(total_amount) / 100) # 訂單總金額,單位為元,精確到小數(shù)點(diǎn)后兩位,取值范圍[0.01,100000000] 
 params['biz_content']['product_code']  = settings.ALIPAY_APP_PRODUCT_CODE
 params['biz_content']      = json.dumps(params['biz_content'], separators=(',', ':'))
 
 params['sign'] = build_sign(params)
 
 return urllib.urlencode(params)
 
def check_sign(message, sign):
 '''Doc: https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.dDRpeK&treeId=204&articleId=105301&docType=1'''
 try:
  OpenSSL.crypto.verify(settings.ALIPAY_PUBLIC_KEY_OBJ, sign, message, 'SHA1')
  return True
 except Exception as _:
  return False

在讀取支付寶公鑰的時候,由于OpenSSL模塊使用的是X509格式的證書,所以需要做以下的處理(用于對發(fā)起支付報文進(jìn)行簽名):

# 支付寶開發(fā)者公鑰(支付寶生成)
ALIPAY_PUBLIC_KEY = os.path.join(BASE_DIR, 'utils/paycenter/alipay/certs/alipay_public_key')
_ALIPAY_PUBLIC_KEY_OBJ_PUB = OpenSSL.crypto.load_publickey(OpenSSL.crypto.FILETYPE_PEM, open(ALIPAY_PUBLIC_KEY).read())
_ALIPAY_PUBLIC_KEY_OBJ_X509 = OpenSSL.crypto.X509()
_ALIPAY_PUBLIC_KEY_OBJ_X509.set_pubkey(_ALIPAY_PUBLIC_KEY_OBJ_PUB)
ALIPAY_PUBLIC_KEY_OBJ = _ALIPAY_PUBLIC_KEY_OBJ_X509

載入開發(fā)者生成的私鑰的代碼為(用于驗證支付寶回調(diào)請求的合法性):

# 支付寶開發(fā)者應(yīng)用私鑰(接入方生成)
ALIPAY_APP_PRIVATE_KEY = os.path.join(BASE_DIR, 'utils/paycenter/alipay/certs/alipay_app_private_key')
ALIPAY_APP_PRIVATE_KEY_OBJ = OpenSSL.crypto.load_privatekey(OpenSSL.crypto.FILETYPE_PEM, open(ALIPAY_APP_PRIVATE_KEY).read(), None)

二、銀聯(lián)支付

1. 銀聯(lián)支付(網(wǎng)關(guān)支付)與支付寶支付基本上遵循了同樣的流程,但是在發(fā)起支付的請求報文和簽名、驗證簽名等方面存在細(xì)微的差別,特別是在簽名和驗證簽名時,支付寶是直接對報文內(nèi)容進(jìn)行了RSA加密,但是銀聯(lián)卻是首先對簽名內(nèi)容取SHA1的摘要,繼而對此摘要做RSA加密,這點(diǎn)在build_sign函數(shù)中就可以很明顯地看出來。

2. 銀聯(lián)支付的證書文件申請流程比較繁瑣,并且其格式也和支付寶使用的不同,我們申請到的私鑰證書文件是以PKCS12的格式保存的,并且需要注意在從指定位置下載此證書后,導(dǎo)出證書時一定要將密碼設(shè)置為6位的整數(shù)數(shù)字,之后,還需要將PKCS12格式的證書文件上傳至指定位置并啟用才可以正常使用此證書。

核心的簽名和報文構(gòu)建代碼如下:

import time
import hashlib
import urllib, urllib2
import base64
import OpenSSL
from django.conf import settings
 
def build_sign(param_map, sign_type="RSA"):
 '''構(gòu)建簽名'''
 # 將篩選的參數(shù)按照第一個字符的鍵值A(chǔ)SCII碼遞增排序(字母升序排序),如果遇到相同字符則按照第二個字符的鍵值A(chǔ)SCII碼遞增排序,以此類推。
 sort_param = sorted([(key, unicode(value, settings.UNIONPAY_ENCODING).encode(settings.UNIONPAY_ENCODING)) for key, value in param_map.iteritems()], key=lambda x: x[0])
 content = '&'.join(['='.join(x) for x in sort_param])
 message = hashlib.sha1(content).hexdigest()
 return base64.b64encode(OpenSSL.crypto.sign(settings.UNIONPAY_PRIVATE_KEY_OBJ, message, 'sha1'))
 
def build_params(out_trade_no, total_amount):
 params = {}
 # 獲取配置信息
 params['accType'] = settings.UNIONPAY_ACC_TYPE
 params['accessType'] = settings.UNIONPAY_ACCESS_TYPE
 params['backUrl'] = settings.UNIONPAY_BACK_URL
 params['frontUrl'] = settings.UNIONPAY_FRONT_URL
 params['bizType'] = settings.UNIONPAY_BIZ_TYPE
 params['certId'] = settings.UNIONPAY_CERT_ID
 params['channelType'] = settings.UNIONPAY_CHANNEL_TYPE
 params['currencyCode'] = settings.UNIONPAY_CURRENCY_CODE
 params['encoding'] = settings.UNIONPAY_ENCODING
 params['merId'] = settings.UNIONPAY_MER_ID
 params['signMethod'] = settings.UNIONPAY_SIGN_METHOD
 params['txnType'] = settings.UNIONPAY_TXN_TYPE
 params['txnSubType'] = settings.UNIONPAY_TXN_SUBTYPE
 params['version'] = settings.UNIONPAY_VERSION
 
 params['orderId'] = out_trade_no
 params['txnAmt'] = '%d' % int(total_amount) # 單位為分
 params['txnTime'] = time.strftime('%Y%m%d%H%M%S') # 
 
 params['signature'] = build_sign(params)
#  return params
 return urllib.urlencode(params)
 
def check_sign(message, sign):
 try:
  OpenSSL.crypto.verify(settings.UNIONPAY_PUBLIC_KEY_OBJ, sign, message, 'SHA1')
  return True
 except Exception as _:
  return False

商戶私鑰證書的載入方法(用戶對發(fā)起支付的報文進(jìn)行簽名):

# 商戶私鑰證書
UNIONPAY_APP_PRIVATE_KEY_CERT = os.path.join(UNIONPAY_CERTS_PATH, UNIONPAY_APP_PRIVATE_KEY_CERT_FILENAME) # PKCS12 format
UNIONPAY_PRIVATE_KEYSTORE = OpenSSL.crypto.load_pkcs12(open(UNIONPAY_APP_PRIVATE_KEY_CERT).read(), UNIONPAY_APP_PRIVATE_KEY_CERT_PASSWORD)
UNIONPAY_PRIVATE_KEY_OBJ = UNIONPAY_PRIVATE_KEYSTORE.get_privatekey()

銀聯(lián)公鑰證書的載入方法(用于驗證銀聯(lián)回調(diào)的合法性):

# 銀聯(lián)公鑰證書
UNIONPAY_PUBLIC_KEY_CERT = os.path.join(UNIONPAY_CERTS_PATH, UNIONPAY_PUBLIC_KEY_CERT_FILENAME)
UNIONPAY_PUBLIC_KEY_OBJ = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, open(UNIONPAY_PUBLIC_KEY_CERT).read())

后記:銀聯(lián)支付接入過程中,參考過其官方提供的一個Python實現(xiàn)的接口,里面同時使用了python的rsa模塊和OpenSSL模塊,并且對證書的格式做了各種處理,但是這些似乎是沒有什么必要,只使用OpenSSL模塊就完全可以完成相關(guān)的工作。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python?字符串使用多個分隔符分割成列表的2種方法

    Python?字符串使用多個分隔符分割成列表的2種方法

    本文主要介紹了Python?字符串使用多個分隔符分割成列表,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • 從零學(xué)python系列之從文件讀取和保存數(shù)據(jù)

    從零學(xué)python系列之從文件讀取和保存數(shù)據(jù)

    在Python一般都是運(yùn)用內(nèi)置函數(shù)open()與文件進(jìn)行交互,下面說說具體用法
    2014-05-05
  • Python中的SOLID原則實例詳解

    Python中的SOLID原則實例詳解

    SOLID原則是由Robert C. Martin提出的以首字母縮寫命名的編碼準(zhǔn)則,它代表了五種不同的編碼習(xí)慣,下面這篇文章主要給大家介紹了關(guān)于Python中SOLID原則的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • 如何用python實現(xiàn)結(jié)構(gòu)體數(shù)組

    如何用python實現(xiàn)結(jié)構(gòu)體數(shù)組

    這篇文章主要介紹了如何用python實現(xiàn)結(jié)構(gòu)體數(shù)組,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • python學(xué)習(xí)之panda數(shù)據(jù)分析核心支持庫

    python學(xué)習(xí)之panda數(shù)據(jù)分析核心支持庫

    這篇文章主要給大家介紹了關(guān)于python學(xué)習(xí)之panda數(shù)據(jù)分析核心支持庫的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • python二維碼操作:對QRCode和MyQR入門詳解

    python二維碼操作:對QRCode和MyQR入門詳解

    今天小編就為大家分享一篇python二維碼操作:對QRCode和MyQR入門詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06
  • 詳解pandas繪制矩陣散點(diǎn)圖(scatter_matrix)的方法

    詳解pandas繪制矩陣散點(diǎn)圖(scatter_matrix)的方法

    這篇文章主要介紹了詳解pandas繪制矩陣散點(diǎn)圖(scatter_matrix)的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • Windows 安裝 Anaconda3+PyCharm的方法步驟

    Windows 安裝 Anaconda3+PyCharm的方法步驟

    這篇文章主要介紹了Windows 安裝 Anaconda3+PyCharm的方法步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-06-06
  • 使用django和vue進(jìn)行數(shù)據(jù)交互的方法步驟

    使用django和vue進(jìn)行數(shù)據(jù)交互的方法步驟

    這篇文章主要介紹了使用django和vue進(jìn)行數(shù)據(jù)交互的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • postman傳遞當(dāng)前時間戳實例詳解

    postman傳遞當(dāng)前時間戳實例詳解

    在本篇文章里小編給大家整理的是一篇關(guān)于postman傳遞當(dāng)前時間戳知識點(diǎn)相關(guān)內(nèi)容,有需要的朋友們可以學(xué)習(xí)下。
    2019-09-09

最新評論

五原县| 定安县| 广河县| 比如县| 镇赉县| 昌吉市| 古交市| 汤原县| 顺义区| 辽中县| 于都县| 小金县| 连南| 邵阳市| 互助| 华阴市| 博湖县| 敦化市| 晋江市| 个旧市| 玛沁县| 榆社县| 石泉县| 黄石市| 朔州市| 浦北县| 平远县| 金秀| 松溪县| 垦利县| 安西县| 瑞安市| 黑水县| 浦北县| 沅陵县| 麻栗坡县| 安多县| 耿马| 邵武市| 白山市| 顺义区|