uniapp前端+python后端=微信小程序支付到底怎么开发???国内的资料为什么没一篇能讲清楚,简简单单的只需要3步就可以了-V2版本

一.微信小程序支付

真的,在接到这个任务的时候,本以为很简单,不就是普通的浏览器复制粘贴,最不济找下gpt给生成一下,但是到实际开发就不同了,不是后端出问题就是前端,搜资料,上百度上google,基本每一个人讲的都不一样,不是这问题就是那问题,特别是微信官方,自己接口的逻辑也不整清楚,就算是报错,参数错误连个提示也没有,而且用python写后端的少之又少,我只是想说,python-flask写接口简直不要太好用,java真的太胖了,这里的胖就是指的是,像小程序这种逻辑和体量并不大的项目来说,python作为后端就是不是太好用

二.前期准备(你必须会的,要准备的)

2.1你必须会的

uniapp开发小程序的前端

这个国内的资源还是蛮全的,一搜一大把,先搜《uniapp开发第一个小程序hello word》一天搞点到入门

python-flask开发小程序的后端

这个更多,先搜《python-flask如何开发后端接口》

2.2要准备的

appid:不用多说,小程序的appid
mch_id:商家号,先搜《微信支付》,点击进去,一通申请,一通绑定到小程序
今天篇文章主要是讲代码开发的,需要讲讲怎么绑定的可以评论,专门来讲讲怎么绑定怎么申请或者
文章最后会写怎么联系我
key:商家支付密钥
没了,没了,就这三个,基本就是登录注册,得到这些玩意

三.开始第一步

首先你有个可以获取openid的接口,可以就是我们python-flask里面写就ok了
先看看整体

import flask
from flask import request, jsonify, send_file
from gevent import pywsgi
from flask_cors import CORS
import requests
import json
from datetime import datetime
import hashlib
import string
import random
import xmltodict
import time
import threading

#你的代码区开始



#你的代码区结束

if __name__ == '__main__':
    server2 = pywsgi.WSGIServer(('0.0.0.0', 7004), server)
    server2.serve_forever()

我们就往开发到结束来进行讲解
首先还是你要有一个获取openid的接口

@server.route('/api/GetOpenid')
def GetOpenidYSGJ():
    # 获取用户的code,从而获取用户的唯一标识openid
    code = request.args.get('code')
    res = {}
    if code!="":
        response = requests.get('https://api.weixin.qq.com/sns/jscode2session?appid=wx17c2f9121ad6e094&secret=1c56f6b24ad40c468879ae3bae6bcd5b&js_code='+code+'&grant_type=authorization_code')
        resdata=json.loads(response.text)
        try:
            if resdata['openid'] != "":
                res['openid'] = resdata['openid']
                return res
            else:
                res['openid'] = "0"
                return res
        except:
            res['openid'] = "0"
            return res
    else:
        res['openid']="0"
        return res

看懂了晒,前端访问这个接口/api/GetOpenid,传入code,code开发小程序的都是wx.login()或者uniapp开发的,uni.logo()就能获取code,code以获取就获取到openid了

开始第二步

