uniapp+unicloud(微信商家转账到零钱功能+v3签名)

news2024/11/27 5:33:08

企业版

首先需要在微信商户里面设置好 v3密钥,弄好证书,网上有很多这边不做详细讲解了,可以自行查询。

v3签名

直接贴出我的全部代码

unicloud

money 的index.js

cert是在money下面的文件夹

'use strict';
const db = uniCloud.database()


// 云函数入口文件
// 读取证书
const appid = "xxxxxx"//你的appid 
let mchid = 'xxxxxx' //你的微信商户号
// 支付密钥
// 证书序列号
let num = 'xxxxxxxxxxxxxxxx'

const fs = require('fs') // 文件读取模块
const path = require('path'); // 引入内置的path模块
const crypto = require('crypto');
exports.main = async (event, context) => {
	event.out_batch_no = `plfk${Math.floor(Date.now() / 1000)}`
	event.total_amount = parseFloat(event.total_amount)
	event.transfer_detail_list[0].transfer_amount = event.total_amount


	// 读取证书
	const cert = fs.readFileSync(path.resolve(__dirname, 'cert/apiclient_cert.pem'))
	const prikey = fs.readFileSync(path.resolve(__dirname, 'cert/apiclient_key.pem'))


	let chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678';
	let maxPos = chars.length;
	let character = '';
	for (let i = 0; i < 32; i++) {
		character += chars.charAt(Math.floor(Math.random() * maxPos))
	}

	// 获取签名

	const timestamp = Math.floor(Date.now() / 1000);
	const nonceStr = character; // 替换成随机字符串
	const method = 'POST'; // 请求方法
	const path2 = '/v3/transfer/batches'; // 请求路径
	const body = JSON.stringify(event); // 请求体数据,如果有的话
	const serialNo = num; // 商户证书序列号

	// 构建待签名字符串
	const message = `${method}\n${path2}\n${timestamp}\n${nonceStr}\n${body}\n`;

	// 使用商户私钥进行签名
	const sign = crypto
		.createSign('sha256')
		.update(message)
		.sign(prikey, 'base64');

	// 创建 Authorization 头部
	const authorization =
		`WECHATPAY2-SHA256-RSA2048 mchid="${mchid}",serial_no="${serialNo}",nonce_str="${nonceStr}",timestamp="${timestamp}",signature="${sign}"`;



	const headers = {
		'Accept': 'application/json',
		'Content-Type': 'application/json',
		'user-agent': encodeURIComponent('私厨到家啦/1.0.0'),
		'Wechatpay-Serial': num,
		"Authorization": authorization
	};

	let data = {
		cert_sn: cert,
		mch_id: mchid,
		api_key: 'xxxxxxxxxxxxx'// v3密钥
	};
	const res = await uniCloud.httpclient.request('https://api.mch.weixin.qq.com/v3/transfer/batches', {
		method: 'POST',
		data: JSON.stringify(event),
		rejectUnauthorized: false,
		body: JSON.stringify(event),
		headers: headers,
		contentType: 'json', // 指定以 application/json 发送 data 内的数据
		dataType: 'json', // 指定返回值为 json 格式,自动进行 parse
		timeout: 30 * 1000
	})
	return res
};

前端代码

    let param = {
        appid: appid,
        out_batch_no: partner_trade_no, //商家批次单号
        batch_name: time + "厨师提现",
        batch_remark: time + "厨师提现",
        total_amount: Number(this.moneyVal) * 100, // 转账金额
        total_num: 1,
        transfer_scene_id: "1001",
        transfer_detail_list: [
          {
            out_detail_no: nonce_str,
            transfer_amount: Number(this.moneyVal) * 100, // 转账金额
            transfer_remark: time + "厨师提现",
            openid: "o8Pt3649dwh9r9U3eOrjcjPCIYtQ",
          },
        ],
      };
      // 接口我自己做了封装
      let RES = await this.$common.GetUniCloud("money", param);
      console.log(RES, "json======");

