设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间11 现在时间11 缓存数据 "如果你喜欢一个人, 一定要告诉她 不是为了要她报答, 而是让她在以后黑暗的日子里, 否定自己的时候, 想起世界上还有人这么喜欢她 她并非一无是处。"

"如果你喜欢一个人, 一定要告诉她 不是为了要她报答, 而是让她在以后黑暗的日子里, 否定自己的时候, 想起世界上还有人这么喜欢她 她并非一无是处。" -- 感谢你曾来过

查看: 1709|回复: 2

GO语言支付宝沙箱对接的实现

[复制链接]

  离线 

TA的专栏

  • 打卡等级:热心大叔
  • 打卡总天数:223
  • 打卡月天数:0
  • 打卡总奖励:3194
  • 最近打卡:2025-04-13 11:58:00
等级头衔

等級:晓枫资讯-上等兵

在线时间
0 小时

积分成就
威望
0
贡献
426
主题
392
精华
0
金钱
4484
积分
865
注册时间
2023-1-7
最后登录
2025-4-13

发表于 2024-9-27 18:13:52 | 显示全部楼层 |阅读模式
目录


  • 1.1 官网
  • 1.2 秘钥生成(系统默认)
  • 1.3 秘钥生成(软件生成)
  • 1.4 golan 安装 SDK
  • 1.5 GoLand 代码
  • 1.6 前端代码

1.1 官网
  1. <strong>沙箱官网:</strong>
复制代码
  1. https://open.alipay.com/develop/sandbox/app
复制代码
  1. <strong>秘钥用具下载:</strong>
复制代码
  1. https://opendocs.alipay.com/common/02kipk?pathHash=0d20b438
复制代码
1.png


1.2 秘钥生成(系统默认)

2.png


1.3 秘钥生成(软件生成)


  • 点击生成密钥
3.png


  • 生成成功
4.png


  • 自定义密钥
5.png

****

  • 复制粘贴之前生成的公钥并点击保存
6.png


  • 继续点击确认
7.png


1.4 golan 安装 SDK
  1. go get -u github.com/smartwalle/alipay/v3
复制代码
8.png


1.5 GoLand 代码


  • app

    • utils

      • abfPay.go


  1. package utils

  2. import (
  3.         "fmt"
  4.         "github.com/smartwalle/alipay/v3"
  5.         "net/url"
  6. )

  7. func ZfbPay(orderID string, totalPrice string) string {
  8.         appID := "9021000131612134" // 你的appID
  9.         privateKey := "" // 你的私钥
  10.         aliPublicKey := "" // 支付宝的公钥
  11.         var client, err = alipay.New(appID, privateKey, false)
  12.         if err != nil {
  13.                 panic(err)
  14.         }
  15.         err = client.LoadAliPayPublicKey(aliPublicKey)
  16.         if err != nil {
  17.                 panic(err)
  18.         }
  19.         //var p = alipay.TradeWapPay{}
  20.         var p = alipay.TradePagePay{}
  21.         p.NotifyURL = "http://192.168.137.188:5173/#/pages/pay-success/pay-success" //支付宝回调
  22.         p.ReturnURL = "http://192.168.137.188:5173/#/pages/pay-success/pay-success" //支付后调转页面
  23.         p.Subject = "云尚校园-订单支付"                                                     //标题
  24.         p.OutTradeNo = orderID                                                      //传递一个唯一单号
  25.         p.TotalAmount = totalPrice                                                  //金额
  26.         //p.ProductCode = "QUICK_WAP_WAY"
  27.         p.ProductCode = "FAST_INSTANT_TRADE_PAY" //网页支付
  28.         var url2 *url.URL
  29.         url2, err = client.TradePagePay(p)
  30.         if err != nil {
  31.                 fmt.Println(err)
  32.         }

  33.         var payURL = url2.String()
  34.         println(payURL)
  35.         return payURL
  36. }
复制代码

  • app

    • dto

      • Pay.go


  1. package dto

  2. type ShopPay struct {
  3.         ByCode          string `json:"byCode"`
  4.         ShopID          string `json:"id"`
  5.         OrderTips       string `json:"tips"`
  6.         OrderTotalPrice string `json:"totalPrice"`
  7.         OrderStatus     string `json:"status"`
  8.         OrderID         string `json:"order_id"`
  9. }
复制代码

  • app

    • model

      • Pay.go


  1. package models

  2. import "gorm.io/gorm"

  3. //
  4. //  ShopPay
  5. //  @Description: 生成订单号
  6. //

  7. type ShopPay struct {
  8.         gorm.Model
  9.         ByCode          string `gorm:"type:varchar(100)"`
  10.         OrderId         string `gorm:"type:varchar(100); unique;not null"` // 订单ID
  11.         OrderStatus     string `gorm:"type:varchar(100); not null"`        // 订单状态
  12.         OrderTips       string `gorm:"type:varchar(200); not null"`        // 订单备注
  13.         OrderTotalPrice string `gorm:"type:varchar(100); not null"`
  14.         ShopID          string `gorm:"type:varchar(100); not null"`
  15. }
复制代码

  • app

    • common

      • databaseMySQL.go


  1. package common

  2. import (
  3.         "github.com/spf13/viper"
  4.         "gorm.io/driver/mysql"
  5.         "gorm.io/gorm"
  6. )

  7. var DB *gorm.DB

  8. func InitDB() *gorm.DB {
  9.         host := viper.GetString("datasource.host")
  10.         port := viper.GetString("datasource.port")
  11.         database := viper.GetString("datasource.database")
  12.         username := viper.GetString("datasource.username")
  13.         password := viper.GetString("datasource.password")
  14.         charset := viper.GetString("datasource.charset")

  15.         db, err := gorm.Open(mysql.Open(username+`:`+password+`@tcp(`+host+`:`+port+`)/`+database+`?charset=`+charset+`&parseTime=true&loc=Local`),
  16.                 &gorm.Config{})

  17.         if err != nil {
  18.                 panic("failed to connect database, err: " + err.Error())
  19.         }

  20.         db.AutoMigrate(&model.ShopPay{})

  21.         DB = db
  22.         return db
  23. }

  24. func GetDB() *gorm.DB {
  25.         return DB
  26. }
复制代码

  • app

    • config

      • application.yml


  1. server:
  2.   port: 9999

  3. datasource:
  4.   diverName: mysql
  5.   host: 127.0.0.1
  6.   port: 3306
  7.   database: go-app
  8.   username: root
  9.   password: 123456
  10.   charset: utf8
复制代码

  • app

    • controller

      • PayController.go


  1. package controller

  2. import "github.com/gin-gonic/gin"

  3. type PayController interface {
  4.         AddShopPay(ctx *gin.Context)
  5.         OrderPay(ctx *gin.Context)
  6. }
复制代码

  • app

    • controller

      • pay

        • pay.go



  1. package pay

  2. import (
  3.         "github.com/gin-gonic/gin"
  4.         "go-app/common"
  5.         "go-app/controller"
  6.         "go-app/dto"
  7.         model "go-app/models"
  8.         "go-app/response"
  9.         "go-app/utils"
  10.         "gorm.io/gorm"
  11.         "strconv"
  12. )

  13. type PayFun interface {
  14.         controller.PayController
  15. }

  16. type payDB struct {
  17.         DB *gorm.DB
  18. }

  19. func PayFunction() PayFun {
  20.         db := common.GetDB()
  21.         db.AutoMigrate(model.User{})
  22.         return payDB{DB: db}
  23. }

  24. func (db payDB) AddShopPay(ctx *gin.Context) {
  25.         getPayData := dto.ShopPay{}
  26.         ctx.BindJSON(&getPayData)
  27.         getPayData.OrderStatus = "2"
  28.         getPayData.OrderID = strconv.FormatInt(utils.GetSnowflakeId(), 10)
  29.         if getPayData.ByCode != "" {
  30.                 db.DB.Debug().Create(&getPayData)
  31.         }
  32.         response.Success(ctx, gin.H{"data": getPayData}, "success")
  33. }
  34. func (db payDB) OrderPay(ctx *gin.Context) {
  35.         order := model.ShopPay{}
  36.         id, _ := strconv.Atoi(ctx.Params.ByName("orderID"))
  37.         db.DB.Debug().Where("order_id", id).First(&order)
  38.         pay := utils.ZfbPay(order.OrderId, order.OrderTotalPrice)
  39.         response.Success(ctx, gin.H{"data": pay}, "success")
  40. }
复制代码

  • app

    • router.go

  1. package main

  2. import (
  3.         "github.com/gin-gonic/gin"
  4.         shopController "go-app/controller/shop"
  5. )
  6. func CollectRoute(r *gin.Engine) *gin.Engine {

  7.         // 支付页面
  8.         payGroup := r.Group("api/pay/")
  9.         payFun := payController.PayFunction()
  10.         payGroup.POST("/AddShopPay/", payFun.AddShopPay)
  11.         payGroup.POST("/orderPay/:orderID", payFun.OrderPay)
  12.         return r
  13. }
