Heim  >  Artikel  >  Backend-Entwicklung  >  So implementieren Sie Golang zur Implementierung der Alipay-Schnittstelle einer Webanwendung

So implementieren Sie Golang zur Implementierung der Alipay-Schnittstelle einer Webanwendung

WBOY
WBOYOriginal
2023-06-24 13:15:101309Durchsuche

Mit der Popularisierung des mobilen Internets, der Popularität von Online-Shopping und mobilem Bezahlen ist Alipay immer mehr zu einem unverzichtbaren Bestandteil des Lebens der Menschen geworden, und die Benutzeroberfläche von Alipay ist zu einer der Fähigkeiten geworden, die Entwickler beherrschen müssen. In diesem Artikel wird erläutert, wie Sie mit Golang die Alipay-Schnittstelle von Webanwendungen implementieren.

Zuerst müssen wir ein Konto auf der Entwicklerplattform von Alipay registrieren und eine Anwendung erstellen. Beim Erstellen einer Anwendung müssen Sie den Anwendungsnamen, den Anwendungstyp, die Rückrufadresse der Anwendung und andere Informationen eingeben und die Anwendungs-ID und den privaten Schlüssel generieren. Diese Informationen werden in nachfolgenden Schnittstellenaufrufen verwendet.

Als nächstes müssen wir Golang verwenden, um Code zum Aufrufen der Alipay-Schnittstelle zu schreiben. Zuerst müssen wir die notwendigen Pakete einführen:

import (
    "bytes"
    "crypto"
    "crypto/rsa"
    "crypto/x509"
    "encoding/base64"
    "encoding/json"
    "fmt"
    "io/ioutil"
    "net/http"
    "net/url"
    "sort"
    "strings"
    "time"
)

Als nächstes müssen wir einige Variablen definieren. Darunter müssen die Werte von Variablen wie appId, privateKey, publicKey, GatewayUrl, charset, signType und Format entsprechend Ihren Anwendungsinformationen geändert werden.

const (
    appId      = "xxx"
    privateKey = `xxx`
    publicKey  = `xxx`

    gatewayUrl = "https://openapi.alipay.com/gateway.do"
    charset    = "utf-8"
    signType   = "RSA2"
    format     = "json"
)

Unter diesen müssen private Key und publicKey durch den privaten Schlüssel der Anwendung und den öffentlichen Schlüssel von Alipay ersetzt werden, die aus Sicherheitsgründen in Konstanten gespeichert werden. Tatsächlich sollten sie in Dateien oder Datenbanken gespeichert werden . .

Als nächstes müssen wir einige Strukturen zum Parsen der von der Alipay-Schnittstelle zurückgegebenen JSON-Daten definieren:

type AlipayResponse struct {
    Code    string `json:"code"`
    Msg     string `json:"msg"`
    SubCode string `json:"sub_code"`
    SubMsg  string `json:"sub_msg"`
}

type TradePrecreateResponse struct {
    AlipayResponse
    OutTradeNo string `json:"out_trade_no"`
    QrCode     string `json:"qr_code"`
}

Hier ist nur eine TradePrecreateResponse-Struktur definiert, die zum Parsen der von der Alipay-Erstellungsauftragsschnittstelle zurückgegebenen JSON-Daten verwendet wird.

Als nächstes müssen wir einige Funktionen definieren. Zuerst müssen wir eine Funktion zum Generieren von Signaturen definieren.

func generateSign(params url.Values) string {
    keys := make([]string, 0, len(params))

    for key := range params {
        keys = append(keys, key)
    }

    sort.Strings(keys)

    var sortedParams bytes.Buffer

    for _, key := range keys {
        values := params[key]
        value := ""
        if len(values) > 0 {
            value = values[0]
        }

        sortedParams.WriteString(key)
        sortedParams.WriteString("=")
        sortedParams.WriteString(value)
        sortedParams.WriteString("&")
    }

    sortedParams.Truncate(sortedParams.Len() - 1)

    h := crypto.SHA256.New()
    h.Write(sortedParams.Bytes())

    privateKeyByte := []byte(privateKey)
    block, _ := pem.Decode(privateKeyByte)
    privateKey, _ := x509.ParsePKCS8PrivateKey(block.Bytes)

    signature, err := rsa.SignPKCS1v15(nil, privateKey.(*rsa.PrivateKey), crypto.SHA256, h.Sum(nil))
    if err != nil {
        panic(err)
    }

    return base64.StdEncoding.EncodeToString(signature)
}

Diese Funktion sortiert zunächst die Parameter in lexikografischer Reihenfolge, berechnet dann mit dem SHA256-Algorithmus den Digest der Parameter, signiert dann den Digest mit dem privaten Schlüssel der Anwendung und codiert schließlich die Signatur mit Base64.

