uniapp+nodejs实现小程序支付

1.准备商户号、企业级小程序(或者个体工商户级别的)

2.在小程序端调用uni.login获取code,传递给后端

uni.login({success: loginRes => {uni.request({url: "http://127.0.0.1:3003/wxpay/pay",data: {code: loginRes.code},method: "get",success: res => {},fail: err => {}})}})

3.在nodejs端,

let express = require("express");
let router = express.Router();
const WxPay = require('wechatpay-node-v3');
const fs = require('fs');
let api = require("../api/index");
var path = require('path');
let weixinData = require('../utils/weixinData');
const qs = require('querystring')//根据code查找openid
function getOpenid(code){return new Promise((resolve, reject) => {let appid = weixinData.Appidlet secret = weixinData.AppSecretlet params = {appid,secret,js_code:code}let formData = qs.stringify(params)let openIdUrl = "https://api.weixin.qq.com/sns/jscode2session?" + formData + "&grant_type=authorization_code"api.get(openIdUrl).then( res => {resolve(res.data.openid)})})
}// 创建支付实例
const pay = new WxPay({appid: 'wx9fc72986dc9287b6',mchid: '1674432158',publicKey: fs.readFileSync(path.resolve(__dirname, 'apiclient_cert.pem')), // 公钥privateKey: fs.readFileSync(path.resolve(__dirname, 'apiclient_key.pem')), // 秘钥key: 'zlc010903zlc010903zlc010903wcpwc'
});// 订单号生成函数
function randomNumber() {const now = new Date()let month = now.getMonth() + 1let day = now.getDate()let hour = now.getHours()let minutes = now.getMinutes()let seconds = now.getSeconds()month = month < 10 ? "0" + month : month;day = day < 10 ? "0" + day : day;hour = hour < 10 ? "0" + hour : hour;minutes = minutes < 10 ? "0" + minutes : minutes;seconds = seconds < 10 ? "0" + seconds : seconds;let orderCode = now.getFullYear().toString() + month.toString() + day + hour + minutes + seconds + (Math.round(Math.random() * 1000000)).toString();return orderCode;
}let notify = async (req, res) => {// 申请的APIv3let key = 'zlc010903zlc010903zlc010903wcpwc';let { ciphertext, associated_data, nonce } = req.body.resource;// 解密回调信息const result = pay.decipher_gcm(ciphertext, associated_data, nonce, key);// 拿到订单号let { out_trade_no } = result;if (result.trade_state == 'SUCCESS') {// 支付成功之后需要进行的业务逻辑console.log('支付成功')}
}// 拿到支付所需参数
let payInfo = (req, res) => {let { code } = req.query//获取openidgetOpenid(code).then(async resolve => {const params = {mchid: '1674432158',description: '支付测试', // 订单描述out_trade_no: randomNumber(), // 订单号,一般每次发起支付都要不一样,可使用随机数生成notify_url: 'http://127.0.0.1:3003/wxpay/notify_url',amount: {total: 1, // 支付金额,单位为分currency: 'CNY'},payer: {openid: resolve, // 微信小程序用户的openid,一般需要前端发送过来},scene_info: {payer_client_ip: 'ip', // 支付者ip,这个不用理会也没有问题},};const result = await pay.transactions_jsapi(params);// 将结果响应给微信小程序前端res.send(result);})}// 回调路由
router.post('/notify_url', notify)
router.get('/pay', payInfo);
module.exports = router

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RedHat9 | kickstart无人值守批量安装

一、知识补充 kickstart Kickstart是一种用于Linux系统安装的自动化工具&#xff0c;它通过一个名为ks.cfg的配置文件来定义Linux安装过程中的各种参数和设置。 kickstart的工作原理 Kickstart的工作原理是通过记录典型的安装过程中所需人工干预填写的各种参数&#xff0c;…

漏洞分析 | PHP CGI Windows平台远程代码执行漏洞(CVE-2024-4577)

漏洞概述 PHP CGI&#xff08;Common Gateway Interface&#xff09;是在Windows平台上运行PHP的一种方式。CGI是一种标准接口&#xff0c;允许Web服务器与外部应用程序&#xff08;如PHP脚本&#xff09;进行交互&#xff0c;从而生成动态网页内容。 近期&#xff0c;PHP发布…

Request safe_get 小工具

接口安全获取请求参数小工具&#xff08; python&#xff09; flask import logging import traceback from flask import (Blueprint, request, Response, jsonify, g, send_file)def safe_get(req: request, attr: str, defaultNone):try:if attr in req.form:return req.f…

拍摄泡咖啡的剧本!

泡咖啡的过程可以是一种放松和享受的仪式&#xff0c;同时也是一个记录生活美好瞬间的好机会。以下是一些步骤和提示&#xff0c;帮助您记录泡咖啡的过程&#xff1a; 1. **准备材料**&#xff1a; 确保您有新鲜的咖啡豆、磨豆机、咖啡壶、滤纸、热水和杯子。 2. **选择音乐**&…

Logstash安装插件失败的问题

Logstash安装插件失败的问题 安装 logstash-output-jdbc 失败 报错为&#xff1a; Unable to download data from https://rubygems.org - Net::OpenTimeout: Failed to open TCP connection to rubygems.org:443 (execution expired) (https://rubygems.org/latest_specs.4.…

【算法 - 哈希表】两数之和

这里写自定义目录标题 两数之和题目解析思路解法一 &#xff1a;暴力枚举 依次遍历解法二 &#xff1a;使用哈希表来做优化 核心逻辑为什么之前的暴力枚举策略不太好用了&#xff1f;所以&#xff0c;这就是 这道题选择 固定一个数&#xff0c;再与其前面的数逐一对比完后&…

Linux系统(CentOS)安装iptables防火墙

1&#xff0c;先检查是否安装了iptables 检查安装文件-执行命令&#xff1a;rpm -qa|grep iptables 检查安装文件-执行命令&#xff1a;service iptables status 2&#xff0c;如果安装了就卸装(iptables-1.4.21-35.el7.x86_64 是上面命令查出来的版本) 执行命令&#xff1a…

蓝牙信标和蓝牙标签我们如何区分,区分方法有哪些?

蓝牙信标和蓝牙标签其实是两种不同的技术&#xff0c;很多人可能会把蓝牙信标和蓝牙标签搞混&#xff0c;因为区分不开来&#xff0c;但实际上&#xff0c;区分这两种技术也很简单&#xff0c;因为它们各自都有不一样的特性&#xff0c;通过这些特性&#xff0c;我们也能正常区…

相机光学(二十四)——CRA角度

CRA角度 0.参考资料1.什么是CRA角度2.为什么 CRA 会导致luma shading3.为什么 CRA 会导致color shading4.CRA相差过大的具体表现5.CRA Matching6.怎样选择sensor的CRA 0.参考资料 1.芯片CRA角度与镜头的匹配关系&#xff08;一&#xff09;   2.芯片CRA角度与镜头选型的匹配关…

爬虫进阶:Selenium与Ajax的无缝集成

爬虫与Ajax的挑战 Ajax&#xff08;Asynchronous JavaScript and XML&#xff09;允许网页在不重新加载整个页面的情况下与服务器交换数据并更新部分内容。这为用户带来了更好的体验&#xff0c;但同时也使得爬虫在抓取数据时面临以下挑战&#xff1a; 动态内容加载&#xff…

go语言 函数和包

go语言 函数和包 一、函数 在Go语言中&#xff0c;函数是执行特定任务的自包含代码块。 1.函数的定义 函数通过func关键字定义&#xff0c;格式如下&#xff1a; func 函数名(形参 形参类型, 形参 形参类型) 返回值类型 {函数体return 返回值 }2.基础函数类型 无参数无返回…

vue中数组出现__ob__: Observer属性,导致不能正确使用问题解决

直接上图&#xff0c;如下图&#xff0c;数组中出现__ob__: Observer属性&#xff0c;导致无法取值。 解决方案为&#xff1a;JSON.parse(JSON.stringify(数组变量名))深拷贝数组&#xff0c;重新生成一个可枚举数组。 // 处理代码如let tempIds JSON.parse(JSON.stringify(i…

一文带你初探FreeRTOS信号量

本文记录我初步学习FreeRTOS的信号量的知识&#xff0c;在此记录分享&#xff0c;希望我的分享对你有所帮助&#xff01; 什么是信号量 在FreeRTOS中&#xff0c;信号量&#xff08;Semaphore&#xff09;是一种用于任务间同步和资源共享的机制。信号量主要用于管理对共享资源的…

Cgi上传文件 注意事项

//核心代码 ofstream outfile("/opt/software/" file.getFilename(), ios::out | ios::binary); outfile << file.getData(); //错误方式&#xff1a;outfile << file.getData() <<endl; outfile.close(); 参考博客&#xff1a; https://blog.cs…

GNU/Linux - 各种包管理器介绍

Linux 包管理器根据不同的发行版和包管理系统有所不同。以下是一些常见的 Linux 包管理器&#xff1a; 1. RPM (Red Hat Package Manager) * 用于&#xff1a; Red Hat Enterprise Linux (RHEL), Fedora, CentOS, openSUSE * 包管理器&#xff1a; rpm, yum, dnf 2. DEB (Deb…

HTML如何在图片上添加文字

HTML如何在图片上添加文字 当我们开发一个页面&#xff0c;插入图片时&#xff0c;需要有一组文字对图片进行描述。那么HTML中如何在图片上添加文字呢&#xff1f;这篇文章告诉你。 先让我们来看下效果图&#xff1a; 句子“这是一张夜空图片”被放置在了图片的左下角。 那么…

Leetcode.342 4的幂

给定一个整数&#xff0c;写一个函数来判断它是否是 4 的幂次方。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 整数 n 是 4 的幂次方需满足&#xff1a;存在整数 x 使得 n 4x 示例 1&#xff1a; 输入&#xff1a;n 16 输出&#xff1a;true示…

微信小程序的智慧物流平台-计算机毕业设计源码49796

目 录 摘要 1 绪论 1.1 研究背景 1.2 研究意义 1.3研究方法 1.4开发技术 1.4.1 微信开发者工具 1.4.2 Node.JS框架 1.4.3 MySQL数据库 1.5论文结构与章节安排 2系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 用户登录流程 2.2.2 数据删除流程 2.3 系统功能分…

C#面:ASP.NET Core Filter如何⽀持依赖注⼊?

ASP.NET Core Filter可以通过依赖注入来支持。在ASP.NET Core中&#xff0c;依赖注入是一种将依赖对象提供给类的机制&#xff0c;它可以帮助我们解耦和测试代码。 要在ASP.NET Core Filter中使用依赖注入&#xff0c;可以按照以下步骤进行操作&#xff1a; 首先&#xff0c;…

ESP32CAM物联网教学09

ESP32CAM物联网教学09 摄像头配上显示屏 小智给摄像头配上了一块液晶显示屏,ESP32Cam变得更加酷炫了,应用也更加广泛了。 TFT彩色显示屏从第一课的CameraWebServer开始,我们一直都是利用浏览器来查看显示摄像头的视频流,都需要借助这个网页提供的服务。 可以让ESP32Cam开…