欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

golang調(diào)用藍兔支付實現(xiàn)網(wǎng)上支付功能

 更新時間:2023年09月19日 10:36:58   作者:唐詩  
支付寶、微信的網(wǎng)上支付需要營業(yè)執(zhí)照個人無法直接使用,如果個人需要實現(xiàn)網(wǎng)上支付功能,目前大部分應(yīng)該是都是依賴第三方聚合支付來實現(xiàn),本文就來介紹一下如何調(diào)用藍兔支付實現(xiàn)網(wǎng)上支付功能,有需要的可以參考下

支付寶、微信的網(wǎng)上支付需要營業(yè)執(zhí)照個人無法直接使用。

如果個人需要實現(xiàn)網(wǎng)上支付功能,目前大部分應(yīng)該是都是依賴第三方聚合支付來實現(xiàn)。

三方聚合支付

我是在做一個電商網(wǎng)站(ps:極簡風(fēng)格)的 demo 所以并不會有太多的流水,經(jīng)過一番檢索我發(fā)現(xiàn)大部分三方支付都會收取一些費用比如開戶費、接口服務(wù)服務(wù)費。

咱也能理解畢竟靠愛發(fā)電不是長久的事情,有時候支付一些費用獲取比較好的體驗也是可以接受的。

矮個子里挑高個我找到了藍兔支付-猛擊訪問官網(wǎng) 開戶費用 50,相對來說比較優(yōu)惠了。

接口服務(wù)費感覺有那么一點高,不過我是用來做個人網(wǎng)站的支付不會有太大的流水倒也沒那么在意。

產(chǎn)品對比

從這張圖大概可以了解到與微信官方的一些區(qū)別。

商戶開通

藍兔支付的開通還是比較簡單的進入個人中心、點擊微信支付申請簽約。

然后你會看到一個彈窗,小伙子你很剛啊!

然后按照要求填寫一些信息即可,身份信息需要上傳身份證照片。

友情提示記得加水印養(yǎng)成好習(xí)慣!

都做完以后一般很快就會審核完成,我大概半個小時左右就可以了。

然后在商戶管理這里可以看到商戶號、商戶密鑰后邊調(diào)用接口要用!

使用 go 對接藍兔支付

藍兔支付提供了對接文檔文檔地址這非常好,一個好的文檔可以讓我少走很多彎路。

實現(xiàn)簽名算法

這里文檔說明了簽名算法的實現(xiàn),說明了和微信支付的簽名算法一致可以使用微信支付的校驗工具進行測試。

可以測試就會簡單很多,讓我們來實現(xiàn)一下這個簽名。

package pay  
import (  
    "crypto/md5"  
    "encoding/hex"  
    "simple-mall/global"  
    "sort"  
    "strings"  
)  
func calculateMD5(data string) string {  
    hash := md5.Sum([]byte(data))  
    return hex.EncodeToString(hash[:])  
}  
// LTZFGenerateSignature 生成藍兔支付簽名  
func LTZFGenerateSignature(sinObj map[string]string) string {  
    // 按照參數(shù)名進行字典序排序  
    keys := make([]string, 0, len(sinObj))  
    for k := range sinObj {  
        keys = append(keys, k)  
    }  
    sort.Strings(keys)  
    // 拼接參數(shù)鍵值對  
    var builder strings.Builder  
    for _, key := range keys {  
    value := sinObj[key]  
        if value != "" {  
            builder.WriteString(key + "=" + value + "&")  
        }  
    }  
    // 拼接密鑰 也就上邊說的商戶密鑰
    builder.WriteString("key=" + global.LTZFConfig.SecretKey)  
    // 計算MD5并轉(zhuǎn)換為大寫  
    signature := calculateMD5(builder.String())  
    return strings.ToUpper(signature)  
}

支付接口參數(shù)序列化

接口的調(diào)用比較簡單但是沒有接口參數(shù)的示例,參考文檔實現(xiàn)下參數(shù)的封裝。

// 獲取微信支付簽名對象  
func getLTZFWeChatPayApiSinObj(params map[string]string) string {  
    // 只有必填參數(shù)才參與簽名!
    sinObj := map[string]string{  
        "mch_id": params["mch_id"],  
        "out_trade_no": params["out_trade_no"],  
        "total_fee": params["total_fee"],  
        "body": params["body"],  
        "timestamp": params["timestamp"],  
        "notify_url": params["notify_url"],  
    }  
    return LTZFGenerateSignature(sinObj)  
}
// 獲取藍兔支付微信 api 參數(shù)  
func getLTZFWeChatPayApiReq(payReq pay.WeChatPayReq) url.Values {  
    // 請求支付接口參數(shù)  
    opts := map[string]string{  
        "mch_id": global.LTZFConfig.MchId, // 上邊說的商戶id  
        "out_trade_no": payReq.OrderId,
        "total_fee": "0.01", // 為了測試設(shè)置為 0.01 防止誤支付
        "body": payReq.Info,  
        "timestamp": strconv.FormatInt(time.Now().Unix(), 10),  
        "notify_url": "xxxxx",  // 這里填寫支付成功的回調(diào)地址
        "attach": payReq.OrderId,  // 附加數(shù)據(jù),在支付通知中原樣返回
        "time_expire": "15m",  // 支付超時時間
        "sign": "",  
    }  
    // 設(shè)置接口簽名  
    opts["sign"] = getLTZFWeChatPayApiSinObj(opts)  
    // 格式化參數(shù)  
    req := url.Values{}  
    for key, value := range opts {  
        req.Add(key, value)  
    }  
    return req  
}

支付接口調(diào)用

支付接口的調(diào)用官網(wǎng)文檔有示例,記得先設(shè)置白名單地址。