到这边的话,提现功能就成功了!!

注意提现最低是0.03

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

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

相关文章

sqlserver已经启动了允许远程连接,但局域网内无法访问

sqlserver已经启动了允许远程连接&#xff0c;但局域网内无法访问。 可以确认一下sqlserver browser是不是没有启动。 修改启动模式为自动试一试。

Spatial Data Analysis(四):空间自相关示例

Spatial Data Analysis&#xff08;四&#xff09;&#xff1a;空间自相关示例 空间自相关是地理信息科学&#xff08;GIS&#xff09;和空间统计学中的重要概念之一&#xff0c;用于研究地理空间上的数据变异性和相关性。空间自相关分析的目标是探讨地理空间中的现象是否呈现…

[linux] 用命令行wget下载google drive的大文件

使用wget命令下载Google drive上的文件_ubuntu上wget下载谷歌云盘文件-CSDN博客 如何用命令行下载Google Drive上的共享文件&#xff1f;-腾讯云开发者社区-腾讯云 举例&#xff1a;https://drive.google.com/drive/folders/1vKj3VvJEKgS_o-uOSmz3I0-GomECpql3 1、在网页上&…

定义一个学生类,其中有3个私有数据成员学号、姓名、成绩,以及若于成员。 函数实现对学生数据的赋值和输出。

#include <stdio.h> // 定义学生类 typedef struct Student { int stuNum; // 学号 char name[20]; // 姓名&#xff0c;假设最长为20个字符 float score; // 成绩 } Student; // 初始化学生信息 void initializeStudent(Student *student, int num, const…

C语言——从终端输入三个正实数,判断这三个数能否构成直角三角形。

代码实现&#xff1a; #include <stdio.h> #include <math.h>int main() {float a, b, c;printf("输入三个正实数:\n");scanf("%f%f%f", &a, &b, &c);if (a b > c && a c > b && b c > a){if (a * …

股市复苏中的明懿金汇:抓住新机遇

2023年对于明懿金汇来说是充满挑战与机遇的一年。面对复杂多变的市场环境&#xff0c;明懿金汇展现了其对市场趋势的敏锐洞察和卓越的策略适应能力。以下是该公司在2023年的主要投资策略和市场适应方式的详细分析。 随着2023年中国股市迎来反弹&#xff0c;明懿金汇迅速调整了…

【Unity动画】Sprite 2D精灵创建编辑到动画

如何切图&#xff08;sprite editor&#xff09; 有时候一张图可能包含了很多张子图&#xff0c;就需要在Unity 临时处理一下&#xff0c;切开&#xff0c;比如动画序列帧图集 虽然我们可以在PS里面逐个切成一样的尺寸导出多张&#xff0c;再放回Unity&#xff0c;但是不需要这…

mockito加junit实现单元测试笔记

目录 一、简介1.1 单元测试的特点1.2 mock类框架使用场景1.3 常用mock类框架1.3.1 mockito1.3.2 easymock1.3.3 powermock1.3.4 JMockit 二、mockito的单独使用2.1 mock对象与spy对象2.2 初始化mock/spy对象的方式初始化mock/spy对象第1种方式初始化mock/spy对象第2种方式初始化…

排序算法介绍(三)选择排序

0. 简介 选择排序&#xff08;Selection Sort&#xff09;是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;直到全部待排序的数据元素排完。选择排序是不稳…

Java:CAS(乐观锁)

目录 1. 什么是CAS机制 2. CAS的缺点 synchronized是悲观锁&#xff0c;这种线程一旦得到锁&#xff0c;其他需要锁的线程就挂起的情况就是悲观锁。CAS操作的就是乐观锁&#xff0c;每次不加锁而是假设没有冲突而去完成某项操作&#xff0c;如果因为冲突失败就重试&#xff0…

Linux中的日志管理

