python使用第三方支付宝SDK实现小程序发红包、用户支付等功能

  • 实现小程序发红包,创建支付订单、登录验证等
    • 继承DCAlipay添加几个我们需要的功能
    • 初始化DCAlipay对象并使用
    • 回调notify_url

支付宝官方SDK是相当的难用,而且python官方SDK不支持验签,验签功能需要自己写,因此使用了第三方SDK:python-alipay-sdk
地址:github连接
验签步骤:支付宝平台官方说明
如果需要自己实现验签:验签实现逻辑

首先安装:

pip install python-alipay-sdk --upgrade

实现小程序发红包,创建支付订单、登录验证等

第三方SDK实际上已经实现了验签逻辑,但是功能比较少,我们需要的发红包、小程序创建支付订单、登录逻辑之类的都没有,因此我们自己来扩展一下

首先在官方的验签步骤页我们应该生成了自己的密钥文件,大概是这样:

  • 这里每个文件夹代表一个小程序
  • 前四个文件分别对应需要的密钥文件


先看下demo创建一个支付宝web订单,之后模仿源码添加我们需要的功能即可:

from alipay import AliPay, DCAlipaydc_alipay = DCAliPay(appid="appid",app_notify_url="http://example.com/app_notify_url",app_private_key_string=app_private_key_string,app_public_key_cert_string=app_public_key_cert_string,alipay_public_key_cert_string=alipay_public_key_cert_string,alipay_root_cert_string=alipay_root_cert_string
)
subject = "测试订单"# Pay via Web,open this url in your browser: https://openapi.alipay.com/gateway.do? + order_string
order_string = dc_alipay.api_alipay_trade_page_pay    (out_trade_no="20161112",total_amount=0.01,subject=subject,return_url="https://example.com",notify_url="https://example.com/notify" # this is optional
)

继承DCAlipay添加几个我们需要的功能

  • 这里只使用新的验签方式,即要四个证书文件,以往使用的公钥和私钥不再使用了
  • SDK里有个坑,如果不是他设定好的method将不会添加回调url,因此我们自己加上
  • 同样的,登录需要的参数我们也自己添加
from alipay import DCAliPay
from alipay import compatclass CBAliPay(DCAliPay):def api_alipay_fund_trans_uni_transfer(self, out_biz_no, trans_amount, payee_info, biz_scene=None,product_code=None, **kwargs):""" 商家转账给用户即发红包 """                                if not product_code:product_code = "STD_RED_PACKET"if not biz_scene:biz_scene = "DIRECT_TRANSFER"biz_content = {"out_biz_no": out_biz_no,"trans_amount": trans_amount,"payee_info": payee_info,"product_code": product_code,"biz_scene": biz_scene}print(biz_content)biz_content.update(**kwargs)data = self.build_body("alipay.fund.trans.uni.transfer", biz_content)url = self._gateway + "?" + self.sign_data(data)raw_string = compat.urlopen(url, timeout=15).read().decode("utf-8")return self._verify_and_return_sync_response(raw_string, "alipay_fund_trans_uni_transfer_response")def api_alipay_trade_create(self, out_trade_no, total_amount, subject, buyer_id, notify_url, **kwargs):""" 小程序创建订单,返回out_trade_no给前端即可 """biz_content = {"out_trade_no": out_trade_no,"total_amount": total_amount,"subject": subject,"buyer_id": buyer_id,}print(biz_content)biz_content.update(**kwargs)data = self.build_body("alipay.trade.create", biz_content)# SDK里有个坑,如果不是他设定好的method将不会添加回调url,因此我们自己加上data['notify_url'] = notify_urlurl = self._gateway + "?" + self.sign_data(data)raw_string = compat.urlopen(url, timeout=15).read().decode("utf-8")return self._verify_and_return_sync_response(raw_string, "alipay_trade_create")def api_alipay_system_oauth_token(self, grant_type="authorization_code", code='', **kwargs):""" 登录验签 """data = self.build_body("alipay.system.oauth.token", {})# 登录需要的参数我们也自己添加data['grant_type'] = grant_typedata['code'] = codeurl = self._gateway + "?" + self.sign_data(data)raw_string = compat.urlopen(url, timeout=15).read().decode("utf-8")return self._verify_and_return_sync_response(raw_string, "alipay_system_oauth_token")def api_alipay_user_info_share(self, auth_token, **kwargs):""" 获取用户信息 """ data = self.build_body("alipay.user.info.share", {})data['auth_token'] = auth_tokenprint(data)url = self._gateway + "?" + self.sign_data(data)raw_string = compat.urlopen(url, timeout=15).read().decode("utf-8")return self._verify_and_return_sync_response(raw_string, "alipay_user_info_share")

