本文详细介绍了微信支付项目实战的全过程,包括注册与开通微信支付、准备开发环境、获取API密钥以及相关配置信息。文章还深入讲解了如何创建第一个微信支付接口,确保开发者能够轻松入门并掌握微信支付开发技巧。微信支付项目实战涵盖了从环境搭建到接口调用的每一个步骤,帮助新手快速上手。
微信支付是一种基于微信平台的在线支付服务,涵盖扫码支付、APP支付、公众号支付、小程序支付等多种场景。微信支付通过安全的支付方式,帮助用户在移动设备上快速便捷地完成支付操作。微信支付支持多种支付场景,包括线下商店、线上商城、公共服务等。
注册微信支付:
安装开发环境:
获取API密钥:
创建项目目录结构:
wechat-pay
config
,routes
,controllers
,models
,views
,public
。安装Python Flask框架:
pip install Flask
创建路由:
routes
目录下创建payment.py
文件。
from flask import Flask, request, jsonify from config import MERCHANT_ID, API_SECRET_KEY from wechat_pay import WeChatPay
app = Flask(name)
pay = WeChatPay(MERCHANT_ID, API_SECRET_KEY)
@app.route('/create-payment', methods=['POST'])
def create_payment():
data = request.get_json()
total_amount = data['total_amount']
description = data['description']
pay_response = pay.create_order(total_amount, description)
if pay_response.success:
return jsonify({
'code': 0,
'data': pay_response.data
})
else:
return jsonify({
'code': -1,
'msg': pay_response.error
})
配置微信支付SDK:
config
目录下创建wechat_pay.py
文件。
from wechatpy.pay import WeChatPay
class WeChatPay:
def init(self, merchant_id, api_secret):
self.merchant_id = merchant_id
self.api_secret = api_secret
self.client = WeChatPay(merchant_id, api_secret)
def create_order(self, total_amount, description):
return self.client.create_order(total_amount, description)
pip install wechatpy
使用SDK创建支付单:
from wechatpy.pay import WeChatPay client = WeChatPay(merchant_id, api_secret) pay_response = client.create_order(total_amount, description)
创建回调处理接口:
在routes
目录下创建callback.py
文件。
@app.route('/callback', methods=['POST']) def handle_callback(): # 处理微信支付回调 data = request.get_json() is_success = data.get('return_code', '').lower() == 'success' order_id = data.get('out_trade_no', '') if is_success: # 更新订单状态为已支付 update_order_status(order_id, 'PAID') return jsonify({'return_code': 'SUCCESS'}) else: # 错误处理 return jsonify({'return_code': 'FAIL'})
更新订单状态:
controllers
目录下创建order.py
文件。
import db # 假设存在一个数据库操作模块
def update_order_status(order_id, status):
db.execute("UPDATE orders SET status = %s WHERE order_id = %s", (status, order_id))
前端页面逻辑:
fetch('/create-payment', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ total_amount: 100, description: '购买商品' }) }).then(response => response.json()) .then(data => { // 显示支付链接 document.getElementById('pay-link').innerHTML = data.data; });
接收支付请求:
data = { 'code_url': 'https://example.com/pay?out_trade_no=123', 'total_amount': 100, 'description': '购买商品' } return jsonify(data)
接收回调通知:
{ "return_code": "SUCCESS", "return_msg": "OK", "appid": "wx8888888888888888", "mch_id": "1234567890", "out_trade_no": "1234567890", "transaction_id": "12345678901234567890123456", "total_fee": 1, "fee_type": "CNY", "attach": "attach", "time_end": "20200112120012" }
验证回调通知:
def update_order_status(order_id, status): # 更新数据库中订单状态为已支付 db.execute("UPDATE orders SET status = %s WHERE order_id = %s", (status, order_id))
原因:
try: pay_response = pay.create_order(total_amount, description) if pay_response.success: return jsonify(pay_response.data) else: raise Exception(pay_response.error) except Exception as e: return jsonify({'error': str(e)})
原因:
if pay_response.error_code == 'ORDER_AMT_EXCEED_LIMIT': return jsonify({'msg': '支付金额超过限额'})
原因:
if not pay_response.success: return jsonify({'msg': '交易记录查询失败'})
安全校验:
日志记录:
集成微信支付接口:
配置路由:
routes
目录下创建payment.py
文件。
from flask import Flask, request, jsonify from config import MERCHANT_ID, API_SECRET_KEY from wechat_pay import WeChatPay
app = Flask(name)
pay = WeChatPay(MERCHANT_ID, API_SECRET_KEY)
@app.route('/create-payment', methods=['POST'])
def create_payment():
data = request.get_json()
total_amount = data['total_amount']
description = data['description']
pay_response = pay.create_order(total_amount, description)
if pay_response.success:
return jsonify(pay_response.data)
else:
return jsonify({'error': pay_response.error})
商品下单:
后端生成订单并返回订单ID。
@app.route('/create-order', methods=['POST']) def create_order(): data = request.get_json() user_id = data['user_id'] product_id = data['product_id'] quantity = data['quantity'] # 生成订单 order_id = generate_order_id() db.execute("INSERT INTO orders (user_id, product_id, quantity, status) VALUES (%s, %s, %s, 'NEW')", (user_id, product_id, quantity)) return jsonify({'order_id': order_id})
fetch('/create-payment', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ order_id: '12345', total_amount: 100 }) }).then(response => response.json()) .then(data => { // 显示支付链接 document.getElementById('pay-link').innerHTML = data.code_url; });
处理回调通知:
处理回调通知并更新订单状态。
@app.route('/callback', methods=['POST']) def handle_callback(): data = request.get_json() order_id = data['out_trade_no'] transaction_id = data['transaction_id'] total_fee = data['total_fee'] # 更新订单状态 update_order_status(order_id, 'PAID') return jsonify({'return_code': 'SUCCESS'})
def update_order_status(order_id, status): db.execute("UPDATE orders SET status = %s WHERE order_id = %s", (status, order_id))
功能测试:
性能测试:
安全性测试:
项目总结:
深入学习微信支付API:
学习支付安全:
前端技术提升: