# dj_alipay_pro **Repository Path**: duans/dj_alipay_pro ## Basic Information - **Project Name**: dj_alipay_pro - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-01-29 - **Last Updated**: 2026-02-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: 支付宝支付, Django ## README # `django`项目中集成支付宝支付 ## 注册支付宝开放平台账号 https://open.alipay.com/platform/home.htm 1. 访问[支付宝开放平台](https://open.alipay.com/platform/home.htm),点击“注册账号”。 2. 填写必要的个人信息,包括姓名、手机号、邮箱、身份证号等。 3. 完成注册后,登录支付宝开放平台。 ## 进入沙箱环境 https://open.alipay.com/develop/sandbox/app 1. 在支付宝开放平台首页,点击“沙箱环境”。 2. 按照提示,完成沙箱环境的配置。 3. 配置沙箱环境的相关参数,包括应用ID、公钥、私钥等。 1. 应用ID:在沙箱环境中,应用ID是用于标识您的应用的唯一标识符。 2. 公钥:用于加密请求参数,确保请求的安全性。 3. 私钥:用于解密支付宝返回的响应参数,确保响应的安全性。 ![复制公钥秘钥-step01](media/复制公钥秘钥-step01.png) ![复制公钥秘钥-step02](media/复制公钥秘钥-step02.png) ## 下载支付宝`SDK` ```shell pip install python-alipay-sdk ``` ## 创建公钥秘钥文件 ### 支付宝公钥 > `"cert/alipay_public_key.pem"` ```python -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtOvDD7v8xRgApWpXVTrot+aENuyNFG++yzNHLXEFA5lH9... -----END PUBLIC KEY----- ``` ### 应用秘钥 > `/cert/app_private_key.pem` ```python -----BEGIN PRIVATE KEY----- MIIEpAIBAAKCAQEAkN3rCkgY59qHoeImi+k0PJPCWEGq7vKm/69Tk9BYs7eyC50+4NoBQHeBfarl/xDQOUDb6uFobBNlhfH84CkLmwuiiWjR/Zr3R56S2sbAWSvBZ0nS8lCQcggbgsWOYSQBgPgIOnLlF+SOMgTD9c7EVlQmxuTKp+mvae... -----END PRIVATE KEY----- ``` ## 配置项目 > `dj_alipay_pro//settings.py` ```python # =============================支付宝配置=============================# ALIPAY_APPID = "9021000140697146" # 应用id ALIPAY_APP_PRIVATE_KEY = BASE_DIR / "cert/app_private_key.pem" # 应用私钥路径 ALIPAY_PUBLIC_KEY = BASE_DIR / "cert/alipay_public_key.pem" # 支付宝公钥路径 # ALIPAY_GATEWAY = "https://openapi.alipaydev.com/gateway.do" # =============================支付宝配置=============================# ``` ## 创建支付工具函数 > `dj_alipay_pro/utils.py` ```python # utils.py from alipay import AliPay from django.conf import settings # 读取支付宝公钥 def read_alipay_public_key(): with open(settings.ALIPAY_PUBLIC_KEY, "r") as f: return f.read().strip() # 读取应用私钥 def read_app_private_key(): with open(settings.ALIPAY_APP_PRIVATE_KEY, "r") as f: return f.read().strip() # 获取支付宝客户端对象 def get_alipay_client(): return AliPay( appid=settings.ALIPAY_APPID, app_notify_url=None, # 默认异步通知 URL(可全局设) app_private_key_string=settings.ALIPAY_APP_PRIVATE_KEY, alipay_public_key_string=settings.ALIPAY_PUBLIC_KEY, sign_type="RSA2", debug=True # 沙箱环境必须为 True ) ``` ## 视图函数 > views.py ```python # views.py from django.shortcuts import redirect from django.http import HttpResponse, HttpResponseRedirect, JsonResponse from .utils import get_alipay_client import uuid def index(request): return redirect(to="alipay_create") def create_order(request): """生成支付订单并跳转到支付宝""" alipay = get_alipay_client() # 订单信息(通常来自数据库) out_trade_no = str(uuid.uuid4()).replace("-", "") total_amount = "0.01" # 沙箱支持最小 0.01 元 subject = "测试商品" # 生成支付跳转链接====PC网页支付链接 order_string = alipay.api_alipay_trade_page_pay( out_trade_no=out_trade_no, total_amount=total_amount, subject=subject, return_url="http://127.0.0.1:8000/ali/return/", # 同步回调 支付成功之后, 自动跳转的一个网页地址 notify_url="http://127.0.0.1:8000/ali/notify/" # 异步通知(需公网 IP 或内网穿透) ) # 生成支付跳转链接====移动网页支付链接 # order_string = alipay.api_alipay_trade_wap_pay( # out_trade_no=out_trade_no, # total_amount=total_amount, # subject=subject, # return_url="http://127.0.0.1:8000/ali/return/", # 同步回调 # notify_url="http://127.0.0.1:8000/ali/notify/" # 异步通知(需公网 IP 或内网穿透) # ) # 生成支付跳转链接====app支付链接 # order_string = alipay.api_alipay_trade_app_pay( # out_trade_no=out_trade_no, # total_amount=total_amount, # subject=subject, # return_url="http://127.0.0.1:8000/ali/return/", # 同步回调 # notify_url="http://127.0.0.1:8000/ali/notify/" # 异步通知(需公网 IP 或内网穿透) # ) with open("order_string.txt", "w") as f: f.write(order_string) # 沙箱支付网关 # pay_url = f"https://openapi.alipaydev.com/gateway.do?{order_string}" pay_url= f"{alipay._gateway}?{order_string}" return HttpResponseRedirect(pay_url) def return_view(request): """同步回调(用户支付后浏览器跳回)""" alipay = get_alipay_client() params = request.GET.dict() # 验证签名 signature = params.pop("sign", None) success = alipay.verify(params, signature) print(params,'params') print(success,'success') if success and params.get("trade_status") in ["TRADE_SUCCESS", "TRADE_FINISHED"]: out_trade_no = params.get("out_trade_no") return HttpResponse(f"支付成功!订单号:{out_trade_no}") else: return HttpResponse("支付失败或验证不通过") def notify_view(request): """异步通知(支付宝服务器 POST 通知)""" alipay = get_alipay_client() data = request.POST.dict() signature = data.pop("sign", None) success = alipay.verify(data, signature) if success and data.get("trade_status") in ["TRADE_SUCCESS", "TRADE_FINISHED"]: out_trade_no = data.get("out_trade_no") # ✅ 在这里更新数据库订单状态(最重要!) with open("notify.txt", "w") as f: f.write(str(data)) # 注意:必须返回 "success" 字符串,否则支付宝会重复通知 return HttpResponse("success") else: return HttpResponse("failure") # 生成支付二维码 def generate_qr_code(request): alipay = get_alipay_client() out_trade_no = str(uuid.uuid4()).replace("-", "")[:32] # 订单号(≤64字符) total_amount = "0.01" subject = "沙箱扫码支付测试" # 调用 precreate 接口(生成二维码) result = alipay.api_alipay_trade_precreate( out_trade_no=out_trade_no, total_amount=total_amount, subject=subject ) if result.get("code") == "10000": qr_code = result["qr_code"] # 这是二维码的内容(URL 格式) return JsonResponse({ "out_trade_no": out_trade_no, "qr_code": qr_code, "message": "二维码生成成功" }) else: return JsonResponse({ "error": result.get("msg", "未知错误"), "sub_msg": result.get("sub_msg", "") }, status=400) ``` ## 沙箱环境账号 ![沙箱账号](media/沙箱账号.png) ```yaml # 应用(APPID): 9021000140697146 # 买家账号: yglnxo8601@sandbox.com ``` ## 参考链接 - [支付宝开放平台](https://open.alipay.com/develop/manage) - [支付宝沙箱环境](https://open.alipay.com/develop/sandbox/app) - [支付宝开发平台秘钥工具](https://opendocs.alipay.com/isv/02kipk)