项目演示:

一、输入金额

二、跳转到支付宝付款

三、支付成功

四、跳转回自己网站

在使用支付宝接口的前期准备:

1、支付宝公钥

2、应用公钥

3、应用私钥

4、APPID

5、Django 1.11.11 环境

1234均由阿里开放平台生成

如果你不是商户或者你只是想测试,阿里提供了沙箱环境供测试

沙箱环境下的商户账号和用户账号、支付宝app都是沙箱版的,不能用实际账号

这时候我们需要去阿里开放平台去生成一些1234参数

注册网址: https://openhome.alipay.com/platform/appDaily.htm?tab=info

点击设置应用公钥

下载签名生成工具,解压后找到 RSA签名验签工具.bat 文件打开

这个工具会自动保存应用公钥和应用私钥到 RSA密钥 文件夹

将应用公钥拷贝到网站窗口,点保存,在原应用公钥按钮旁就会自动生成支付宝公钥

我们需要将网站窗口生成的支付宝公钥也新建一个txt文件放到这里面

继续操作

修改三个txt文件的名字为英文,如:app_public.txt \  app_private.txt  \ alipay_public.txt

修改三个txt文件内容为固定格式:

-----BEGIN PUBLIC KEY-----  # 加上这行

密钥部分

-----END PUBLIC KEY-----   # 同上

将三个文件copy到django项目下新建文件夹中,如:

你也可以放在app下面,都可以,随你自己,但你可以先按我的一模一样配置将项目先跑通。

建议新建alipay的文件夹,配置及相关py文件可以全部放到这里面来

接下来在settings配置文件中配置这三个txt文件的路径

我的配置:

ALIPAY_PUBLIC = os.path.join(BASE_DIR,'alipay_use','alipay','alipay_keys','alipay_public.txt')

APP_PUBLIC = os.path.join(BASE_DIR,'alipay_use','alipay','alipay_keys','app_public.txt')

APP_PRIVATE = os.path.join(BASE_DIR,'alipay_use','alipay','alipay_keys','app_private.txt')

alipay文件夹下新建alipay.py文件

alipay.py 代码如下:

# _*_ coding=utf-8 _*_

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(object):

"""

支付宝支付接口(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",

# "qr_pay_mode":4

}

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"))

# ordered_items = self.ordered_data(data)

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)

# 将字典类型的数据dump出来

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))

# base64 编码,转换为unicode表示并移除回车

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:

sign_type = 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)

这个Alipay类主要是用来生成一个包含订单详情、签名的大字典,然后把这个大字典加密成字符串拼接到支付宝付款网关接口路径后面

视图中重定向到该地址,支付宝处理完成后向我们的路由发get请求携带详细信息和签名,使用这个类的一个方法来校验签名即可

路由层(项目中)

urls.py

from django.contrib import admin

from django.conf.urls import url

from app01 import views

urlpatterns = [

url('admin/', admin.site.urls),

url('index/', views.index),

url('result/', views.pay_result), # 支付宝处理完成后回调的get请求路由

url('update_order/', views.update_order), # 支付宝处理完成后回调的post请求路由

]

视图层(app中)

views.py

import time

from urllib.parse import parse_qs

from django.conf import settings

from django.shortcuts import render, redirect, HttpResponse

from django.views.decorators.csrf import csrf_exempt

from alipay_use.alipay.alipay import AliPay

def aliPay():

obj = AliPay(

appid="2016100100642208", # 支付宝沙箱里面的APPID,需要改成你自己的

app_notify_url="http://129.211.29.98/update_order/", # 如果支付成功,支付宝会向这个地址发送POST请求(校验是否支付已经完成),此地址要能够在公网进行访问,需要改成你自己的服务器地址

return_url="http://129.211.29.98/result/", # 如果支付成功,重定向回到你的网站的地址。需要你自己改,这里是我的服务器地址

alipay_public_key_path=settings.ALIPAY_PUBLIC, # 支付宝公钥

app_private_key_path=settings.APP_PRIVATE, # 应用私钥

debug=True, # 默认False,True表示使用沙箱环境测试

)

# 优化:在settings里面的设置后使用

# obj = AliPay(

# appid=settings.APPID,

# app_notify_url=settings.NOTIFY_URL,

# return_url=settings.RETURN_URL,

# alipay_public_key_path=settings.PUB_KEY_PATH,

# app_private_key_path=settings.PRI_KEY_PATH,

# debug=True,

# )

return obj

@csrf_exempt

def index(request):

if request.method == "GET":

return render(request, 'index.html')

# 实例化SDK里面的类AliPay

alipay = aliPay()

# 对购买的数据进行加密

money = float(request.POST.get('price')) # 保留俩位小数 前端传回的数据

out_trade_no = "x2" + str(time.time()) # 商户订单号 # 订单号可以有多中生成方式,可以百度一下

# 1. 在数据库创建一条数据:状态(待支付)

query_params = alipay.direct_pay(

subject="充气式Saber", # 商品简单描述 这里一般是从前端传过来的数据

out_trade_no=out_trade_no, # 商户订单号 这里一般是从前端传过来的数据

total_amount=money, # 交易金额(单位: 元 保留俩位小数) 这里一般是从前端传过来的数据

)

# 拼接url,转到支付宝支付页面

pay_url = "https://openapi.alipaydev.com/gateway.do?{}".format(query_params)

return redirect(pay_url)

@csrf_exempt

def update_order(request):

"""

