Python对接支付宝支付自实现

Python对接支付宝支付自实现

# -*- coding: utf-8 -*-

import base64
import json
import urllib.parse
from datetime import datetime

import requests
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives.asymmetric import padding

class AliPayException(Exception):
    def __init__(self, data):
        super(AliPayException, self).__init__()
        self.data = data

    def __str__(self):
        return "alipay - {}".format(self.data)

    def __unicode__(self):
        return u"alipay - {}".format(self.data)

class AliPayVerifyException(AliPayException):
    def __init__(self, msg, data):
        super(AliPayVerifyException, self).__init__('alipay verify except - {}:{}'.format(msg, data))

class AliPay:
    def __init__(self, **kwargs):
        """
        :param kwargs:
            url: 请求地址
            notify_url: 支付宝服务器主动通知商户服务器里指定的页面http/https路径
            app_id: 支付宝分配给开发者的应用ID
            sign_type: 商户生成签名字符串所使用的签名算法类型,目前支持RSA2和RSA,推荐使用RSA2
            app_private_key: 签名私钥
        """
        self._app_id = kwargs['app_id']
        self._seller_id = kwargs['seller_id']
        self._gateway_url = kwargs['gateway_url']
        self._notify_url = kwargs.get('notify_url')
        self._sign_type = kwargs.get('sign_type', 'RSA2')
        if self._sign_type not in ('RSA', 'RSA2'):
            raise Exception('alipay sign_type must `RSA` or `RSA2`')
        self._charset = 'utf-8'
        self._format = 'json'

        with open(kwargs['app_private_key']) as f:
            self._app_private_key = serialization.load_pem_private_key(
                f.read().encode('utf8'),
                None,
                default_backend()
            )
        with open(kwargs['public_key']) as f:
            self._public_key = serialization.load_pem_public_key(
                f.read().encode('utf8'),
                default_backend()
            )

    @property
    def app_id(self):
        return self._app_id

    @property
    def seller_id(self):
        return self._seller_id

    def app_private_sign(self, data):
        if self._sign_type == 'RSA':
            signature = self._app_private_key.sign(
                data.encode('utf8'),
                padding.PKCS1v15(),
                hashes.SHA1())
        else:
            signature = self._app_private_key.sign(
                data.encode('utf8'),
                padding.PKCS1v15(),
                hashes.SHA256())
        return base64.b64encode(signature).decode('utf8')

    def sync_verify(self, method, raw_data):
        """
        同步验签
        :return:
        """
        method = method.replace('.', '_') + '_response'
        raw_data = raw_data.decode('utf8')
        sign_index = raw_data.rfind('sign')
        signature = base64.b64decode(raw_data[sign_index + 7: -2])
        method_data = raw_data[raw_data.find(method) + len(method) + 2: sign_index - 2]
        self._public_key.verify(
            signature,
            method_data.encode('utf8'),
            padding.PKCS1v15(),
            hashes.SHA256())

    def async_verify(self, data):
        """
        异步验签
        :return:
        """
        sign_data = {}
        for k, v in data.items():
            if k in ('sign', 'sign_type'):
                continue
            sign_data[k] = v

        self._public_key.verify(
            base64.b64decode(data['sign']),
            '&'.join(['{}={}'.format(item) for item in self.sort_data(sign_data)]).encode('utf8'),
            padding.PKCS1v15(),
            hashes.SHA256())

    @staticmethod
    def sort_data(data):
        return [(k, data[k]) for k in sorted(data.keys())]

    def params(self, method, biz_content):
        data = {
            'app_id': self._app_id,
            'method': method,
            'format': self._format,
            'charset': self._charset,
            'sign_type': self._sign_type,
            'timestamp': datetime.now().strftime('%Y-%m-%d %H:%M:%S'),  # yyyy-MM-dd HH:mm:ss
            'version': '1.0',
            'biz_content': json.dumps(biz_content, separators=(',', ':'))
        }
        if self._notify_url:
            data['notify_url'] = self._notify_url

        sign = self.app_private_sign('&'.join(['{}={}'.format(item) for item in self.sort_data(data)]))

        p = '&'.join(['{}={}'.format(item[0], urllib.parse.quote(item[1])) for item in self.sort_data(data)])
        p += '&{}={}}'.format('sign', urllib.parse.quote(sign))

        return p

    def command(self, method, biz_content):
        params = self.params(method, biz_content)

        response = requests.get('%s?%s' % (self._gateway_url, params))
        response_raw_data = response.content
        response_data = response.json()
        alipay_response_data = response_data[method.replace('.', '_') + '_response']
        if alipay_response_data.get('code', '10000') != '10000':
            raise AliPayException(alipay_response_data)
        self.sync_verify(method, response_raw_data)
        return alipay_response_data

if __name__ == '__main__':
    alipay = AliPay(**{
        'app_id': '...',
        'seller_id': '...',
        'gateway_url': 'https://openapi.alipaydev.com/gateway.do',
        'notify_url': '...',
        'app_private_key': 'path to private_key.pem',
        'public_key': 'path to public_key.pem'
    })
    biz_content = {
        'out_trade_no': "111",
        'total_amount': 0.01,
        'subject': "test",
    }
    alipay.command('alipay.trade.precreate', biz_content)

原文地址:https://www.cnblogs.com/zhuxiaoru/p/11643614.html

时间: 2024-10-29 21:49:18

