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. Office 365系列(3)------Office 365认证使用ADFS安装部署参考
  2. 【数字信号处理】序列傅里叶变换 ( 序列傅里叶变换定义详细分析 | 证明单位复指数序列正交完备性 | 序列存在傅里叶变换的性质 | 序列绝对可和 → 序列傅里叶变换一定存在 )
  3. python中的序列化与反序列化
  4. linux while read文件,linux shell脚本用while read逐行读取文本的问题
  5. 编写react组件_s! 这就是为什么ReasonReact是编写React的最佳方法的原因
  6. 通俗理解“Schmidt正交化”和“正交矩阵” 此博文包含图片 (2015-05-19 09:50:47) 施密特正交化在空间上是不断建立垂直于原次维空间的新向量的过程。 如图β2垂直于β1(1维)
  7. Sql Server 2005 获取表结构信息
  8. Linux之父新年首次“炮轰”:英特尔在扼杀整个 ECC 行业
  9. 光流(四)--Kanade-Lucas-Tomasi(KLT)目标跟踪
  10. REST API详解
  11. vmware mac os 10.11.6 安装xcode 8
  12. html span 字体位置,span内文字居中css布局方法_让span内容居中
  13. 计算机各类会议及投稿文章总结(快速入门)
  14. 物联网卡和流量卡网速对比,看看谁更强?
  15. MySQL 与 Navicat for MySQL
  16. 下载单词英语单词_单词如何塑造体验
  17. LINUX服务介绍(清晰版)
  18. 【Python】Windows:PyCharm 旧版卸载与新版安装汉化参考(专业版试用期/社区版)
  19. 手机如何关闭微信“自动扣费”?
  20. Syscan360会议胸牌破解揭秘

热门文章

  1. 编写html网页文档有哪些方法 它们,网页设计 第2章 HTML基础与文字版面设计.ppt...
  2. jsonp跨域请求数据实例——手机号码查询
  3. 【前端模糊查询】vue用elementul表格,前端写模糊查询功能,简单实现方法
  4. Android实现识别相册二维码
  5. 智能电能表故障预警系统设计
  6. 《微服务设计》--读书笔记
  7. Golang 浮点数格式化输出,保留一位小数
  8. 基于android的五子棋游戏app
  9. PopupWindow实现屏幕底部弹出
  10. 开题报告之修改意见和心得体会(下)