java系统找不到指定文件怎么解决
244
2022-09-23
支付宝开发详细流程【沙箱环境】
支付宝开发详细流程
1. 正式环境(需要营业执照等信息)2. 沙箱环境(模拟真实的环境)
沙箱环境2.1 申请开通沙箱环境2.2 生成密钥
2.2.1 下载密钥生成器2.2.2 生成密钥2.2.3 上传应用公钥并获得支付宝公钥
3. 账户信息和测试APP4. SDK & API
4.1 SDK4.2 API
参数构造
5. 支付宝签名
5.1 签名原理5.2 签名实现
6. 常见报错
6.1 密钥6.2 钓鱼网站
支付宝开发详细流程
1. 正式环境(需要营业执照等信息)
2. 沙箱环境(模拟真实的环境)
沙箱环境
2.1 申请开通沙箱环境
APPID:xxxx支付宝网关
生成密钥
2.2.1 下载密钥生成器
2.2.2 生成密钥
会生成一对密钥,同时生成两个txt文件
应用公钥应用私钥
2.2.3 上传应用公钥并获得支付宝公钥
应用公钥
生成支付宝公钥后就没用处了
应用私钥
对以后URL中传入的数据进行签名加密用
支付宝公钥(通过应用公钥生成)
在页面支付成功后跳转回来时,对支付宝给我们传的值进行校验
3. 账户信息和测试APP
买家信息卖家信息
注意: 不要使用自己的支付宝账号登录
4. SDK & API
一般都会有两个支持SDK,现成的Python模块【优先使用】1. 安装模块 2. 基于模块实现想要的功能 API,提供一个URL1. 自己手动对URL进行处理和加密
4.1 SDK
4.2 API
参数构造
# 跳转到这个地址: 【网关?参数】组成网关 = = { 'app_id': 'xxxx', 'method': 'alipay.trade.page.pay', 'format': 'JSON', 'return_url': '支付成之后跳转到的页面地址(GET请求)', 'notify_url': '跳转到return_url的同时向这个地址发送POST请求', 'charset': 'utf-8', 'sign_type': 'RSA2', 'sign': '签名', 'timestamp': 'yyyy-MM-dd HH:mm:ss', 'version': '1.0', 'biz_content': { 'out_trade_no': '订单号', 'product_code': 'FAST_INSTANT_TRADE_PAY', 'total_amount': 88.88, 'subject': '订单标题' }}
如果支付成功之后,服务器宕机,如何处理? 向notify_url发请求,支付成功,请求更新状态, 服务器宕机,支付宝访问不到,则会在24小时以内:支付宝服务器会不断重发通知,直到超过24小时22分钟。一般情况下,25小时以内完成8次通知(通知的间隔频率一般是:4m,10m,10m,1h,2h,6h,15h); 接收到支付宝请求之后,返回的数据不正确,同上。 返回一个 success 支付结果异步通知
5. 支付宝签名
对参数进行处理,处理完之后和网关进行拼接使用生成密钥请求签名自行实现签名
5.1 签名原理
1. 将参数中 空、文件、字节、sign 剔除 params.pop(sign)2. 排序,对参数中所有的key进行从小大到大排序 sort(params) 按照第一个字符的键值 ASCII 码递增排序(字母升序排序),如果遇到相同字符则按照第二个字符的键值 ASCII 码递增排序3. 将排序后的参数与其对应值,组合成“参数=参数值”的格式,并且把这些参数用 & 字符连接起来,此时生成的字符串为待签名字符串。 待签名字符串 = "app_id=xxxx&method=alipay.trade.page.pay&...." 注意: 1. 有字典应该转换为字符串 2. 字符串中间不能有空格(真操蛋的要求,json.dumps(xxx)后默认就会有空格 可以使用 json.dumps(xxx, separators=(',',':'))) 4. 使用各自语言对应的 SHA256WithRSA 签名函数并利用商户(应用)私钥对待签名字符串进行签名,并进行 Base64 编码 - result= 使用SHA256WithRSA函数和私钥对待签名字符串进行签名 - 签名 = 对result进行Base64编码 把签名再添加回params字典中 params[sign] = 签名 注意: base64编码之后,内部不能有换行符 签名.replace('\n', '') 5. 再将所有的参数拼接起来 注意: 在拼接URL时不能出现 ;,( 等字符,提前将特殊字符转换为URL转义的字符(URL编码) `from urllib.parse import quote_plus`
5.2 签名实现
# pip install pycrypto# windows 安装可能会报错【如下图】# 可以下载安装 pycryptodome 这个库# pycryptodome.xxx.whl 安装方法:# 进入安装目录 pip install pycryptodome.xxx.whl
下载也有点麻烦,我这里把下载好的几个文件放在网盘,需要自行下载即可,我这里放的版本有 【py27、py35、py36】,其他版本可自行下载注意:根据自己的python版本安装,例如: 文件名中的py35代表python3.5链接:提取码:kjnd
# 构造字典params = { 'app_id': "2021000117635347", 'method': 'alipay.trade.page.pay', 'format': 'JSON', 'return_url': " 'notify_url': " 'charset': 'utf-8', 'sign_type': 'RSA2', 'timestamp': datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"), 'version': '1.0', 'biz_content': json.dumps({ 'out_trade_no': xxx, 'product_code': 'FAST_INSTANT_TRADE_PAY', 'total_amount': xxx, 'subject': "tracer payment" }, separators=(',', ':'))}# 获取待签名的字符串unsigned_string = "&".join(["{0}={1}".format(k, params[k]) for k in sorted(params)])# 签名 SHA256WithRSA(对应sign_type为RSA2)from Crypto.PublicKey import RSAfrom Crypto.Signature import PKCS1_v1_5from Crypto.Hash import SHA256from base64 import decodebytes, encodebytes# SHA256WithRSA + 应用私钥 对待签名的字符串 进行签名private_key = RSA.importKey(open("files/应用私钥2048.txt").read())signer = PKCS1_v1_5.new(private_key)signature = signer.sign(SHA256.new(unsigned_string.encode('utf-8')))# 对签名之后的执行进行base64 编码,转换为字符串sign_string = encodebytes(signature).decode("utf8").replace('\n', '')# 把生成的签名赋值给sign参数,拼接到请求参数中。from urllib.parse import quote_plusresult = "&".join(["{0}={1}".format(k, quote_plus(params[k])) for k in sorted(params)])result = result + "&sign=" + quote_plus(sign_string)gateway = "= "{}?{}".format(gateway, result)
6. 常见报错
6.1 密钥
成功解决: RSA key format is not supported
6.2 钓鱼网站
成功解决: 支付宝报错钓鱼网站
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~