项目演示:

1、输入金额

2、扫码支付:

3、支付完成:

4.跳转回商户

一、注册账号

二、设置应用公钥

三、代码实现

1、项目结构:

2、把生成的     应用私钥     和    支付宝的公钥       放入keys目录下:

注意:

支付宝公钥

商户私钥

但是要做修改:

alipay_public_2048.txt

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

支付宝的公钥

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

app_private_2048.txt

-----BEGIN PUBLIC KEY----- #同上

应用的私钥

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

3、pay.py 这是从git上找到的支付宝支付接口(PC端支付接口)

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

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)

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

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)

3、路由设置

from django.conf.urls import url

from django.contrib import admin

from app01 import views

urlpatterns = [

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

url(r'^page1/', views.page1),

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

url(r'^page2/', views.page2),

]

from django.conf.urls import url

from django.contrib import admin

from app01 import views

urlpatterns = [

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

url(r'^page1/', views.page1),

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

url(r'^page2/', views.page2),

]

4、视图设置

from django.shortcuts import render, redirect, HttpResponse

from utils.pay import AliPay

import json

import time

def ali():

# 沙箱环境地址:https://openhome.alipay.com/platform/appDaily.htm?tab=info

app_id = "2016091100487127"

# POST请求,用于最后的检测

notify_url = "http://127.0.0.1:8002/page2"

# notify_url = "http://www.wupeiqi.com:8804/page2/"

# GET请求,用于页面的跳转展示

return_url ="http://127.0.0.1:8002/page2/"

# return_url = "http://www.wupeiqi.com:8804/page2/"

merchant_private_key_path = "keys/app_private_2048.txt"

alipay_public_key_path = "keys/alipay_public_2048.txt"

alipay = AliPay(

appid=app_id,

app_notify_url=notify_url,

return_url=return_url,

app_private_key_path=merchant_private_key_path,

alipay_public_key_path=alipay_public_key_path, # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥

debug=True, # 默认False,

)

return alipay

def index(request):

return render(request,'index.html')

def page1(request):

if request.method == "GET":

return render(request, 'page1.html')

else:

money = float(request.POST.get('money'))

alipay = ali()

# 生成支付的url

query_params = alipay.direct_pay(

subject="充气式韩红", # 商品简单描述

out_trade_no="x2" + str(time.time()), # 商户订单号

total_amount=money, # 交易金额(单位: 元 保留俩位小数)

)

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

return redirect(pay_url)

def page2(request):

alipay = ali()

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]

print(post_dict)

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

status = alipay.verify(post_dict, sign)

print('POST验证', status)

return HttpResponse('POST返回')

else:

params = request.GET.dict()

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

status = alipay.verify(params, sign)

print('GET验证', status)

return HttpResponse('支付成功')

from django.shortcuts import render, redirect, HttpResponse

from utils.pay import AliPay

import json

import time

def ali():

# 沙箱环境地址:https://openhome.alipay.com/platform/appDaily.htm?tab=info

app_id = "2016091100487127"

# POST请求,用于最后的检测

notify_url = "http://127.0.0.1:8002/page2"

# notify_url = "http://www.wupeiqi.com:8804/page2/"

# GET请求,用于页面的跳转展示

return_url ="http://127.0.0.1:8002/page2/"

# return_url = "http://www.wupeiqi.com:8804/page2/"

merchant_private_key_path = "keys/app_private_2048.txt"

alipay_public_key_path = "keys/alipay_public_2048.txt"

alipay = AliPay(

appid=app_id,

app_notify_url=notify_url,

return_url=return_url,

app_private_key_path=merchant_private_key_path,

alipay_public_key_path=alipay_public_key_path, # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥

debug=True, # 默认False,

)

return alipay

def index(request):

return render(request,'index.html')

def page1(request):

if request.method == "GET":

return render(request, 'page1.html')

else:

money = float(request.POST.get('money'))

alipay = ali()

# 生成支付的url

query_params = alipay.direct_pay(

subject="充气式韩红", # 商品简单描述

out_trade_no="x2" + str(time.time()), # 商户订单号

total_amount=money, # 交易金额(单位: 元 保留俩位小数)

)

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

return redirect(pay_url)

def page2(request):

alipay = ali()

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]

print(post_dict)

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

status = alipay.verify(post_dict, sign)

print('POST验证', status)

return HttpResponse('POST返回')

else:

params = request.GET.dict()

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

status = alipay.verify(params, sign)

print('GET验证', status)

return HttpResponse('支付成功')

5、模板

Title

{% csrf_token %}

Title

{% csrf_token %}

6.  Crypto 模块 的处理

python支付宝自动支付_python-支付宝支付示例相关推荐

  1. python生成yaml_使用python脚本自动生成K8S-YAML的方法示例

    1.生成 servie.yaml 1.1.yaml转json service模板yaml apiVersion: v1 kind: Service metadata: name: ${jarName} ...

  2. python qq自动登陆_Python自动登录QQ的实现示例

    这是一份来自网络的代码,经过了我的修改和验证. 首先我的运行环境是python3.7,需要安装pyuserinput库. 直接上代码吧: #!/usr/bin/python import os imp ...

  3. python如何自动缩进_python自动缩进

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 我正在使用vim并编辑python脚本. autoindent通常工作得很好,但 ...

  4. python如何自动缩进_python word 自动排版写码时应该缩进使用 tab 还是空格?

    对于程序员来说,其实Tab和空格远远不只是"立场"问题那么简单. 在不同的编辑器里tab的长度可能不一致,所以在一个编辑器里用tab设置缩进后,在其它编辑器里看可能缩进就乱了.空格 ...

  5. python实现扫码支付_python支付宝页面扫码支付

    importtimefrom pay importAliPayclassAlipayApi(object):def __init__(self, app_id, notify_url, return_ ...

  6. python支付宝自动转账_python实现支付宝转账接口

    python实现支付宝转账接口 发布时间:2020-09-14 03:23:42 来源:脚本之家 阅读:128 由于工作需要使用python开发一个自动转账接口,记录一下开发过程. 首先需要在蚂蚁金服 ...

  7. python实现自动工作_python实现串口自动触发工作的示例

    最近在一个python工具中需要实现串口自动触发工作的功能,之前只在winform上面实现,今天使用python试试.这里简单记一下: 首先用wxpython实现一个Button,点击事件绑定函数On ...

  8. python支付宝自动转账_Django支付宝自动转账功能(二)

    接着上一篇的介绍,这部分将介绍如何读取上传的文件并调用转账接口实现转账功能. 具体步骤   ===>打开文件  ===>读取每一行的数据 ===>调用支付宝单笔转账接口 1.Exce ...

  9. python支付宝自动转账_Django支付宝自动转账功能(一)

    首先说明一下最终实现的效果:===>用户上传excel文件====>网页端显示读取文件并显示预览效果====>上传文件至服务器,服务器后台开始调用接口自动转账===>所有转账信 ...

  10. python 列表自动排序_Python学习小技巧之列表项排序的示例代码分享

    这篇文章主要给大家介绍了Python学习小技巧之列表项排序的相关资料,文中介绍的非常详细,需要的朋友们可以参借鉴,下面跟着小编一起来学习学习吧. 本文介绍的是关于Python列表项排序的相关内容,分享 ...

最新文章

  1. html表单的创建和css的构成
  2. POJ1088(滑雪)
  3. 在ubuntu上使用gdb-multiarch 跨平台调试
  4. springmvc+mybatis+sql server实现简单登录功能
  5. c调用其他类的方法_Java 的 Native 方法——今天又进步了
  6. 万稞pw80线切割编程软件_线切割机床的控制系统的现状
  7. 线程间操作无效 progressBar2线程不能被访问
  8. Django(part33)--数据库的迁移
  9. 百度联盟广告如何理解按父容器宽度
  10. PHP轻量级在线客服系统源码 自适应手机移动端
  11. python - PyDev统一编码
  12. android 调用java webservice_Android在网络中与JavaWeb的项目进行交互的方法(Webservice)...
  13. MyBatis开发文档
  14. 飞鱼星行为管理路由器【限制视频】方法(网页+客户端)
  15. 2008欧锦赛 球员名单 C组
  16. 基本模块 time datetime randon os sys subprocess 打印进度条
  17. 橘子学ES03之Docker安装ELK+cerebro
  18. 7年时间,从功能测试到测试开发月薪30K,有志者事竟成
  19. 【1066】满足条件的数累加
  20. 使用hibernate的validator时提示java.lang.NoClassDefFoundError: com/fasterxml/classmate/TypeResolver

热门文章

  1. FusionCharts 技术文档-Jsp画图例子
  2. [BJOI2017]树的难题 点分治,线段树合并
  3. java实现单链表常见操作
  4. mysql查询当天数据(上周、本月、上个月、距离当前现在6个月的数据)
  5. 【转载】Understanding When to use RabbitMQ or Apache Kafka
  6. APP动态界面设计使用的利与弊
  7. sqlserver 判断字段是否为空字符串或者null
  8. Memcahce和Redis比较
  9. httpclient在获取response的entity时报异常
  10. Educational Codeforces Round 23 E. Choosing The Commander 字典树