用python模拟微信支付_Python实现微信支付

本文档介绍了如何使用Python来模拟微信支付的过程,包括扫码支付模式一和模式二的实现,以及使用JSAPI发起微信支付。内容涵盖环境准备、支付二维码生成、统一下单接口调用、回调处理及签名验证等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Python实现微信支付

一、准备环境

1、要有微信公众号,商户平台账号

2、支持的支付方式有

1540176727044.png

3、备案域名

选择扫码支付,如果使用模式二则不需要域名,只需要可访问的ip地址就行。

一、扫码支付

点击“扫码支付”按官方文档配置好回调url(具体如何配置看官网)

先从公众号上获取APP_ID,APP_SECRECT,从商户平台上获取MCH_ID,API_KEY

1、使用模式一生成支付二维码

这个二维码是没有时间限制的。

create_qrcode.html

创建二维码页面

生成扫码支付二维码

输入手机号:

{% if img_url %}

{% endif %}

{ { url }}

pay_settings.py

#微信支付配置

# ========支付相关配置信息===========

import random

import time

import hashlib

from random import Random

import qrcode

from bs4 import BeautifulSoup

APP_ID = "xxx" # 你公众账号上的appid

MCH_ID = "xxx" # 你的商户号

API_KEY = "xxx" # 微信商户平台(pay.weixin.qq.com) -->账户设置 -->API安全 -->密钥设置,设置完成后把密钥复制到这里

APP_SECRECT = "xxx"

UFDODER_URL = "https://api.mch.weixin.qq.com/pay/unifiedorder" # 该url是微信下单api

NOTIFY_URL = "http://xxx/" # 微信支付结果回调接口,需要改为你的服务器上处理结果回调的方法路径

CREATE_IP = 'xxx' # 你服务器的IP

def random_str(randomlength=8):

"""

生成随机字符串

:param randomlength: 字符串长度

:return:

"""

str = ''

chars = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789'

length = len(chars) - 1

random = Random()

for i in range(randomlength):

str+=chars[random.randint(0, length)]

return str

def order_num(phone):

"""

生成扫码付款订单号

:param phone: 手机号

:return:

"""

local_time = time.strftime('%Y%m%d%H%M%S', time.localtime(time.time()))

result = phone + 'T' + local_time + random_str(5)

return result

def get_sign(data_dict, key):

# 签名函数,参数为签名的数据和密钥

params_list = sorted(data_dict.items(), key=lambda e: e[0], reverse=False) # 参数字典倒排序为列表

params_str = "&".join(u"{}={}".format(k, v) for k, v in params_list) + '&key=' + key

# 组织参数字符串并在末尾添加商户交易密钥

md5 = hashlib.md5() # 使用MD5加密模式

md5.update(params_str.encode('utf-8')) # 将参数字符串传入

sign = md5.hexdigest().upper() # 完成加密并转为大写

return sign

def trans_dict_to_xml(data_dict): # 定义字典转XML的函数

data_xml = []

for k in sorted(data_dict.keys()): # 遍历字典排序后的key

v = data_dict.get(k) # 取出字典中key对应的value

if k == 'detail' and not v.startswith('

v = ''.format(v)

data_xml.append('{value}{key}>'.format(key=k, value=v))

return '{}'.format(''.join(data_xml)).encode('utf-8') # 返回XML,并转成utf-8,解决中文的问题

def trans_xml_to_dict(data_xml):

soup = BeautifulSoup(data_xml, features='xml')

xml = soup.find('xml') # 解析XML

if not xml:

return {}

data_dict = dict([(item.name, item.text) for item in xml.find_all()])

return data_dict

def wx_pay_unifiedorde(detail):

"""

访问微信支付统一下单接口

:param detail:

:return:

"""

detail['sign'] = get_sign(detail, API_KEY)

# print(detail)

xml = trans_dict_to_xml(detail) # 转换字典为XML

response = requests.request('post', UFDODER_URL, data=xml) # 以POST方式向微信公众平台服务器发起请求

# data_dict = trans_xml_to_dict(response.content) # 将请求返回的数据转为字典

return response.content

def pay_fail(err_msg):

"""

微信支付失败

:param err_msg: 失败原因

:return:

"""

data_dict = {'return_msg': err_msg, 'return_code': 'FAIL'}

return trans_dict_to_xml(data_dict)

def create_qrcode(phone,url):

"""

生成扫码支付二维码

:param phone: 手机号

:param url: 支付路由

:return:

"""

img = qrcode.make(url) # 创建支付二维码片

# 你存放二维码的地址

img_url = r'media/QRcode' + '/' + phone + '.png'

img.save(img_url)

return img_url

views.py

import render

from django.http import HttpResponse

from django.views import View

from django.views.decorators.csrf import csrf_exempt

from pay_settings.py import *

class Wxpay_QRccode(View):

"""

生成微信支付二维码

"""

def get(self, request, *args, **kwargs):

return render(request,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值