支付宝sdk——python-alipay-sdk
文章目录
- 一、支付宝支付介绍
- 二、支付宝支付使用
- 三、支付宝支付二次封装
一、支付宝支付介绍
线上支付有:
- 支付宝支付
- 微信支付
- 云闪付
支付流程:
1.用户把钱打到第三方平台(支付宝,微信)的商家账户中
2.商家提现提出来(第三方平台收手续费)
注意:必须是商户(企业),有营业执照才能申请支付宝,微信的支付接入
二、支付宝支付使用
第一步:找到支付宝沙箱
第二步:画框处后续需要用到
第三步:创建公钥私钥
安装支付宝开放平台开发助手:点击进入支付宝文档下载
生成公钥私钥
第四步:将生成的公钥配置到支付宝沙箱中
示例:
直接使用python-alipay-sdk调用支付宝
首先安装
pip install python-alipay-sdk
from alipay import AliPayapp_private_key_string = open("./pri").read() #在pri文件下加入私钥
alipay_public_key_string = open("./pub").read() #在pub文件下加入支付宝公钥
alipay = AliPay(appid="xxxxxxxxxxxx", # 此处填写支付宝公开平台的appidapp_notify_url=None, # 默认回调 urlapp_private_key_string=app_private_key_string,# 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,alipay_public_key_string=alipay_public_key_string,sign_type="RSA2", # RSA 或者 RSA2debug=True, # 默认 False
)
# 电脑网站支付,需要跳转到:https://openapi.alipay.com/gateway.do? + order_string
res=alipay.api_alipay_trade_page_pay(out_trade_no='asdsad623232332', # 订单号,自设total_amount=float(999), # 只有生成支付宝链接时,不能用Decimalsubject='充气球', # 订单内容,自设return_url='http://127.0.0.1:8000', # 回调地址notify_url='http://127.0.0.1:8000',
)gataway = 'https://openapi.alipaydev.com/gateway.do?' # 支付宝网关地址
print(gataway+res) # 此处是生成的支付链接
三、支付宝支付二次封装
创建一个包
ipay #包名-pem #存放公钥私钥alipay_public_key.pemapp_private_key.pem__init__.py pay.py #生成一个对象settings.py #配置文件
公钥私钥必须按照格式来存放
pem文件下的app_private_key.pem存放私钥
-----BEGIN RSA PRIVATE KEY-----
此处为私钥内容
-----END RSA PRIVATE KEY-----
pem文件下的alipay_public_key.pem存放支付宝公钥
-----BEGIN PUBLIC KEY-----
此处为公钥内容
-----END PUBLIC KEY-----
init.py
from .pay import alipay
from .settings import GATEWAY
pay.py
from alipay import AliPayfrom . import settingsalipay = AliPay(appid=settings.APP_ID,app_notify_url=None, # 默认回调 urlapp_private_key_string=settings.APP_PRIVATE_KEY_STRING,# 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,alipay_public_key_string=settings.ALIPAY_PUBLIC_KEY_STRING,sign_type=settings.SIGN, # RSA 或者 RSA2debug=settings.DEBUG, # 默认 False
)
settings.py
import os# 应用私钥
APP_PRIVATE_KEY_STRING = open(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'pem', 'app_private_key.pem')).read()# 支付宝公钥
ALIPAY_PUBLIC_KEY_STRING = open(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'pem', 'alipay_public_key.pem')).read()# 应用ID
APP_ID = 'xxxxxxxx'# 加密方式
SIGN = 'RSA2'# 是否是支付宝测试环境(沙箱环境),如果采用真是支付宝环境,配置False
DEBUG = True# 支付网关
GATEWAY = 'https://openapi.alipaydev.com/gateway.do?' if DEBUG else 'https://openapi.alipay.com/gateway.do?'
调用二次封装支付的sdk:
dev.py(开发配置文件相当于setting.py)
# 上线后必须换成公网地址
# 后台基URL
HOST_URL = 'http://127.0.0.1:8000'
# 前台基URL
LUFFY_URL = 'http://127.0.0.1:8080'
# 支付宝同步异步回调接口配置
# 后台异步回调接口--->post回调,调后台
NOTIFY_URL = HOST_URL + "/api/v1/order/success/" #后台的用来修改订单状态
# 前台同步回调接口,没有 / 结尾 ----》 get回调调前台
RETURN_URL = LUFFY_URL + "/pay/success" # 前端需要有个页面显示
def _get_pay_url(self, out_trade_no, total_amount, subject):# 生成pay_url,放入到context中res = alipay.api_alipay_trade_page_pay(out_trade_no=out_trade_no,total_amount=float(total_amount), # 只有生成支付宝链接时,不能用Decimalsubject=subject, #订单内容return_url=settings.RETURN_URL, #支付宝回调post请求地址,就是用户支付后支付宝调用该结果告知订单已完成notify_url=settings.NOTIFY_URL, # 前端页面get请求地址,就是订单完成后,返回给用户的页面)pay_url = GATEWAY + res #网管拼接api_alipay_trade_page_pay的返回值才是支付链接self.context['pay_url'] = pay_url
前端回调页面是自设的
例如:
<template><div class="pay-success"><!--如果是单独的页面,就没必要展示导航栏(带有登录的用户)--><Header/><div class="main"><div class="title"><div class="success-tips"><p class="tips">您已成功购买 1 门课程!</p></div></div><div class="order-info"><p class="info"><b>订单号:</b><span>{{ result.out_trade_no }}</span></p><p class="info"><b>交易号:</b><span>{{ result.trade_no }}</span></p><p class="info"><b>付款时间:</b><span><span>{{ result.timestamp }}</span></span></p></div><div class="study"><span>立即学习</span></div></div></div>
</template><script>
import Header from "@/components/Header"export default {name: "Success",data() {return {result: {},};},created() {// url后拼接的参数:?及后面的所有参数 => ?a=1&b=2// console.log(location.search);// 解析支付宝回调的url参数console.log(location.search)let params = location.search.substring(1); // 去除? => a=1&b=2let items = params.length ? params.split('&') : []; // ['a=1', 'b=2']//逐个将每一项添加到args对象中for (let i = 0; i < items.length; i++) { // 第一次循环a=1,第二次b=2let k_v = items[i].split('='); // ['a', '1']//解码操作,因为查询字符串经过编码的if (k_v.length >= 2) {// url编码反解let k = decodeURIComponent(k_v[0]);this.result[k] = decodeURIComponent(k_v[1]);// 没有url编码反解// this.result[k_v[0]] = k_v[1];}}// 解析后的结果console.log(this.result);// 把地址栏上面的支付结果,再get请求转发给后端this.$axios({url: this.$settings.base_url + '/order/success/' + location.search,method: 'get',}).then(response => {console.log(response.data);if (response.data.code != 100) {alert(response.data.msg)}}).catch(() => {console.log('支付结果同步失败');})},components: {Header,}
}
</script><style scoped>
.main {padding: 60px 0;margin: 0 auto;width: 1200px;background: #fff;
}.main .title {display: flex;-ms-flex-align: center;align-items: center;padding: 25px 40px;border-bottom: 1px solid #f2f2f2;
}.main .title .success-tips {box-sizing: border-box;
}.title img {vertical-align: middle;width: 60px;height: 60px;margin-right: 40px;
}.title .success-tips {box-sizing: border-box;
}.title .tips {font-size: 26px;color: #000;
}.info span {color: #ec6730;
}.order-info {padding: 25px 48px;padding-bottom: 15px;border-bottom: 1px solid #f2f2f2;
}.order-info p {display: -ms-flexbox;display: flex;margin-bottom: 10px;font-size: 16px;
}.order-info p b {font-weight: 400;color: #9d9d9d;white-space: nowrap;
}.study {padding: 25px 40px;
}.study span {display: block;width: 140px;height: 42px;text-align: center;line-height: 42px;cursor: pointer;background: #ffc210;border-radius: 6px;font-size: 16px;color: #fff;
}
</style>
支付宝回调函数post和前端的反馈结果get
class PaySuccessView(ViewSet):authentication_classes = []permission_classes = []# 给前端做二次校验用def list(self, resquest):out_trade_no = resquest.query_params.get('out_trade_no')order = Order.objects.filter(out_trade_no=out_trade_no, order_status=1).first()if order:return Luffy_Response(200, '支付成功')else:return Luffy_Response(code=101, msg='暂时还没收到你的付款')# 给支付宝用的--->必须把项目部署在公网上才能回调成功def create(self, request):try:# post提交的数据(支付宝回调格式:urlencoded,QueryDic)## from django.http.request import QueryDict## print(type(request.data))# 把QueryDic对象转成真正的dict对象,就可以修改,popresult_data = request.data.dict()#我们的订单号out_trade_no = result_data.get('out_trade_no')#支付宝的签名signature = result_data.pop('sign')from libs.ipay import alipayresult = alipay.verify(result_data, signature)if result and result_data["trade_status"] in ("TRADE_SUCCESS", "TRADE_FINISHED"):# 完成订单修改:订单状态、流水号、支付时间Order.objects.filter(out_trade_no=out_trade_no).update(order_status=1)# 完成日志记录logger.warning('%s订单支付成功' % out_trade_no)# 支付宝要的格式就这个格式return Response('success')else:logger.error('%s订单支付失败' % out_trade_no)except:passreturn Response('failed')
支付宝sdk——python-alipay-sdk相关推荐
- python - alipay sdk 使用 及 注意点
一. 在 点击跳转 这里拿到自己的 appid 和 支付宝公钥 , 如果想要得到 支付宝的公钥 就需要获取 应用的公钥,具体获取方式 : 获取应用公钥和私钥 应用私钥和支付宝公钥 获取 和 ...
- Xamarin只言片语3——Xamarin.Android下支付宝(Alipay SDK)使用
开发环境Visual Studio 2015,Xamarin 3.11.1537,Xamarin Android5.1.7.12 下载支付宝移动支付的SDK(http://doc.open.alipa ...
- alipay-sdk-python支付宝开放平台官方SDK使用详解
一.环境搭建 1. 安装支付宝开放平台官方SDK(最好在python的虚拟环境中安装 pip install alipay-sdk-python 二.功能解析 1.构建支付宝客户端:功能是 ...
- 【iOS】程序内跳转到支付宝转账(非SDK实现支付)及相关监听
转载请注明出处 今天遇到了一个有意思的问题,就是支付调用支付宝,但是后台返的链接类似这种(https://qr.alipay.com/bax05299bjty5xvbkjii8018).这种链接直接打 ...
- Spring Boot集成支付宝(最新版SDK)—— 手机支付
前言 前些日子写了一篇关于H5网页集成支付宝的文章: Spring Boot集成支付宝(最新版SDK)-- H5/网页支付 当时写了好久,往那一坐就是俩小时,写完直接就发布了,发布之后才感觉少点啥-- ...
- 支付宝网银直连SDK封装记上|强力去掉支付宝网银直连DEMO中56个坏味道 余下6个坏味道 Sonarqube无视阿里支付宝光环
" Yuema约吗?一起学技术,一起成长!学海无涯 高人带路系列" 程序的世界,就是有坑的地方!分享踩坑的心得与体验!每天分享一点点! 关注公众号,进入学海无涯,高人带路模式!!微 ...
- spring boot 微信 支付宝 集成 开源jm-pay sdk
微信和支付宝集成封装的sdk 需要自己拉代码到本地进行打包 https://github.com/sunuping/jm-pay.git pom.xml <!--支付宝--><dep ...
- 支付宝网银直连SDK封装记下|强力去掉支付宝网银直连DEMO中56个坏味道 余下6个坏味道 Sonarqube无视阿里支付宝光环
" Yuema约吗?一起学技术,一起成长!学海无涯 高人带路系列" 程序的世界,就是有坑的地方!分享踩坑的心得与体验!每天分享一点点! 关注公众号,进入学海无涯,高人带路模式!!支 ...
- python的sdk是什么意思_python sdk
关于 python sdk的搜索结果 问题 命令行工具 CLI:用户指南:阿里云 Python SDK 列表 阿里云各产品对应的 Python SDK 如下所示. 产品Python SDK账号登录al ...
- 调用阿里云语音合成Python版SDK
一.阿里云介绍 阿里云创立于2009年,是全球领先的云计算及人工智能科技公司,致力于以在线公共服务的方式,提供安全.可靠的计算和数据处理能力,让计算和人工智能成为普惠科技.阿里云服务着制造.金融. ...
最新文章
- 卡莱特led显示屏调试教程_恒彩光电重庆P3 LED显示屏项目顺利完工
- 慎用uniapp开发商业级应用
- Java实现算法导论中线性规划单纯形算法
- 论面向组合子程序设计方法 之 南无阿弥陀佛
- malloc/free和new/delete的区别
- Use a layout_width of 0dip instead of fill_parent for better performance
- 单例设计模式和多线程
- python中print的用法_python中print用法
- 二、规则组织数学模型的建立
- mysql时间正确时区错误_在app中的日期时间但在mysql [时区]错误
- std在汇编语言是什么指令_汇编语言程序指令整理
- Akka和Actor一起工作的消息《ten》译
- C++二叉链表遍历理论基础
- 办公室常用计算机常识,这10个办公必备的电脑小技巧,让你事半功倍
- win7 C盘满如何清理
- kong_团结的面Kong:国际妇女节
- 关于Bootstrap 中使用Tooltips不生效的问题
- Android 查看内存使用工具 (procstats)
- RestAssured接口测试框架
- C++语言程序设计第五版 - 郑莉(第四章课后习题)
热门文章
- 2019-1-25 画图:画风玫瑰图
- 用python爬虫写一个属于自己的彩虹屁生成器!
- 详解线上线下收单业务(1)
- 六十秒倒计时android,如何用jquery实现六十秒倒计时
- VUE项目配置UEditor集成秀米编辑器
- python对数据求均值_利用Python读取json数据并求数据平均值
- 弹出启动windows安全中心服务器,win10系统启用windows安全中心服务器提示关闭的操作方法...
- php 月份查询生日_PHP判断日期(生日)格式是否正确合法的方法
- MySQL-查询本周过生日的人-终极答案
- minHJ函数matlab黄金分割法,黄金分割法求极小值