首先创建4个方法
1.获取随机字符串generate_nonce_str()
2.获取签名generate_sign((data, key),
3.将字典转换为xml格式dict_to_xml(data)
4.将xml格式的数据转换为字典xml_to_dict(xml_data)
分别是

def generate_nonce_str(length=32):
    chars = string.ascii_letters + string.digits
    return ''.join(random.choice(chars) for _ in range(length))
def generate_sign(data, key):
    sorted_keys = sorted(data.keys())
    stringA = '&'.join([f"{key}={data[key]}" for key in sorted_keys])
    stringSignTemp = f"{stringA}&key={key}".encode('utf-8')
    sign = hashlib.md5(stringSignTemp).hexdigest().upper()
    return sign


def dict_to_xml(data):
    """
    将字典转换为xml格式
    """
    xml_data = ["<xml>"]
    for k, v in data.items():
        xml_data.append(f"<{k}>{v}</{k}>")
    xml_data.append("</xml>")
    return "".join(xml_data)

def xml_to_dict(xml_data):
    """
    将xml格式的数据转换为字典
    """
    xml_dict = {}
    soup = BeautifulSoup(xml_data, 'xml')
    for item in soup.find_all():
        xml_dict[item.name] = item.text
    return xml_dict

创建微信支付接口请求unifiedorder

@server.route('/api/unifiedorder', methods=['POST'])
def unifiedorder():
    # 获取请求中的订单信息
    data = request.json
    # 获取当前时间戳
    client_ip = request.headers.get('X-Forwarded-For', request.headers.get('X-Real-IP', request.remote_addr))
    #获取随机字符串的方法
    sss=generate_nonce_str()
    # 构造统一下单请求参数
    params = {
        'appid': '你的小程序appid',
        'mch_id': '商品号',
        'nonce_str': sss,
        'body': data['body'],
        'out_trade_no': data['out_trade_no'],
        'total_fee': data['total_fee'],
        'spbill_create_ip': client_ip,
        'notify_url': 'https://jcbb1.fun/wallpaper/api/your_notify_url',  # 异步通知地址
        'trade_type': 'JSAPI',  # 小程序支付
        'openid': data['openid'],  # 用户在小程序中的openid
    }
    # 生成签名
    sign = generate_sign(params, '微信商户的密钥V2的')
    params['sign'] = sign
    param = {'root': params}
    xml = xmltodict.unparse(param)
    # 将参数转换为 XML 格式
    xml_data = dict_to_xml(params)

    # 发送请求到微信支付服务器
    response = requests.post('https://api.mch.weixin.qq.com/pay/unifiedorder', data=xml.encode('utf-8'),headers={'Content-Type': 'text/xml'})

    # 解析微信支付服务器的响应
    result = xmltodict.parse(response.content.decode('utf-8'))
    # 封装返回结果
    # 从微信支付服务器返回的结果中提取用于验证签名的部分参数
    result_params = {
        'appId': '小程序的appid',
        'timeStamp': str(int(time.time())),
        'nonceStr': generate_nonce_str(),
        'package': "prepay_id="+result['xml']['prepay_id'],
        'signType': 'MD5',
    }
    result_params['paySign'] = generate_sign(result_params, '微信商户的密钥V2的')
    return json.dumps(result_params)

开始第三步,回调地址

创建python回调地址接口

@server.route('/api/your_notify_url', methods=['POST'])
def handle_payment_notification():
    # 处理微信支付结果异步通知的逻辑
    data = request.data
    # 在这里处理通知数据,验证签名等操作
    print("有用户充值啦")
    # 解析微信支付服务器的响应
    result = xmltodict.parse(data.decode('utf-8'))
    print(result)
    #获取openid
    openid=result['xml']['openid']
    #获取充值了多少
    cash_fee=result['xml']['cash_fee']
    # 状态
    result_code = result['xml']['result_code']
    # 状态2
    return_code = result['xml']['return_code']
    # 订单号
    transaction_id = result['xml']['transaction_id']
    if result_code=="SUCCESS" and return_code=="SUCCESS":
        # 进行你的数据处理
        print(openid)
        print(cash_fee)
        print(type(cash_fee))
    # 返回成功响应给微信支付服务器
    # 构建回复内容
    response_data = {"code":"SUCCESS","message":"ok"}
    return 'SUCCESS',200

开始第四步,前端调用

我这里用的前端是uniapp
创建按钮进行请求
就是一个简单的创建按钮,然后绑定事件,举例绑定的事件是chongzhi()
具体事件代码就是

generateUniqueOrderNumber() {
  // 这里可以使用你的逻辑生成唯一订单号
  return 'your_order_' + new Date().getTime();
},
chongzhi(amount){
	const lll=this;
	try{
		// 假设以下参数是从前端获取的
		const body = "Kbit";
		const total_fee = amount; // 订单总金额,单位为分
		const openid = uni.getStorageSync("openid");
		
		// 生成商户订单号,这里可以使用你自己的逻辑生成唯一订单号
		const out_trade_no = this.generateUniqueOrderNumber();
		console.log("----------------"+out_trade_no)
		// 发送支付请求
		uni.request({
		  url: "https://你的服务器/api/unifiedorder",
		  method: "POST",
		  data: JSON.stringify({
		    body: body,
		    out_trade_no: out_trade_no,
		    total_fee: total_fee,
		    openid: openid,
		  }),
		  success: (res) => {
		    // 调起支付
		    uni.requestPayment({
		        provider: 'wxpay',
		    	timeStamp: res.data.timeStamp,
		    	nonceStr: res.data.nonceStr,
		    	package: res.data.package,
		    	signType: res.data.signType,
		    	paySign: res.data.paySign,
		    	success: function (res) {
		    		console.log(res);
					if(res.errMsg=="requestPayment:ok"){
						//成功付款,进行查询和提示成功
						//查询余额
						//请求用户的个人信息
						uni.showToast({
							title: "充值成功",
						})
		    	},
		    	fail: function (err) {
					console.log("失败了")
		    		console.log(err);
		    	}
		    });
		  },
		  fail: (err) => {
		    console.error('支付请求失败:', err);
			uni.showToast({
			  title: err,
			  duration: 2000, // 提示的延迟时间,单位毫秒,默认值 1500
			  mask: true, // 是否显示透明蒙层,防止触摸穿透,默认值 false
			  success: function() {
			    // 提示框关闭后的回调函数
			  }
			})
		  },
		});
		console.log(amount)
	}catch (e) {
	  // TODO handle the exception
	  console.log("充值失败,联系客服")
	  console.log(e)
	}
},

在这里插入图片描述

是不是超级的简单,很简单的四步就能充值成功,前端其实没啥讲的,主要是python来做微信支付的后端很少人讲到,所以才写了这一篇,希望能帮到大家

总结

总之就是一个很简单的v2版本的微信支付,简单来说就是3个外部接口,分别是获取openid的接口、微信支付主接口和回调接口,其他4个方法主要是来处理数据,前端更简单,传入该传入的值,金额,主要坑的点是在签名环节,网上很多方法,我这个方法是百分之百可以用的,不会出现签名错误
如果不懂的,可以通过关注微信公众号:程序员PG
来联系我
这边会提供

  • 提供test的反向代理(如果没有服务器想用自己的电脑当服务器的,我可以用我的服务器给你做代理)
  • 提供源码,更进一步的指导
  • 提供技术服务

ok 这次就讲到这里了,如果有大神或者其他伙伴看出问题的,欢迎评论,大家一起交流

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/195560.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Current request is not a multipart request问题排查

概述 在应用工程里看到如下被标记为deprecated的代码&#xff0c;这对有代码洁癖的我而言是无法忍受的&#xff1a; row.getCell(10).setCellType(Cell.CELL_TYPE_STRING); String hospital row.getCell(0).getStringCellValue();对应的poi版本号&#xff1f;是的&#xff…

适用于iOS 的顶级苹果数据恢复软件

数据丢失可能随时发生在任何人身上&#xff0c;这可能是一种令人沮丧的经历。丢失 iOS 设备上的重要数据可能会造成特别严重的损失&#xff0c;因为其中可能包括有价值的照片、联系人、消息和其他重要文件。幸运的是&#xff0c;有多种数据恢复工具可以帮助用户恢复丢失的数据。…

filebeat日志收集工具

elk:filebeat日志收集工具和logstash相同 filebeat是一个轻量级的日志收集工具&#xff0c;所使用的系统资源比logstash部署和启动时使用的资源要小得多 filebeat可以运行在非Java环境&#xff0c;它可以代理logstash在非Java环境上收集日志 filebeat无法实现数据的过滤&…

定制开发办公软件在企业发展中的优势|app小程序网站搭建

定制开发办公软件在企业发展中的优势|app小程序网站搭建 如今&#xff0c;办公软件已经成为企业日常工作的必需品。很多企业为了提高工作效率和满足自身业务需要&#xff0c;选择定制开发办公软件。下面将介绍定制开发办公软件在企业发展中的优势。 首先&#xff0c;定制开发办…

DjiTello + YoloV5的无人机的抽烟检测

一、效果展示 注&#xff1a;此项目纯作者自己原创&#xff0c;创作不易&#xff0c;不经同意不给予搬运权限&#xff0c;转发前请联系我&#xff0c;源码较大需要者评论获取&#xff0c;谢谢配合&#xff01; 1、未启动飞行模型无人机的目标检测。 DjiTello YOLOV5抽烟检测 …

EDA实验-----正弦信号发生器的设计(Quartus II )

目录 一、实验目的 二、实验仪器 三、实验原理 四、实验内容 五、实验步骤 六、注意事项 七、实验过程&#xff08;操作过程&#xff09; 1.定制LPM_ROM模块 2.定制LPM_ROM元件 3.计数器定制 4.创建锁相环 5.作出电路图 6.顶层设计仿真 一、实验目的 学习使用Ver…

Echarts地图registerMap使用的GeoJson数据获取

https://datav.aliyun.com/portal/school/atlas/area_selector 可以选择省&#xff0c;市&#xff0c;区。 也可以直接在地图上点击对应区域。 我的应用场景 我这里用到这个还是一个特别老的大屏项目&#xff0c;用的jq写的。显示中国地图边界区域 我们在上面的这个地区选择…

【开源】基于Vue+SpringBoot的独居老人物资配送系统

项目编号&#xff1a; S 045 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S045&#xff0c;文末获取源码。} 项目编号&#xff1a;S045&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 查询社区4…

ELK---filebeat日志收集工具

filebeat日志收集工具 filebeat日志收集工具和logstash相同 filebeat的优点&#xff1a; filebeat是一个轻量级的日志收集工具&#xff0c;所使用的系统资源比logstash部署和启动时使用的资源要小的多 filebeat可以运行在非Java环境。它可以代替logstash在非Java环境上收集…

Java学习路线第一篇:Java基础(2)

这篇则分享Java学习路线第一part&#xff1a;Java基础&#xff08;2&#xff09; 从看到这篇内容开始&#xff0c;你就是被选定的天命骚年&#xff0c;将承担起学完Java基础的使命&#xff0c;本使命为单向契约&#xff0c;你可选择YES或者选择YES。 具体路线安排&#xff1a…

深度学习第1天:深度学习入门-Keras与典型神经网络结构

☁️主页 Nowl &#x1f525;专栏《机器学习实战》 《机器学习》 &#x1f4d1;君子坐而论道&#xff0c;少年起而行之 文章目录 神经网络 介绍 结构 基本要素 Keras 介绍 导入 定义网络 模型训练 前馈神经网络 特点 常见类型 代码示例 反馈神经网络 特点 …

AlphaFold的原理及解读

1、背景 蛋白质是生物体内一类重要的生物大分子&#xff0c;其结构复杂多样&#xff0c;蛋白质的结构对于理解其功能和参与的生物学过程具有重要意义。从生物学角度上看&#xff0c;蛋白质的结构可以分为四个层次&#xff1a;初级结构、二级结构、三级结构和四级结构。 初级结…

企业如何保障跨境金融业务中的数据安全传输?

随着全球化的不断深入&#xff0c;跨境金融业务日益频繁&#xff0c;然而在这些业务中&#xff0c;数据的安全传输一直是企业面临的重大挑战。跨境业务数据传输可能会遇到多种困难&#xff0c;如网络攻击、数据泄露、通信故障等。因此&#xff0c;企业需要采取有效的措施来确保…

【Mybatis系列】Mybatis之TypeHandler入门

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【C语言】深入理解数据类型转换与运算

文章目录 1.数据类型转换在分析源程序之前&#xff0c;我们需要了解几个基本概念&#xff1a;现在来分析源程序中的变量及其对应的十进制真值以及扩展操作方式&#xff1a; 1.1. short si -32768;1.2. unsigned short usi si;1.3. int i si;1.4. unsigned ui usi; 2&#x…

U-Net及其变体在医学图像分割中的应用研究综述

U-Net及其变体在医学图像分割中的应用研究综述 论文来自&#xff1a;中国生物医学工程学报 2022 摘 要&#xff1a; 医学图像分割可以为临床诊疗和病理学研究提供可靠的依据&#xff0c;并能辅助医生对病人的病情做出准确的判断。 基于深度学习的分割网络的出现解决了传统自动分…

Git——Git应用入门

将会介绍以下知识&#xff1a; 搭建Git环境和创建Git版本库&#xff08;init、clone&#xff09;。文件添加、状态检查、创建注释和查看历史记录。与其他Git版本库交互&#xff08;pull、push&#xff09;。解决合并冲突。创建分支列表、列表切换和合并。创建标签。 1、版本控…

sqli-labs靶场详解(less17-less22)

目录 less-17 less-18 less-19 less-20 less-21 less-22 less-17 修改密码关卡 服务器后端 账号密码都存在数据库中 使用UPDATE进行修改密码 尝试username处 尝试好久尝试不出来应该是对用户名进行了过滤 于是对password进行注入 判断注入点 passwdadmin 报错&#xff1a…

vue3中的customRef创建一个自定义的 ref对象

customRef 创建一个自定义的 ref&#xff0c;并对其依赖项跟踪和更新触发进行显式控制 小案例: 自定义 ref 实现 debounce <template><div style"font-size: 14px;"><input v-model"text" placeholder"搜索关键字"/><…

智能优化算法应用:基于郊狼算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于郊狼算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于郊狼算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.郊狼算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…