当前位置: 首页 > news >正文

python 支付宝营销活动现金红包开发接入流程-含接口调用加签

1 创建网页/移动应用

2 配置接口加签方式

在这里插入图片描述

涉及到金额的需要上传证书,在上传页面有教程,

在支付宝开放平台秘钥工具中生成CSR证书,会自动保存应用公钥和私钥到电脑上,调用支付宝接口需要应用私钥进行加签

在这里插入图片描述

在这里插入图片描述

上传完CSR证书后会有三个证书下载, 分别是: alipayRootCert.crt(支付宝根证书), alipayCertPublicKey_RSA2.crt(支付宝证书公钥), appCertPublicKey_网站应用id.crt(网站应用公钥),下载到本地,后续调用接口的时候加签要用到

3 绑定红包产品

在这里插入图片描述

发红包需要绑定红包、营销活动红包产品功能

配置完成后,对该网站应用进行上线申请,审核通过后就可以使用了

4 代码实现

现金红包接口文档: https://opendocs.alipay.com/open/029yy9

4.1 实现加签

可参考 https://blog.csdn.net/tm_tsm/article/details/105124809 文章,有点区别在 encode_for_sign 函数中,最后拼接才需要 urllib quote

import time
import binascii
import json
import urllib
import urllib.parse
from Cryptodome.Hash import SHA, SHA256
from Cryptodome.PublicKey import RSA
from Cryptodome.Signature import PKCS1_v1_5prv_key = "-----BEGIN RSA PRIVATE KEY-----\n" \"应用私钥" \"\n-----END RSA PRIVATE KEY-----"class SignRSA:MAXLINESIZE = 76  # Excluding the CRLFMAXBINSIZE = (MAXLINESIZE // 4) * 3def __init__(self, **kwargs):self.kwargs = kwargsself.sign_type = "RSA2"  # rsa 用sha, rsa2方式用SHA256self.private_key = prv_key@staticmethoddef get_ordered_data(data: dict):#  还没生成签名 前不能传 sign 和 sign_type 进行排序complex_keys = [k for k, v in data.items() if isinstance(v, dict)]# 将字典类型的数据dump出来for key in complex_keys:data[key] = json.dumps(data[key], separators=(',', ':'))return sorted([(k, v) for k, v in data.items()])@staticmethoddef encode_for_sign(ordered_items, quote=False):ordered_items.sort()if quote:unsigned_str = "&".join('''{}={}'''.format(k, urllib.parse.quote(v)) for k, v in ordered_items)else:unsigned_str = "&".join('''{}={}'''.format(k, v) for k, v in ordered_items)return unsigned_str.encode('utf-8').decode('unicode_escape')def verify_with_public_key(self, sign):""":parameter sign:The signature that needs to be validated.:type sign: byte string"""ordered_item = self.get_ordered_data(self.kwargs)params = "&".join(u"{}={}".format(k, v) for k, v in ordered_item)# 公钥验签signer = PKCS1_v1_5.new(RSA.importKey(self.public_key))if self.sign_type == 'RSA':msg_hash = SHA.new()else:msg_hash = SHA256.new()msg_hash.update(params.encode("utf8"))# sign = urllib.parse.unquote_plus(sign)# sign = self.decodebytes(sign.encode())  # 反操作:base64 编码,转换为unicode表示并移除回车return signer.verify(msg_hash, self.decodebytes(sign.encode("utf8")))  # true / falsedef sign_with_private_key(self):ordered_item = self.get_ordered_data(self.kwargs)unsigned_str = self.encode_for_sign(ordered_item)signer = PKCS1_v1_5.new(RSA.importKey(self.private_key))print("加签参数: ", unsigned_str)# rsa 用sha, rsa2方式用SHA256if self.sign_type == 'RSA':rand_hash = SHA.new()else:rand_hash = SHA256.new()rand_hash.update(unsigned_str.encode())signature = signer.sign(rand_hash)# base64 编码,转换为unicode表示并移除回车sign = self.encodebytes(signature).decode("utf8").replace("\n", "")data = self.kwargsdata['sign'] = signdata['sign_type'] = self.sign_typeordered_data = self.get_ordered_data(data)print("加签结果:", sign)# 在最后拼接的时候才需要 urllib quotereturn f'''{self.encode_for_sign(ordered_data, quote=True)}'''def encodebytes(self, s):"""Encode a bytestring into a bytes object containing multiple linesof base-64 data."""self._input_type_check(s)pieces = []for i in range(0, len(s), self.MAXBINSIZE):chunk = s[i: i + self.MAXBINSIZE]pieces.append(binascii.b2a_base64(chunk))return b"".join(pieces)def decodebytes(self, byte_str):"""Decode a bytestring of base-64 data into a bytes object."""self._input_type_check(byte_str)return binascii.a2b_base64(byte_str)@staticmethoddef _input_type_check(s):try:m = memoryview(s)except TypeError as err:msg = "expected bytes-like object, not %s" % s.__class__.__name__raise TypeError(msg) from errif m.format not in ('c', 'b', 'B'):msg = ("expected single byte elements, not %r from %s" %(m.format, s.__class__.__name__))raise TypeError(msg)if m.ndim != 1:msg = ("expected 1-D data, not %d-D data from %s" %(m.ndim, s.__class__.__name__))raise TypeError(msg)
4.2 支付宝根证书sn码、网站应用sn码获取

代码来源: https://blog.csdn.net/weixin_37309049/article/details/105319729

import OpenSSL
import hashlib
import redef md5(string):return hashlib.md5(string.encode('utf-8')).hexdigest()# 应用公钥证书序列号
def get_app_cert_cn(cert_str=None):cert_str = cert_str or open("appCertPublicKey_网站应用id.crt").read()cert = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, cert_str)try:res = cert.get_signature_algorithm()# 根据其他语言算法 应该剔除不是sha加密的部分python2 可以用r'sha.+WithRSAEncryption' 但是python3必须是b'sha.+WithRSAEncryption'if not re.match(b'sha.+WithRSAEncryption', res):return Noneexcept:return Nonecert_issue = cert.get_issuer()op = ''b = list(cert_issue.get_components())# 证书签发机构排序方式应该是倒序的for i in range(len(b)):a = list(b[len(b) - 1 - i])# 在Python3中直接读取的a[0]为bytes,会影响加密结果,进行decode,兼容python2opp = "{}={}".format(a[0].decode(), a[1].decode())op = op + opp + ','return md5(op[:-1] + str(cert.get_serial_number()))# 根证书序列号
def get_root_cn_sn():root_cert = open("alipayRootCert.crt").read()cert_list = root_cert.split('-----BEGIN CERTIFICATE-----')root_cert_sn = ''for i in cert_list:# print i, len(i)if not len(i):continuecert_sn = get_app_cert_cn('-----BEGIN CERTIFICATE-----' + i)if cert_sn is not None:root_cert_sn = root_cert_sn + cert_sn + '_'return root_cert_sn[:-1]if __name__ == "__main__":print("根证书sn:", get_root_cn_sn())print("应用证书sn:", get_app_cert_cn())
4.3 创建现金红包
import timeimport requests# 导入上面加签的代码
import alipay_countersigndate_str = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())alipay_params = {"app_id": "网站应用id","method": "alipay.marketing.campaign.cash.create","charset": 'UTF-8',"sign_type": "RSA2","timestamp": date_str,"version": "1.0","alipay_root_cert_sn": "支付宝根证书sn码","app_cert_sn": "网站应用sn码","biz_content": {"coupon_name": "answer activity",   # 营销活动名称,暂时只能是英文,中文会报验签错误,应该是上面加签的代码还有点问题"prize_type": "fixed","total_money": "10.00","total_num": "50","prize_msg": "answer activity",   # 红包详情页展示的文案"start_time": "NowTime","end_time": "2023-03-10 12:00:00"}
}sign_rsa = alipay_countersign.SignRSA(**alipay_params)
order_info = sign_rsa.sign_with_private_key()
url = "https://openapi.alipay.com/gateway.do?" + order_infoheaders = {"content-type": "application/json"
}
data = requests.post(url, headers=headers)print(data)
print(data.text)
4.4 红包发放
import timeimport requests
# 加签代码
import alipay_countersigndate_str = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())alipay_params = {"app_id": "网站应用id","method": "alipay.marketing.campaign.cash.trigger","charset": 'UTF-8',"sign_type": "RSA2","timestamp": date_str,"version": "1.0","alipay_root_cert_sn": "支付宝根证书sn码","app_cert_sn": "网站应用sn码","biz_content": {"user_id": "用户id","crowd_no": "创建现金红包活动的活动号",}
}
sign_rsa = alipay_countersign.SignRSA(**alipay_params)
order_info = sign_rsa.sign_with_private_key()url = "https://openapi.alipay.com/gateway.do?" + order_infoheaders = {"content-type": "application/json"
}
data = requests.post(url, headers=headers)
print(data)
print(data.text)

