PC端扫码实现微信支付

简介: PC端扫码实现微信支付

在PC端实现微信支付的流程主要包括以下步骤:

  1. 商户服务器生成微信支付订单,并获取支付二维码。
  2. 用户扫描二维码,进入微信支付页面。
  3. 用户在微信中完成支付。
  4. 微信服务器通知商户支付结果。

以下是实现微信支付的详细步骤和代码示例:

步骤一:生成微信支付订单

首先,需要在微信支付商户平台申请支付权限,并获取商户号、AppID和密钥。然后,通过调用微信支付统一下单接口生成支付订单。

import requests
import hashlib
import xml.etree.ElementTree as ET
 
# 微信支付配置
appid = 'your_appid'  # 微信支付AppID
mch_id = 'your_mch_id'  # 商户号
key = 'your_api_key'  # API密钥
notify_url = 'your_notify_url'  # 支付结果通知地址
 
def generate_nonce_str():
    """生成随机字符串"""
    import random
    import string
    return ''.join(random.sample(string.ascii_letters + string.digits, 32))
 
def sign(data, key):
    """生成签名"""
    stringA = '&'.join([f"{k}={v}" for k, v in sorted(data.items()) if v])
    stringSignTemp = f"{stringA}&key={key}"
    return hashlib.md5(stringSignTemp.encode('utf-8')).hexdigest().upper()
 
def unified_order(out_trade_no, total_fee, body, spbill_create_ip):
    """调用微信统一下单接口生成支付订单"""
    url = 'https://api.mch.weixin.qq.com/pay/unifiedorder'
    data = {
        'appid': appid,
        'mch_id': mch_id,
        'nonce_str': generate_nonce_str(),
        'body': body,
        'out_trade_no': out_trade_no,
        'total_fee': total_fee,
        'spbill_create_ip': spbill_create_ip,
        'notify_url': notify_url,
        'trade_type': 'NATIVE'
    }
    data['sign'] = sign(data, key)
    
    xml = '<xml>'
    for k, v in data.items():
        xml += f'<{k}>{v}</{k}>'
    xml += '</xml>'
    
    response = requests.post(url, data=xml)
    root = ET.fromstring(response.content)
    
    if root.find('return_code').text == 'SUCCESS' and root.find('result_code').text == 'SUCCESS':
        return root.find('code_url').text
    else:
        raise Exception(f"Error: {root.find('return_msg').text}")
 
# 示例调用
out_trade_no = '20230718001'  # 商户订单号
total_fee = 1  # 订单金额,单位为分
body = 'Test Order'  # 商品描述
spbill_create_ip = '127.0.0.1'  # 终端IP
 
try:
    code_url = unified_order(out_trade_no, total_fee, body, spbill_create_ip)
    print(f"Scan the QR code to pay: {code_url}")
except Exception as e:
 

在上述代码中,我们通过调用微信支付统一下单接口生成支付订单,并返回支付二维码的URL。商户可以使用这个URL生成二维码并展示给用户,用户扫码后可以在微信中进行支付。

步骤二:生成支付二维码

通过生成的支付二维码URL,我们可以生成二维码图片,并展示给用户。可以使用 qrcode 库来生成二维码。

import qrcode
 
def generate_qr_code(data, file_path):
    """生成二维码图片"""
    qr = qrcode.QRCode(
        version=1,
        error_correction=qrcode.constants.ERROR_CORRECT_L,
        box_size=10,
        border=4,
    )
    qr.add_data(data)
    qr.make(fit=True)
 
    img = qr.make_image(fill='black', back_color='white')
    img.save(file_path)
 
# 示例调用
file_path = 'pay_qr_code.png'
generate_qr_code(code_url, file_path)
print(f"QR code saved to {file_path}")

在上述代码中,我们使用 qrcode 库生成支付二维码图片,并保存到本地文件中。

步骤三:支付结果通知

