网络编程
位置:首页>> 网络编程>> Python编程>> 三分钟python搭建支付宝三方支付

三分钟python搭建支付宝三方支付

作者:楼下安同学  发布时间:2022-02-03 22:58:42 

标签:python,支付宝,支付

为什么使用三方支付?

  再没有三方支付平台之前,用户发起支付请求的时候,用户要去和银行签约(转账),特别的不方便,为了解决这些问题,就有了三方支付,三方平台去完成签约,给用户节省时间。

支付宝支付的流程

  商户拿到支付宝的公钥、自己的私钥(私钥加密、公钥解密),用私钥请求支付宝,支付宝解密、验签、进行支付处理,支付宝将处理的返回值传给商户,当支付成功后,返还给商户订单号、金额、时间戳等消息,支付失败后同样给商户反馈结果。

配置流程

1、获取APPID

支付宝开放平台:https://open.alipay.com/

登录支付宝开放平台–>点击控制台

三分钟python搭建支付宝三方支付

点击沙箱(复制APPID)

三分钟python搭建支付宝三方支付

2、在线生成密钥

点击文档,找到开发助手,点击在线加密。

三分钟python搭建支付宝三方支付

获取私钥

三分钟python搭建支付宝三方支付

3、获取公钥

点击应用公钥

三分钟python搭建支付宝三方支付

生成公钥

三分钟python搭建支付宝三方支付

现在已经拿到了需要的公钥。

python项目中集成支付宝

构建支付类


from datetime import datetime
from Crypto.PublicKey import RSA
from Crypto.Signature import PKCS1_v1_5
from Crypto.Hash import SHA256
from urllib.parse import quote_plus
from base64 import decodebytes, encodebytes
import json

class AliPay:
   """
   支付宝支付接口(PC端支付接口)
   """

def __init__(self, appid, app_notify_url, app_private_key_path,
                alipay_public_key_path, return_url, debug=False):
       self.appid = appid
       self.app_notify_url = app_notify_url
       self.app_private_key_path = app_private_key_path
       self.app_private_key = None
       self.return_url = return_url
       with open(self.app_private_key_path) as fp:
           self.app_private_key = RSA.importKey(fp.read())
       self.alipay_public_key_path = alipay_public_key_path
       with open(self.alipay_public_key_path) as fp:
           self.alipay_public_key = RSA.importKey(fp.read())

if debug is True:
           self.__gateway = "https://openapi.alipaydev.com/gateway.do"
       else:
           self.__gateway = "https://openapi.alipay.com/gateway.do"

def direct_pay(self, subject, out_trade_no, total_amount, return_url=None, **kwargs):
       biz_content = {
           "subject": subject,
           "out_trade_no": out_trade_no,
           "total_amount": total_amount,
           "product_code": "FAST_INSTANT_TRADE_PAY",
       }

biz_content.update(kwargs)
       data = self.build_body("alipay.trade.page.pay", biz_content, self.return_url)
       return self.sign_data(data)

def build_body(self, method, biz_content, return_url=None):
       data = {
           "app_id": self.appid,
           "method": method,
           "charset": "utf-8",
           "sign_type": "RSA2",
           "timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
           "version": "1.0",
           "biz_content": biz_content
       }

if return_url is not None:
           data["notify_url"] = self.app_notify_url
           data["return_url"] = self.return_url

return data

def sign_data(self, data):
       data.pop("sign", None)
       unsigned_items = self.ordered_data(data)
       unsigned_string = "&".join("{0}={1}".format(k, v) for k, v in unsigned_items)
       sign = self.sign(unsigned_string.encode("utf-8"))
       quoted_string = "&".join("{0}={1}".format(k, quote_plus(v)) for k, v in unsigned_items)

signed_string = quoted_string + "&sign=" + quote_plus(sign)
       return signed_string

def ordered_data(self, data):
       complex_keys = []
       for key, value in data.items():
           if isinstance(value, dict):
               complex_keys.append(key)

for key in complex_keys:
           data[key] = json.dumps(data[key], separators=(',', ':'))

return sorted([(k, v) for k, v in data.items()])

def sign(self, unsigned_string):
       key = self.app_private_key
       signer = PKCS1_v1_5.new(key)
       signature = signer.sign(SHA256.new(unsigned_string))
       sign = encodebytes(signature).decode("utf8").replace("\n", "")
       return sign

def _verify(self, raw_content, signature):
       key = self.alipay_public_key
       signer = PKCS1_v1_5.new(key)
       digest = SHA256.new()
       digest.update(raw_content.encode("utf8"))
       if signer.verify(digest, decodebytes(signature.encode("utf8"))):
           return True
       return False

