Python中如何实现微信扫码支付后下载或查看内容的功能?

内容需要付费查看,扫码付款成攻后,内容就出来了.
用 python 能开发出这样的功能不?如果可以有没有教程? 我要学学.谢谢。Python中如何实现微信扫码支付后下载或查看内容的功能?

22 回复

要实现微信扫码支付后下载或查看内容,核心是整合微信支付接口和内容访问控制。这里给你一个基于Flask的完整示例,使用微信支付V3接口。

from flask import Flask, request, jsonify, redirect, send_file
import requests
import json
import time
import hashlib
import hmac
import base64
from urllib.parse import quote

app = Flask(__name__)

# 配置信息
APPID = '你的小程序或公众号APPID'
MCHID = '你的商户号'
API_V3_KEY = '你的APIv3密钥'
CERT_PATH = 'apiclient_cert.pem'  # 商户证书
KEY_PATH = 'apiclient_key.pem'    # 商户私钥

# 存储订单状态和内容映射(生产环境用数据库)
orders = {}

def generate_signature(method, url, body='', timestamp=None):
    """生成微信支付V3签名"""
    if timestamp is None:
        timestamp = str(int(time.time()))
    
    nonce = ''.join(random.choices('abcdefghijklmnopqrstuvwxyz0123456789', k=32))
    
    # 构造签名字符串
    message = f"{method}\n{url}\n{timestamp}\n{nonce}\n{body}"
    
    # 使用APIv3密钥进行HMAC-SHA256签名
    signature = base64.b64encode(
        hmac.new(API_V3_KEY.encode(), message.encode(), hashlib.sha256).digest()
    ).decode()
    
    return f'WECHATPAY2-SHA256-RSA2048 mchid="{MCHID}",nonce_str="{nonce}",timestamp="{timestamp}",signature="{signature}"'

@app.route('/create_order', methods=['POST'])
def create_order():
    """创建支付订单"""
    data = request.json
    product_id = data.get('product_id')
    price = data.get('price', 100)  # 单位:分
    
    # 生成订单号
    order_id = f"ORDER{int(time.time() * 1000)}"
    
    # 调用微信支付统一下单API
    url = "https://api.mch.weixin.qq.com/v3/pay/transactions/native"
    body = {
        "mchid": MCHID,
        "appid": APPID,
        "description": "内容购买",
        "out_trade_no": order_id,
        "amount": {"total": price, "currency": "CNY"},
        "notify_url": "https://yourdomain.com/pay_notify"
    }
    
    headers = {
        'Authorization': generate_signature('POST', '/v3/pay/transactions/native', json.dumps(body)),
        'Content-Type': 'application/json'
    }
    
    response = requests.post(url, json=body, headers=headers, cert=(CERT_PATH, KEY_PATH))
    result = response.json()
    
    if 'code_url' in result:
        # 存储订单信息,关联产品ID
        orders[order_id] = {
            'product_id': product_id,
            'status': 'pending',  # pending, paid, expired
            'paid_at': None,
            'code_url': result['code_url']
        }
        return jsonify({
            'order_id': order_id,
            'code_url': result['code_url'],
            'qrcode_url': f"https://api.qrserver.com/v1/create-qr-code/?size=200x200&data={quote(result['code_url'])}"
        })
    
    return jsonify({'error': '创建订单失败'}), 400

@app.route('/pay_notify', methods=['POST'])
def pay_notify():
    """微信支付回调通知"""
    # 验证签名(实际生产环境需要完整验证)
    data = request.json
    order_id = data.get('out_trade_no')
    
    if order_id in orders and data.get('trade_state') == 'SUCCESS':
        orders[order_id]['status'] = 'paid'
        orders[order_id]['paid_at'] = time.time()
        
        # 这里可以触发后续业务逻辑,如发送邮件、更新数据库等
    
    return jsonify({'code': 'SUCCESS', 'message': 'OK'})

@app.route('/download/<order_id>')
def download_content(order_id):
    """验证订单状态并提供下载"""
    if order_id not in orders:
        return "订单不存在", 404
    
    order = orders[order_id]
    
    # 检查订单状态和支付时间(假设24小时有效)
    if order['status'] != 'paid':
        return "订单未支付", 403
    
    if time.time() - order['paid_at'] > 86400:  # 24小时
        return "订单已过期", 403
    
    # 根据product_id获取对应的文件
    product_id = order['product_id']
    file_path = f"content/{product_id}.pdf"  # 假设内容为PDF文件
    
    try:
        return send_file(file_path, as_attachment=True, download_name=f"content_{product_id}.pdf")
    except FileNotFoundError:
        return "内容不存在", 404

@app.route('/view/<order_id>')
def view_content(order_id):
    """验证订单状态并展示内容(如HTML页面)"""
    if order_id not in orders:
        return "订单不存在", 404
    
    order = orders[order_id]
    
    if order['status'] != 'paid':
        return "请先完成支付", 403
    
    # 返回HTML内容或重定向到内容页面
    product_id = order['product_id']
    return f"""
    <html>
        <h1>您购买的内容</h1>
        <p>产品ID: {product_id}</p>
        <p>这里是你的专属内容...</p>
        <a href="/download/{order_id}">下载PDF版本</a>
    </html>
    """