咱就借鑒官網(wǎng)的調(diào)用示例然后完善一下,這里使用了 gin。

func WeChatPay(ctx *gin.Context) {  
    payReq := pay.WeChatPayReq{}  
    if err := ctx.ShouldBind(&payReq); err != nil {  
        utils.HandleValidatorError(ctx, err)  
        return  
    }  
    // 調(diào)用藍兔支付接口 獲取支付二維碼
    res, err := http.PostForm("https://api.ltzf.cn/api/wxpay/native", getLTZFWeChatPayApiReq(payReq))  
    if err != nil {  
        // 處理請求錯誤  
        utils.ResponseResultsError(ctx, err.Error())  
        return  
    }  
    defer func(Body io.ReadCloser) {  
    err := Body.Close()  
    if err != nil {  
        utils.ResponseResultsError(ctx, err.Error())  
    }  
    }(res.Body)  
    body, err := io.ReadAll(res.Body)  
    if err != nil {  
        // 處理讀取響應(yīng)體錯誤  
        utils.ResponseResultsError(ctx, err.Error())  
        return  
    }  
    // 解析接口響應(yīng)數(shù)據(jù)  
    type Data struct {  
        CodeURL string `json:"code_url"`  
        QRCodeURL string `json:"QRcode_url"`  
    }  
    type Response struct {  
        Code int `json:"code"`  
        Data Data `json:"data"`  
        Msg string `json:"msg"`  
        RequestID string `json:"request_id"`  
    }  
    // 解析JSON數(shù)據(jù)  
    var resp Response  
    if err := json.Unmarshal(body, &resp); err != nil {  
        // 處理解析JSON錯誤  
        utils.ResponseResultsError(ctx, err.Error())  
        return  
    }  
    if resp.Code != 0 {  
        utils.ResponseResultsError(ctx, resp.Msg)  
        return  
    }  
    utils.ResponseResultsSuccess(ctx, resp.Data)  
}

然后也提供了一個交易記錄的管理。

總結(jié)

文章介紹了使用 go + 藍兔支付 來實現(xiàn)的個人的網(wǎng)上支付,從藍兔支付的開通到對接這個過程做了一個講解說明。

重點說明:藍兔支付客服態(tài)度不是很友好!

以上就是golang調(diào)用藍兔支付實現(xiàn)網(wǎng)上支付功能的詳細內(nèi)容,更多關(guān)于go支付的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 使用Golang進行比較版本號大小

    使用Golang進行比較版本號大小

    在日常開發(fā)中,比較版本號大小的情況是經(jīng)常遇到的,這篇文章主要為大家詳細介紹了如何使用Golang進行比較版本號大小,需要的小伙伴可以參考下
    2024-01-01
  • Go語言strconv包實現(xiàn)字符串和數(shù)值類型的相互轉(zhuǎn)換

    Go語言strconv包實現(xiàn)字符串和數(shù)值類型的相互轉(zhuǎn)換

    這篇文章主要介紹了Go語言strconv包實現(xiàn)字符串和數(shù)值類型的相互轉(zhuǎn)換,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • go語言中slice,map,channl底層原理

    go語言中slice,map,channl底層原理

    這篇文章主要介紹了go語言中slice,map,channl底層原理,slice,map,channl是我們Go語言中最最常用的幾個數(shù)據(jù)結(jié)構(gòu),對于其更多相關(guān)內(nèi)容需要的小伙伴可以參考下面文章詳細內(nèi)容
    2022-06-06
  • Go自定義數(shù)據(jù)序列化的流程詳解

    Go自定義數(shù)據(jù)序列化的流程詳解

    在Go語言中,自定義數(shù)據(jù)的序列化是一個常見的需求,本文將深入探討 Go 語言中自定義數(shù)據(jù)序列化的流程,包括關(guān)鍵概念、技巧和最佳實踐,旨在幫助開發(fā)者更高效地進行數(shù)據(jù)序列化工作,需要的朋友可以參考下
    2024-06-06
  • 使用go實現(xiàn)常見的數(shù)據(jù)結(jié)構(gòu)

    使用go實現(xiàn)常見的數(shù)據(jù)結(jié)構(gòu)

    這篇文章主要介紹了使用go實現(xiàn)常見的數(shù)據(jù)結(jié)構(gòu),本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • go語言for循環(huán)中嵌套defer的執(zhí)行順序

    go語言for循環(huán)中嵌套defer的執(zhí)行順序

    在Go語言中,defer語句用于延遲函數(shù)調(diào)用的執(zhí)行,本文主要介紹了go語言for循環(huán)中嵌套defer的執(zhí)行順序,具有一定的參考價值,感興趣的可以了解一下
    2025-03-03
  • golang jwt+token驗證的實現(xiàn)

    golang jwt+token驗證的實現(xiàn)

    這篇文章主要介紹了golang jwt+token驗證的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Go語言實現(xiàn)請求超時處理的方法總結(jié)

    Go語言實現(xiàn)請求超時處理的方法總結(jié)

    這篇文章主要為大家詳細介紹了Go語言中實現(xiàn)請求的超時控制的方法,主要是通過timer和timerCtx來實現(xiàn)請求的超時控制,希望對大家有所幫助
    2023-05-05
  • golang多維度排序及題解最長連續(xù)序列

    golang多維度排序及題解最長連續(xù)序列

    這篇文章主要為大家介紹了golang多維度排序及題解最長連續(xù)序列示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • Golang切片Slice功能操作詳情

    Golang切片Slice功能操作詳情

    這篇文章主要介紹了Golang切片功能操作詳情,切片是一個擁有相同類型元素的可變長度的序列。它是基于數(shù)組類型做的一層封,切片是一個引用類型,它的內(nèi)部結(jié)構(gòu)包含地址、長度和容量
    2022-09-09

最新評論