当前位置: 代码网 > it编程>前端脚本>Golang > Go语言实现支付宝支付与退款详解

Go语言实现支付宝支付与退款详解

2024年11月03日 Golang 我要评论
在当今数字支付的时代,移动支付已经成为各行各业的主流选择。支付宝作为中国最大的支付平台之一,提供了丰富的支付和退款api,供开发者集成到各种应用中。上期我已经介绍了go语言对接微信支付。本文将详细介绍

在当今数字支付的时代,移动支付已经成为各行各业的主流选择。支付宝作为中国最大的支付平台之一,提供了丰富的支付和退款api,供开发者集成到各种应用中。上期我已经介绍了 go语言对接微信支付。本文将详细介绍如何使用go语言对接支付宝的支付与退款功能,通过实例代码来讲解关键步骤和注意事项。

一、准备工作

在开始编码之前,你需要准备以下几项:

注册成为支付宝支付商户:注册并登录支付宝开放平台,获取必要的appid、商户id(mchid)、私钥等信息。

获取必要的配置信息

  • appid:支付宝应用的唯一标识。
  • mchid:商户号。
  • privatekey:开发者的私钥,用于生成支付签名。
  • publickey:支付宝的公钥,用于验证回调签名。
  • notifyurl:支付结果通知地址。
  • returnurl:支付成功后用户跳转的地址。

安装第三方库:安装gopay库,这是一个go语言的支付宝sdk,可以简化开发流程。

go get github.com/go-pay/gopay

二、初始化配置

首先,我们需要定义支付相关的配置信息,包括应用id、商户id、私钥等:

type config struct {
	appid      string
	mchid      string
	privatekey string
	notifyurl  string
	refundurl  string
	returnurl  string
	publickey  string
	quiturl    string
}

通过 go-pay 的 alipay.newclient 方法,我们可以轻松初始化支付宝客户端。以下是如何在go中初始化alipay服务:

func newalipayservice(ctx context.context, config config) *alipayservice {
    alipaycli, err := alipay.newclient(config.appid, config.privatekey, true)
    if err != nil {
        panic(err)
    }
    alipaycli.debugswitch = gopay.debugon // 开启debug
    alipaycli.setcharset(alipay.utf8).setsigntype(alipay.rsa2)
    
    return &alipayservice{
        ctx:    ctx,
        config: config,
        alipay: alipaycli,
    }
}

三、实现支付功能

1. 付款时序图

支付时序图

2. 实现不同场景下的支付

1. 实现pc端支付

pc端支付通过生成支付链接并提供给用户,用户通过扫码或点击链接完成支付。下面是pc端支付的实现:

// pcpay pc端支付
func (a *alipayservice) pcpay(charge *charge) (string, error) {
	a.alipay = a.alipay.setreturnurl(a.config.returnurl).setnotifyurl(a.config.notifyurl)
	// 生成单号
	amount := decimal.newfromint(charge.moneyfee).divround(decimal.newfromint(100), 2).string()
	// 构造参数
	bm := make(gopay.bodymap)
	bm.set("subject", charge.describe).
		set("out_trade_no", charge.tradenum).
		set("total_amount", amount).
		set("qr_pay_mode", 4).
		set("qrcode_width", 120)
	// 发起支付
	return a.alipay.tradepagepay(a.ctx, bm)
}

此函数中,我们将支付的关键参数(如商品描述、订单号、支付金额等)传递给支付宝sdk,支付宝返回生成的支付二维码,用户通过扫码即可完成支付。

2. 实现wap端支付

移动端支付(wap端)与pc端支付类似,但需要额外处理 quit_url 参数,该参数决定用户在支付取消后跳转的地址。

