1.1 官网
沙箱官网:
https://open.alipay.com/develop/sandbox/app
秘钥用具下载:
https://opendocs.alipay.com/common/02kipk?pathhash=0d20b438

1.2 秘钥生成(系统默认)

1.3 秘钥生成(软件生成)
- 点击生成密钥

- 生成成功

- 自定义密钥

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

- 继续点击确认

1.4 golan 安装 sdk
go get -u github.com/smartwalle/alipay/v3

1.5 goland 代码
- app
- utils
- abfpay.go
- utils
package utils
import (
"fmt"
"github.com/smartwalle/alipay/v3"
"net/url"
)
func zfbpay(orderid string, totalprice string) string {
appid := "9021000131612134" // 你的appid
privatekey := "" // 你的私钥
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.url
url2, err = client.tradepagepay(p)
if err != nil {
fmt.println(err)
}
var payurl = url2.string()
println(payurl)
return payurl
}
- app
- dto
- pay.go
- dto
package dto
type 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
- model
package models
import "gorm.io/gorm"
//
// shoppay
// @description: 生成订单号
//
type shoppay struct {
gorm.model
bycode string `gorm:"type:varchar(100)"`
orderid string `gorm:"type:varchar(100); unique;not null"` // 订单id
orderstatus 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
- common
package common
import (
"github.com/spf13/viper"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
var db *gorm.db
func 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 = db
return db
}
func getdb() *gorm.db {
return db
}
- app
- config
- application.yml
- config
server: port: 9999 datasource: divername: mysql host: 127.0.0.1 port: 3306 database: go-app username: root password: 123456 charset: utf8
- app
- controller
- paycontroller.go
- controller
package controller
import "github.com/gin-gonic/gin"
type paycontroller interface {
addshoppay(ctx *gin.context)
orderpay(ctx *gin.context)
}
- app
- controller
- pay
- pay.go
- pay
- controller
package pay
import (
"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 main
import (
"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 main
import (
"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 h5
window.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>到此这篇关于go语言支付宝沙箱对接的实现的文章就介绍到这了,更多相关go语言支付宝沙箱对接内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论