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 10 Python
解决matplotlib库show()方法不显示图片的问题
May 24 Python
浅析python继承与多重继承
Sep 13 Python
Python字符串的全排列算法实例详解
Jan 07 Python
在PYQT5中QscrollArea(滚动条)的使用方法
Jun 14 Python
解决python super()调用多重继承函数的问题
Jun 26 Python
python按键按住不放持续响应的实例代码
Jul 17 Python
Golang GBK转UTF-8的例子
Aug 26 Python
解决Django中checkbox复选框的传值问题
Mar 31 Python
Django ORM filter() 的运用详解
May 14 Python
Python进行特征提取的示例代码
Oct 15 Python
python解压zip包中文乱码解决方法
Nov 27 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
php生成xml简单实例代码
2009/12/16 PHP
php 后端实现JWT认证方法示例
2018/09/04 PHP
jQuery EasyUI API 中文文档 - Documentation 文档
2011/09/29 Javascript
JS往数组中添加项性能分析
2015/02/25 Javascript
javascript记住用户名和登录密码(两种方式)
2015/08/04 Javascript
Bootstrap实现弹性搜索框
2016/07/11 Javascript
浅析Javascript ES6中的原生Promise
2016/08/25 Javascript
微信小程序技巧之show内容展示,上传文件编码问题
2017/01/23 Javascript
javascript 中设置window.location.href跳转无效问题解决办法
2017/02/09 Javascript
jQuery Ajax自定义分页组件(jquery.loehpagerv1.0)实例详解
2017/05/01 jQuery
基于JavaScript实现幸运抽奖页面
2020/07/05 Javascript
原生JS实现旋转轮播图+文字内容切换效果【附源码】
2018/09/29 Javascript
JS实现根据数组对象的某一属性排序操作示例
2019/01/14 Javascript
vue写h5页面的方法总结
2019/02/12 Javascript
vue实现将数据存入vuex中以及从vuex中取出数据
2019/11/08 Javascript
js找出5个数中最大的一个数和倒数第二大的数实现方法示例小结
2020/03/04 Javascript
Python模拟登陆实现代码
2017/06/14 Python
pytorch cnn 识别手写的字实现自建图片数据
2018/05/20 Python
Tensorflow Summary用法学习笔记
2020/01/10 Python
Python如何实现在字符串里嵌入双引号或者单引号
2020/03/02 Python
python爬虫学习笔记之Beautifulsoup模块用法详解
2020/04/09 Python
Python内置函数locals和globals对比
2020/04/28 Python
python 常见的反爬虫策略
2020/09/27 Python
HTML5 form标签之解放表单验证、增加文件上传、集成拖放的使用方法
2013/04/24 HTML / CSS
Marc Jacobs官方网站:美国奢侈品牌
2017/08/29 全球购物
台湾家适得:Homeget
2019/02/11 全球购物
中国领先的汽车保养服务平台:途虎养车
2019/10/18 全球购物
几个Linux面试题笔试题
2012/12/01 面试题
化学专业毕业生自荐信
2013/11/15 职场文书
计算机操作自荐信
2013/12/07 职场文书
青春无悔演讲稿
2014/05/08 职场文书
法律专业求职信
2014/05/24 职场文书
上课不认真检讨书
2014/09/17 职场文书
2015年副班长工作总结
2015/05/15 职场文书
用Python提取PDF表格的方法
2021/04/11 Python
Redis基本数据类型String常用操作命令
2022/06/01 Redis