// wappay wap端支付
func (a *alipayservice) wappay(charge *charge) (string, error) {
	a.alipay = a.alipay.setreturnurl(a.config.returnurl).setnotifyurl(a.config.notifyurl)
	// 生成单号
	amount := decimal.newfromint(charge.moneyfee).divround(decimal.newfromint(100), 2).string()
	// 构造参数
	bm := make(gopay.bodymap)
	bm.set("subject", charge.describe).
		set("out_trade_no", charge.tradenum).
		set("total_amount", amount).
		set("quit_url", a.config.quiturl+a.config.quiturl).
		set("product_code", "fast_instant_trade_pay")
	// 发起支付
	return a.alipay.tradewappay(a.ctx, bm)
}

3. 实现android端支付

在android端,支付宝提供了app支付方式。通过生成支付参数,客户端可以调用支付宝app完成支付流程。以下是android端支付的代码:

// androidpay android端支付
func (a *alipayservice) androidpay(charge *charge) (string, error) {

	a.alipay.setnotifyurl(a.config.notifyurl)

	amount := decimal.newfromint(charge.moneyfee).divround(decimal.newfromint(100), 2).string()
	// 构造参数
	bm := make(gopay.bodymap)
	bm.set("subject", charge.describe).
		set("out_trade_no", charge.tradenum).
		set("total_amount", amount).
		set("product_code", "fast_instant_trade_pay")
	// 发起支付
	return a.alipay.tradeapppay(a.ctx, bm)
}

3. 支付结果回调

当用户完成支付后,支付宝会向您的服务器发送支付结果的通知。您需要解析这些通知并验证其有效性:

// aliwebpayresult 支付宝支付结果回调
type aliwebpayresult struct {
	outtradeno  string `json:"out_trade_no"`
	tradestatus string `json:"trade_status"`
}

// getnotifyresult  解析支付回调
func (a *alipayservice) getnotifyresult(r *http.request) (result *aliwebpayresult, err error) {
	// 解析异步通知的参数
	notifyreq, err := alipay.parsenotifytobodymap(r)
	if err != nil {
		// todo 处理错误信息
		return
	}

	// 支付宝异步通知验签(公钥模式)
	_, err = alipay.verifysign(a.config.publickey, notifyreq)
	if err != nil {
		// todo 处理错误信息
		return
	}
	if err = notifyreq.unmarshal(result); err != nil {
		// todo 处理错误信息
		return
	}
	return
}

四、退款功能实现

退款时序图

支付宝退款时序图

支付宝退款跟微信退款不一样的,支付宝退款的结果是接口直接返回的,而不是异步通知的,发起退款的时候也不支持回调通知

发起退款

退款操作的关键是构造正确的退款参数,并通过支付宝api发起退款请求。下面是退款的代码实现:

// refundcharge 退款参数
type refundcharge struct {
   tradenum     string `json:"tradenum,omitempty"`
   moneyfee     int64  `json:"moneyfee,omitempty"`
   outrefundno  string `json:"out_refund_no,omitempty"`
   refundreason string `json:"refund_reason,omitempty"`
}


func (a *alipayservice) refund(charge *refundcharge) (err error) {
	amount := decimal.newfromint(charge.moneyfee).divround(decimal.newfromint(100), 2).string()
	// 构造参数
	bm := make(gopay.bodymap)
	bm.set("out_trade_no", charge.tradenum).
		set("refund_reason", charge.refundreason).
		set("out_request_no", charge.outrefundno).
		set("refund_amount", amount)
	// 发起支付
	res, err := a.alipay.traderefund(a.ctx, bm)
	//todo 处理错误信息,处理结果
	return
}

五、总结

本文通过go语言结合 go-pay 库,详细介绍了如何对接支付宝的pc端支付、wap端支付、android端支付以及退款功能。通过合理的封装和错误处理,开发者可以快速集成支付宝支付功能到自己的项目中。希望本文能够帮助到有支付集成需求的开发者,在实际开发中提升效率。

更多支付宝api细节,请参考支付宝官方文档

到此这篇关于go语言实现支付宝支付与退款详解的文章就介绍到这了,更多相关go语言支付宝支付内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

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

发表评论

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