1 Star 0 Fork 0

h79/goutils

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
ali.go 3.36 KB
一键复制 编辑 原始数据 按行查看 历史
huqiuyun 提交于 2022-06-01 16:56 . go.mod module
package client
import (
"crypto"
"crypto/rand"
"crypto/rsa"
"crypto/sha1"
"crypto/sha256"
"encoding/base64"
"encoding/json"
"errors"
"fmt"
"gitee.com/h79/goutils/pay/common"
"hash"
"net/url"
"sort"
"strings"
"time"
)
type AliPayClient struct {
AppID string // 应用ID
PrivateKey *rsa.PrivateKey
PublicKey *rsa.PublicKey
RSAType string // RSA or RSA2
PayURL string // https://openapi.alipay.com/gateway.do
}
func (client *AliPayClient) PayToClient(charge *common.Charge) (map[string]string, error) {
var result = make(map[string]string)
var m = make(map[string]string)
var bizContent = make(map[string]string)
m["app_id"] = client.AppID
m["method"] = "alipay.fund.trans.toaccount.transfer"
m["format"] = "JSON"
m["charset"] = "utf-8"
m["timestamp"] = time.Now().Format("2006-01-02 15:04:05")
m["version"] = "1.0"
m["sign_type"] = client.RSAType
bizContent["out_biz_no"] = charge.TradeNum
bizContent["amount"] = AliyunMoneyFeeToString(charge.MoneyFee)
bizContent["payee_account"] = charge.AliAccount
bizContent["payee_type"] = charge.AliAccountType
bizContent["remark"] = TruncatedText(charge.Describe, 32)
bizContentJson, err := json.Marshal(bizContent)
if err != nil {
return result, errors.New("json.Marshal: " + err.Error())
}
m["biz_content"] = string(bizContentJson)
m["sign"] = client.GenSign(m)
requestUrl := fmt.Sprintf("%s?%s", client.PayURL, client.ToURL(m))
var resp map[string]interface{}
bytes, err := HTTPSC.GetData(requestUrl)
if err != nil {
return result, err
}
err = json.Unmarshal(bytes, &resp)
if err != nil {
return result, err
}
result, ok := resp["alipay_fund_trans_toaccount_transfer_response"].(map[string]string)
if !ok {
return result, errors.New(fmt.Sprintf("返回结果错误:%s", resp))
}
return result, nil
}
// GenSign 产生签名
func (client *AliPayClient) GenSign(m map[string]string) string {
var data []string
for k, v := range m {
if v != "" && k != "sign" {
data = append(data, fmt.Sprintf(`%s=%s`, k, v))
}
}
sort.Strings(data)
signData := strings.Join(data, "&")
s := client.getHash(client.RSAType)
_, err := s.Write([]byte(signData))
if err != nil {
panic(err)
}
hashByte := s.Sum(nil)
signByte, err := client.PrivateKey.Sign(rand.Reader, hashByte, crypto.SHA256)
if err != nil {
panic(err)
}
return base64.StdEncoding.EncodeToString(signByte)
}
// CheckSign 检测签名
func (client *AliPayClient) CheckSign(signData, sign string) {
signByte, err := base64.StdEncoding.DecodeString(sign)
if err != nil {
panic(err)
}
s := client.getHash(client.RSAType)
_, err = s.Write([]byte(signData))
if err != nil {
panic(err)
}
hashByte := s.Sum(nil)
err = rsa.VerifyPKCS1v15(client.PublicKey, client.getCrypto(), hashByte, signByte)
if err != nil {
panic(err)
}
}
// ToURL
func (client *AliPayClient) ToURL(m map[string]string) string {
var buf []string
for k, v := range m {
buf = append(buf, fmt.Sprintf("%s=%s", k, url.QueryEscape(v)))
}
return strings.Join(buf, "&")
}
func (client *AliPayClient) getRsa() string {
if client.RSAType == "" {
client.RSAType = "RSA"
}
return client.RSAType
}
func (client *AliPayClient) getCrypto() crypto.Hash {
if client.RSAType == "RSA2" {
return crypto.SHA256
}
return crypto.SHA1
}
func (client *AliPayClient) getHash(rasType string) hash.Hash {
if rasType == "RSA2" {
return sha256.New()
}
return sha1.New()
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/h79/goutils.git
git@gitee.com:h79/goutils.git
h79
goutils
goutils
v1.5.7

搜索帮助