Golang を使用して Web アプリケーションの Alipay インターフェイスを実装する方法

WBOY
リリース: 2023-06-24 13:15:10
オリジナル
1297 人が閲覧しました

モバイルインターネットの普及、オンラインショッピングやモバイル決済の普及により、Alipayはますます人々の生活に欠かせないものとなり、Alipayのインターフェースは開発者が習得しなければならないスキルの1つとなっています。この記事では、Golang を使用して Web アプリケーションの Alipay インターフェイスを実装する方法を紹介します。

まず、Alipay の開発者プラットフォームにアカウントを登録し、アプリケーションを作成する必要があります。アプリケーションを作成する際には、アプリケーション名、アプリケーションの種類、アプリケーションのコールバック アドレスなどの情報を入力し、アプリケーション ID と秘密キーを生成する必要があり、この情報は後続のインターフェイス呼び出しで使用されます。

次に、Golang を使用して、Alipay のインターフェイスを呼び出すコードを記述する必要があります。まず、必要なパッケージを導入する必要があります:

import (
    "bytes"
    "crypto"
    "crypto/rsa"
    "crypto/x509"
    "encoding/base64"
    "encoding/json"
    "fmt"
    "io/ioutil"
    "net/http"
    "net/url"
    "sort"
    "strings"
    "time"
)
ログイン後にコピー

次に、いくつかの変数を定義する必要があります。このうち、appId、privateKey、publicKey、gatewayUrl、charset、signType、formatなどの変数の値はアプリケーションの情報に応じて変更する必要があります。

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

    gatewayUrl = "https://openapi.alipay.com/gateway.do"
    charset    = "utf-8"
    signType   = "RSA2"
    format     = "json"
)
ログイン後にコピー

このうち、privateKey と publicKey は、Alipay 開発者プラットフォームから取得したアプリケーション秘密鍵と Alipay 公開鍵に置き換える必要がありますが、セキュリティ上の理由から定数に格納されています。ファイルまたはデータベース内。

次に、Alipay インターフェイスから返された JSON データを解析するための構造をいくつか定義する必要があります:

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"`
}
ログイン後にコピー

ここでは TradePrecreateResponse 構造が 1 つだけ定義されており、Alipay を解析して予約 JSON を作成するために使用されます。単一のインターフェイスから返されるデータ。

次に、いくつかの関数を定義する必要があります。まず、署名を生成する関数を定義する必要があります。

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)
}
ログイン後にコピー

この関数は、まずパラメーターを辞書順に並べ替え、次に SHA256 アルゴリズムを使用してパラメーターのダイジェストを計算し、次にアプリケーションの秘密キーを使用してダイジェストに署名し、最後に署名を Base64 でエンコードします。

次に、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
    }
}
ログイン後にコピー

この関数は、まずパラメーターを URL 文字列に編成し、generateSign 関数を使用して署名を生成します。その後、この URL 文字列を Alipay のインターフェースに送信し、Alipay からの返信結果を待ちます。最後に、返された結果を文字列に変換して返します。

この時点で、Alipay インターフェースのリクエストは完了しました。次のステップは、この関数を呼び出して、事前注文インターフェースを作成する機能を実現する方法です。以下は関数の例です:

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
}
ログイン後にコピー

この関数は、最初に販売者の注文番号、注文金額、注文タイトルなどのいくつかのパラメータを整理し、次に doRequest 関数を呼び出してリクエストを送信し、戻り値を解析します。結果。返された結果のコードが 10000 の場合は、リクエストが成功したことを意味します。それ以外の場合は、リクエストが失敗したことを意味します。この場合、エラー メッセージを返す必要があります。

最後に、この関数を Web アプリケーションで使用して、Alipay インターフェイスを実装できます。たとえば、Go 言語の Web フレームワーク gin では、上記の関数を次のように呼び出すことができます。

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})
}
ログイン後にコピー

この関数は販売者の注文を生成し、次に tradePrecreate 関数を呼び出して予約注文を生成し、 JSON 応答を含む QR コード。

最後に、上記の手順を要約します。まず、Alipay 開発者プラットフォームにアカウントを登録してアプリケーションを作成し、アプリケーション ID と秘密キーを生成する必要があります。次に、Golang を使用して Alipay のコードを呼び出すコードを作成します。インターフェイスと定義 いくつかの構造、関数、変数。最終的に、これらの関数は Web アプリケーションで Alipay インターフェイスを実装するために使用されます。

上記は、Golang を使用して Web アプリケーションの Alipay インターフェイスを実装する手順と方法です。

以上がGolang を使用して Web アプリケーションの Alipay インターフェイスを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!