支付成功后,支付宝向该地址发送的POST请求(用于修改订单状态)

:param request:

:return:

"""

if request.method == 'POST':

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 = post_dict.get('out_trade_no')

print(out_trade_no)

# 2. 根据订单号将数据库中的数据进行更新

return HttpResponse('支付成功')

else:

return HttpResponse('支付失败')

return HttpResponse('')

@csrf_exempt

def pay_result(request):

"""

支付完成后,跳转回的地址

:param request:

:return:

"""

params = request.GET.dict()

sign = params.pop('sign', None)

alipay = aliPay()

status = alipay.verify(params, sign)

if status:

return HttpResponse('支付成功')

return HttpResponse('支付失败')

index.html

Title

需要装的模块:

--pycryptodome

--urllib

--base64

支付宝接口流程:

总结

以上所述是小编给大家介绍的python调用支付宝支付接口流程,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

python 支付宝接口_python调用支付宝支付接口流程相关推荐

  1. 支付宝免签约 免手续费 支付接口API

    支付宝免签约 免手续费 支付接口API 会PHP的朋友看了能明白这个原理 想开发的自己可以开发一个 谢谢支持 数据库连接 //会PHP的朋友看了能明白这个原理 想开发的自己可以开发一个 谢谢支持 // ...

  2. [Java基础]-- 调用第三方支付接口

    1.调用第三方支付接口参考 http://blog.csdn.net/saindy5828/article/details/6800331点击打开链接 2.举例 一般情况下,各个支付平台都会给我们一个 ...

  3. 调用微信支付接口总结

        项目里面用到了微信支付的功能,照着文档学习了一下,这里做个总结来记录.项目用到的是anglusJS来做前端开发,我这边简化了,用的ajax进行异步的调用,然后业务也直接写在了控制层(不过不应该 ...

  4. php 调用微信支付的时间戳,前端调用微信支付接口

    支付按钮的点击事件$(´.Save_Patient_Msg´).click(function(){ $(´.Save_Patient_Msg´).off(´click´); var hrdfId = ...

  5. 微信支付接口怎么申请 微信支付接口申请教程

     微信支付接口:点击进去 一直让大家翘首以盼的微信最核心的杀手锏--"微信支付"终于开放申请了!今天微信团队在官网发布消息,微信公众平台支付功能已正式开放申请,已开通公众号的 ...

  6. 新版支付宝开放平台 手机网页支付 整个流程

    新版支付宝开放平台  手机网页支付 整个流程 在支付宝签约如下产品 然后,使用支付宝最新的签名工具生成商户的私钥和公钥 值得注意的是,如果是.net c# 请选择PKCS1,我只采用1024密钥长度. ...

  7. NFT支付平台接口,数字藏品支付接口如何申请?

    NFT支付支付平台接口,数字藏品支付接口如何申请? 申请流程如下: 许多第三方支付店都想申请支付接口,但是不知道怎么操作.因此今天我就详尽告诉你们第三方支付接口的办理流程,希望以下介绍能给大家带来协助 ...

  8. python 支付宝接口_python实现支付宝转账接口

    由于工作需要使用python开发一个自动转账接口,记录一下开发过程. 首先需要在蚂蚁金服上申请开通开发者账户,有了开发者账户就可以使用沙箱进行开发了. 在开发之前我们需要在沙箱应用中填写密钥,密钥的获 ...

  9. python支付宝自动支付_python 调用支付宝支付

    支付宝接口集成,本地环境调试支付请求 1.首先登录 蚂蚁金服网站,也就是支付宝开发者平台 登录蚂蚁金服开发者平台后,创建沙箱应用 开发者平台 也就是支付宝给开发者提供的调试环境应用 沙箱测试应用 2. ...

最新文章

  1. Debain 7.2安装配置
  2. Linux(Ubuntu)下如何解压 .zip 文件
  3. vs2015 python 调试dll
  4. 在VS2010中使用wxWidgets 2.9.3
  5. PAT甲级1024 Palindromic Number:[C++题解]回文串和高精度加法
  6. 程序化广告交易中的点击率预估
  7. 中国进口消费市场研究报告2020
  8. RDBMS DML DDL
  9. SQLSERVER查看阻塞和CPU占用的会话,存储过程执行性能排行
  10. python 基础 学习 内置函数
  11. 云计算开发python_云计算开发学习笔记:Python的环境搭建
  12. js实现城市名称拼音索引
  13. Tek DPO2024B示波器和电流探头A622的使用
  14. hMailServer 使用教程 —— 手把手教你搭建自己的邮箱服务器
  15. 微信扫码背后的图像超分辨率技术
  16. matlab fread 详细讲解
  17. 很好的源码软件列表,有助于学习提高
  18. 复旦大学桂韬:Uncertainty—Aware Sequence Labeling
  19. linux 安装 iftop
  20. Dropbox怎么安全地存储用户密码?

热门文章

  1. unity videoplayer视频播放无声音
  2. Spring事务和Aspects框架管理事务,看这篇就够了!(简单易懂!)
  3. props接受参数配置
  4. 高级架构师纯手写MySQL笔记,已经熬夜学习了
  5. 智能电表远红外远程抄表实施技术方案
  6. js 中使用idx模块方便获取链条式的对象属性值
  7. vis.js network 教程二 edges
  8. toft 测试用例rat_软件测试用例类型
  9. 学习知识-你会学习吗?
  10. 爬虫配套学习-前端学习笔记01