红包发放成功后在支付宝app–账单,或者红包–我的红包中可以看到红包流水,个人商家发的红包是没有支付消息通知的,需要在这两个地方才能看到流水详情

4.5 用户id获取
import timeimport requests
# 加签
import alipay_countersigndate_str = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())alipay_params = {"app_id": "网站应用id","method": "alipay.system.oauth.token","charset": 'UTF-8',"sign_type": "RSA2","timestamp": date_str,"version": "1.0","grant_type": "authorization_code","alipay_root_cert_sn": "支付宝根证书sn码","app_cert_sn": "网站应用sn码","code": "f0361800bf764a0c858dbc87671cVX20"   # h5获取到的auth_code
}sign_rsa = alipay_countersign.SignRSA(**alipay_params)
order_info = sign_rsa.sign_with_private_key()
url = "https://openapi.alipay.com/gateway.do?" + order_infoheaders = {"content-type": "application/json"
}
data = requests.post(url, headers=headers)
print(data)
print(data.text)
4.6 h5获取授权code
  <html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><metaname="viewport"content="width=750,user-scalable=yes,target-densitydpi=device-dpi"/><title></title><link href="css/ttqhb.css" rel="stylesheet" type="text/css" /><script src="js/jquery.min.js"></script><script src="js/index.js"></script></head><body style="background: #c72211"></body><a onclick="get_red_packet()"><img src="images/btn.png" class="btnimg" /></a><img src="images/redbao.jpg" class="img100" /><script>function getQueryString(name) {var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");var r = window.location.search.substr(1).match(reg);if (r != null) {return unescape(r[2]);}return null;}var url ="https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?app_id=网站应用id&scope=auth_base&redirect_uri=";var red_uri = encodeURIComponent("https://baidu.com//index.html" // 授权成功回跳地址);url += red_uri;var auth_code = getQueryString("auth_code");if (!auth_code) {window.location.href = url;}</script>
</html>

在支付宝上进入该页面会自动进行授权回调,授权成功后回调改url页面,在url参数中就会有授权auth_code

5 注意事项

需要是签约的商户才能使用转账功能,如果商户未签约需要进行签约

相关文章:

python 支付宝营销活动现金红包开发接入流程-含接口调用加签

1 创建网页/移动应用 2 配置接口加签方式 涉及到金额的需要上传证书&#xff0c;在上传页面有教程&#xff0c; 在支付宝开放平台秘钥工具中生成CSR证书&#xff0c;会自动保存应用公钥和私钥到电脑上&#xff0c;调用支付宝接口需要应用私钥进行加签 上传完CSR证书后会有三个…...

Python操作Windows

用python进行windows端UI自动化的库有很多&#xff0c;比如pywinauto等&#xff0c;本文介绍一个使用autoit3来实现的 pyautoit 库pyautoit 是一个用python写的基于AutoItX3.dll的接口库&#xff0c;用来进行windows窗口的一系列操作&#xff0c;也支持鼠标键盘的操作。安装pip…...

Aptos SDK交互笔记(一)

背景 之前我们已经了解TS的一些语法&#xff0c;接下来可以实战训练下&#xff0c;这系列的文章就会介绍如何通过Aptos官网提供的TypeScript SDK与Aptos进行交互&#xff0c;这篇文章主要讲的就是如何使用提供API在aptos区块链上转帐。 官网示例 官网提供了交互的例子&#…...

汽车 12V 和 24V 电池输入保护推荐

简介汽车电池电源线路在运行系统时容易出现瞬变。所需的典型保护包括过压、过载、反极性和跨接启动。在汽车 的生命周期中&#xff0c;交流发电机可能会被更换为非OEM 部件。售后市场上的交流发电机可能具有不同的负载突降&#xff08;LOAD DUMP&#xff09;保护或没有负载突降…...

龙蜥LoongArch架构研发全揭秘,龙芯开辟龙腾计划技术合作新范式

编者按&#xff1a;在开源新基建加快建设的背景下&#xff0c;越来越多的企业选择加入龙蜥社区&#xff0c;当前社区生态合作伙伴已突破 300 家。于是&#xff0c;龙蜥社区能为加入的企业提供哪些支持成为越多伙伴们更加关注的话题。本文将以龙蜥社区和龙芯中科联合研发龙蜥 Lo…...

剑指 Offer 16. 数值的整数次方

摘要 剑指 Offer 16. 数值的整数次方 本题的方法被称为快速幂算法&#xff0c;有递归和迭代两个版本。这篇题解会从递归版本的开始讲起&#xff0c;再逐步引出迭代的版本。当指数n为负数时&#xff0c;我们可以计算 x^(-n)再取倒数得到结果&#xff0c;因此我们只需要考虑n为…...

在苹果电脑 mac 上安装原神(playCover)

该方法只能在 M1、M2 mac 上安装原神 目录前言一、首先下载安装 playCover1. playCover 下载2. playCover 安装安装出现问题解决方法二、下载安装原神1.安装包下载2.安装原神三、登录、键盘映射及版本更新等问题登录键盘映射版本更新前言 最近买了新的mac&#xff0c;作者本人…...

数据结构考研习题精选

&#xff11; A假设比较&#xff54;次&#xff0c;由于换或不换&#xff0c;则必然有&#xff12;&#xff3e;&#xff54;种可能。又设有&#xff4e;个关键字&#xff0c;&#xff4e;&#xff01;排列组合&#xff0c;则必然有&#xff12;&#xff3e;&#xff54;&…...

linux常用命令介绍 04 篇——uniq命令使用介绍(Linux重复数据的统计处理)

linux常用命令介绍 04 篇——uniq命令使用介绍&#xff08;Linux重复数据的统计处理&#xff09;1. uniq 使用语法2. sort 简单效果3. uniq 使用例子3.1 不加任何选项3.1.1 不用 sort 效果3.1.2 uniq 结合 sort 一起使用3.2 使用选项例子3.2.1 去重打印&#xff08;或打印不重复…...

网站打不开数据库错误等常见问题解决方法

1、“主机开设成功&#xff01;”上传数据后显示此内容&#xff0c;是因为西部数码默认放置的index.htm内容&#xff0c;需要核实wwwroot目录里面是否有自己的程序文件&#xff0c;可以删除index.htm。 2、恭喜&#xff0c;lanmp安装成功&#xff01;这个页面是wdcp的默认页面&…...

爬虫实战进阶版【1】——某眼专业版实时票房接口破解

某眼专业版-实时票房接口破解 某眼票房接口:https://piaofang.maoyan.com/dashboard-ajax 前言 当我们想根据某眼的接口获取票房信息的时候,发现它的接口处的参数是加密的,如下图: 红色框框的参数都是动态变化的,且signKey明显是加密的一个参数。对于这种加密的参数,我们需要…...

大话数据结构-普里姆算法(Prim)和克鲁斯卡尔算法(Kruskal)

5 最小生成树 构造连通网的最小代价生成树称为最小生成树&#xff0c;即Minimum Cost Spanning Tree&#xff0c;最小生成树通常是基于无向网/有向网构造的。 找连通网的最小生成树&#xff0c;经典的有两种算法&#xff0c;普里姆算法和克鲁斯卡尔算法。 5.1 普里姆&#xff…...

UNet-肝脏肿瘤图像语义分割

目录 一. 语义分割 二. 数据集 三. 数据增强 图像数据处理步骤 CT图像增强方法 &#xff1a;windowing方法 直方图均衡化 获取掩膜图像深度 在肿瘤CT图中提取肿瘤 保存肿瘤数据 四. 数据加载 数据批处理 ​编辑​编辑 数据集加载 五. UNet神经网络模型搭建 单张图片…...

三周爆赚千万 电竞选手在无聊猿游戏赢麻了

如何用3个星期赚到1千万&#xff1f;普通人做梦都不敢想的事&#xff0c;电竞职业选手Mongraal却用几把游戏轻易完成&#xff0c;赚钱地点是蓝筹NFT项目Bored Ape Yacht Club&#xff08;BAYC无聊猿&#xff09;出品的新游戏Dookey Dash。 这款游戏类似《神庙逃亡》&#xff0…...

BERT学习

非精读BERT-b站有讲解视频&#xff08;跟着李沐学AI&#xff09; &#xff08;大佬好厉害&#xff0c;讲的比直接看论文容易懂得多&#xff09; 写在前面 在计算MLM预训练任务的损失函数的时候&#xff0c;参与计算的Tokens有哪些&#xff1f;是全部的15%的词汇还是15%词汇中真…...

大话数据结构-图的深度优先遍历和广度优先遍历

4 图的遍历 图的遍历分为深度优先遍历和广度优先遍历两种。 4.1 深度优先遍历 深度优先遍历&#xff08;Depth First Search&#xff09;&#xff0c;也称为深度优先搜索&#xff0c;简称DFS&#xff0c;深度优先遍历&#xff0c;是指从某一个顶点开始&#xff0c;按照一定的规…...

c语言指针怎么理解 第一部分

不理解指针&#xff0c;是因为有人教错了你。 有人告诉你&#xff0c;指针是“指向”某某某的&#xff0c;那就是误导你&#xff0c;给你挖了个坑。初学者小心不要误读这“指向”二字。 第一&#xff0c;“指针”通常用于保存一个地址&#xff0c;这个地址的数据类型在定义指…...

计算机网络安全基础知识2:http超文本传输协议,请求request消息的get和post,响应response消息的格式,响应状态码

计算机网络安全基础知识&#xff1a; 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle&#xff0c;尤…...

Pytest自动化框架~权威教程03-原有TestSuite的执行方法

前言TestSuite一直是unittest的灵活与精髓之处, 在繁多的测试用例中, 可以任意挑选和组合各种用例集, 比如smoke用例集, level1用例集, webtest用例集, bug回归用例集等等, 当然这些TestSuite需要我们提前定义好, 并把用例加载进去.Pytest采取的是完全不同的用例组织和运行方式…...

web自动化 基于python+Selenium+PHP+Ftp实现的轻量级web自动化测试框架

1、 开发环境 win7 64 PyCharm 4.0.5 setuptools-29.0.1.zip 下载地址&#xff1a;setuptools-29.0.1.zip_免费高速下载|百度网盘-分享无限制 官方下载地址&#xff1a;setuptools PyPI python 3.3.2 mysql-connector-python-2.1.4-py3.3-win64 下载地址&#xff1a;mysq…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面&#xff0c;gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress&#xff0c;说明目标所使用的cms是wordpress&#xff0c;访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)

前言&#xff1a; 双亲委派机制对于面试这块来说非常重要&#xff0c;在实际开发中也是经常遇见需要打破双亲委派的需求&#xff0c;今天我们一起来探索一下什么是双亲委派机制&#xff0c;在此之前我们先介绍一下类的加载器。 目录 ​编辑 前言&#xff1a; 类加载器 1. …...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧

上周三&#xff0c;HubSpot宣布已构建与ChatGPT的深度集成&#xff0c;这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋&#xff0c;但同时也存在一些关于数据安全的担忧。 许多网络声音声称&#xff0c;这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...

Linux系统部署KES

1、安装准备 1.版本说明V008R006C009B0014 V008&#xff1a;是version产品的大版本。 R006&#xff1a;是release产品特性版本。 C009&#xff1a;是通用版 B0014&#xff1a;是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存&#xff1a;1GB 以上 硬盘&#xf…...

图解JavaScript原型:原型链及其分析 | JavaScript图解

​​ 忽略该图的细节&#xff08;如内存地址值没有用二进制&#xff09; 以下是对该图进一步的理解和总结 1. JS 对象概念的辨析 对象是什么&#xff1a;保存在堆中一块区域&#xff0c;同时在栈中有一块区域保存其在堆中的地址&#xff08;也就是我们通常说的该变量指向谁&…...

比特币:固若金汤的数字堡垒与它的四道防线

第一道防线&#xff1a;机密信函——无法破解的哈希加密 将每一笔比特币交易比作一封在堡垒内部传递的机密信函。 解释“哈希”&#xff08;Hashing&#xff09;就是一种军事级的加密术&#xff08;SHA-256&#xff09;&#xff0c;能将信函内容&#xff08;交易细节&#xf…...

RLHF vs RLVR:对齐学习中的两种强化方式详解

在语言模型对齐&#xff08;alignment&#xff09;中&#xff0c;强化学习&#xff08;RL&#xff09;是一种重要的策略。而其中两种典型形式——RLHF&#xff08;Reinforcement Learning with Human Feedback&#xff09; 与 RLVR&#xff08;Reinforcement Learning with Ver…...

深入理解 C++ 左值右值、std::move 与函数重载中的参数传递

在 C 编程中&#xff0c;左值和右值的概念以及std::move的使用&#xff0c;常常让开发者感到困惑。特别是在函数重载场景下&#xff0c;如何合理利用这些特性来优化代码性能、确保语义正确&#xff0c;更是一个值得深入探讨的话题。 在开始之前&#xff0c;先提出几个问题&…...