python3.6 对接微信、支付宝支付接口,以及异步验签、同步验签全过程。

  1. 首先简单描述下微信以及支付宝对接流程(PC网站中集成支付二维码)
    1. 对接支付宝付款的话有两种方式,一:调用支付宝接口,根据返回的qr_code的值(是一个url),然后自己生成二维码,嵌入在网页付款(也就是订单预创建),二:通过新跳转页面到支付网站支付,这种方式对于web来说不太友好,毕竟直接集成在网站中,直接支付比较方便,我本次项目中使用到的也是集成在网站中,支付宝的接口都要用到RSA2的加密库,在验签的时候略微麻烦。
    2. 微信支付跟支付宝的都差不多,安全方面,支付宝使用的是RSA2对数据的签名,微信使用MD5对数据签名,相比之下微信的对接工作量要小一些,但是微信目前没有测试的支付环境。
  2. 准备工作
    1. 支付宝对接有一个测试环境,支付宝沙箱版(注意,目前只有支持安卓版本)。
    2. 微信因为没有测试环境,正式环境有需要商户认证或者企业认证,所以下面代码示例中,已经明文写上去了,方便大家测试。
  3. 开发文档
    1. 支付宝秘钥生成以及配置指南调用接口的签名文档支付宝回调你的接口(异步验签)以及你调用支付宝生成支付二维码接口(同步验签)时,你需要的验证签名文档,这一步很重要。支付宝沙箱环境,下载后需要在网页中获取登录沙箱的账号密码,用于支付测试。
    2. 微信支付接口文档,只需要一个对接文档就够了。
  4. 代码部分(代码全部摘自项目部分,所以有部分耦合,还需大家自己简单处理下,有疑问可以留言)


    公共模块(public_method.py),log模块大家自己处理下,我的就不放上去了

    """
    定义公共方法
    """
    import os
    import io
    import time
    import json
    import hashlib
    import base64
    import datetime
    
    from urllib import parse
    import qrcode
    import xmltodict
    from Crypto.PublicKey import RSA
    from Crypto.Signature import PKCS1_v1_5
    from Crypto.Hash import SHA256
    
    from log import Lzlog
    
    
    def rsa_verify_sign(data_str, sign, secret_key, key_is_file=False, need_import=False):
        """
    
        :param data_str: 等待验签的数据
        :param sign: 数据的签名
        :param secret_key: 秘钥
        :param key_is_file: 秘钥是否是一个文件目录
        :param need_import: 是否需要预导入秘钥
        :return:
        """
        secret_key = get_secret(secret_key, key_is_file, need_import)
        signer = PKCS1_v1_5.new(secret_key)
        digest = SHA256.new()
        digest.update(data_str.encode("utf8"))
        if signer.verify(digest, base64.decodebytes(sign.encode("utf8"))):
            return True
        return False
    
    
    def get_secret(secret_key, key_is_file=False, need_import=False):
        """
    
        :param secret_key: 秘钥、或者秘钥路径
        :param key_is_file: 标识秘钥是否是一个文件
        :param need_import: 是否需要做导入处理
        :return: 秘钥
        """
        res = secret_key
        if secret_key:
            if key_is_file:
                    res = read_secret(secret_key)
            else:
                if need_import:
                    res = RSA.importKey(secret_key)
    
        return res
    
    
    def read_secret(secret_path, import_key=True):
        """
        从文件加载秘钥
        :param secret_path:
        :param import_key: 是否需要导入秘钥
        :return:
        """
        with open(secret_path, "r") as fp:
            return RSA.importKey(fp.read()) if import_key else fp.read()
    
    
    def rsa_sign(unsigned_string, secret_key, key_is_file=False, need_import=False) -> str:
        """
        RSA数字签名协议根据PKCS#1 v1.5
        :param unsigned_string: 等待签名的字符串
        :param secret_key: 秘钥
        :param need_import: 如果为True, 则初始化秘钥
        :param key_is_file: 为True 表示需要从文件读取
        :return: 将签名base64编码
        """
        if unsigned_string and secret_key:
            if key_is_file:
                    secret_key = read_secret(secret_key)
            else:
                if need_import:
                    secret_key = RSA.importKey(secret_key)
            # 创建一个签名对象
            signer = PKCS1_v1_5.new(secret_key)
            # 签名
            signature = signer.sign(SHA256.new(unsigned_string))
            # base64 编码,转换为unicode表示并移除回车
            sign = base64.encodebytes(signature).decode("utf8").replace("\n", "")
            return sign
        return ''
    
    
    def join_tuple_param(data: list, quote_plus=False) -> str:
        """
        :param data:  [(key, val
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值