复制代码

  • app

    • main.go

  1. package main

  2. import (
  3.         "github.com/gin-contrib/cors"
  4.         "github.com/gin-gonic/gin"
  5.         "github.com/spf13/viper"
  6.         "go-app/common"
  7.         "os"
  8. )

  9. func main() {
  10.         InitConfig()
  11.         common.InitDB()
  12.         r := gin.Default()
  13.         config := cors.DefaultConfig()
  14.         config.AllowAllOrigins = true                            //允许所有域名
  15.         config.AllowMethods = []string{"GET", "POST", "OPTIONS"} //允许请求的方法
  16.         config.AllowHeaders = []string{"token", "tus-resumable", "upload-length", "upload-metadata", "cache-control", "x-requested-with", "*"}
  17.         r.Use(cors.New(config))

  18.         // 定义路由和处理函数
  19.         r = CollectRoute(r)
  20.         port := viper.GetString("server.port")
  21.         if port != "" {
  22.                 panic(r.Run(":" + port))
  23.         }
  24.         r.Run()
  25. }

  26. func InitConfig() {
  27.         workDir, _ := os.Getwd()
  28.         viper.SetConfigName("application")
  29.         viper.SetConfigType("yml")
  30.         viper.AddConfigPath(workDir + "/config")
  31.         err := viper.ReadInConfig()
  32.         if err != nil {
  33.                 panic(err)
  34.         }
  35. }
