Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Cara menggunakan Golang untuk melaksanakan antara muka Alipay bagi aplikasi web

Cara menggunakan Golang untuk melaksanakan antara muka Alipay bagi aplikasi web

WBOY
WBOYasal
2023-06-24 13:15:101285semak imbas

Dengan mempopularkan Internet mudah alih, populariti beli-belah dalam talian dan pembayaran mudah alih, Alipay telah menjadi semakin penting dalam kehidupan orang ramai, dan antara muka Alipay telah menjadi salah satu kemahiran yang mesti dikuasai oleh pembangun. Artikel ini akan memperkenalkan cara menggunakan Golang untuk melaksanakan antara muka Alipay aplikasi web.

Pertama, kita perlu mendaftar akaun pada platform pembangun Alipay dan membuat aplikasi. Semasa membuat aplikasi, anda perlu mengisi nama aplikasi, jenis aplikasi, alamat panggilan balik aplikasi dan maklumat lain, dan menjana ID aplikasi dan kunci peribadi Maklumat ini akan digunakan dalam panggilan antara muka yang berikutnya.

Seterusnya, kita perlu menggunakan Golang untuk menulis kod untuk memanggil antara muka Alipay. Pertama, kita perlu memperkenalkan pakej yang diperlukan:

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

Seterusnya, kita perlu menentukan beberapa pembolehubah. Antaranya, nilai pembolehubah seperti appId, privateKey, publicKey, gatewayUrl, charset, signType dan format perlu diubah suai mengikut maklumat aplikasi anda.

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

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

Antaranya, privateKey dan publicKey perlu digantikan dengan kunci peribadi aplikasi dan kunci awam Alipay yang diperoleh daripada platform pembangun Alipay, ia disimpan dalam pemalar .

Seterusnya, kita perlu menentukan beberapa struktur untuk menghuraikan data JSON yang dikembalikan oleh antara muka Alipay:

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"`
}

Hanya satu struktur TradePrecreateResponse ditakrifkan di sini, yang digunakan untuk menghuraikan data JSON yang dikembalikan oleh antara muka pesanan penciptaan Alipay.

Seterusnya, kita perlu menentukan beberapa fungsi. Pertama, kita perlu menentukan fungsi untuk menjana tandatangan.

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)
}

Fungsi ini mula-mula mengisih parameter dalam susunan leksikografi, kemudian menggunakan algoritma SHA256 untuk mengira ringkasan parameter, kemudian menggunakan kunci peribadi aplikasi untuk menandatangani ringkasan, dan akhirnya base64 mengekod tandatangan.

Seterusnya, kita perlu menentukan fungsi untuk menghantar permintaan ke antara muka Alipay:

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
    }
}

Fungsi ini mula-mula mengatur parameter ke dalam rentetan URL dan menggunakan fungsi generateSign untuk menjana tandatangan. Selepas itu, hantar rentetan URL ini ke antara muka Alipay dan tunggu hasil pulangan daripada Alipay. Akhirnya, hasil yang dikembalikan ditukar kepada rentetan dan dikembalikan.

Pada ketika ini, kami telah menyelesaikan permintaan untuk antara muka Alipay Langkah seterusnya ialah cara memanggil fungsi ini untuk melaksanakan fungsi mencipta antara muka pra-pesanan. Berikut ialah contoh fungsi:

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
}

Fungsi ini mula-mula mengatur beberapa parameter, seperti nombor pesanan pedagang, jumlah pesanan, tajuk pesanan, dll., kemudian memanggil fungsi doRequest untuk menghantar permintaan dan menghuraikan hasil yang dikembalikan. Jika kod dalam hasil yang dikembalikan ialah 10000, ini bermakna permintaan itu berjaya, jika tidak, ini bermakna permintaan itu gagal, dan dalam kes ini, mesej ralat perlu dikembalikan.

Akhir sekali, kita boleh menggunakan fungsi ini dalam aplikasi web untuk melaksanakan antara muka Alipay. Contohnya, dalam gin rangka kerja web bahasa Go, anda boleh memanggil fungsi di atas seperti ini:

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})
}

Fungsi ini akan menjana pesanan pedagang, kemudian memanggil fungsi tradePrecreate untuk menjana prapesanan, dan mengembalikan respons JSON dengan Kod QR.

Akhir sekali, mari kita ringkaskan langkah-langkah di atas: Pertama, anda perlu mendaftar akaun pada platform pembangun Alipay dan mencipta aplikasi, dan menjana ID aplikasi dan kunci peribadi kemudian, gunakan Golang untuk menulis kod untuk memanggil antara muka Alipay dan tentukan beberapa struktur, Fungsi dan pembolehubah akhirnya, fungsi ini digunakan dalam aplikasi web untuk melaksanakan antara muka Alipay.

Di atas adalah langkah dan kaedah untuk menggunakan Golang untuk melaksanakan antara muka Alipay aplikasi web saya harap ia akan membantu anda.

Atas ialah kandungan terperinci Cara menggunakan Golang untuk melaksanakan antara muka Alipay bagi aplikasi web. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn