支付宝沙箱对接(GO语言)

支付宝沙箱对接

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

1.1 官网


沙箱官网:

https://open.alipay.com/develop/sandbox/app

秘钥用具下载:

https://opendocs.alipay.com/common/02kipk?pathHash=0d20b438

image-20231027214014588

1.2 秘钥生成(系统默认)

image-20231027214829962

1.3 秘钥生成(软件生成)


  • 点击生成密钥

image-20231027214209352

  • 生成成功

image-20231027214306694

  • 自定义密钥

image-20231027214456066****

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

image-20231027214551413

  • 继续点击确认

image-20231027214642751

1.4 golan 安装 SDK


go get -u github.com/smartwalle/alipay/v3

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1.5 GoLand 代码


  • app
    • utils
      • abfPay.go
package utilsimport ("fmt""github.com/smartwalle/alipay/v3""net/url"
)func ZfbPay(orderID string, totalPrice string) string {appID := "9021000131612134" // 你的appIDprivateKey := "" // 你的私钥aliPublicKey := "" // 支付宝的公钥var client, err = alipay.New(appID, privateKey, false)if err != nil {panic(err)}err = client.LoadAliPayPublicKey(aliPublicKey)if err != nil {panic(err)}//var p = alipay.TradeWapPay{}var p = alipay.TradePagePay{}p.NotifyURL = "http://192.168.137.188:5173/#/pages/pay-success/pay-success" //支付宝回调p.ReturnURL = "http://192.168.137.188:5173/#/pages/pay-success/pay-success" //支付后调转页面p.Subject = "云尚校园-订单支付"                                                     //标题p.OutTradeNo = orderID                                                      //传递一个唯一单号p.TotalAmount = totalPrice                                                  //金额//p.ProductCode = "QUICK_WAP_WAY"p.ProductCode = "FAST_INSTANT_TRADE_PAY" //网页支付var url2 *url.URLurl2, err = client.TradePagePay(p)if err != nil {fmt.Println(err)}var payURL = url2.String()println(payURL)return payURL
}
  • app
    • dto
      • Pay.go
package dtotype ShopPay struct {ByCode          string `json:"byCode"`ShopID          string `json:"id"`OrderTips       string `json:"tips"`OrderTotalPrice string `json:"totalPrice"`OrderStatus     string `json:"status"`OrderID         string `json:"order_id"`
}
  • app
    • model
      • Pay.go
package modelsimport "gorm.io/gorm"//
//  ShopPay
//  @Description: 生成订单号
//type ShopPay struct {gorm.ModelByCode          string `gorm:"type:varchar(100)"`OrderId         string `gorm:"type:varchar(100); unique;not null"` // 订单IDOrderStatus     string `gorm:"type:varchar(100); not null"`        // 订单状态OrderTips       string `gorm:"type:varchar(200); not null"`        // 订单备注OrderTotalPrice string `gorm:"type:varchar(100); not null"`ShopID          string `gorm:"type:varchar(100); not null"`
}
  • app
    • common
      • databaseMySQL.go
package commonimport ("github.com/spf13/viper""gorm.io/driver/mysql""gorm.io/gorm"
)var DB *gorm.DBfunc InitDB() *gorm.DB {host := viper.GetString("datasource.host")port := viper.GetString("datasource.port")database := viper.GetString("datasource.database")username := viper.GetString("datasource.username")password := viper.GetString("datasource.password")charset := viper.GetString("datasource.charset")db, err := gorm.Open(mysql.Open(username+`:`+password+`@tcp(`+host+`:`+port+`)/`+database+`?charset=`+charset+`&parseTime=true&loc=Local`),&gorm.Config{})if err != nil {panic("failed to connect database, err: " + err.Error())}db.AutoMigrate(&model.ShopPay{})DB = dbreturn db
}func GetDB() *gorm.DB {return DB
}
  • app
    • config
      • application.yml
