1 Star 0 Fork 0

h79/goutils

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
ali_web.go 2.97 KB
一键复制 编辑 原始数据 按行查看 历史
huqiuyun 提交于 2022-06-01 16:56 . go.mod module
package client
import (
"crypto"
"crypto/rand"
"crypto/rsa"
"crypto/sha1"
"encoding/base64"
"errors"
"fmt"
"gitee.com/h79/goutils/pay/common"
"net/url"
"sort"
"strings"
)
var aliWebClient *AliWebClient
// AliWebClient 支付宝网页支付
// PayURL: https://mapi.alipay.com/gateway.do"
type AliWebClient struct {
AliPayClient
PartnerID string // 支付宝合作身份ID
SellerID string // 卖家支付宝用户号
}
func InitAliWebClient(c *AliWebClient) {
aliWebClient = c
}
// DefaultAliWebClient 默认支付宝网页支付客户端
func DefaultAliWebClient() *AliWebClient {
return aliWebClient
}
// Pay 实现支付接口
func (client *AliWebClient) Pay(charge *common.Charge) (map[string]string, error) {
var m = make(map[string]string)
m["service"] = "create_direct_pay_by_user"
m["partner"] = client.PartnerID
m["_input_charset"] = "UTF-8"
m["notify_url"] = charge.CallbackURL
m["return_url"] = charge.ReturnURL // 注意链接不能有&符号,否则会签名错误
m["out_trade_no"] = charge.TradeNum
m["subject"] = TruncatedText(charge.Describe, 32)
m["total_fee"] = AliyunMoneyFeeToString(charge.MoneyFee)
m["seller_id"] = client.SellerID
sign := client.GenSign(m)
m["sign"] = sign
m["sign_type"] = client.getRsa()
return map[string]string{"url": ToURL(client.PayURL, m)}, nil
}
func (client *AliWebClient) CloseOrder(charge *common.Charge) (map[string]string, error) {
return map[string]string{}, errors.New("暂未开发该功能")
}
func (client *AliWebClient) PayToClient(charge *common.Charge) (map[string]string, error) {
return map[string]string{}, errors.New("暂未开发该功能")
}
// 订单查询
func (client *AliWebClient) QueryOrder(outTradeNo string) (common.AliWebQueryResult, error) {
var m = make(map[string]string)
m["service"] = "single_trade_query"
m["partner"] = client.PartnerID
m["_input_charset"] = "utf-8"
m["out_trade_no"] = outTradeNo
sign := client.GenSign(m)
m["sign"] = sign
m["sign_type"] = client.getRsa()
return GetAlipay(ToURL(client.PayURL, m))
}
// GenSign 产生签名
func (client *AliWebClient) GenSign(m map[string]string) string {
var data []string
for k, v := range m {
if v != "" && k != "sign" && k != "sign_type" {
data = append(data, fmt.Sprintf(`%s=%s`, k, v))
}
}
sort.Strings(data)
signData := strings.Join(data, "&")
s := sha1.New()
_, err := s.Write([]byte(signData))
if err != nil {
panic(err)
}
hashByte := s.Sum(nil)
signByte, err := client.PrivateKey.Sign(rand.Reader, hashByte, crypto.SHA1)
if err != nil {
panic(err)
}
return url.QueryEscape(base64.StdEncoding.EncodeToString(signByte))
}
// CheckSign 检测签名
func (client *AliWebClient) CheckSign(signData, sign string) {
signByte, err := base64.StdEncoding.DecodeString(sign)
if err != nil {
panic(err)
}
s := sha1.New()
_, err = s.Write([]byte(signData))
if err != nil {
panic(err)
}
hash := s.Sum(nil)
err = rsa.VerifyPKCS1v15(client.PublicKey, crypto.SHA1, hash, signByte)
if err != nil {
panic(err)
}
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/h79/goutils.git
git@gitee.com:h79/goutils.git
h79
goutils
goutils
v1.1.30

搜索帮助