iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python实现微信小程序的多种支付方式
  • 706
分享到

python实现微信小程序的多种支付方式

2024-04-02 19:04:59 706人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录多支付原理多支付接口代码支付方式代码Alipay支付YLpay支付方式Wxpay支付方式Creat下订单多支付 原理 1.利用鸭子类型。规定前台传过来支付方式。pay_metho

多支付

原理

1.利用鸭子类型。规定前台传过来支付方式。pay_methon

2.再支付方式里面实现pay(名字统一)方法

3.回调函数,在支付方式里面写notify(名字统一)统一方法,返回的data统一格式。   

eg: data={"statu":'success',"order_id":notity_data['order_id'],"print":"0000"}

 这样的的牛逼之处:我们在修改、添加支付方式的时候,只需要按照鸭子类型,命名一样的函数名,写好自己的支付方式即可。不需要改其他的代码

多支付接口代码

urls.py:

path("order/create",order.Creat.as_view()),
path("order/notify/<paymethod>",order.Notify.as_view())
# 这里所有的支付都是走的小程序微信支付:
import importlib
class Creat(apiView):
    ...伪代码
    pay_methon = "Wxpay"  # 如果是PC端,可以前台传过来支付方式
    try:
        #pay_file是对象
        pay_file = importlib.import_module(f"app01.Pay.{pay_methon}")  # 调用对应的支付方式
        pay_class = getattr(pay_file, pay_methon)  # 反射机制
        order_data['open_id'] = openid # 传的参数
        order_data['ip'] = host_ip  # 传的参数
        data = pay_class().pay(order_data)  # 调用支付
    except:
        return  Response({"code":201,"msg":"未知支付方式"})
# 异步回调的
class Notify(APIView):
    def post(self,request,paymethod):
        pay_file = importlib.import_module(f"app01.Pay.{paymethod}")
        pay_class = getattr(pay_file,paymethod)
        data = pay_class().notify(request.data)  # 调用异步回调
        # 判断data数据中属性,然后修改订单
        if data["statu"] == "success":
            models.Order.objects.filter(order_id =data['order_id']).update(pay_status =1)
            return Response(data["print"])

支付方式代码

Alipay支付

# Alipay支付
class Alipay:
    def pay(self,order_data):
        #统一下单方法
        pass
    def notify(self,notity_data):
        if notity_data['success'] :
            #notity_data['order_id']表示商城订单号
            data={"statu":'success',"order_id":notity_data['order_id'],"print":"0000"}
            return   data

YLpay支付方式

# YLpay支付方式
class YLpay:
    def pay(self,order_data):
        pass
    def notify(self,request_data):
        #验签
        #数据处理
        pass

Wxpay支付方式

import time
from app01.wx import settings
class Wxpay:
    def pay(self,order_data):
        self.order_id = order_data["order_id"]
        self.open_id = order_data['open_id']
        self.ip = order_data['ip']
        data_body = self.get_body_data()
        import requests
        url = "https://api.mch.weixin.qq.com/pay/unifiedorder"
        response = requests.post(url, data_body.encode("utf-8"), headers={'content-type': "application/xml"})
        res_dict = self.xml_to_dic(response.content)
        timeStamp = str(int(time.time()))
        paySign = self.get_pay_sign(res_dict, timeStamp)
        data_dic = {
            'timeStamp': timeStamp,
            'nonceStr': res_dict['nonce_str'],
            'package': f"prepay_id={res_dict['prepay_id']}",
            'signType': 'MD5',
            "paySign": paySign,
        }
        return data_dic
    def get_pay_sign(self, res_dict, timeStamp):
        data_dic = {
            'appId': res_dict['appid'],
            'timeStamp': timeStamp,
            'nonceStr': res_dict['nonce_str'],
            'package': f"prepay_id={res_dict['prepay_id']}",
            "signType": "MD5"
        }
        sign_str = "&".join([f"{k}={data_dic[k]}" for k in sorted(data_dic)])
        sign_str = f"{sign_str}&key={settings.pay_apikey}"
        import hashlib
        md5 = hashlib.md5()
        md5.update(sign_str.encode("utf-8"))
        sign = md5.hexdigest()
        return sign.upper()
    def xml_to_dic(self, xml_data):
        import xml.etree.ElementTree as ET
        '''
        xml to dict
        :param xml_data:
        :return:
        '''
        xml_dict = {}
        root = ET.fromstring(xml_data)
        for child in root:
            xml_dict[child.tag] = child.text
        return xml_dict
    def get_random(self):
        import random
        data = "123456789zxcvbnmasdfghjklqwertyuiopZXCVBNMASDFGHJKLQWERTYUIOP"
        nonce_str = "".join(random.sample(data, 30))
        return nonce_str
    def get_sign(self):
        data_dic = {
            "nonce_str": self.nonce_str,
            "out_trade_no": self.out_trade_no,
            "spbill_create_ip": self.spbill_create_ip,
            "notify_url": self.notify_url,
            "openid": self.open_id,
            "body": self.body,
            "trade_type": "jsAPI",
            "appid": self.appid,
            "total_fee": "1",
            "mch_id": self.mch_id
        }
        sign_str = "&".join([f"{k}={data_dic[k]}" for k in sorted(data_dic)])
        sign_str = f"{sign_str}&key={settings.pay_apikey}"
        import hashlib
        md5 = hashlib.md5()
        md5.update(sign_str.encode("utf-8"))
        sign = md5.hexdigest()
        return sign.upper()

    def get_body_data(self):
        self.appid = settings.AppId
        # openid=self.open_id
        self.mch_id = str(settings.pay_mchid)
        self.nonce_str = self.get_random()
        self.out_trade_no = self.order_id
        self.spbill_create_ip = self.ip
        self.notify_url = "Https://www.test.com"
        self.body = "老男孩学费"
        self.sign = self.get_sign()
        body_data = f"""
           <xml>
               <appid>{self.appid}</appid>
               <mch_id>{self.mch_id}</mch_id>
               <nonce_str>{self.nonce_str}</nonce_str>
               <sign>{self.sign}</sign>
               <body>{self.body}</body>
               <out_trade_no>{self.out_trade_no}</out_trade_no>
               <total_fee>1</total_fee>
               <spbill_create_ip>{ self.spbill_create_ip}</spbill_create_ip>
               <notify_url>{self.notify_url}</notify_url>
               <openid>{self.open_id}</openid>
               <trade_type>JSAPI</trade_type> 
           </xml>"""
        return body_data