本章主要介绍Linux中的日志管理 了解rsyslog是如何管理日志的查看日志的方法 日志中记录了各种各样的问题&#xff0c;所以读取日志是检测并排除故障的一个重要方式&#xff0c;日志文件默认放在/var/log目录下。不同的问题要读取不同的日志&#xff0c;例如&#xff0c;邮件…

Python 在控制台打印带颜色的信息

#格式&#xff1a;  设置颜色开始 &#xff1a;\033[显示方式;前景色;背景色m #说明&#xff1a; 前景色 背景色 颜色 --------------------------------------- 30 40 黑色 31 41 红色 32 …

Java 对接智谱 AI(官方 sdk 是真垃圾)

官方 sdk 狗屎。 一堆密钥不知道啥玩意&#xff0c;文档也没写好。 python 版本的就不清楚&#xff0c;应该支持会比较好&#xff0c;果然做 ai 应用后端开发还是得使用 python 比较好。 那么要如何对接智谱 AI 呢&#xff1f;用小博哥的这个版本&#xff0c;虽然不是官方的…

UVM验证平台中加入sequencer

sequence机制用于产生激励&#xff0c;它是UVM中最重要的机制之一。在 一个规范化的UVM验证平台中&#xff0c;driver只负责驱动transaction&#xff0c;而不负责产生transaction。sequence机制有两大组成部分&#xff0c;一是 sequence&#xff0c;二是sequencer。如何在验证平…

安防监控系统镜头选型分析,低噪声,低振动,多通道

安防镜头步进驱动选用型号 GC6107 C6109 GC6209 GC6119 GC6129 GC6139 GC6208 GC6150 GC6151 GC6152 GC6125 GC6236采用5V的镜头驱动 。其中GC6107 C6109 GC6209 GC6119 GC6129 GC6139 GC6208关键特性两通道&#xff0c;256细分&#xff0c;低噪&#xff0c;内部和外部时钟…

React 中虚拟DOM是什么,为什么需要它?

注意&#xff1a;本节主要讲React中的虚拟DOM&#xff0c;但是虚拟DOM并不是React中特有的内容。 1. React 中虚拟 DOM是什么&#xff1f; 虚拟DOM是对真实DOM的描述&#xff0c;虚拟DOM是JS对象&#xff0c;实际上就是 JSX 通过 babel 转换成 React.createElement()&#xff…

浴霸市场研究:2023年市场现状及未来发展

据不完全统计&#xff0c;目前我国浴霸行业拥有品牌数量超过250个&#xff0c;市场竞争激烈&#xff0c;主要代表企业有奥普、美的、松桥、松下、澳柯玛、光芒、桑普、来斯奥、飞雕、万家乐等。从未来发展趋势来看&#xff0c;伴随着市场消费升级以及市场需求多元化发展&#x…

道可云专业文旅元宇宙平台整体解决方案,打造沉浸体验新场景

值得注意的是&#xff0c;随着“互联网”时代的到来&#xff0c;元宇宙技术正逐渐成为未来数字经济核心之一。《“十四五”数字经济发展规划》将互联网新基建、数字产业生态系统、数字文娱与数字创新产业视为重点发展领域&#xff0c;其中元宇宙技术在文旅等旅游发挥了不可替代…

【linux系统编程】编辑器gcc/g++

目录 Linux下的编辑器 介绍&#xff1a; 1&#xff0c;编辑器gcc/g 1-1&#xff0c;系统的编译过程 1-2&#xff0c;预处理过程 1-3&#xff0c;编译过程 1-4&#xff0c;汇编过程 1-5&#xff0c;链接过程 Linux下的编辑器 介绍&#xff1a; Linux系统下可支持很多高…

性能优化三步骤(一)——性能分析

从公众号转载&#xff0c;关注微信公众号掌握更多技术动态 --------------------------------------------------------------- 一、性能分析简介 在完成性能测试之后&#xff0c;需要输出一份性能测试报告&#xff0c;分析系统性能测试的情况。其中测试结果需要包含测试接口的…