AliPay SDK for Golang
go get gitee.com/gomods/alipay
import gitee.com/gomods/alipay
下面用到的 privateKey 需要特别注意一下,如果是通过“支付宝开发平台开发助手”创建的CSR文件,在 CSR 文件所在的目录下会生成相应的私钥文件,我们需要使用该私钥进行签名。
var client, err = alipay.New(appID, privateKey, true)
如果采用公钥证书方式进行验证签名,需要调用以下几个方法加载证书信息,所有证书都是从支付宝创建的应用处下载,参考 https://docs.open.alipay.com/291/105971/ 和 https://docs.open.alipay.com/291/105972/
client.LoadAppPublicCertFromFile("appCertPublicKey_2017011104995404.crt") // 加载应用公钥证书
client.LoadAliPayRootCertFromFile("alipayRootCert.crt") // 加载支付宝根证书
client.LoadAliPayPublicCertFromFile("alipayCertPublicKey_RSA2.crt") // 加载支付宝公钥证书
client.LoadAliPayPublicKey("aliPublicKey")
特别注意:公钥证书和普通公钥不能同时存在,只能选择其中一种。
中线(-)后面的名称是该接口在 AliPay 结构体中对应的方法名。
手机网站支付接口
alipay.trade.wap.pay - TradeWapPay()
电脑网站支付
alipay.trade.page.pay - TradePagePay()
统一收单线下交易查询
alipay.trade.query - TradeQuery()
统一收单交易支付接口
alipay.trade.pay - TradePay()
统一收单交易创建接口
alipay.trade.create - TradeCreate()
统一收单线下交易预创建
alipay.trade.precreate - TradePreCreate()
统一收单交易撤销接口
alipay.trade.cancel - TradeCancel()
统一收单交易关闭接口
alipay.trade.close - TradeClose()
统一收单交易退款接口
alipay.trade.refund - TradeRefund()
App支付接口
alipay.trade.app.pay - TradeAppPay()
统一收单交易退款查询
alipay.trade.fastpay.refund.query - TradeFastpayRefundQuery()
支付宝订单信息同步接口
alipay.trade.orderinfo.sync - TradeOrderInfoSync()
单笔转账到支付宝账户接口
alipay.fund.trans.toaccount.transfer - FundTransToAccountTransfer()
查询转账订单接口
alipay.fund.trans.order.query - FundTransOrderQuery()
资金授权发码接口
alipay.fund.auth.order.voucher.create - FundAuthOrderVoucherCreate()
资金授权操作查询接口
alipay.fund.auth.operation.detail.query - FundAuthOperationDetailQuery()
资金授权撤销接口
alipay.fund.auth.operation.cancel - FundAuthOperationCancel()
资金授权解冻接口
alipay.fund.auth.order.unfreeze - FundAuthOrderUnfreeze()
资金授权冻结接口
alipay.fund.auth.order.freeze - FundAuthOrderFreeze()
线上资金授权冻结接口
alipay.fund.auth.order.app.freeze - FundAuthOrderAppFreeze()
查询对账单下载地址
alipay.data.dataservice.bill.downloadurl.query - BillDownloadURLQuery()
支付宝商家账户当前余额查询
alipay.data.bill.balance.query - BillBalanceQuery()
身份认证初始化服务
alipay.user.certify.open.initialize - UserCertifyOpenInitialize()
身份认证开始认证
alipay.user.certify.open.certify - UserCertifyOpenCertify()
身份认证记录查询
alipay.user.certify.open.query - UserCertifyOpenQuery()
用户信息授权(网站支付宝登录快速接入)
生成授权链接 - PublicAppAuthorize()
换取授权访问令牌
alipay.system.oauth.token - SystemOauthToken()
支付宝会员授权信息查询
alipay.user.info.share - UserInfoShare()
App支付宝登录
com.alipay.account.auth - AccountAuth()
支付宝个人协议页面签约
alipay.user.agreement.page.sign - AgreementPageSign()
支付宝个人代扣协议查询
alipay.user.agreement.query - AgreementQuery()
支付宝个人代扣协议解约
alipay.user.agreement.unsign - AgreementUnsign()
支单笔转账接口
alipay.fund.trans.uni.transfer - FundTransUniTransfer()
转账业务单据查询接口
alipay.fund.trans.common.query - FundTransCommonQuery()
支付宝资金账户资产查询接口
alipay.fund.account.query - FundAccountQuery()
通知内容转换及签名验证
将支付宝的通知内容转换为 Golang 的结构体,并且验证其合法性。
从支付宝开放平台申请创建相关的应用,使用自己的支付宝账号登录即可。
支付宝开放平台为每一个应用提供了沙箱环境,供开发人员开发测试使用。
沙箱环境是独立的,每一个应用都会有一个商家账号和买家账号。
参考官网文档 进行应用的配置。
本 SDK 中的签名方法默认为 RSA2,采用支付宝提供的 RSA签名&验签工具 生成秘钥时,秘钥的格式必须为 PKCS1,秘钥长度推荐 2048。所以在支付宝管理后台请注意配置 RSA2(SHA256)密钥。
生成秘钥对之后,将公钥提供给支付宝(通过支付宝后台上传)对我们请求的数据进行签名验证,我们的代码中将使用私钥对请求数据签名。
请参考 如何生成 RSA 密钥。
var privateKey = "xxx" // 必须,上一步中使用 RSA签名验签工具 生成的私钥
var client, err = alipay.New(appId, privateKey, false)
client.LoadAppPublicCertFromFile("appCertPublicKey_2017011104995404.crt") // 加载应用公钥证书
client.LoadAliPayRootCertFromFile("alipayRootCert.crt") // 加载支付宝根证书
client.LoadAliPayPublicCertFromFile("alipayCertPublicKey_RSA2.crt") // 加载支付宝公钥证书
// 将 key 的验证调整到初始化阶段
if err != nil {
fmt.Println(err)
return
}
var p = alipay.TradeWapPay{}
p.NotifyURL = "http://xxx"
p.ReturnURL = "http://xxx"
p.Subject = "标题"
p.OutTradeNo = "传递一个唯一单号"
p.TotalAmount = "10.00"
p.ProductCode = "QUICK_WAP_WAY"
var url, err = client.TradeWapPay(p)
if err != nil {
fmt.Println(err)
}
var payURL = url.String()
fmt.Println(payURL)
// 这个 payURL 即是用于支付的 URL,可将输出的内容复制,到浏览器中访问该 URL 即可打开支付页面。
支持自动对支付宝返回的数据进行签名验证,详细信息请参考自行实现验签.
发起支付的时候,当我们有提供 Return URL 参数,那么支付成功之后,支付宝将会重定向到该 URL,并附带上相关的参数。
var p = alipay.TradeWapPay{}
p.ReturnURL = "http://xxx/return"
这时候我们需要对支付宝提供的参数进行签名验证:
http.HandleFunc("/return", func (rep http.ResponseWriter, req *http.Request) {
req.ParseForm()
ok, err := client.VerifySign(req.Form)
fmt.Println(ok, err)
}
有支付或者其它动作发生后,支付宝服务器会调用我们提供的 Notify URL,并向其传递会相关的信息。参考手机网站支付结果异步通知。
我们需要在提供的 Notify URL 服务中获取相关的参数并进行验证:
http.HandleFunc("/alipay", func (rep http.ResponseWriter, req *http.Request) {
var noti, _ = client.GetTradeNotification(req)
if noti != nil {
fmt.Println("交易状态为:", noti.TradeStatus)
}
alipay.AckNotification(rep) // 确认收到通知消息
})
此验证方法适用于支付宝所有情况下发送的 Notify,不管是手机 App 支付还是 Wap 支付。
应用私钥是我们通过工具生成的私钥,调用支付宝接口的时候,我们需要使用该私钥对参数进行签名。
支付宝提供了用于开发时测试的 sandbox 环境,对接的时候需要注意相关的 app id 和密钥是 sandbox 环境还是 production 环境的。如果是 sandbox 环境,本参数应该传 false,否则为 true。
默认采用的是 RSA2 签名,不再提供 RSA 的支持
Fork github.com/smartwalle/alipay
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。