python - alipay sdk 使用 及 注意点
一. 在 点击跳转 这里拿到自己的 appid 和 支付宝公钥 ,
如果想要得到 支付宝的公钥 就需要获取 应用的公钥,具体获取方式 :
a. 应用私钥和支付宝公钥 获取 和 配置 过程:
1. 下载后打开文件夹 点击 RSA签名验签工具.bat 然后生成密钥 , 然后退出就行了
2. 找到 RSA密钥 的文件夹 , 将里面的 应用公钥 复制一下 , 然后在 沙箱应用 中点击 查看应用公钥,
点击修改,将刚才的 应用公钥 粘贴上去,然后保存,此刻你会多一个支付宝公钥 ( 注: 当你修改应用公钥后,支付宝公钥会自动生成 )
3. 准备两个文本文件名为( 文件名随意,注意规范 ) :
alipay_public_2048.txt (存放支付宝公钥) 和 app_private_2048.txt (存放应用私钥)
这里注意两点 :
1. 应用私钥指的是 刚刚 RSA密钥 文件夹中 的应用私钥 ,而 公钥指的是 刚刚上传 应用公钥后给你自动生成的 应用公钥
2. 将应用私钥和支付宝公钥保存在 文本中的时候 要添加 一个标识 ( 必须加 ):
- 打开 alipay_public_2048.txt(存放支付宝公钥) 这个空文本 格式是这样的:
-----BEGIN PUBLIC KEY-----
中间放入你的支付宝公钥
-----END PUBLIC KEY-----
- 打开 app_private_2048.txt (存放应用私钥)这个空文本 格式是这样的:
-----BEGIN RSA PRIVATE KEY-----
中间放你的应用私钥
-----END RSA PRIVATE KEY-----
b. 下载工作
1. 配置服务端 sdk -- 官方链接 :https://pypi.org/project/alipay-sdk-python/
pip install python-alipay-sdk --upgrade
2. 导入加密模块
- pip install Crypto
二:示例代码
- Url
- urlpatterns=[
- url(r"^index/$",views.index), # 商品页面 API
- url(r"^back_url/$",views.back_url), # 支付成功后的重定向 API
- url(r"^update_order/$",views.back_url), # 支付成功后的异步POST请求 API
- ]
- Views
- from django.shortcuts import render,HttpResponse,redirect
- from django.views.decorators.csrf import csrf_exempt # 取消 csrf组件
- import time
- from alipay import AliPay
- def Alipay():
- alipay = AliPay(
- appid='', # appid (详细在你的沙箱应用中的 APPID)
- app_notify_url='http://127.0.0.1:8045/update_order/', # 异步回调url(回调地址需是服务器地址,否则接收不到回调结果)
- app_private_key_path='app_test/app_private_2048.txt', # 应用私钥
- alipay_public_key_path='app_test/alipay_public_2048.txt', # 支付宝公钥
- sign_type="RSA2", # RSA 或者 RSA2 -- 这里注意一点:2018年1月5日后创建的应用只支持RSA2的格式;
- debug=True, # 默认False -- 设置为True则是测试模式,正式上线的话改为 False就行了
- )
- return alipay
- def index(request):
- """
- # 这里发起POST的支付请求
- """
- if request.method == 'GET':
- return render(request,'index.html')
- alipay = Alipay()
- out_trade_no = "x2" + str(time.time())
- order_string = alipay.api_alipay_trade_page_pay(
- out_trade_no=out_trade_no, # 订单号 - 注 : 每次的订单号不能一致
- total_amount=0.01, # 商品价格
- subject='shop_name', # 商品名称
- return_url = 'http://127.0.0.1:8045/back_url/', # 支付成功后 - 重定向自己的网站
- notify_url='http://127.0.0.1:8045/update_order/' # 支付成功后 - 异步发送支付结果到回调地址(地址需是服务器地址,否则无法接收到回调结果)
- )
- pay_url = "https://openapi.alipaydev.com/gateway.do?{}".format(order_string)
- # 注 :这里结尾不能加 /
- return redirect(pay_url)
- def back_url(request):
- """
- # 支付成功后的回调函数 -- 重定向自己的网站
- # 同时在重定向之前会校验此次支付信息是否正确
- :param request:
- :return:
- """
- params = request.GET.dict()
- sign = params.pop('sign', None)
- print(params)
- alipay = Alipay()
- status = alipay.verify(params, sign) # 返回 True or False
- if status:
- return HttpResponse('支付成功')
- return HttpResponse('支付失败')
- @csrf_exempt
- def update_order(request):
- """
- 支付成功后,支付宝向该地址发送的POST请求(用于修改订单状态)
- :param request:
- :return:
- """
- if request.method == 'POST':
- from urllib.parse import parse_qs
- body_str = request.body.decode('utf-8')
- post_data = parse_qs(body_str)
- post_dict = {}
- for k, v in post_data.items():
- post_dict[k] = v[0]
- alipay = Alipay()
- sign = post_dict.pop('sign', None)
- status = alipay.verify(post_dict, sign)
- if status:
- # 1. 获取订单号(获取的订单号是你上面的参数: out_trade_no)
- out_trade_no = post_dict.get('out_trade_no')
- print(out_trade_no)
- # 2. 根据订单号将数据库中的数据进行更新(修改订单状态)
- return HttpResponse('success')
# 3. 最终需要返回 "success" 字符给支付宝,否则支付宝将一直请求该地址并发送回调结果(具体看官方文档)- return HttpResponse('success')
- - AliPay 中的加密配置(本身就是配置好的,但是如果验证出问题了,看看这里对不对):
- 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 urllib.parse import urlparse, parse_qs
- from base64 import decodebytes, encodebytes
- import json
三:最后总结一点容易出现的错误 和 一些方法的说明
- return_url :支付成功后 - 重定向自己的网站
- notify_url :支付成功后 - 发送的POST订单验证消息(异步)
- out_trade_no :这个是订单号 -- 注意一点,千万不要测试的时候每次使用一个同一个订单号,否则会出现支付页面无法打开的问题
- debug = True / False :如果等于 True 的话就是测试环境的支付,如果是 False 就是正式环境的支付
- app_private_key_path :后面写 应用的私钥 路径位置
- alipay_public_key_path : 后面写 支付宝的公钥 路径位置
- sign_type = "RSA2" :可以使用 RSA 或者 RSA2 ,
这里注意下 :2018年1月5日后创建的应用只支持RSA2的格式;
- "https://openapi.alipaydev.com/gateway.do?{}".format(order_string) -- 结尾不要加 / (反斜杠)
注:带 dev 则是测试用的接口,但是不带 dev 就是真正的支付接口
- - 最后说一点规范:
1. 建议把 AliPay 下面的 appid 什么的信息 写在 settings 中,
然后导入 settings 在通过 settings.APPID 拿到信息
2. 将存放 应用密钥 和 支付宝公钥 的 txt 文件放到单独一个文件夹中
python - alipay sdk 使用 及 注意点的更多相关文章
- python 支付宝SDK
python 支付宝SDK代码如下 from datetime import datetime from Crypto.PublicKey import RSA from Crypto.Signatu ...
- laravel5.5 使用alipay SDK报错Cannot redeclare Encrypt() (previously declared in ../vendor/laravel/framework/src/Illuminate/Foundation/helpers.php:448)
错误现象: 在laravel5.5 中,使用alipaySDK 报错: Cannot redeclare Encrypt() (previously declared in ../vendor/lar ...
- boto3--通过Python的SDK连接aws
通过Python的SDK连接aws 参考: https://aws.amazon.com/cn/developers/getting-started/python/ aws上生成访问密钥 ID 和私有 ...
- 【Azure Developer - 密钥保管库 】使用 Python Azure SDK 实现从 Azure Key Vault Certificate 中下载证书(PEM文件)
问题描述 在Azure Key Vault中,我们可以从Azure门户中下载证书PEM文件到本地. 可以通过OpenSSL把PFX文件转换到PEM文件.然后用TXT方式查看内容,操作步骤如下图: Op ...
- MinIO Python Client SDK 快速入门指南
官方文档地址:http://docs.minio.org.cn/docs/master/python-client-quickstart-guide MinIO Python Client SDK提供 ...
- IDEA集成Python插件,SDK配置
(第一次写在博客园添加随笔, 会有些生硬,有不对的地方和描述错误之处希望可以指出) 最近在学习一个新的知识点,涉及到Python的使用,因为第一次接触很多地方都不是很明白 ,好,废话不多说,现在直接上 ...
- [python](Docker SDK)上传镜像到私有仓库(tls、身份认证)
(Docker SDK)上传镜像到私有仓库(tls.身份认证) API:https://docker-py.readthedocs.io/en/stable/ 环境:python:3.7.3 配置参数 ...
- 支付宝 python alipay 集成(转)
即时到帐只是支付宝众多商家服务中的一个,表示客户付款,客户用支付宝付款,支付宝收到款项后,马上通知你,并且此笔款项与交易脱离关系,商家可以马上使用. 即时到帐只对企业客户服务,注册成功企业账号以后,申 ...
- Mac下安装appium+python+Android sdk 环境完整流程
安装大纲:1,安装jdk (jdk1.8及以上版本都可以,尽量不要用最新可能会不兼容) 2,安装android-sdk (mac版本的android-sdk) 3,mumu模拟器 (随便找的一个) 4 ...
随机推荐
- Linux学习-IP设置
网卡命名规则 CENTOS6的网卡命名方式:它会根据情况有所改变而非唯一且固定,在CENTOS6之前,网络接口使用连续号码命名: eth0. eth1等,当增加或删除网卡时,名称可能会发生变化 CEN ...
- Java基础笔试练习(十一)
1.下面的方法,当输入为2的时候返回值是多少? public static int getValue(int i) { int result = 0; switch (i) { case 1: res ...
- 小程序发起get请求====post请求
- mysql_重置密码
# 修改编码 ```pythonshow variables like '%char%'; #查看当前使用的编码 1.打开配置文件: vim /etc/mysql/my.cnf 2.在[client] ...
- idea 中激活 JRebel
JRebel介绍: JRebel是一款JVM插件,它使得Java代码修改后不用重启系统,立即生效.IDEA上原生是不支持热部署的,一般更新了 Java 文件后要手动重启 Tomcat 服务器,修改才能 ...
- Winform 使用热键功能实现Ctrl+C和Ctrl+V复制粘贴功能
当我们使用winform控件的时候,会发现这些控件(比如Label)不支持Ctrl+c 复制和Ctrl+v 快捷键复制粘贴功能,如果我们需要实现这个功能改怎么做呢? 1. 首先我们创建一个winfor ...
- python PIL图像处理库
1. Introduction PIL(Python Image Library)是python的第三方图像处理库,但是由于其强大的功能与众多的使用人数,几乎已经被认为是python官方图像处理库了. ...
- Linux系统中五款好用的日志分析工具
监控网络活动是一项繁琐的工作,但有充分的理由这样做.例如,它允许你查找和调查工作站和连接到网络的设备及服务器上的可疑登录,同时确定管理员滥用了什么.你还可以跟踪软件安装和数据传输,以实时识别潜在问题, ...
- java后台获取微信小程序openid
一.jar包准备 1.在网盘下载 链接:https://pan.baidu.com/s/15HAAWOg_yn768g4s9IrcPg 提取码:hgj0 二.在pom文件中添加依赖 1.将外部的引入的 ...
- 什么是MBR
MBR的定义 MBR(Main Boot Record)主引导记录是位于磁盘最前边的一段引导代码,由磁盘操作系统(DOS)在对磁盘初始化时产生,负责磁盘操作系统(DOS)对磁盘进行读写时磁盘分区合法性 ...