Skip to content

后端接入

后端接入通常用来验证签名是否合法,通过前端接入最终会得到一个 token 如果想验证真伪这需要后端来做。

前言

在接入之前你需要获取个人密钥,此密钥用于验证签名。

获取个人密钥:立刻享用小程序 - 我的 - 个人信息 - 个人密钥 - 复制

个人密钥

验证签名

签名算法采用 HMAC-SHA-256 它可以在不暴露密钥的情况下验证数据是否合法。


通过 前端接入 最终我们可以得到 timestampticketstatetokenresourceId 五个变量。

例如:

text
// 这个是个人密钥(绝对不要泄漏)
secret=28d78ccfb25622b4d703c71b
// 通过 ticket 得到的 token
token=615051c4b81795efa5a406e4172df5835ea1f6b8387ef518cec3b8b2af2e578c

timestamp=1716622123
ticket=1FP4e7LIaI
state=
resourceId=2

拼接在一起得到:
str = resourceId=2&state=&ticket=1FP4e7LIaI&timestamp=1716622123

hex=HMAC_SHA_256(secret).hex(str)

正确情况下 hex 的值是: 615051c4b81795efa5a406e4172df5835ea1f6b8387ef518cec3b8b2af2e578c

hex 与 token 一致时说明用户真的获取成功了,如果一致说明数据被篡改,用户没有真正的获取资源。

语言实现

Java

pom.xml

xml

<dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.15</version>
</dependency>
java
import org.apache.commons.codec.digest.HmacAlgorithms;
import org.apache.commons.codec.digest.HmacUtils;

public class HmacUtilsTest {
    public static void main(String[] args) {
        final String secret = "28d78ccfb25622b4d703c71b";
        final String timestamp = "1716622123";
        final String ticket = "1FP4e7LIaI";
        final String state = "";
        final String resourceId = "2";

        final String hex = new HmacUtils(HmacAlgorithms.HMAC_SHA_256, secret)
                .hmacHex(String.format("resourceId=%s&state=%s&ticket=%s&timestamp=%s", resourceId, state, ticket, timestamp));

        System.out.println(hex);
    }
}

Golang

go
package main

import (
	"crypto/hmac"
	"crypto/sha256"
	"encoding/hex"
)

func main() {
	secret := "28d78ccfb25622b4d703c71b"
	timestamp := "1716622123"
	ticket := "1FP4e7LIaI"
	state := ""
	resourceId := "2"

	h := hmac.New(sha256.New, []byte(secret))
	h.Write([]byte("resourceId=" + resourceId + "&state=" + state + "&ticket=" + ticket + "&timestamp=" + timestamp))

	println(hex.EncodeToString(h.Sum(nil)))
}