一. 在 点击跳转 这里拿到自己的 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 使用 及 注意点的更多相关文章

  1. python 支付宝SDK

    python 支付宝SDK代码如下 from datetime import datetime from Crypto.PublicKey import RSA from Crypto.Signatu ...

  2. 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 ...

  3. boto3--通过Python的SDK连接aws

    通过Python的SDK连接aws 参考: https://aws.amazon.com/cn/developers/getting-started/python/ aws上生成访问密钥 ID 和私有 ...

  4. 【Azure Developer - 密钥保管库 】使用 Python Azure SDK 实现从 Azure Key Vault Certificate 中下载证书(PEM文件)

    问题描述 在Azure Key Vault中,我们可以从Azure门户中下载证书PEM文件到本地. 可以通过OpenSSL把PFX文件转换到PEM文件.然后用TXT方式查看内容,操作步骤如下图: Op ...

  5. MinIO Python Client SDK 快速入门指南

    官方文档地址:http://docs.minio.org.cn/docs/master/python-client-quickstart-guide MinIO Python Client SDK提供 ...

  6. IDEA集成Python插件,SDK配置

    (第一次写在博客园添加随笔, 会有些生硬,有不对的地方和描述错误之处希望可以指出) 最近在学习一个新的知识点,涉及到Python的使用,因为第一次接触很多地方都不是很明白 ,好,废话不多说,现在直接上 ...

  7. [python](Docker SDK)上传镜像到私有仓库(tls、身份认证)

    (Docker SDK)上传镜像到私有仓库(tls.身份认证) API:https://docker-py.readthedocs.io/en/stable/ 环境:python:3.7.3 配置参数 ...

  8. 支付宝 python alipay 集成(转)

    即时到帐只是支付宝众多商家服务中的一个,表示客户付款,客户用支付宝付款,支付宝收到款项后,马上通知你,并且此笔款项与交易脱离关系,商家可以马上使用. 即时到帐只对企业客户服务,注册成功企业账号以后,申 ...

  9. Mac下安装appium+python+Android sdk 环境完整流程

    安装大纲:1,安装jdk (jdk1.8及以上版本都可以,尽量不要用最新可能会不兼容) 2,安装android-sdk (mac版本的android-sdk) 3,mumu模拟器 (随便找的一个) 4 ...

随机推荐

  1. easyui_datagrid实现导出Excel

    easyui_datagrid实现导出Excel 一.PHPExcel使用方法 先下载PHPExcel类库文件,并引入. 二.利用AJAX实现datagrid导出Excel 原理:前台通过AJAX调用 ...

  2. REDISTEMPLATE如何注入到VALUEOPERATIONS

    REDISTEMPLATE如何注入到VALUEOPERATIONS 今天看到Spring操作redis  是可以将redisTemplate注入到ValueOperations,避免了ValueOpe ...

  3. 前端开发 Vue Vue.js和Nodejs的关系

    首先vue.js 是库,不是框架,不是框架,不是框架. Vue.js 使用了基于 HTML 的模版语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据. Vue.js 的核心是一个允许你 ...

  4. springboot笔记07——整合MyBatis

    前言 Springboot 整合 MyBatis 有两种方式,分别是:"全注解版" 和 "注解.xml混合版". 创建项目 创建Springboot项目,选择依 ...

  5. 【面试突击】- SpringMVC那些事(一)

    1.什么是Spring MVC ?简单介绍下你对springMVC的理解? Spring MVC是一个基于MVC架构的用来简化web应用程序开发的应用开发框架,它是Spring的一个模块,无需中间整合 ...

  6. Linux下使用nextcloud搭建个人网盘

    市面上有那么多的网盘服务提供商,为什么还要自己搭建网盘呢?主要有以下原因: 免费的网盘都有种种限制,要么不限速容量小(onedriver,google driver),要么容量大限速(百度云) 付费网 ...

  7. vue2.0项目在360兼容模式下打开空白

    安装两个依赖环境 yarn add babel-polyfill -D yarn add babel-preset-es2015 babel-cli -D 在main.js中引入babel-polyf ...

  8. linux下安装dotnet core

    windows下安装linux系统需要用到VMware 这个软件,可自行百度下载,然后安装centos7系统安装 centos下安装dotnetcore 在终端输入命令: sudo yum insta ...

  9. 【Bug】MQ消息与事务提交

    项目联调期间,遇到个bug,涉及MQ消息传递和事务提交时间问题,简单记录下. 背景 审核服务(审核创建项目),点击审核通过,后台代码会在提交事务前发送MQ消息(该消息由项目管理服务消费),发送成功后, ...

  10. Java--8--新特性--接口中的变化!!

    package InterfaceP; public interface Interface1 { default String getName(){ return "Interface1& ...