初始化DCAlipay对象并使用

  • 代码有所简化,直接使用可能会有问题
  • 初始化时添加了默认回调url,在具体使用时可以更换需要的回调url
  • 回调url地址我都放在了flask app的配置文件里
from util.CBAlipay import CBAliPaydef getCBAlipay(app_id):""" 初始化对象 """app_private_key_string = open("./cert/{}/app_private.pem".format(appid)).read()# app_public_key_cert_string = open("./cert/{}/caibo-inc.com_public.pem".format(appid)).read()app_public_key_cert_string = open("./cert/{}/app_public.crt".format(appid)).read()alipay_public_key_cert_string = open("./cert/{}/alipayCertPublicKey_RSA2.crt".format(appid)).read()alipay_root_cert_string = open("./cert/{}/alipayRootCert.crt".format(appid)).read()dc_alipay = CBAliPay(appid=appid,# 默认回调urlapp_notify_url=current_app.config['ALIPAY_NOTIFY_URL'],app_private_key_string=app_private_key_string,app_public_key_cert_string=app_public_key_cert_string,alipay_public_key_cert_string=alipay_public_key_cert_string,alipay_root_cert_string=alipay_root_cert_string,sign_type="RSA2")return dc_alipaydef transferRequest(app_id, alipay_user_id, amount):""" 发红包 """dc_alipay = getCBAlipay(app_id)if not dc_alipay:return Falsepayee_info = {"identity_type": "ALIPAY_USER_ID", "identity": alipay_user_id}result = dc_alipay.api_alipay_fund_trans_uni_transfer(out_biz_no=datetime.datetime.now().strftime("%Y%m%d%H%M%S"),trans_amount=amount, payee_info=payee_info)print(result)return resultdef alipayOrder(app_id, subject, out_trade_no, buyer_id, total_amount, notify_url):""" 付款 """dc_alipay = getCBAlipay(app_id)if not dc_alipay:return Falseresult = dc_alipay.api_alipay_trade_create(subject=subject, out_trade_no=out_trade_no,total_amount=total_amount, buyer_id=buyer_id,notify_url=notify_url)print(result)return resultdef systemOAuthToken(code="", app_id="", grant_type="authorization_code"):""" 用户登录 """dc_alipay = getCBAlipay(app_id)if not dc_alipay:return Falseresult = dc_alipay.api_alipay_system_oauth_token(grant_type=grant_type,code=code)print(result)return result

回调notify_url

# coding=utf-8
import time
from flask import current_app, request
from . import home
from util import UserFinanceUtil, AlipayUtil@home.route('/alipay/notify_url', methods=['GET', 'POST'])
def notify():""" 支付回调 """print(request.form.to_dict())data = request.form.to_dict()if data is None or data == "":return "error: empty data"signature = data.pop("sign")res = 'success'# 根据订单号动态配置out_trade_no = data.get('out_trade_no')# 这里从数据库获取信息,判断是哪个小程序app_id = ...  # 省略alipay = AlipayUtil.getCBAlipay(app_id)# verifysuccess = alipay.verify(data, signature)print(success)if success and data["trade_status"] in ("TRADE_SUCCESS", "TRADE_FINISHED"):print("trade succeed")# 这里已经验签成功了,执行自己需要的操作即可...else:res = 'false'return res

