当前位置:   article > 正文

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

模拟扫码支付

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, 'create_qrcode.html')

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

"""

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/258467
推荐阅读
相关标签
  

闽ICP备14008679号