Creat下订单

from  rest_framework.views import  APIView
from rest_framework.response import  Response
from app01.wx import wx_login
import hashlib ,time
from app01 import models
from Django.core.cache import cache
from djanGo.db import transaction
from app01.func import function_tool
import importlib
class Creat(APIView):
    @transaction.atomic
    def post(self,request):
        #小程序提交给我们的数据
        '''
        {'token': '0bb2aa1102ca9c8306133b2539c3508b',
        'remark': '',
        'province': '广东省',
        'city': '广州市',
        'county': '海珠区',
        'address':
        '新港中路397号',
        'phone': '020-81167888',
        'name': '张三',
        'buy_list': {'2': 1}}
        '''
        param = request.data
        if param.get("token") and param.get("buy_list"):
            user_cache = cache.get(param["token"])
            if user_cache:
                # 获取ip
                if request.META.get("HTTP_X_FORWARDED_FOR"):
                    host_ip = request.META["HTTP_X_FROWARDED_FOR"]
                else:
                    host_ip = request.META["REMOTE_ADDR"]
                openid = user_cache.split("&")[0]  #data['openid']+"&"+data["session_key"]
                user_data = models.Wxuser.objects.filter(openid=openid).first()
                order_data = {
                    "consignee_mobile": param['phone'],
                    'consignee_name': param['name'],
                    'wxuser_id': user_data.id,
                    "memo": param['remark'],
                    "consignee_area": f"{param['province']},{param['city']},{param['county']}",
                    "consignee_address": param['address'],
                    "order_id": function_tool.get_order_id(),
                    "order_total": 0
                }
                # 1 上面的order_data 出来上面的数据,有些是需要通过购买上面列表做累加才能获得到
                # 2 order_item 是通过buy_list里面的商品列表,一个键值对就是一条记入'buy_list': {'2': 1,“1”:2}
                # 3 再每一次增加一个order_item的时候,我们都需要校验库存。如果有一个商品的库存不足,我们就应该不然用户下单
                # 4 由于第三步中进行多次增加,如果再后面的的商品库存有问题,我们不让他下单,但是前面的数据已经插入。
                # 所有我们要用数据库事务管理数据的统一。就算order_item没有问题,order_data,插入的时候,也可能出错,所以也要用事务
                # 5 由于并发问题,所有的用户都会对数据的库存进行加减,所以我们这里再校验库存的时候要用。
                buy_list = param.get("buy_list")
                # 获取到buy_list是没有商品信息只有有id,我们先把buy_list中的所有商品查出来
                goods_key = list(buy_list.keys())
                all_product = models.Product.objects.filter(product_id__in = goods_key)
                #用for循环添加order_item

                sid = transaction.savepoint()
                for product in all_product:
                    # 将product.product_id 转字符串,为了通过product.product_id在buy_list获取商品的购买数量
                    product.product_id = str(product.product_id)
                    # 获取订单总金额
                    order_data['order_total'] += product.price* buy_list[product.product_id]
                    for i in range(3):
                        #先查库存,重新查库的
                        stock = product.stock.quantity
                        #当前的库存的库存数量,减去购买数量,是否大于0
                        new_stock = stock-buy_list[product.product_id]
                        if new_stock < 0 :
                            #库存不足,回滚
                            transaction.savepoint_rollback(sid)
                            return Response({"code":201,"msg": f"{product.name}库存不足"})
                        #乐观锁
                        res = models.Stock.objects.filter(quantity= stock,stock_id =product.stock.stock_id).update(quantity = new_stock)
                        if not res:
                            if i == 2:
                                transaction.savepoint_rollback(sid)
                                return  Response({"code":201,"msg": "创建订单失败"})
                            else:
                                continue
                        else:
                            break
                    #获取购买数量
                    new_buy_cout = product.buy_count + buy_list[product.product_id]
                    models.Product.objects.filter(product_id=product.product_id).update(buy_count =new_buy_cout)
                    #组织order_item的数据
                    order_item_data = {
                         'order_id': order_data['order_id'],
                         'product_id': product.product_id,
                         "name": product.name,
                         "image": product.image,
                         "price": product.price,
                          "nums": buy_list[product.product_id],
                          "brief": product.brief
                     }
                    models.Order_items.objects.create(**order_item_data)
                models.Order.objects.create(**order_data)
                transaction.savepoint_commit(sid)

                #所有的支付都是走的小程序微信支付:
                pay_methon = "Wxpay"
                try:
                    #pay_file是对象
                    pay_file = importlib.import_module(f"app01.Pay.{pay_methon}")
                    pay_class = getattr(pay_file, pay_methon)
                    order_data['open_id'] = openid
                    order_data['ip'] = host_ip
                    data = pay_class().pay(order_data)
                except:
                    return  Response({"code":201,"msg":"未知支付方式"})
                # 1对接小程序支付
                # 2 我们要用celery去定时检查,该订单在指定时间内用没有支付,没有支付,取消订单,回滚库存
                function_tool.pay_status(order_data['order_id'])
                return  Response({"code":200,"msg":"ok","data":data})

            else:
                return Response({"code": 201, "msg": "无效的token"})
        else:
            return Response({"code":202,"msg":"缺少参数"})
