This Go implementation shows how to parse a passphrase-protected RSA private key, generate a SHA1 hash of the request body, sign it using PKCS#1 v1.5, and send the request to the AliKassa API.
package main
import (
"bytes"
"crypto"
"crypto/rand"
"crypto/rsa"
"crypto/sha1"
"crypto/tls"
"encoding/base64"
"encoding/json"
"fmt"
"io"
"net/http"
"os"
"time"
"golang.org/x/crypto/ssh"
)
func requestRate(method, account string, data any) (map[string]any, error) {
body, err := json.Marshal(data)
if err != nil { return nil, err }
pemBytes, err := os.ReadFile("cert/payout/private.pem")
if err != nil { return nil, fmt.Errorf("Error cert.") }
passBytes, err := os.ReadFile("cert/payout/password.txt")
if err != nil { return nil, fmt.Errorf("Error cert.") }
pass := bytes.TrimSpace(passBytes)
rawKey, err := ssh.ParseRawPrivateKeyWithPassphrase(pemBytes, pass)
if err != nil { return nil, fmt.Errorf("Error cert.") }
key, ok := rawKey.(*rsa.PrivateKey)
if !ok { return nil, fmt.Errorf("Error cert.") }
sum := sha1.Sum(body)
sig, err := rsa.SignPKCS1v15(rand.Reader, key, crypto.SHA1, sum[:])
if err != nil { return nil, err }
sign := base64.StdEncoding.EncodeToString(sig)
client := &http.Client{
Timeout: 30 * time.Second,
Transport: &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
},
}
req, err := http.NewRequest(http.MethodPost, "https://api-merchant.alikassa.io/"+method, bytes.NewReader(body))
if err != nil { return nil, err }
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Account", account)
req.Header.Set("Sign", sign)
req.Header.Set("User-Agent", "AliKassa2.0 API")
resp, err := client.Do(req)
if err != nil { return nil, err }
defer resp.Body.Close()
b, err := io.ReadAll(resp.Body)
if err != nil { return nil, err }
if len(b) == 0 { return nil, nil }
var out map[string]any
if err := json.Unmarshal(b, &out); err != nil { return nil, err }
return out, nil
}
func main() {
rate, err := requestRate("v1/account/rate", "93d5df06-996c-48c3-9847-348d6b580b80", []any{})
if err != nil { panic(err) }
fmt.Println(rate)
}