python支付宝支付示例详解


Posted in Python onAugust 22, 2019

本文实例为大家分享了python支付宝支付示例代码,供大家参考,具体内容如下

项目演示:

1、输入金额

python支付宝支付示例详解

2、扫码支付:

python支付宝支付示例详解

3、支付完成:

python支付宝支付示例详解

python支付宝支付示例详解

一、注册账号

https://openhome.alipay.com/platform/appDaily.htm?tab=info

二、设置应用公钥

python支付宝支付示例详解

python支付宝支付示例详解

python支付宝支付示例详解

python支付宝支付示例详解

python支付宝支付示例详解

三、代码实现

1、项目结构:

python支付宝支付示例详解

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

注意:

支付宝公钥

商户私钥

--- 配置商户应用私钥--copy到key目录下

python支付宝支付示例详解

python支付宝支付示例详解

--- 配置支付宝公钥--进入网页-->查看支付宝公钥-->把公钥放到key目录下

python支付宝支付示例详解

但是要做修改:

python支付宝支付示例详解

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端支付接口) 

python支付宝支付示例详解

in pay.py

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、路由设置

in urls.py

urlpatterns = [
 url(r'^admin/', admin.site.urls),
 url(r'^page1/', views.page1),
 url(r'^index/', views.index),
 url(r'^page2/', views.page2),
 ]

4、视图设置

in  view.py

from django.shortcuts import render, redirect, HttpResponse
 from utils.pay import AliPay
 import json
 import time
 
 
 def get_ali_object():
 # 沙箱环境地址:https://openhome.alipay.com/platform/appDaily.htm?tab=info
 app_id = "2016091100486897" # APPID (沙箱应用)
 
 # 支付完成后,支付偷偷向这里地址发送一个post请求,识别公网IP,如果是 192.168.20.13局域网IP ,支付宝找不到,def page2() 
 # 接收不到这个请求
 notify_url = "http://47.94.172.250:8804/page2/"
 
 # 支付完成后,跳转的地址。
 return_url = "http://47.94.172.250: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):
 # 根据当前用户的配置,生成URL,并跳转。 
 money = float(request.POST.get('money'))
 
 alipay = get_ali_object()
 
 # 生成支付的url
 query_params = alipay.direct_pay(
 subject="充气式赵俊明", # 商品简单描述
 out_trade_no="x2" + str(time.time()), # 用户购买的商品订单号(每次不一样) 20180301073422891
 total_amount=money, # 交易金额(单位: 元 保留俩位小数)
 )
 
 pay_url = "https://openapi.alipaydev.com/gateway.do?{0}".format(query_params) # 支付宝网关地址(沙箱应用)
 
 return redirect(pay_url)
 
 
 def page2(request):
 alipay = get_ali_object()
 if request.method == "POST":
 # 检测是否支付成功
 # 去请求体中获取所有返回的数据:状态/订单号
 from urllib.parse import parse_qs
 # name&age=123....
 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]
 
 # post_dict有10key: 9 ,1
 sign = post_dict.pop('sign', None)
 status = alipay.verify(post_dict, sign)
 print('------------------开始------------------')
 print('POST验证', status)
 print(post_dict)
 out_trade_no = post_dict['out_trade_no']
 
 # 修改订单状态
 # models.Order.objects.filter(trade_no=out_trade_no).update(status=2)
 print('------------------结束------------------')
 # 修改订单状态:获取订单号
 return HttpResponse('POST返回')
 
 else:
 params = request.GET.dict()
 sign = params.pop('sign', None)
 status = alipay.verify(params, sign)
 print('==================开始==================')
 print('GET验证', status)
 print('==================结束==================')
 return HttpResponse('支付成功')

5、模板

in index.html

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
 <link rel="stylesheet" href="dist/css/bootstrap.css" rel="external nofollow" >
</head>
<body>
 <form action="/page1/" method="POST">
 {% csrf_token %}
 <input type="text" name="money">
 <input type="submit" value="去支付" />
 </form>
<script></script>
</body>
</html>

6、当你全部设置完,代码只需修改三个地方

git项目地址

 (1)、修改APPID

-- 这是你账号的APPID       

python支付宝支付示例详解

-- in  views.py