class Notify(APIView):
    def post(self,request,paymethod):
        pay_file = importlib.import_module(f"app01.Pay.{paymethod}")
        pay_class = getattr(pay_file,paymethod)
        data = pay_class().notify(request.data)

        # 判断data数据中属性,然后修改订单
        if data["statu"] == "success":
            models.Order.objects.filter(order_id =data['order_id']).update(pay_status =1)
            return Response(data["print"])

以上就是python实现微信小程序的多种支付方式的详细内容,更多关于Python微信支付方式的资料请关注编程网其它相关文章!

--结束END--

本文标题: python实现微信小程序的多种支付方式

本文链接: https://www.lsjlt.com/news/117307.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • python实现微信小程序的多种支付方式
    目录多支付原理多支付接口代码支付方式代码Alipay支付YLpay支付方式Wxpay支付方式Creat下订单多支付 原理 1.利用鸭子类型。规定前台传过来支付方式。pay_metho...
    99+
    2024-04-02
  • python怎么实现微信小程序的多种支付方式
    本篇内容主要讲解“python怎么实现微信小程序的多种支付方式”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“python怎么实现微信小程序的多种支付方式”吧!多支付原理1.利用鸭子类型。规定前台...
    99+
    2023-06-30
  • Python3微信支付(小程序支付)V3接口的实现
    起因: 因公司项目需要网上充值功能,从而对接微信支付,目前也只对接了微信支付的小程序支付功能,在网上找到的都是对接微信支付V2版本接口,与我所对接的接口版本不一致,无法使用,特此记录...
    99+
    2023-01-17
    Python3 微信支付V3接口 Python3 微信支付
  • 小程序微信支付
    微信小程序实现支付功能 1. 准备工作 在开始实现微信小程序支付功能之前,我们需要先完成以下准备工作: 注册微信支付商户号,并完成商户资质审核;微信支付开发文档;在小程序中引入微信支付JSAPI;获取...
    99+
    2023-09-04
    小程序 微信 微信小程序
  • 微信小程序中如何实现微信支付
    微信支付是微信公众平台提供的一种在线支付服务,可以为用户提供快速、方便、安全的支付体验。而在微信小程序中实现微信支付,则可以为应用程序提供更多的功能和服务,提高用户体验和商业价值。因此,在本文中,我们将介绍如何在微信小程序中实现微信支付。 ...
    99+
    2023-08-16
    微信小程序 微信 小程序 前端 javascript
  • 【微信支付】java-微信小程序支付-V3接口
    一、对接前准备 最开始需要在微信支付的官网注册一个商户; 在管理页面中申请关联小程序,通过小程序的 appid 进行关联;商户号和appid之间是多对多的关系 进入微信公众平台,功能-微信支付中确认关联 具体流程请浏览官方文档:接入前准备-...
    99+
    2023-10-27
    微信 微信小程序 小程序
  • java微信小程序支付
    这篇文章将为大家详细讲解有关java微信小程序支付,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Java 微信小程序支付 前言 微信小程序支付是一种方便快捷的支付方式,它允许用户在微信小程序中直接进行支付...
    99+
    2024-04-02
  • 微信小程序支付java
    这篇文章将为大家详细讲解有关微信小程序支付java,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。微信小程序支付 Java 实现 微信小程序支付提供了便捷的支付机制,使开发者能够轻松地在其小程序中集成支付功...
    99+
    2024-04-02
  • 微信小程序接入微信支付实现过程详解
    目录一、基本介绍二、配置信息三、编码实现四、流程总结一、基本介绍 1、支付场景:点击支付按钮唤起微信支付弹窗,输入正确密码后完成支付。 2、基本流程:点击支付按钮首先生成一个订单,然...
    99+
    2022-12-26
    小程序接入微信支付 微信小程序微信支付
  • springboot整合IJPay实现微信支付-V3---微信小程序
    前言 微信支付适用于许多场合,如小程序、网页支付、但微信支付相对于其他支付方式略显麻烦,我们使用IJpay框架进行整合 一、IJpay是什么? JPay 让支付触手可及,封装了微信支付、支...
    99+
    2023-09-23
    微信小程序 微信 小程序 spring Powered by 金山文档
  • 微信支付V3 小程序支付API Java版
    本文目的:快速接通微信支付V3 无需关注细节,实现支付功能,修改配置即可调用 文章目录 接入准备微信支付流程整理(小程序版)一、导入微信支付扩展包二、微信支付工具类1.签名工具类2.微信...
    99+
    2023-10-27
    微信 小程序 java
  • 微信小程序支付功能怎么实现
    实现微信小程序支付功能,需要以下步骤:1. 首先,在微信公众平台申请开通支付功能,并获取到支付相关的配置信息,包括 appID、商户...
    99+
    2023-08-16
    微信小程序
  • 微信小程序支付功能如何实现
    这篇文章主要介绍了微信小程序支付功能如何实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇微信小程序支付功能如何实现文章都会有所收获,下面我们一起来看看吧。微信小程序支付功能开发文档如下:小程序端,保留大部分的...
    99+
    2023-06-26
  • PHP实现小程序微信支付(v3版本)
    PS:本篇文章是PHP对小程序进行微信支付v3版本的实现,仅用于对支付流程的了解,具体使用方面需要大家自行调整 小程序端JS代码: getPrepayID(){ var that = th...
    99+
    2023-09-17
    php 小程序 微信
  • Python3 微信支付(小程序支付)V3接口
    起因:         因公司项目需要网上充值功能,从而对接微信支付,目前也只对接了微信支付的小程序支付功能,在网上找到的都是对接微信支付V2版本接口,与我所对接的接口版本不一致,无法使用,特此记录下微信支付完成功能,使用Django完成后...
    99+
    2023-09-12
    微信 小程序 微信小程序
  • 微信小程序如何实现支付及退款
    这篇文章将为大家详细讲解有关微信小程序如何实现支付及退款,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一. 支付支付主要分为几个步骤:前端携带支付需要的数据(商品id,购...
    99+
    2024-04-02
  • 小程序通过小程序云实现微信支付功能实例
    目录一、开通微信支付 1.1 关联商户号1.2 添加商户号1.3 管理员授权二、云函数开发2.1 新建云函数2.2 云函数代码2.3 云函数上传并部署三、小程序调用3.1 ...
    99+
    2024-04-02
  • 微信小程序支付踩坑notify_url(支付回调)
    最近做了微信小程序支付,支付成功之后发现notify_url回调地址竟然没有访问。 检查了无数次代码,下单结果里面的回调地址看了又看,都没有错啊。 把回调地址复制出来到浏览器上面,外网也是可以访问的啊。 然后我再分析,为什么以前公众号支付都...
    99+
    2023-09-20
    微信小程序 小程序 微信
  • 微信小程序实现 item点击变色的多种方式
    1:wxs实现 多个item点击变色 并且保持之前的不变 效果图: 思路1:for循环渲染item            给点击的元素添加active标签            多个元素使用wxs语法判断 active标签数组中是否存在点...
    99+
    2023-09-23
    微信小程序 小程序
  • 微信小程序支付完整流程
    1、注册微信支付商户号(由上级或法人注册) 注册链接:https://pay.weixin.qq.com/index.php/apply/applyment_home/guide_normal 此商户...
    99+
    2023-09-21
    微信小程序 小程序 javascript
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作