def verify(self, data, signature):
       if "sign_type" in data:
           data.pop("sign_type")
       unsigned_items = self.ordered_data(data)
       message = "&".join(u"{}={}".format(k, v) for k, v in unsigned_items)
       return self._verify(message, signature)

实例化类


def init_alipay():
   # 初始化Alipay
   alipay = AliPay(
       appid="appid",
       app_notify_url="回调地址",
       return_url="回调地址",
       app_private_key_path="私钥相对路径",
       alipay_public_key_path="公钥相对路径",
       debug=True  # 支付环境
   )
   return alipay

API


async def get(self):

alipay = init_alipay()
   # 传一个标题  订单号  订单价格
   params = alipay.direct_pay("三方广告平台", order_no, money)
   url = f"https://openapi.alipaydev.com/gateway.do?{params}"
   return self.write(ret_json(url))

# 构建一个回调地址,用于支付成功后回调,在回调地址中可以获取订单号(out_trade_no)、金额(total_amount)、时间戳(timestamp),然后进行处理业务逻辑。

来源:https://blog.csdn.net/weixin_45394086/article/details/121843483

0
投稿

猜你喜欢

  • 一、列表切片(Slicing)由于列表是元素的集合,我们应该能够获得这些元素的任何子集。 例如,如果想从列表中获得前三个元素,我们应该能够轻
  •     对于网页制作者来说,最烦琐的事情可能就是给页面中的图片或文字加链接了。假如页面内容很多的话,那么所做的
  • 本文实例讲述了Python调用C语言的方法。分享给大家供大家参考,具体如下:Python中的ctypes模块可能是Python调用C方法中最
  • 我就废话不多说,大家还是直接看代码吧~def get_model():  n_classes = 6  inp=Inpu
  • 本文介绍Python中的线程同步对象,主要涉及 thread 和 threading 模块。threading 模块提供的线程同步原语包括:
  • 由于谷歌浏览器80以后版本采用了新的加密方式,所以记录在这里# -*- coding:utf-8 -*-import osimport js
  • 在Python3环境下,调试实现了《大话设计模式》中简单工厂模式,通过定义单独的工厂类,完成对具体的产品的实例化,参考链接具体实现见代码:#
  • 迭代器跟生成器,与上篇文章讲的装饰器一样,都是属于我的一个老大难问题。通常就是遇到的时候就去搜一下,结果在一大坨各种介绍博客中看了看,回头又
  • 在 ASP(VBScript 为语言)中,Asc 函数的返回值小于 0 的,可以被判断为中文字符。Asc 函数返回与字符串的第一个字母对应的
  • 有的小伙伴对于枚举的理解很模糊,其实我们可以把它看成一个数量的大管家,对其中的每一个数进行检查,保证里面的数字都没有重复的,这就是枚举的用法
  • 介绍在本文中,我们将使用 OpenCV 库来开发 Python 文档扫描器。OpenCV 的简要概述: OpenCV 是一个开源库,用于各种
  • 内容摘要:网页设计师制作网页最常用的设计软件应该就算adobe的产品Photoshop了,当然Photoshop不仅可以设计网页,不过作为网
  • 如何实现优惠打折?       代码及说明见下:<%@ LANG
  • 写在之前我们都知道 Python 中内置了许多标准的数据结构,比如列表,元组,字典等。与此同时标准库还提供了一些额外的数据结构,我们可以基于
  • 本文实例讲述了Python3使用requests包抓取并保存网页源码的方法。分享给大家供大家参考,具体如下:使用Python 3的reque
  • 前言现在很多地方都有使用到弹幕,最近在捣鼓自己的个人博客网站,也想着在里面加入一个弹幕模块,所以在这里封装了一个可复用的弹幕组件,目前已经实
  • 本文实例讲述了python中dir函数用法。分享给大家供大家参考。具体分析如下:dir 函数返回任意对象的属性和方法列表,包括模块对象、函数
  • 背景简介ImageAI是一个面向计算机视觉编程的Python库,支持最先进的机器学习算法。主要图像预测,物体检测,视频对象检测与跟踪等多个应
  • 本文实例讲述了Go语言计算两个经度和纬度之间距离的方法。分享给大家供大家参考。具体实现方法如下:package main &nbs
  • ERROR 1819 (HY000): Your password does not satisfy the current policy
手机版 网络编程 asp之家 www.aspxhome.com