python使用第三方支付宝SDK实现小程序发红包、用户支付等功能相关推荐

  1. 微信小程序红包开发 小程序发红包 开发过程中遇到的坑 微信小程序红包接口的...

    最近公司在开发一个小程序红包系统,客户抢到红包需要提现.也就是通过小程序来给用户发红包. 小程序如何来发红包呢?于是我想到两个方法. 之前公众号开发一直用了的.一个是红包接口,一个是企业支付接口.一开 ...

  2. 微信小程序红包开发 小程序发红包 开发过程中遇到的坑 微信小程序红包接口的

    本文转载自: https://www.cnblogs.com/xinweiyun/p/7667595.html 作者:xinweiyun 转载请注明该声明. 最近公司在开发一个小程序红包系统,客户抢到 ...

  3. 微信小程序发红包功能实现,附效果图加讲解。

    微信小程序开发交流qq群   173683895    承接微信小程序开发.扫码加微信. 需要做红包功能的可以找我,收费卖源码,也承接开发.此博文仅示例. 流程效果图: 图片1触发wx.sendBiz ...

  4. 微信支付 企业转账 小程序发红包 提现 发红包 企业支付等遇到的问题

    最近公司在开发一个项目,小程序抢红包,抢到的红包用户要提现.商家需要通过微信的企业转账功能打款到微信的钱包里. 开发的时候发现有几个坑,在这里和大家分享下.首先就是微信支付的开通条件. 第一个,就是个 ...

  5. jsapi支付签名_小程序开发之微信支付

    1. 小程序之微信支付 虽然我们现行的小程序版本中没有支付这块功能,但是作为移动互联网中非常重要的一个功能还是需要了解下(老版本的小程序中有微信支付相关的功能代码在serviceList.js中). ...

  6. 2023年最新最全uniCloud入门学习,零基础入门到实战项目 uni-admin打造uniapp网页后端 微信支付宝抖音小程序后端 unicloud数据后台快速打造uniapp小程序项目

    今天开始带着大家一起零基础学习uniCloud,在下面的课程中我们就简称uniCloud为cloud吧.我这里从零基础开始教大家,后面可以带大家简单的做一个实战项目.所以不用担心自己没有基础,跟着石头 ...

  7. 支付宝小程序授权/获取用户信息

    支付宝小程序授权/获取用户信息 目录: 文章目录 支付宝小程序授权/获取用户信息 获取支付宝小程序授权token 解析支付宝小程序接口响应加密数据 获取支付宝小程序授权token ​ 前提准备工作: ...

  8. 如何基于Agora Web SDK实现小程序互动连麦

    微信在12月底开放了小程序的直播功能,主要面向社交.教育.医疗.政务民生.金融应用场景.目前已经有支持直播的小程序上线,比如实现音频直播的"荔枝FM播客",以及花椒的"百 ...

  9. 【课程设计】基于Taro+React+Springboot+TaroUI+Python爬虫的网络音乐播放小程序详细设计实现

    [课程设计]基于Taro+React+Springboot+TaroUI+Python爬虫的网络音乐播放小程序详细设计实现 解决触摸穿透 自定义导航栏 文章目录 项目简介 功能截图 1.用户登录注册 ...

最新文章

  1. 三星E1200R语言设置_三星 S20 系列评测:依旧是 Android 阵营最高水平
  2. NVIDIA ECCV18论文:超像素采样网络助力语义分割与光流估计(代码将开源)
  3. Python:int,float,str之间的转换
  4. SpringBoot 集成 layering-cache 实现两级缓存调研与实践
  5. 改名之后的 Java EE,现在有什么新进展?
  6. my first d3d application 哈哈哈。
  7. 拓端tecdat|R语言极值理论:希尔HILL统计量尾部指数参数估计可视化
  8. ssh登录失败处理步骤
  9. 百度地图API-自定义图标覆盖物
  10. Silverlight for Windows Phone 7开发系列(1):环境搭建
  11. opencv java教程_详解OpenCV For Java环境搭建与功能演示
  12. SpringCloud 与 SpringBoot 微服务 架构 | 面试题及答案详解
  13. 还不知道切图吗,工作实战手把手教你PS切图,0基础轻松掌握
  14. PDF提取器:ByteScout PDF Extractor SDK
  15. mysql rrd_时间序列数据库rrd启动
  16. 关于 PCB 多层板制程能力不得不说的那些事儿
  17. C++弹窗拦截程序,弹窗广告怎么关闭?不用问,我教你怎么屏蔽!
  18. Java的运行机制(一)
  19. 候补购票进一步提升旅客的购票体验
  20. Python——连接数据库操作

热门文章

  1. Linux修改文件出现[O]pen Read-Only、(E)dit anyway、(R)ecover解决方法
  2. python27.dll是系统自带的吗_《消防应急照明和疏散指示系统技术标准》疑难问题汇总(一)...
  3. 腾讯云不同账号的服务器,网站如何迁移
  4. B站美食区内卷愈演愈烈,头部UP主跟风挑战
  5. python爬虫翻页_教给你一个python爬虫最简单的翻页的办法
  6. Sql Sever语句 (续2)
  7. docker操作基础
  8. 软件项目管理系统-功能模块
  9. InnoDB存储引擎B+树的树高推导
  10. VScode 检测到#include 错误,请更新includepath。已为此翻译单元 禁用波形曲线