1. 支付宝设置
支付宝开发平台登录
沙箱环境
-
是支付宝提供给开发者的模拟支付的环境
-
跟真实环境是分开的
-
沙箱应用:沙箱环境 | 网页&移动应用
-
沙箱账号:登录 - 支付宝
支付宝开发者文档
-
文档主页:支付宝开放平台文档中心
-
产品介绍:电脑网站支付 | 网页&移动应用
-
SDK
:
-
python对接支付宝SDK:https://github.com/fzlee/alipay/blob/master/README.zh-hans.md
-
python对接支付宝SDK安装:
pip install python-alipay-sdk --upgrade
-
-
API列表:网页&移动应用学习路径 | 网页&移动应用
2.生成签名
主目录下新建一个key文件夹,把生成的签名放到文件夹中
public加头尾
-----BEGIN PUBLIC KEY----- -----END PUBLIC KEY-----
private加头尾
-----BEGIN RSA PRIVATE KEY----- -----END RSA PRIVATE KEY-----
3.支付宝公钥配制
点击设置把生成的公钥复制进去,点击确定。点击查看复制生成的公钥,把key文件下的public中更新
4.sdk
在utils中新建一个pay.py,如果安装不了Crypto模块,换成Cryptodome
from datetime import datetime from Crypto.PublicKey import RSA from Crypto.Signature import PKCS1_v1_5 from Crypto.Hash import SHA256 from urllib.parse import quote_plus from urllib.parse import urlparse, parse_qs from base64 import decodebytes, encodebytes import json class AliPay(object): """ 支付宝支付接口(PC端支付接口) """ def __init__(self, appid, app_notify_url, app_private_key_path, alipay_public_key_path, return_url, debug=False): self.appid = appid self.app_notify_url = app_notify_url self.app_private_key_path = app_private_key_path self.app_private_key = None self.return_url = return_url with open(self.app_private_key_path) as fp: self.app_private_key = RSA.importKey(fp.read()) self.alipay_public_key_path = alipay_public_key_path with open(self.alipay_public_key_path) as fp: self.alipay_public_key = RSA.importKey(fp.read()) if debug is True: self.__gateway = "https://openapi.alipaydev.com/gateway.do" else: self.__gateway = "https://openapi.alipay.com/gateway.do" def direct_pay(self, subject, out_trade_no, total_amount, return_url=None, **kwargs): biz_content = { "subject": subject, "out_trade_no": out_trade_no, "total_amount": total_amount, "product_code": "FAST_INSTANT_TRADE_PAY", # "qr_pay_mode":4 } biz_content.update(kwargs) data = self.build_body("alipay.trade.page.pay", biz_content, self.return_url) return self.sign_data(data) def build_body(self, method, biz_content, return_url=None): data = { "app_id": self.appid, "method": method, "charset": "utf-8", "sign_type": "RSA2", "timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), "version": "1.0", "biz_content": biz_content } if return_url is not None: data["notify_url"] = self.app_notify_url data["return_url"] = self.return_url return data def sign_data(self, data): data.pop("sign", None) # 排序后的字符串 unsigned_items = self.ordered_data(data) unsigned_string = "&".join("{0}={1}".format(k, v) for k, v in unsigned_items) sign = self.sign(unsigned_string.encode("utf-8")) # ordered_items = self.ordered_data(data) quoted_string = "&".join("{0}={1}".format(k, quote_plus(v)) for k, v in unsigned_items) # 获得最终的订单信息字符串 signed_string = quoted_string + "&sign=" + quote_plus(sign) return signed_string def ordered_data(self, data): complex_keys = []