抖音小程序支付(通用交易系统)

  • 不知道抖音小程序怎么想的,好好的担保支付系统又要改为通用支付系统,上个月刚开放好的小程序支付又马上不能用了,需要换成通用支付。
  • 不过有一说一,抖音小程序确实不如微信小程序,本文记录下如何实现抖音小程序通用交易支付的。

这里是之前的小程序担保支付链接

要求更改公告

开发文档链接

一、开通通用交易系统

官方文档
也就是把以下能力开通

参考步骤一和步骤二

在这里插入图片描述
几分钟就审核通过了,理由随便填写
下图开发这里出现解决方案配置也就是可以了,在右边添加下你的方案。

在这里插入图片描述
记得网站后加上/path

在这里插入图片描述

二、交易下单

官方文档链接

1、参数说明
tt.requestOrder(options);//这个代码块

需要的参数如下,主要就data和byteAuthorization,注意这两个都是string,也就是data要转一下
在这里插入图片描述

2、变量

data的变量必填的有四个,本文也只填了这四个,第二个和第三个随便填写喽,不过外部订单不能重复貌似。

在这里插入图片描述

3、skuList和orderEntrySchema

最主要的就是前一个
skuList
在这里插入图片描述
在这里插入图片描述
在此直接给出我的

var SkuList = [{
		skuId: '001',
		price: 10,
		quantity: 1,
		title: '测试',
		imageList: [
			'https://p3-developGJ8%3D'//图片链接
		],
		type: 301,
		tagGroupId: 'tag_group_7272625659888058380'//参照文档里
	}]

orderEntrySchema

orderEntrySchema: {
			path: 'pages/first/first'
		}

总的data

var data_ce = {
		skuList: SkuList,
		outOrderNo: 'ceshi002',
		totalAmount: 10,
		orderEntrySchema: {
			path: 'pages/first/first'
		}
	}
4、byteAuthorization签名

这一部分是最费力的,本来小程序开发就是为那些入门级玩家玩的,结果现在一个签名涉及一大堆东西,有点难搞

在这里插入图片描述
首先就是生成公钥和私钥。
按照官方提供的代码,
1、首先下载安装openssl

安装教程参考这个部分

最后把代码复制过去,不用复制注释,注意看保存地址,按回车后的那个就会出现地址,在那里会有两个文件
在这里插入图片描述
在这里插入图片描述
把public打开,右键记事本或者其他软件都能打开

2、设置公钥

把他复制到这里
在这里插入图片描述
3、获取签名
我是用的云函数,本人就是一个只会前端的小白,对于后端什么不懂,所以用云开发实现。
注意,这里填写的是私钥!!,也就是上图另外一个文件
需要改的是你的appid和私钥,以及订单数据

  • 注意,需要在云函数安装node-forge,右键控制台npm stall node-forge
'use strict';
const forge = require('node-forge');
const crypto = require('crypto');
exports.main = async (event, context) => {
	//event为客户端上传的参数
	console.log('event : ', event)
	const forge = require('node-forge');
	const crypto = require('crypto');
	var SkuList = [{
		skuId: '001',
		price: 10,
		quantity: 1,
		title: '测试',
		imageList: [
			'https://p3-developer-sign.bytemaimg.com/tos-cn-i-ke512zj2cu/0356d9745f634f8d8e3026bb4b8aafef~tplv-ke512zj2cu-144x144.jpeg?x-expires=2648356927&x-signature=OWzOrhl%2BKoKYBofGiMpwxBNjGJ8%3D'
		],
		type: 301,
		tagGroupId: 'tag_group_7272625659888058380'
	}]
	var data_ce = {
		skuList: SkuList,
		outOrderNo: 'ceshi002',
		totalAmount: 10,
		orderEntrySchema: {
			path: 'pages/first/first'
		}
	}
	// console.log(JSON.stringify(data))
	function getByteAuthorization(privateKeyStr, data, appId, nonceStr, timestamp, keyVersion) {
		return new Promise((resolve, reject) => {
			const key = forge.util.decode64(privateKeyStr.replace(/\n/g, ''));
			const privateKey = forge.pki.privateKeyFromAsn1(forge.asn1.fromDer(key));

			// Generate signature
			const targetStr = `POST\n/requestOrder\n${timestamp}\n${nonceStr}\n${data}\n`;
			const md = forge.md.sha256.create();
			md.update(targetStr, 'utf8');
			const digest = md.digest();
			const signBytes = privateKey.sign(md);
			const signature = forge.util.encode64(signBytes);

			// Construct byteAuthorization
			const byteAuthorization =
				`SHA256-RSA2048 appid=${appId},nonce_str=${nonceStr},timestamp=${timestamp},key_version=${keyVersion},signature=${signature}`;
			resolve(byteAuthorization);
		});
	}
	const yes = '12';
	const b = '';
	// Call the function
	const privateKeyStr =
		"GAHUgS4hybYTiT9qvZDQ88uzbx9NeQRSE/87Ul/PkXHSdM+E/MI1M0PfyLksB3z2n47qG0QovppL8Pb1wK6KsTq7Fe3nSuC4TSQQw7lmFU8+OO8ZE/nQLpHP/Crw=="//你的私钥,会很长

	const data = JSON.stringify(data_ce)
	const appId = "te01";//你的appid
	const nonceStr = randStr(10);
	const timestamp = Math.floor(Date.now() / 1000).toString();
	const keyVersion = "1";

	getByteAuthorization(privateKeyStr, data, appId, nonceStr, timestamp, keyVersion)
		.then(byteAuthorization => {
			console.log("getByteAuthorization res:", byteAuthorization);
			const yes = byteAuthorization
		})
		.catch(err => {
			console.error("getByteAuthorization err:", err);
			b = err
		});
	const res = getByteAuthorization(privateKeyStr, data, appId, nonceStr, timestamp, keyVersion)

	function randStr(length) {
		const characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
		let result = "";
		for (let i = 0; i < length; i++) {
			result += characters.charAt(Math.floor(Math.random() * characters.length));
		}
		return result;
	}
	//返回数据给客户端
	return res
};

最后返回的res即签名

三、发起支付

官方文档
获取了res,这里就很简单了

tt.requestOrder({
		data: JSON.stringify(data),//最好也用云端返回的,也就是云端的那个data
		byteAuthorization: e,//刚返回的res
		success(res) {
			console.log(res)
			tt.getOrderPayment({//获取orderId订单号后发起支付
				orderId: res.orderId,
				success(res) {
					console.log('YES')
				},
				fail(err) {
					console.log(err)
				}
			});

					},
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 13
    评论
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

未来一定会来的

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值