用户在微信中完成支付后,微信服务器会通过商户在下单时提供的 notify_url 地址通知商户支付结果。商户需要实现支付结果通知的处理逻辑。

from flask import Flask, request, jsonify
 
app = Flask(__name__)
 
@app.route('/notify', methods=['POST'])
def notify():
    xml_data = request.data
    root = ET.fromstring(xml_data)
    
    # 获取微信返回的数据
    out_trade_no = root.find('out_trade_no').text
    result_code = root.find('result_code').text
    return_code = root.find('return_code').text
    total_fee = root.find('total_fee').text
    
    if return_code == 'SUCCESS' and result_code == 'SUCCESS':
        # 处理支付成功的逻辑,例如更新订单状态
        print(f"Order {out_trade_no} paid successfully, total fee: {total_fee}")
        
        response_data = {
            'return_code': 'SUCCESS',
            'return_msg': 'OK'
        }
    else:
        # 处理支付失败的逻辑
        print(f"Order {out_trade_no} payment failed")
        
        response_data = {
            'return_code': 'FAIL',
            'return_msg': 'Payment Failed'
        }
    
    response_xml = '<xml>'
    for k, v in response_data.items():
        response_xml += f'<{k}>{v}</{k}>'
    response_xml += '</xml>'
    
    return response_xml
 
if __name__ == '__main__':
    app.run(port=5000)

在上述代码中,我们使用 Flask 框架实现了支付结果通知的处理逻辑。当微信服务器通知支付结果时,我们解析通知数据,并根据支付结果处理相应的业务逻辑,例如更新订单状态。

总结

通过以上步骤,我们实现了PC端扫码支付的完整流程,包括生成支付订单、生成支付二维码以及处理支付结果通知。在实际应用中,可以根据业务需求进一步完善和优化代码逻辑。


相关文章
|
存储
将PC端的apk文件通过微信文件分享到手机,后缀名有.1
将PC端的apk文件通过微信文件分享到手机,后缀名有.1
296 0
|
2月前
详细教程:扫码提交表单后,数据直接推送到企业微信、钉钉、飞书群聊
在草料制作的表单中,填表人扫码填写并提交数据后,这些信息可以立即通过企业微信、钉钉或飞书自动推送到相应的群聊中,实现即时共享和沟通,提升团队协作效率。
|
4月前
|
JavaScript 小程序 应用服务中间件
vue 本地/PC端访问微信云数据库
vue 本地/PC端访问微信云数据库
53 0
|
4月前
|
缓存 前端开发 PHP
【超详细】php实现扫码关注微信公众号系统/网站自动注册登录
【超详细】php实现扫码关注微信公众号系统/网站自动注册登录
280 0
|
5月前
|
XML Java 程序员
Java SpringMVC实现PC端网页微信扫码支付完整版
Java SpringMVC实现PC端网页微信扫码支付完整版
232 0
|
6月前
如何在PC端登录多个微信号?怎么操作免费多开电脑版微信?
如何在PC端登录多个微信号?怎么操作免费多开电脑版微信?
|
小程序 安全 前端开发
从零玩转系列之微信支付实战PC端支付微信取消接口搭建1
从零玩转系列之微信支付实战PC端支付微信取消接口搭建
107 0
从零玩转系列之微信支付实战PC端支付微信取消接口搭建1
|
测试技术 API
从零玩转系列之微信支付实战PC端支付微信回调接口搭建2
从零玩转系列之微信支付实战PC端支付微信回调接口搭建
192 0
从零玩转系列之微信支付实战PC端支付微信回调接口搭建2
|
测试技术 API 数据库
从零玩转系列之微信支付实战PC端支付微信退款接口搭建3
从零玩转系列之微信支付实战PC端支付微信退款接口搭建
98 0
|
JSON API 数据库
从零玩转系列之微信支付实战PC端支付微信退款接口搭建2
从零玩转系列之微信支付实战PC端支付微信退款接口搭建
92 0