def  get_ali_object():

 app_id = 'xxxxxxx' #你的账号APPID  

================================

python支付宝支付示例详解

(2)、换上你的支付宝公钥

(3)、换上你的应用私钥

 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现输出某区间范围内全部素数的方法
May 02 Python
Python使用pymysql从MySQL数据库中读出数据的方法
Jul 25 Python
Python3 jupyter notebook 服务器搭建过程
Nov 30 Python
python url 参数修改方法
Dec 26 Python
Python实现多进程的四种方式
Feb 22 Python
django rest framework vue 实现用户登录详解
Jul 29 Python
Python多叉树的构造及取出节点数据(treelib)的方法
Aug 09 Python
python 实现让字典的value 成为列表
Dec 16 Python
python pandas移动窗口函数rolling的用法
Feb 29 Python
python 已知一个字符,在一个list中找出近似值或相似值实现模糊匹配
Feb 29 Python
jupyter 使用Pillow包显示图像时inline显示方式
Apr 24 Python
Python应用自动化部署工具Fabric原理及使用解析
Nov 30 Python
关于python3中setup.py小概念解析
Aug 22 #Python
python3 requests库文件上传与下载实现详解
Aug 22 #Python
python3使用print打印带颜色的字符串代码实例
Aug 22 #Python
Python检查 云备份进程是否正常运行代码实例
Aug 22 #Python
浅谈Python 递归算法指归
Aug 22 #Python
python求加权平均值的实例(附纯python写法)
Aug 22 #Python
python求平均数、方差、中位数的例子
Aug 22 #Python
You might like
浅析SVN常见问题及解决方法
2013/06/21 PHP
php cURL和Rolling cURL并发方式比较
2013/10/30 PHP
你可能不知道PHP get_meta_tags()函数
2014/05/12 PHP
PHP使用ffmpeg给视频增加字幕显示的方法
2015/03/12 PHP
PHP MySql增删改查的简单实例
2016/06/21 PHP
PHP读取XML格式文件的方法总结
2017/02/27 PHP
IE中直接运行显示当前网页中的图片 推荐
2006/08/31 Javascript
jquery实现仿Flash的横向滑动菜单效果代码
2015/09/17 Javascript
js实现完美兼容各大浏览器的人民币大小写相互转换
2015/10/29 Javascript
jQuery插件之jQuery.Form.js用法实例分析(附demo示例源码)
2016/01/04 Javascript
JQUERY表单暂存功能插件分享
2016/02/23 Javascript
javascript Function函数理解与实战
2017/12/01 Javascript
webpack学习教程之前端性能优化总结
2017/12/05 Javascript
Vue中Axios从远程/后台读取数据
2019/01/21 Javascript
[38:23]完美世界DOTA2联赛循环赛 FTD vs PXG BO2第二场 11.01
2020/11/02 DOTA
老生常谈Python基础之字符编码
2017/06/14 Python
Python与人工神经网络:使用神经网络识别手写图像介绍
2017/12/19 Python
Python 批量合并多个txt文件的实例讲解
2018/05/08 Python
python实现键盘输入的实操方法
2019/07/16 Python
Python namedtuple命名元组实现过程解析
2020/01/08 Python
Python实现CNN的多通道输入实例
2020/01/17 Python
python如何写出表白程序
2020/06/01 Python
零基础学python应该从哪里入手
2020/08/11 Python
Python描述数据结构学习之哈夫曼树篇
2020/09/07 Python
Python中用xlwt制作表格实例讲解
2020/11/05 Python
python中Pexpect的工作流程实例讲解
2021/03/02 Python
英国最大的在线蜡烛商店:Candles Direct
2019/03/26 全球购物
抽样调查项目计划书
2014/04/24 职场文书
培训研修方案
2014/06/06 职场文书
刑事辩护授权委托书
2014/09/13 职场文书
2015年全国科普日活动总结
2015/03/23 职场文书
2015年建筑工程工作总结
2015/05/13 职场文书
入党积极分子群众意见
2015/06/01 职场文书
Python OpenCV快速入门教程
2021/04/17 Python
使用PDF.js渲染canvas实现预览pdf的效果示例
2021/04/17 Javascript
python井字棋游戏实现人机对战
2022/04/28 Python