if __name__ == '__main__':
    app.run(debug=True, ssl_context='adhoc')  # 生产环境需要正式SSL证书

前端调用示例:

// 创建订单并显示二维码
fetch('/create_order', {
    method: 'POST',
    headers: {'Content-Type': 'application/json'},
    body: JSON.stringify({product_id: 'product_001', price: 100})
})
.then(res => res.json())
.then(data => {
    document.getElementById('qrcode').src = data.qrcode_url;
    
    // 轮询检查支付状态
    const checkPayment = setInterval(() => {
        fetch(`/check_order/${data.order_id}`)
        .then(res => res.json())
        .then(result => {
            if (result.status === 'paid') {
                clearInterval(checkPayment);
                window.location.href = `/view/${data.order_id}`;
            }
        });
    }, 3000);
});

核心流程:

  1. 用户选择内容 → 后端创建微信支付订单 → 返回支付二维码
  2. 用户扫码支付 → 微信服务器回调你的/pay_notify接口
  3. 支付成功后,用户访问/view/{order_id}/download/{order_id}
  4. 后端验证订单支付状态 → 返回对应内容

需要补充的:

  • 添加/check_order/{order_id}接口供前端轮询
  • 实现完整的签名验证(微信支付回调验证)
  • 用数据库替代内存存储orders
  • 配置HTTPS(微信支付回调要求)
  • 处理支付过期和退款逻辑

一句话总结: 用微信支付API处理收款,用订单状态控制内容访问权限。


这个用任何一个后端开发语言都可以,比如 屁还是屁,假娃,够浪
用 PY 的筐架也行,通常用的最多的也就是夫拉死客、酱狗之类的。

可以的,语言只是实现想法的工具





有 python django 的教程吗? 谢谢.

qDjango 官方文档很全

楼主缺的怕不仅仅是某个具体框架的教程吧。没有一个具体的教程教你做一个同款扫码付费的页面的。你需要先学 web 基础知识。建议你学 php,学一部分很快就能动手改别人做的东西了。

你需要知道从你在浏览器输入一个所谓的网址,这个网址和域名的关系,为什么网址可以在域名基础上多一些东西,多的东西意义何在,回车进入这个网址发生了什么,dns 是什么,服务器又是什么,最后结合微信商户,微信开发文档做这个东西。

如何在微信浏览器里识别用户唯一的身份? openid/unionid

这个跟什么语言没太大关系。
主要是支付渠道得支持你的想法。就拿微信支付来说,如果你是企业号,可以使用很多高级接口。
如果你是个人号,拿抱歉,很多东西你是用不了的。

去年的时候论坛里有个大佬搞了个个人接口可以使用高级功能的。
/t/416924
payjs.cn

你可以去看看,挺有意思的。


qDjango ? 不是 django ?


多谢。
就是具体的教程。
用 django 开发过东西的。


收到。我看看。多谢。

django 教程网上不要太多。
要学习醬狗之前很多 python 的基础还是要先打好的,不然填坑时间浪费太多了
https://www.jianshu.com/p/cb76310bc0e2

然后推荐你两个比较靠谱的,比较适合初学入门的。
http://www.ziqiangxuetang.com/django/django-tutorial.html
http://www.liujiangblog.com/course/django/2

LZ 的意思是怎么实现付费查看这个功能吧?接入微信 SDK,扫码的时候自动创建账号并关联微信,然后用户支付成功后,将资源 ID 和账号 ID 进行一个关联,标识用户有查看该资源的权限就行了

这个服务叫什么名字?

用 python 你可以直接爬成免费的了


对对对,太对了
就是要这个效果。
我现在会 python django 开发别的东西。
但是不知道有没有 django 开发这个类似的教程?

首先你要知道基本原理和涉及的知识点,不会知识点但至少要知道是他。
像这种,原理:1. 扫码——二维码相关,一个码对应一段文本。这里可以是网址。
2. 微信支付——自己去看微信开发文档。
3. 付款和会员:基本的 cms 系统,已登录的账户(用户),付了款(有权限),就可以看内容。这个如果系统的学习过后端开发是 100%了解的。
以上 3 点如果你不能马上联想到,那还是先学一下编程基础知识吧

打错了,多打了一个 q

都是 web 开发,支付查看特定资源和普通网站开发没什么特殊的地方。
关键还是要理解,用户,资源,鉴权 等概念
差别在普通网站的用户是自己维护 user 表,登录鉴权

而你这是面向微信的开发,那就要理解微信开发领域相关的知识。
那当然就看微信开发官方文档

微信登录:需要理解 OAuth2.0、wx token、openid
你可以查看官方文档:
https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=&lang=

微信二维码登录:需要理解二维码的一些知识
文章大把 https://blog.csdn.net/A9925/article/details/80398133

微信支付:
更是要看官方文档:
https://pay.weixin.qq.com/wiki/doc/api/index.html

然后是支付后成功的回调返回资源给用户

当然这些封装库早有人写好了,你还是需要的是搜索能力的提升。。。
https://github.com/zwczou/weixin-python


多谢。多谢。正在看

用 flask 上手快


.route(’/download/<filepath>’, methods=[‘GET’,‘POST’])
def download(filepath):
do_sth


我以前用过 djang 开发过东西
主要是没有教程对流程不了解

回到顶部