Als nächstes müssen wir eine Funktion definieren, um eine Anfrage an die Alipay-Schnittstelle zu senden:

func doRequest(apiName string, bizContent map[string]interface{}) (string, error) {
    var (
        response *http.Response
        err      error
    )

    params := url.Values{}
    params.Set("app_id", appId)
    params.Set("method", apiName)
    params.Set("version", "1.0")
    params.Set("format", format)
    params.Set("charset", charset)
    params.Set("sign_type", signType)
    params.Set("timestamp", time.Now().Format("2006-01-02 15:04:05"))
    params.Set("biz_content", toJsonString(bizContent))

    params.Set("sign", generateSign(params))

    url := gatewayUrl + "?" + params.Encode()

    if response, err = http.Get(url); err != nil {
        return "", err
    }

    defer response.Body.Close()

    if body, err := ioutil.ReadAll(response.Body); err != nil {
        return "", err
    } else {
        return string(body), nil
    }
}

Diese Funktion organisiert zunächst die Parameter in einer URL-Zeichenfolge und verwendet die Funktion „generateSign“, um eine Signatur zu generieren. Senden Sie anschließend diese URL-Zeichenfolge an die Schnittstelle von Alipay und warten Sie auf das Rückgabeergebnis von Alipay. Abschließend wird das zurückgegebene Ergebnis in einen String umgewandelt und zurückgegeben.

Zu diesem Zeitpunkt haben wir die Anfrage für die Alipay-Schnittstelle abgeschlossen. Der nächste Schritt besteht darin, diese Funktion aufzurufen, um die Funktion zum Erstellen einer Vorbestellungsschnittstelle zu implementieren. Das Folgende ist eine Beispielfunktion:

func tradePrecreate(subject, outTradeNo string, totalAmount float32) (*TradePrecreateResponse, error) {
    bizContent := make(map[string]interface{})
    bizContent["out_trade_no"] = outTradeNo
    bizContent["total_amount"] = fmt.Sprintf("%.2f", totalAmount)
    bizContent["subject"] = subject
    bizContent["timeout_express"] = "30m"

    responseStr, err := doRequest("alipay.trade.precreate", bizContent)
    if err != nil {
        return nil, err
    }

    var response TradePrecreateResponse

    if err := json.Unmarshal([]byte(responseStr), &response); err != nil {
        return nil, err
    }

    if response.Code != "10000" {
        return nil, fmt.Errorf("%s (%s)", response.Msg, response.SubMsg)
    }

    return &response, nil
}

Diese Funktion organisiert zunächst einige Parameter wie die Bestellnummer des Händlers, den Bestellbetrag, den Bestelltitel usw., ruft dann die Funktion doRequest auf, um die Anfrage zu senden, und analysiert das zurückgegebene Ergebnis. Wenn der Code im zurückgegebenen Ergebnis 10000 ist, bedeutet dies, dass die Anforderung erfolgreich war. Andernfalls bedeutet dies, dass die Anforderung fehlgeschlagen ist. In diesem Fall muss die Fehlermeldung zurückgegeben werden.

Schließlich können wir diese Funktion in der Webanwendung verwenden, um die Alipay-Schnittstelle zu implementieren. Im Go-Sprach-Webframework Gin können Sie beispielsweise die obige Funktion wie folgt aufrufen:

func createOrder(c *gin.Context) {
    subject := "Test Order"
    outTradeNo := "12345"
    totalAmount := 1.00

    response, err := tradePrecreate(subject, outTradeNo, totalAmount)
    if err != nil {
        c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
        return
    }

    c.JSON(http.StatusOK, gin.H{"qr_code": response.QrCode})
}

Diese Funktion generiert eine Händlerbestellung, ruft dann die Funktion „tradePrecreate“ auf, um eine Vorbestellung zu generieren, und gibt eine JSON-Antwort mit a zurück QR-Code.

Lassen Sie uns abschließend die oben genannten Schritte zusammenfassen: Zuerst müssen Sie ein Konto auf der Alipay-Entwicklerplattform registrieren und eine Anwendung erstellen sowie eine Anwendungs-ID und einen privaten Schlüssel generieren. Anschließend verwenden Sie Golang, um Code zum Aufrufen und Definieren der Alipay-Schnittstelle zu schreiben Einige Funktionen und Variablen werden letztendlich in der Webanwendung verwendet, um die Alipay-Schnittstelle zu implementieren.

Die oben genannten Schritte und Methoden zur Verwendung von Golang zur Implementierung der Alipay-Schnittstelle von Webanwendungen werden Ihnen hoffentlich weiterhelfen.

Das obige ist der detaillierte Inhalt vonSo implementieren Sie Golang zur Implementierung der Alipay-Schnittstelle einer Webanwendung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn