python接入支付宝的实例操作
Python接入支付宝流程:
第一步:
首先要下载一个python的sdk,这个sdk在支付宝的开发者文档中是没有的,但是强大的python程序员自己开发了一套属于python的支付宝支付sdk。
下载方式:pip install python-alipay-sdk ,github的链接为 https://github.com/fzlee/alipay
第二步:
下载好sdk之后,需要对支付宝进行一些相关的配置,支付宝的环境分为两种,一为正式环境,也就是程序上线之后的环境。
二为沙箱环境,即开发者在开发项目时候的测试环境。
正式环境需要创建应用,然后支付宝后台进行审核,通过后会分配一个appid作为一个唯一标志。如图为创建应用。
这里我用到的是沙箱环境,所以不需要等待支付宝的审核,点击进入开发者中心– 研发服务– 沙箱应用。如图所示它会自动给你分配一个appid,你只需要这是一下私钥和公钥即可。
第三步:
需要生成自己的服务端的私钥和公钥,现在支付宝支持的加密方式为sha256,sha1,
推荐使用sha256.支付宝提供了生成秘钥的方法和步骤(https://docs.open.alipay.com/291/105971/ )
打开括号中的链接,即可看到详细的生成秘钥的方法和步骤。公钥私钥生成完之后,要将公钥上传到支付宝密钥设置中。将支付宝的公钥copy到本地,将自己的公钥私钥和支付宝的公钥保存好(这个很重要),一般都保存到本地项目的文件中。
第四步:
了解并熟悉支付宝的开发流程。如图为客户端通过后端程序与支付宝后端的交互流程图
1、用户选择使用支付宝付款
2、用户使用app向商户服务器发起请求获取签名后的订单信息
3、商户服务端返回签名后的订单信息(查询字符串或者url)例如:
app_id=201609239&biz_content=%7B%22subject%22%3A%22%5Cu6d4b%5Cu8bd5%5Cu8ba2%5Cu5%22out_trade_no%22%3A%22201702021111%22%2C%22total_amount%22%3A1000%2C%22product_code%22%3A%22FAST_INSTANT_TRADE_PAY%22%7D&charset=utf-8&method=alipay.trade.page.pay¬ify_url=http%3A%2F%dus.com%2F&return_url=http%3A%2F%2F47.92.87.172%3A8000%2F&sign_type=RSA2×tamp=2015+15%3A19%3A15&version=1.0&sign=BSzk6LzwNp
4、商户app调用支付接口
5-8、支付宝服务端接收请求,返回支付结果。
9、商户app向商户服务端发起请求,同步支付结果,服务端验证签名,解析支付结果。
10、返回支付结果。
11、商户app展示支付结果。
12、支付宝服务端向商户服务端异步发送支付通知。
13、商户服务端接收支付通知,并返回响应给支付宝服务端。
第五步:
python代码如下
#业务处理:使用pythonsdk调用支付宝的支付接口
#初始化
fromalipayimportAliPay
alipay=AliPay(
appid="2016092300574189",
app_notify_url=None,
app_private_key_path=r"D:python源代码alipay_keysprivate_keys",
alipay_public_key_path=r"D:python源代码alipay_keyspublic_key",
sign_type="RSA2",
debug=True,
)
#调用接口
#total_pay=order.total_price+order.transit_price
total_pay=12311
order_string=alipay.api_alipay_trade_page_pay(
out_trade_no=1231231312313,
total_amount=str(total_pay),
subject='测试text%s'%1,
return_url=None,
notify_url=None,
)
#返回应答
pay_url="https://openapi.alipaydev.com/gateway.do?"+order_string
print(pay_url)
这段代码实现的功能为生成一个签名后的url,这个url就是访问支付宝支付的url
其中初始化部分的参数:appid为支付宝的唯一标志id,
app_notify_url为支付宝后台完成支付的时候异步通知到商户的后台服务器的URL地址。
app_private_key_path为自己生成的私钥,
alipay_public_key_path为支付宝的公钥。sign_type为签名的加密方式,
debug为true时,支付宝的支付的url为非正式的环境,如果为线上环境可以将其改为false。
调用接口部分的参数: out_trade_no为订单编号这个是商户后台服务器自己生成的订单编号。
total_amount为支付金额(必须为字符串类型),subject为标题,return_url为支付成功后支付页面要跳转到哪个页面。
notify_url为异步通知的url。
第六步:
运行这段代码会得到一个签名之后的url。
访问这个url,看到的结果为:
可以手机下载一个沙箱环境的支付宝,也可以点击右侧的登录账户付款。在沙箱应用中提供了用于付款的账号和密码。
第七步:
登录完成支付
实例扩展:
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:
- Spark1.0新特性-->Spark SQL
- 挖洞经验 | 看我如何综合利用4个漏洞实现GitHub Enterprise 远程代码执行
- Spark的机器学习算法mlib的例子运行
- Spark Streaming自定义Receivers
- 利用USB橡皮鸭在目标机器上启动Empire或Meterpreter会话
- Spark部署
- Spark调优
- perl语言十分钟入门【零基础可入】
- Spark硬件配置推荐
- Spark作业调度
- 如何把Photoshop改造成远程控制工具(RAT)来利用
- Office高级威胁漏洞在野利用分析
- 10行代码告诉你,为什么说Python数据可视化是一件艺术品
- 没想到你是这样的Linux | 终端下有趣的命令合集
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 纯CSS制作加<div>制作动画版哆啦A梦
- Ubuntu 18.04 安装使用 Supervisor 进程守护并设置开机自动启动
- AWS CLI version 2 在 Windows 下的安装
- Vue事件绑定原理
- 组合
- 用navicat进行身份验证连接出现cannot connect to Mongodb authentication failed
- three.js中的矩阵计算
- ASP.NET Core 3.x Razor视图运行时刷新实时编译
- 线段树详解分析
- Centos 网卡命名规范及信息查看(物理网卡,虚拟网卡)
- 个人账号密码管理体系(账号篇)
- 当年偶然发现的 Java Bug(JDK 9及之前仍未修复)
- 干货 | 45张图庖丁解牛18种Queue,你知道几种?
- Linux/Unix 效率工具:快速路径切换 z 命令
- Salesforce LWC学习(二十四) Array.sort 浅谈