当前位置: 代码网 > it编程>前端脚本>Golang > GO语言支付宝沙箱对接的实现

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

2024年11月04日 Golang 我要评论
1.1 官网沙箱官网:https://open.alipay.com/develop/sandbox/app秘钥用具下载:https://opendocs.alipay.com/common/02ki

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 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
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
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
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
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
package controller

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

type paycontroller interface {
	addshoppay(ctx *gin.context)
	orderpay(ctx *gin.context)
}
  • app
    • controller
      • pay
        • pay.go
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语言支付宝沙箱对接内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网! 

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com