python实现支付功能

#支付宝接口

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
    '''
    # 将筛选的参数按照第一个字符的键值ASCII码递增排序(字母升序排序),如果遇到相同字符则按照第二个字符的键值ASCII码递增排序,以此类推。
    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])
    # 将排序后的参数与其对应值,组合成“参数=参数值”的格式,并且把这些参数用&字符连接起来,此时生成的字符串为待签名字符串。SDK中已封装签名方法,开发者可直接调用,详见SDK说明。
    # 如自己开发,则需将待签名字符串和私钥放入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
    将参数按照支付宝规定组织并签名之后,返回
    '''
    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
    
    # 业务参数
    params['biz_content'] = {}
    params['biz_content']['body']              = body           # 订单描述、订单详细、订单备注,显示在支付宝收银台里的“商品描述”里
    params['biz_content']['subject']           = subject        # 商品的标题/交易标题/订单标题/订单关键字等。
    params['biz_content']['out_trade_no']      = out_trade_no   # 商户网站唯一订单号    
    params['biz_content']['total_amount']      = '%.2f' % (float(total_amount) / 100)   # 订单总金额,单位为元,精确到小数点后两位,取值范围[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

# 支付宝开发者公钥(支付宝生成)
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

# 支付宝开发者应用私钥(接入方生成)
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)
-------------------------------------------------------------------------------------------------------------------------------------------

银联支付

import time
import hashlib
import urllib, urllib2
import base64
import OpenSSL
from django.conf import settings
 
def build_sign(param_map, sign_type="RSA"):
    '''构建签名'''
    # 将筛选的参数按照第一个字符的键值ASCII码递增排序(字母升序排序),如果遇到相同字符则按照第二个字符的键值ASCII码递增排序,以此类推。
    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
 

# 商户私钥证书
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()

# 银联公钥证书
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())
 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值