- 不知道抖音小程序怎么想的,好好的担保支付系统又要改为通用支付系统,上个月刚开放好的小程序支付又马上不能用了,需要换成通用支付。
- 不过有一说一,抖音小程序确实不如微信小程序,本文记录下如何实现抖音小程序通用交易支付的。
一、开通通用交易系统
官方文档
也就是把以下能力开通
参考步骤一和步骤二
几分钟就审核通过了,理由随便填写
下图开发这里出现解决方案配置也就是可以了,在右边添加下你的方案。
记得网站后加上/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)
}
});
},