py、php、jsp三种开发的支付页面
为您介绍Python、PHP和JSP三种技术开发支付页面功能的实现方式。
1. Python支付页面开发
Flask框架示例
python
from flask import Flask, render_template, request, jsonify import hashlib import time import requests app = Flask(__name__) @app.route('/payment') def payment_page(): """支付页面""" order_info = { 'order_no': '202401150001', 'amount': '100.00', 'product_name': '测试商品' } return render_template('payment.html', order=order_info) @app.route('/create_payment', methods=['POST']) def create_payment(): """创建支付订单""" data = request.json order_no = data.get('order_no') amount = data.get('amount') # 调用支付宝/微信支付接口 payment_data = { 'out_trade_no': order_no, 'total_amount': amount, 'subject': '商品支付', 'timestamp': str(int(time.time())) } # 生成签名 sign = generate_sign(payment_data) payment_data['sign'] = sign return jsonify({ 'success': True, 'payment_data': payment_data, 'payment_url': 'https://pay.example.com/create' }) @app.route('/payment_callback', methods=['POST']) def payment_callback(): """支付回调处理""" callback_data = request.form.to_dict() # 验证签名 if verify_sign(callback_data): # 更新订单状态 update_order_status(callback_data['out_trade_no'], 'paid') return 'success' return 'fail' def generate_sign(data): """生成签名""" sorted_data = sorted(data.items()) sign_str = '&'.join([f"{k}={v}" for k, v in sorted_data]) sign_str += 'your_secret_key' return hashlib.md5(sign_str.encode()).hexdigest() def verify_sign(data): """验证签名""" sign = data.pop('sign', '') local_sign = generate_sign(data) return sign == local_sign
Django框架示例
python
# views.py from django.shortcuts import render from django.http import JsonResponse from django.views.decorators.csrf import csrf_exempt @csrf_exempt def wechat_payment(request): if request.method == 'POST': # 微信支付处理 import wechatpayv3 wechatpay = wechatpayv3.WeChatPay( appid='your_appid', mchid='your_mchid', private_key='path/to/private/key', cert_serial_no='your_cert_serial_no', apiv3_key='your_apiv3_key' ) result = wechatpay.pay( description='测试商品', out_trade_no='order123', amount={'total': 100}, payer={'openid': 'user_openid'} ) return JsonResponse(result)
2. PHP支付页面开发
支付宝支付集成
php
<?php class PaymentController { public function paymentPage() { $orderInfo = [ 'order_no' => '202401150001', 'amount' => '100.00', 'product_name' => '测试商品' ]; include 'payment_view.php'; } public function createAlipayOrder($orderNo, $amount, $productName) { require_once 'alipay_config.php'; $aop = new AopClient(); $aop->gatewayUrl = "https://openapi.alipay.com/gateway.do"; $aop->appId = $app_id; $aop->rsaPrivateKey = $merchant_private_key; $aop->alipayrsaPublicKey = $alipay_public_key; $aop->apiVersion = '1.0'; $aop->signType = 'RSA2'; $aop->postCharset = 'UTF-8'; $aop->format = 'json'; $request = new AlipayTradePagePayRequest(); $request->setNotifyUrl("https://yourdomain.com/notify"); $request->setReturnUrl("https://yourdomain.com/return"); $bizcontent = json_encode([ 'out_trade_no' => $orderNo, 'total_amount' => $amount, 'subject' => $productName, 'product_code' => 'FAST_INSTANT_TRADE_PAY' ]); $request->setBizContent($bizcontent); $result = $aop->pagePay($request, 'POST'); echo $result; } public function paymentNotify() { $postData = $_POST; if ($this->verifyAlipaySign($postData)) { $orderNo = $postData['out_trade_no']; $this->updateOrderStatus($orderNo, 'paid'); echo "success"; } else { echo "fail"; } } private function verifyAlipaySign($data) { // 支付宝签名验证逻辑 $alipaySev = new AlipayNotify($alipay_config); return $alipaySev->rsaCheckV1($data, $alipay_config['alipay_public_key'], $data['sign_type']); } } ?>
微信支付集成
php
<?php class WechatPayment { public function createWechatPayment($orderNo, $amount, $productDesc) { require_once "WxPay.Api.php"; $input = new WxPayUnifiedOrder(); $input->SetBody($productDesc); $input->SetAttach("附加数据"); $input->SetOut_trade_no($orderNo); $input->SetTotal_fee($amount * 100); // 单位:分 $input->SetTime_start(date("YmdHis")); $input->SetTime_expire(date("YmdHis", time() + 600)); $input->SetNotify_url("https://yourdomain.com/wechat/notify"); $input->SetTrade_type("NATIVE"); $input->SetProduct_id($orderNo); $result = WxPayApi::unifiedOrder($input); if ($result['return_code'] == 'SUCCESS' && $result['result_code'] == 'SUCCESS') { return [ 'code_url' => $result['code_url'], 'prepay_id' => $result['prepay_id'] ]; } return false; } public function handleWechatNotify() { $xml = file_get_contents("php://input"); $result = WxPayResults::Init($xml); if ($result['return_code'] == 'SUCCESS' && $result['result_code'] == 'SUCCESS') { $orderNo = $result['out_trade_no']; $this->updateOrderStatus($orderNo, 'paid'); $reply = new WxPayNotifyReply(); $reply->SetReturn_code("SUCCESS"); $reply->SetReturn_msg("OK"); echo $reply->ToXml(); } } } ?>
3. JSP支付页面开发
支付页面JSP
jsp
<%@ page contentType="text/html;charset=UTF-8" %> <%@ page import="java.util.*, com.example.payment.*" %> <% Order order = (Order) request.getAttribute("order"); String orderNo = order.getOrderNo(); double amount = order.getAmount(); String productName = order.getProductName(); %> <!DOCTYPE html> <html> <head> <title>支付页面</title> <meta charset="UTF-8"> <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min.js"></script> </head> <body> <div> <h2>订单支付</h2> <div> <p>订单号: <%= orderNo %></p> <p>商品名称: <%= productName %></p> <p>支付金额: ¥<%= String.format("%.2f", amount) %></p> </div> <div> <button onclick="payWithAlipay()">支付宝支付</button> <button onclick="payWithWechat()">微信支付</button> <button onclick="payWithUnion()">银联支付</button> </div> </div> <script> function payWithAlipay() { $.post('createAlipayOrder', { orderNo: '<%= orderNo %>', amount: '<%= amount %>', productName: '<%= productName %>' }, function(response) { if (response.success) { // 跳转到支付宝支付页面 window.location.href = response.paymentUrl; } }); } function payWithWechat() { $.post('createWechatOrder', { orderNo: '<%= orderNo %>', amount: '<%= amount %>', productName: '<%= productName %>' }, function(response) { if (response.success) { // 显示微信支付二维码 showWechatQRCode(response.codeUrl); } }); } </script> </body> </html>
Servlet支付处理
java
// PaymentServlet.java @WebServlet("/payment/*") public class PaymentServlet extends HttpServlet { private PaymentService paymentService = new PaymentService(); protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String orderNo = request.getParameter("orderNo"); Order order = paymentService.getOrderByNo(orderNo); request.setAttribute("order", order); request.getRequestDispatcher("/payment.jsp").forward(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String path = request.getPathInfo(); switch (path) { case "/createAlipay": createAlipayOrder(request, response); break; case "/createWechat": createWechatOrder(request, response); break; case "/callback": handlePaymentCallback(request, response); break; } } private void createAlipayOrder(HttpServletRequest request, HttpServletResponse response) throws IOException { String orderNo = request.getParameter("orderNo"); String amount = request.getParameter("amount"); String productName = request.getParameter("productName"); try { String paymentUrl = paymentService.createAlipayPayment(orderNo, amount, productName); JsonResponse jsonResponse = new JsonResponse(true, "创建支付成功", paymentUrl); response.setContentType("application/json;charset=UTF-8"); response.getWriter().write(new Gson().toJson(jsonResponse)); } catch (Exception e) { JsonResponse jsonResponse = new JsonResponse(false, "创建支付失败: " + e.getMessage()); response.getWriter().write(new Gson().toJson(jsonResponse)); } } private void handlePaymentCallback(HttpServletRequest request, HttpServletResponse response) throws IOException { Map<String, String[]> parameterMap = request.getParameterMap(); Map<String, String> params = new HashMap<>(); for (String key : parameterMap.keySet()) { params.put(key, parameterMap.get(key)[0]); } boolean verifyResult = paymentService.verifyPaymentCallback(params); if (verifyResult) { String orderNo = params.get("out_trade_no"); paymentService.updateOrderStatus(orderNo, "paid"); response.getWriter().write("success"); } else { response.getWriter().write("fail"); } } }
4. 通用支付功能组件
支付状态管理
java
// 支付状态枚举 public enum PaymentStatus { PENDING("待支付"), PAID("已支付"), FAILED("支付失败"), REFUNDED("已退款"), CANCELLED("已取消"); private String description; PaymentStatus(String description) { this.description = description; } public String getDescription() { return description; } } // 支付服务接口 public interface PaymentService { String createPayment(Order order, PaymentMethod method); boolean verifyPayment(String orderNo); boolean refund(String orderNo, BigDecimal amount); PaymentStatus queryPaymentStatus(String orderNo); }
5. 安全考虑
通用安全措施
- 参数验证:所有输入参数都需要验证
- 签名验证:支付回调必须验证签名
- 防重放攻击:使用时间戳和随机数
- HTTPS加密:所有支付相关请求使用HTTPS
- 金额验证:服务端验证金额一致性
这三种技术栈都可以实现完整的支付功能,选择哪种主要取决于:
- 团队技术栈熟悉程度
- 项目现有架构
- 部署环境要求
- 性能需求
每种方案都需要与具体的支付渠道(支付宝、微信支付、银联等)进行集成,并遵循相应的安全规范。