Python对接支付宝支付自实现的相关文章

对接支付宝支付接口开发详细步骤(证书签名方式)

对接支付宝支付接口,官方文档已经写的很清楚了,但是也有很多像我一样的小白,第一次对接支付宝支付接口,会有些迷茫,所以我在此写下这篇文章,给我和我一样的同学,一点思路吧.需要思路的可以私聊我 两大支付平台感觉都有坑人之处吧(终归是学艺不精,哈哈哈哈!!) 不过支付宝相做的较好的一点是有技术和你在线调试,这就很舒服,哈哈. 寻找技术地址:支付宝开放平台 - 开发者中心 - 网页&移动应用 - 右边有个立即咨询 - 智能问答(多发送几次就有技术出来了) 第一步:(先要在支付宝进行操做,拿到我们需要开发

Python必备基础:这些NumPy的神操作你都掌握了吗?微交易支付通道申请微信支付接口对接支付宝支付通道搭建微盘网银扫码快捷H5支付

导读:NumPy是Python的基础,更是数据科学的通用语言. 本文简单介绍NumPy模块的两个基本对象ndarray.ufunc,介绍ndarray对象的几种生成方法及如何存取其元素.如何操作矩阵或多维数组.如何进行数据合并与展平等.最后说明通用函数及广播机制. 需要了解 JR金融项目 区块链,比特币,p2p项目,B2B网关,现货资金盘,期货招商,股票配资,商品交易所 大盘的 金融支付 第三方支付,网关支付,网银支付,银行卡支付,话费卡支付,银联代扣,支付渠道,支付宝支付,微信支付,扫码支付,

python - 对接微信支付(PC)和 注意点

注:本文仅提供 pc 端微信扫码支付(模式一)的示例代码. 关于对接过程中遇到的问题总结在本文最下方. 参考: 官方文档,    https://blog.csdn.net/lm_is_dc/article/details/83312706 一.wxpay_settings.py (配置基本参数和创建订单时必要的方法,如 随机生成字符串,加密签名,生成支付二维码等) # encoding: utf-8 import random import os import time import requ

Python 支付宝支付

一,支付宝介绍 1. 支付宝开发网址 支付宝开放平台: https://open.alipay.com/platform/home.htm 支付宝沙箱环境: https://openhome.alipay.com/platform/appDaily.htm?tab=info 支付宝开发者文档:https://openhome.alipay.com/developmentDocument.htm 电脑网站支付流程:https://docs.open.alipay.com/270 生成签名:http

使用Tornado异步接入第三方(支付宝)支付

目前国内比较流行的第三方支付主要有支付宝和微信支付,博主最近研究了下如何用Python接入支付宝支付,这里我以Tornado作为web框架,接入支付宝构造支付接口. 使用Tornado异步接入支付宝支付流程: 1. 进入蚂蚁金服开放平台填写开发者信息.应用信息 2. 配置RSA256密钥,生成支付宝和应用的密钥 3. 构造订单接口API,生成订单 4. 构造支付接口 1. 进入蚂蚁金服开放平台填写开发者信息.应用信息 这里通过沙箱环境开发测试接口,蚂蚁金服开放平台-->开发者中心-->研发者服

App对接支付宝移动支付功能

前段时间看了下app对接支付宝移动支付的功能,并自己总结了下支付宝移动支付的实现流程 一.申请流程          前提是已有现成的应用. 1.  申请地址            https://b.alipay.com/order/productDetail.htm?productId=2015110218010538  2. 申请材料 企业支付宝账号注册企业账号,您可以提供产品介绍文档或者手机demo.apk .doc .docx .pdf格式,内容要求包含产品说明.接口使用场景.资费说明

Python接入支付宝进行PC端支付

1.  支付宝开放平台登录,使用支付宝账号登录 https://open.alipay.com/platform/home.htm 2.选择沙箱模式 https://docs.open.alipay.com/200/105311 3.支付宝开发者文档 https://openhome.alipay.com/developmentDocument.htm 4.电脑网站支付 https://docs.open.alipay.com/270,查看支付流程和支付接口介绍 5.因为官方并没有提供Pytho

iOS----支付(微信支付、支付宝支付、银联支付控件集成支付)(转)

资料 支付宝 //文档idk都包含了安卓.iOS版 银 联 银联官网资料 Demo Demo给了一个订单号,做测试使用,若出现支付失败什么的,可能是已经被别人给支付了,或者是服务器订单过期了 ~ 一.支付宝 1.1 请阅读支付宝文档和Demo 1.2 导入对应的库 将支付宝Demo中得这些东西全拷贝过来 1 2 3 4 5 localhost:alipay mac$ ls APAuthV2Info.h        Order.h            libssl.a APAuthV2Info

支付宝支付即时到账接口在ThinkPHP商城中的应用

支付宝支付是PHP高级课程中ThinkPHP商城项目课的内容之一,在此视频中将会讲解如何将支付宝作为第三方库集成到ThinkPHP框架中,并且将支付宝的配置参数写入自定义配置中从而达到在整个项目中灵活调用支付的目的.涉及到的知识点有使用vendor函数加载第三方扩展库,对vendor函数做了详细的介绍.使用C函数来读取自定义配置.结合ThinkPHP的特性和支付宝第三方支付的调用方式做了支付宝集成到ThinkPHP框架的完整流程. 1.   支付宝支付–即时到账 1.1.  获取即时到账sdk