server:port: 9999datasource:diverName: mysqlhost: 127.0.0.1port: 3306database: go-appusername: rootpassword: 123456charset: utf8
  • app
    • controller
      • PayController.go
package controllerimport "github.com/gin-gonic/gin"type PayController interface {AddShopPay(ctx *gin.Context)OrderPay(ctx *gin.Context)
}
  • app
    • controller
      • pay
        • pay.go
package payimport ("github.com/gin-gonic/gin""go-app/common""go-app/controller""go-app/dto"model "go-app/models""go-app/response""go-app/utils""gorm.io/gorm""strconv"
)type PayFun interface {controller.PayController
}type payDB struct {DB *gorm.DB
}func PayFunction() PayFun {db := common.GetDB()db.AutoMigrate(model.User{})return payDB{DB: db}
}func (db payDB) AddShopPay(ctx *gin.Context) {getPayData := dto.ShopPay{}ctx.BindJSON(&getPayData)getPayData.OrderStatus = "2"getPayData.OrderID = strconv.FormatInt(utils.GetSnowflakeId(), 10)if getPayData.ByCode != "" {db.DB.Debug().Create(&getPayData)}response.Success(ctx, gin.H{"data": getPayData}, "success")
}
func (db payDB) OrderPay(ctx *gin.Context) {order := model.ShopPay{}id, _ := strconv.Atoi(ctx.Params.ByName("orderID"))db.DB.Debug().Where("order_id", id).First(&order)pay := utils.ZfbPay(order.OrderId, order.OrderTotalPrice)response.Success(ctx, gin.H{"data": pay}, "success")
}
  • app
    • router.go
package mainimport ("github.com/gin-gonic/gin"shopController "go-app/controller/shop"
)
func CollectRoute(r *gin.Engine) *gin.Engine {// 支付页面payGroup := r.Group("api/pay/")payFun := payController.PayFunction()payGroup.POST("/AddShopPay/", payFun.AddShopPay)payGroup.POST("/orderPay/:orderID", payFun.OrderPay)return r
}
  • app
    • main.go
package mainimport ("github.com/gin-contrib/cors""github.com/gin-gonic/gin""github.com/spf13/viper""go-app/common""os"
)func main() {InitConfig()common.InitDB()r := gin.Default()config := cors.DefaultConfig()config.AllowAllOrigins = true                            //允许所有域名config.AllowMethods = []string{"GET", "POST", "OPTIONS"} //允许请求的方法config.AllowHeaders = []string{"token", "tus-resumable", "upload-length", "upload-metadata", "cache-control", "x-requested-with", "*"}r.Use(cors.New(config))// 定义路由和处理函数r = CollectRoute(r)port := viper.GetString("server.port")if port != "" {panic(r.Run(":" + port))}r.Run()
}func InitConfig() {workDir, _ := os.Getwd()viper.SetConfigName("application")viper.SetConfigType("yml")viper.AddConfigPath(workDir + "/config")err := viper.ReadInConfig()if err != nil {panic(err)}
}

1.6 前端代码


<template><view><!-- 自定义导航栏 --><view class="box-bg" style="font-size: 36rpx;"><!-- <uni-nav-bar shadow left-icon="left" right-icon="cart" title="购物车" /> --><uni-nav-bar shadow fixed="true" left-icon="left" right-text="关闭" title="支付订单" statusBar="true"@clickLeft="backCommitShop" @clickRight="colsePay" /></view><!-- 支付选择模块 --><view class="pay-main"><radio-group name=""><label><view class="pay-item"><view v-for="(item,index) in payItemIamges.data" :key="index"><view class="pay-connect"><img class="pay-item-image" :src="item.imageUrl" alt=""><view class="pay-item-text"><view class="pay-item-text-top">{{item.nameFather}}</view><view class="pay-item-text-foot">{{item.name}}</view></view><label class="pay-radio"><radio :checked="isChecked" color="#F33" /><text></text></label></view></view></view></label></radio-group></view><!-- 底部去支付模块 --><view class="foot-pay"><view class="total-pay"><view class="total">合计:</view><view class="total">¥{{payMoney}}</view></view><view class="go-pay" @tap="goPay">去支付</view></view></view>
</template><script setup>import {onLoad,} from '@dcloudio/uni-app';import {reactive,ref} from "vue"import {orderPay} from "@/api/shop/pay.js"onLoad((e) => {// 获取价格payMoney.value = e.price;// 获取订单号orderID.value = e.orderID;})// 选择支付方式const isChecked = ref(false);const payItemIamges = reactive({data: [{nameFather: "微信支付",name: "推荐微信用户使用",imageUrl: "http://s1jh1gxy3.hn-bkt.clouddn.com/shopCartCommit/wPay.png"},{nameFather: "支付宝支付",name: "推荐支付宝用户使用",imageUrl: "http://s1jh1gxy3.hn-bkt.clouddn.com/shopCartCommit/zPay.png"}]})// 获取金额const payMoney = ref(0);// 订单ID const orderID = ref(0);// 去支付const goPay = () => {uni.navigateTo({url:"@/pages/pay-success/pay-success"})orderPay(orderID.value).then(res=>{//#ifdef APP-PLUS  plus.runtime.openURL(res.data.data, function(res){console.log(res);})//#endif // #ifdef H5window.open(res.data.data)// #endif})}const backCommitShop = () => {uni.navigateBack({delta: 1})}const colsePay = () => {uni.navigateTo({url: "../shop-commit/shop-commit"})}
</script><style lang="less" scoped>// 底部样式.foot-pay {border-top: 2rpx solid #fcc;line-height: 100rpx;height: 100rpx;width: 100%;position: fixed;bottom: 0;left: 0;display: flex;justify-content: space-between;align-items: center;.total-pay {display: flex;flex: 1;background-color: black;color: white;padding-left: 120rpx;.total {padding: 0rpx 7rpx;}}.go-pay {padding: 0rpx 100rpx;color: white;background-color: #49BDFB;}}// 支付样式.pay-main {margin-top: 15rpx;.pay-item {.pay-connect {display: flex;justify-content: space-between;padding: 20rpx 30rpx;border-bottom: 8rpx solid #F5F5F5;.pay-item-image {width: 100rpx;height: 100rpx;}.pay-item-text {flex: 1;padding-left: 80rpx;.pay-item-text-top {font-weight: bold;}.pay-item-text-foot {color: #636263;}}.pay-radio {padding-top: 20rpx;}}}}.box-bg {background-color: #F5F5F5;padding: 0 5px 0;}::v-deep uni-text.uni-nav-bar-text.uni-ellipsis-1 {font-size: 34rpx;font-weight: bolder;}::v-deep uni-text.uni-nav-bar-right-text {font-size: 32rpx;font-weight: bolder;}pay-item-text {flex: 1;padding-left: 80rpx;.pay-item-text-top {font-weight: bold;}.pay-item-text-foot {color: #636263;}}.pay-radio {padding-top: 20rpx;}}}}.box-bg {background-color: #F5F5F5;padding: 0 5px 0;}::v-deep uni-text.uni-nav-bar-text.uni-ellipsis-1 {font-size: 34rpx;font-weight: bolder;}::v-deep uni-text.uni-nav-bar-right-text {font-size: 32rpx;font-weight: bolder;}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/41719.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

并行处理百万个文件的解析和追加

处理和解析大量文件&#xff0c;尤其是百万级别的文件&#xff0c;是一个复杂且资源密集的任务。为实现高效并行处理&#xff0c;可以使用Python中的多种并行和并发编程工具&#xff0c;比如multiprocessing、concurrent.futures模块以及分布式计算框架如Dask和Apache Spark。这…

Mysql系列-Binlog主从同步

原文链接&#xff1a;https://zhuanlan.zhihu.com/p/669450627 一、主从同步概述 mysql主从同步&#xff0c;即MySQL Replication,可以实现将数据从一台数据库服务器同步到多台数据库服务器。MySQL数据库自带主 从同步功能&#xff0c;经过配置&#xff0c;可以实现基于库、表…

B端设计:任何不顾及用户体验的设计,都是在装样子,花架子

B端设计是指面向企业客户的设计&#xff0c;通常涉及产品、服务或系统的界面和功能设计。与C端设计不同&#xff0c;B端设计更注重实用性和专业性&#xff0c;因为它直接影响企业的效率和利益。 在B端设计中&#xff0c;用户体验同样至关重要。不顾及用户体验的设计只是空洞的表…

经典的layui框架,还有人用吗?令人惋惜。

自从layui官网宣布关闭之后&#xff0c;layui框架的用户飞速下滑&#xff0c;以至于到现在贝格前端工场承接的项目中&#xff0c;鲜有要求使用layui框架的&#xff0c;那么个框架还有人用吗&#xff1f; 一、layui没落是不是jquery惹的祸 layui的没落与jQuery无关。layui框架…

Hi3861 OpenHarmony嵌入式应用入门--UDP Server

本篇使用的是lwip编写udp服务端。需要提前准备好一个PARAM_HOTSPOT_SSID宏定义的热点&#xff0c;并且密码为PARAM_HOTSPOT_PSK。 修改网络参数 在Hi3861开发板上运行上述四个测试程序之前&#xff0c;需要根据你的无线路由、Linux系统IP修改 net_params.h文件的相关代码&…

起底:Three.js和Cesium.js,二者异同点,好比全科和专科.

Three.js和Cesium.js是两个常用的webGL引擎&#xff0c;很多小伙伴容易把它们搞混淆了&#xff0c;今天威斯数据来详细介绍一下&#xff0c;他们的起源、不同点和共同点&#xff0c;阅读后你就发现二者就像全科医院和专科医院的关系&#xff0c;很好识别。 一、二者的起源 Th…

性能测试相关理解---性能测试流程(二)

六、性能测试流程&#xff08;如何做性能测试&#xff1f;) 根据学习全栈测试博主的课程做的笔记 1、前期准备– 项目初期就开始&#xff0c;业务需求评审时尽量参与,对业务更深刻的认识&#xff08;确定哪些是核心业务、哪些可能存在并发请求、确定什么地方会出现瓶颈,方便后…

WebOffice在线编微软Offfice,并以二进制流的形式打开Word文档

在日常办公场景中&#xff0c;我们经常会遇到这种场景&#xff1a;我们的合同管理系统的各种Word,excel,ppt数据都是以二进制数组的形式存储在数据库中&#xff0c;如何从数据库中读取二进制数据&#xff0c;以二进制数据作为参数&#xff0c;然后加载到浏览器的Office窗口&…

【无标题】地平线2西之绝境/Horizon Forbidden West™ Complete Edition(更新:V1.3.57)

游戏介绍 与埃洛伊同行&#xff0c;在危险壮美的边疆之地揭开种种未知的神秘威胁。此完整版可完整享受广受好评的《地平线 西之绝境™》内容和额外内容&#xff0c;包括在主线游戏后展开的后续故事“炙炎海岸”。 重返《地平线》中遥远未来的后末日世界&#xff0c;探索远方的土…

Twitter群发消息API接口的功能?如何配置?

Twitter群发消息API接口怎么申请&#xff1f;如何使用API接口&#xff1f; 为了方便企业和开发者有效地与用户互动&#xff0c;Twitter提供了各种API接口&#xff0c;其中Twitter群发消息API接口尤为重要。AokSend将详细介绍Twitter群发消息API接口的功能及其应用场景。 Twit…

html+css+js贪吃蛇游戏

贪吃蛇游戏&#x1f579;四个按钮控制方向&#x1f3ae; 源代码在图片后面 点赞❤️关注&#x1f64f;收藏⭐️ 互粉必回&#x1f64f;&#x1f64f;&#x1f60d;&#x1f60d;&#x1f60d; 源代码&#x1f4df; <!DOCTYPE html> <html lang"en"&…

tomcat原理、结构、设计模式

1 what 一种web服务器&#xff0c;运行java servlet、jsp技术&#xff0c;能为java web提供运行环境并通过http协议处理客户端请求。即tomcat http服务器 servlet容器。同类产品有jetty Web应用&#xff1a;Web应用是指通过Web浏览器访问的应用程序&#xff0c;它使用Web技术…

平台稳定性里程碑 | Android 15 Beta 3 已发布

作者 / 产品管理副总裁、Android 开发者 Matthew McCullough 从近期发布的 Beta 3 开始&#xff0c;Android 15 达成了平台稳定性里程碑版本&#xff0c;这意味着开发者 API 和所有面向应用的行为都已是最终版本&#xff0c;您可以查阅它们并将其集成到您的应用中&#xff0c;并…

系统架构设计师——计算机体系结构

分值占比3-4分 计算机硬件组成 计算机硬件组成主要包括主机、存储器和输入/输出设备。 主机&#xff1a;主机是计算机的核心部分&#xff0c;包括运算器、控制器、主存等组件。运算器负责执行算术和逻辑运算&#xff1b;控制器负责协调和控制计算机的各个部件&#xff1b;主存…

如何看自己电脑的ip地址?这些方法教你搞定

在数字化时代&#xff0c;网络已经成为我们生活中不可或缺的一部分。对于每一个接入网络的设备来说&#xff0c;IP地址就像是一个独特的身份证&#xff0c;它标识着设备在网络中的位置。对于电脑用户而言&#xff0c;了解如何查看自己电脑的IP地址&#xff0c;不仅有助于我们更…

14-44 剑和诗人18 - 你想怎么应用 RAG 与微调

​​​​​​ 要充分发挥 LLM 的潜力&#xff0c;需要在检索增强生成 (RAG) 和微调之间选择正确的技术。 让我们研究一下何时针对 LLM、较小模型和预训练模型使用 RAG 而不是微调。我们将介绍&#xff1a; LLM 和 RAG 的简要背景RAG 相对于微调 LLM 的优势何时针对不同模型大…

AI集成工具平台一站式体验,零门槛使用国内外主流大模型

目录 0 写在前面1 AI艺术大师1.1 绘画制图1.2 智能作曲 2 AI科研助理2.1 学术搜索2.2 自动代码 3 AI智能对话3.1 聊天机器人3.2 模型竞技场 4 特别福利 0 写在前面 人工智能大模型浪潮滚滚&#xff0c;正推动着千行百业的数智化进程。随着技术演进&#xff0c;2024年被视为是大…

保健品商城小程序模板源码

保健品商城小程序模板源码 简洁通用的保健品&#xff0c;健康生活&#xff0c;零售商品&#xff0c;电子商务微信小程序前端模板下载。包含&#xff1a;主页、购物车、客服、个人中心、我的订单、商品详情、我的钱包、设置等等。 保健品商城小程序模板源码

web安全基础名词概念

本节内容根据小迪安全讲解制作 第一天 域名&#xff1a; 1.1什么是域名&#xff1f; 网域名称(英语&#xff1a;Domain Name&#xff0c;简称&#xff1a;Domain)&#xff0c;简称域名、网域&#xff0c;是由一串用点分隔的字符组成的互联网上某一台计算机或计算机组的名称&a…

celery执行任务报错ValueError: not enough values to unpack

背景 在做用户注册模块的时候需要对手机号验证的过程进行优化&#xff0c;目前想到的方式是通过celeryrabbitmq的方式进行异步处理&#xff0c;选择使用celery是因为使用方便、性能好、可分布式部署。 环境信息 目前使用地win11容器化启动 rabbitmq:3.13.2 python:3.6.8 cel…