# 2.1.2 接口签名示例(Authorization)

java代码示例

# 依赖

    <dependency>
         <groupId>org.bouncycastle</groupId>
         <artifactId>bcprov-jdk15on</artifactId>
         <version>1.52</version> <!-- 高版本也是可以的 -->
    </dependency>

<!-- json 序列化 jackson 其他也可以 注意序列化的字段要是字符序 a->z -->

# 代码示例

package example;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.MapperFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Data;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.Security;
import java.util.Base64;

/**
 * TokenGeneratorDemo
 *
 * @author Leon.Dong
 * @since 2024/9/10 上午9:36
 */
public class TokenGeneratorDemo {

    static {
        Security.addProvider(new BouncyCastleProvider());
    }

    public static final String CIPHER = "AES";
    private static final String CIPHER_INSTANCE = "AES/ECB/";
    private static final String PADING_TYPE = "PKCS5Padding";
    private static final String ENCODING = "utf-8";

    public static String encrypt(String text, String rule, String padingType) {

        try {
            Cipher cipher = Cipher.getInstance(CIPHER_INSTANCE + padingType);
            SecretKeySpec key = new SecretKeySpec(rule.getBytes(ENCODING), CIPHER);
            cipher.init(Cipher.ENCRYPT_MODE, key);
            return Base64.getEncoder().encodeToString(cipher.doFinal(text.getBytes(ENCODING)));
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public static void main(String[] args) throws JsonProcessingException {

        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        objectMapper.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);
        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);


        //商户编码和密钥
        String merchantCode = "请联系平台获取";
        String secretKey = "请联系平台获取";

        Token token = new Token();
        token.setMerchantCode(merchantCode);
        token.setTimestamp(System.currentTimeMillis());


        String encryption = TokenGeneratorDemo.encrypt(objectMapper.writeValueAsString(token), secretKey, PADING_TYPE);
        token.setNonceStr(encryption);
        String sign = Base64.getEncoder().encodeToString(objectMapper.writeValueAsString(token).getBytes(StandardCharsets.UTF_8));
        System.out.println(sign);
    }


    @Data
    @JsonPropertyOrder(alphabetic = true)//按字母序 序列化
    public static class Token {
        @JsonProperty("merchant_code")
        private String merchantCode;

        private Long timestamp;

        @JsonProperty("nonce_str")
        private String nonceStr;

    }

}

Last Updated: 2/27/2026, 10:27:52 AM