代码拉取完成,页面将自动刷新
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()
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。