goProject/trunk/center/paycenter/internal/alipay/alipay.go

89 lines
2.4 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package alipay
import (
"context"
"errors"
"github.com/go-pay/gopay"
"github.com/go-pay/gopay/alipay/v3"
"github.com/go-pay/gopay/pkg/js"
"goutil/logUtilPlus"
"paycenter/internal/cert"
"strconv"
)
var (
ctx = context.Background()
client *alipay.ClientV3
err error
)
func init() {
// 初始化支付宝客V3户端
// appid应用ID
// privateKey应用私钥支持PKCS1和PKCS8
// isProd是否是正式环境沙箱环境请选择新版沙箱应用。
client, err = alipay.NewClientV3(cert.Appid, cert.PrivateKey, false)
if err != nil {
logUtilPlus.ErrorLog("new alipay client err:%s", err)
return
}
// 自定义配置http请求接收返回结果body大小默认 10MB
//client.SetBodySize() // 没有特殊需求,可忽略此配置
// Debug开关输出/关闭日志
client.DebugSwitch = gopay.DebugOn
// 设置自定义RequestId生成方法
//client.SetRequestIdFunc()
// 设置biz_content加密KEY设置此参数默认开启加密目前不可用
//client.SetAESKey("KvKUTqSVZX2fUgmxnFyMaQ==")
// 传入证书内容
err = client.SetCert(cert.AppPublicContent, cert.AlipayRootContent, cert.AlipayPublicContentRSA2)
if err != nil {
logUtilPlus.ErrorLog("set cert err:%s", err)
return
}
}
// AliPayPlace 函数用于发起预支付请求。
// 参数:
//
// outTradeNo: 商户订单号。
// currency: 订单金额,单位为分。
// storeId: 商户门店编号。
// clientIp: 用户的客户端IP。
// description: 订单描述。
//
// 返回值:
//
// 成功时返回预支付ID和nil错误。
// 失败时返回空字符串和错误对象。
func AliPayPlace(outTradeNo int64, currency int64, storeId string, clientIp string, description string) (string, error) {
// 请求参数
bm := make(gopay.BodyMap)
bm.Set("subject", "预创建创建订单").
Set("out_trade_no", strconv.FormatInt(outTradeNo, 10)).
Set("total_amount", currency)
rsp := new(struct {
OutTradeNo string `json:"out_trade_no"`
QrCode string `json:"qr_code"`
})
// 创建订单
res, err := client.DoAliPayAPISelfV3(ctx, alipay.MethodPost, alipay.V3TradePrecreate, bm, rsp)
if err != nil {
logUtilPlus.ErrorLog("client.TradePrecreate(), err:%v", err)
return "", err
}
logUtilPlus.DebugLog("aliRsp:%s", js.Marshal(rsp))
if res.StatusCode != alipay.Success {
logUtilPlus.ErrorLog("aliRsp.StatusCode:%d", res.StatusCode)
return "", errors.New("aliRsp.StatusCode:" + strconv.Itoa(res.StatusCode))
}
return "Success", nil
}