复制代码
1.6 前端代码
  1. <template>
  2.         <view>
  3.                 <!-- 自定义导航栏 -->
  4.                 <view class="box-bg" style="font-size: 36rpx;">
  5.                         <!-- <uni-nav-bar shadow left-icon="left" right-icon="cart" title="购物车" /> -->
  6.                         <uni-nav-bar shadow fixed="true" left-icon="left" right-text="关闭" title="支付订单" statusBar="true"
  7.                                 @clickLeft="backCommitShop" @clickRight="colsePay" />
  8.                 </view>
  9.                 <!-- 支付选择模块 -->
  10.                 <view class="pay-main">
  11.                         <radio-group name="">
  12.                                 <label>
  13.                                         <view class="pay-item">
  14.                                                 <view v-for="(item,index) in payItemIamges.data" :key="index">
  15.                                                         <view class="pay-connect">
  16.                                                                 <img class="pay-item-image" :src="item.imageUrl" alt="">
  17.                                                                 <view class="pay-item-text">
  18.                                                                         <view class="pay-item-text-top">{{item.nameFather}}</view>
  19.                                                                         <view class="pay-item-text-foot">{{item.name}}</view>
  20.                                                                 </view>
  21.                                                                 <label class="pay-radio">
  22.                                                                         <radio :checked="isChecked" color="#F33" /><text></text>
  23.                                                                 </label>
  24.                                                         </view>
  25.                                                 </view>
  26.                                         </view>
  27.                                 </label>
  28.                         </radio-group>
  29.                 </view>
  30.                 <!-- 底部去支付模块 -->
  31.                 <view class="foot-pay">
  32.                         <view class="total-pay">
  33.                                 <view class="total">合计:</view>
  34.                                 <view class="total">¥{{payMoney}}</view>
  35.                         </view>
  36.                         <view class="go-pay" @tap="goPay">去支付</view>
  37.                 </view>
  38.         </view>
  39. </template>

  40. <script setup>
  41.         import {
  42.                 onLoad,
  43.         } from '@dcloudio/uni-app';
  44.         import {
  45.                 reactive,
  46.                 ref
  47.         } from "vue"


  48.         import {orderPay} from "@/api/shop/pay.js"

  49.         onLoad((e) => {
  50.                 // 获取价格
  51.                 payMoney.value = e.price;
  52.                 // 获取订单号
  53.                 orderID.value = e.orderID;

  54.         })

  55.         // 选择支付方式
  56.         const isChecked = ref(false);

  57.         const payItemIamges = reactive({
  58.                 data: [{
  59.                                 nameFather: "微信支付",
  60.                                 name: "推荐微信用户使用",
  61.                                 imageUrl: "http://s1jh1gxy3.hn-bkt.clouddn.com/shopCartCommit/wPay.png"
  62.                         },
  63.                         {
  64.                                 nameFather: "支付宝支付",
  65.                                 name: "推荐支付宝用户使用",
  66.                                 imageUrl: "http://s1jh1gxy3.hn-bkt.clouddn.com/shopCartCommit/zPay.png"
  67.                         }
  68.                 ]
  69.         })
  70.         // 获取金额

  71.         const payMoney = ref(0);
  72.         // 订单ID
  73.         const orderID = ref(0);

  74.         // 去支付
  75.         const goPay = () => {
  76.                 uni.navigateTo({
  77.                         url:"@/pages/pay-success/pay-success"
  78.                 })
  79.                 orderPay(orderID.value).then(res=>{
  80.                         //#ifdef APP-PLUS  
  81.                         plus.runtime.openURL(res.data.data, function(res){
  82.                                 console.log(res);
  83.                         })
  84.                         //#endif
  85.                        
  86.                         // #ifdef H5
  87.                          window.open(res.data.data)
  88.                         // #endif
  89.                 })
  90.         }

  91.         const backCommitShop = () => {
  92.                 uni.navigateBack({
  93.                         delta: 1
  94.                 })
  95.         }

  96.         const colsePay = () => {
  97.                 uni.navigateTo({
  98.                         url: "../shop-commit/shop-commit"
  99.                 })
  100.         }
  101. </script>

  102. <style lang="less" scoped>
  103.         // 底部样式
  104.         .foot-pay {
  105.                 border-top: 2rpx solid #fcc;
  106.                 line-height: 100rpx;
  107.                 height: 100rpx;
  108.                 width: 100%;
  109.                 position: fixed;
  110.                 bottom: 0;
  111.                 left: 0;
  112.                 display: flex;
  113.                 justify-content: space-between;
  114.                 align-items: center;

  115.                 .total-pay {
  116.                         display: flex;
  117.                         flex: 1;
  118.                         background-color: black;
  119.                         color: white;
  120.                         padding-left: 120rpx;

  121.                         .total {
  122.                                 padding: 0rpx 7rpx;
  123.                         }
  124.                 }

  125.                 .go-pay {
  126.                         padding: 0rpx 100rpx;
  127.                         color: white;
  128.                         background-color: #49BDFB;
  129.                 }
  130.         }

  131.         // 支付样式
  132.         .pay-main {
  133.                 margin-top: 15rpx;

  134.                 .pay-item {

  135.                         .pay-connect {
  136.                                 display: flex;
  137.                                 justify-content: space-between;
  138.                                 padding: 20rpx 30rpx;
  139.                                 border-bottom: 8rpx solid #F5F5F5;

  140.                                 .pay-item-image {
  141.                                         width: 100rpx;
  142.                                         height: 100rpx;
  143.                                 }

  144.                                 .pay-item-text {
  145.                                         flex: 1;
  146.                                         padding-left: 80rpx;

  147.                                         .pay-item-text-top {
  148.                                                 font-weight: bold;
  149.                                         }

  150.                                         .pay-item-text-foot {
  151.                                                 color: #636263;
  152.                                         }
  153.                                 }

  154.                                 .pay-radio {
  155.                                         padding-top: 20rpx;
  156.                                 }
  157.                         }
  158.                 }
  159.         }


  160.         .box-bg {
  161.                 background-color: #F5F5F5;
  162.                 padding: 0 5px 0;
  163.         }

  164.         ::v-deep uni-text.uni-nav-bar-text.uni-ellipsis-1 {
  165.                 font-size: 34rpx;
  166.                 font-weight: bolder;
  167.         }

  168.         ::v-deep uni-text.uni-nav-bar-right-text {
  169.                 font-size: 32rpx;
  170.                 font-weight: bolder;
  171.         }

  172.         pay-item-text {
  173.                         flex: 1;
  174.                                 padding-left: 80rpx;

  175.                                 .pay-item-text-top {
  176.                                         font-weight: bold;
  177.                                 }

  178.                                 .pay-item-text-foot {
  179.                                         color: #636263;
  180.                                 }
  181.                         }

  182.                         .pay-radio {
  183.                                 padding-top: 20rpx;
  184.                         }
  185.                 }
  186.         }
  187.                 }
  188.        
  189.        
  190.                 .box-bg {
  191.                         background-color: #F5F5F5;
  192.                         padding: 0 5px 0;
  193.                 }
  194.        
  195.                 ::v-deep uni-text.uni-nav-bar-text.uni-ellipsis-1 {
  196.                         font-size: 34rpx;
  197.                         font-weight: bolder;
  198.                 }
  199.        
  200.                 ::v-deep uni-text.uni-nav-bar-right-text {
  201.                         font-size: 32rpx;
  202.                         font-weight: bolder;
  203.                 }
  204. </style>
复制代码
到此这篇关于GO语言支付宝沙箱对接的实现的文章就介绍到这了,更多相关GO语言支付宝沙箱对接内容请搜索晓枫资讯以前的文章或继续浏览下面的相关文章希望大家以后多多支持晓枫资讯!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
22
积分
24
注册时间
2022-12-24
最后登录
2022-12-24

发表于 2024-9-27 20:28:52 | 显示全部楼层
顶顶更健康!!!
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

  • 打卡等级:无名新人
  • 打卡总天数:1
  • 打卡月天数:0
  • 打卡总奖励:17
  • 最近打卡:2025-03-18 15:05:39
等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
29
积分
4
注册时间
2024-11-20
最后登录
2025-3-18

发表于 2025-5-28 22:39:34 | 显示全部楼层
路过,支持一下
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1楼
2楼
3楼

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表