Files
utility_go/pay/wechat.go

100 lines
2.4 KiB
Go
Raw 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 pay
import (
"crypto"
"crypto/rand"
"crypto/rsa"
"crypto/sha256"
"encoding/base64"
"fmt"
"github.com/go-pay/crypto/xpem"
"github.com/go-pay/gopay"
"github.com/go-pay/gopay/wechat/v3"
"github.com/go-pay/util/convert"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gfile"
"strings"
)
var (
// ctx = gctx.New()
)
// GooglePay 是一个处理Google支付的结构体。
type WechatPay struct {
Client *wechat.ClientV3
PrivateKey string
}
func Wechat() *WechatPay {
var pay = &WechatPay{}
var err error
cfg, _ := g.Cfg().Get(ctx, "pay.wechat")
cfgMap := cfg.MapStrStr()
MchId := cfgMap["mchid"]
SerialNo := cfgMap["serialNo"]
APIv3Key := cfgMap["apiV3Key"]
PrivateKey := gfile.GetContents("manifest/pay/apiclient_key.pem")
//PrivateKey := cfgMap["privateKey"]
// NewClientV3 初始化微信客户端 v3
// mchid商户ID 或者服务商模式的 sp_mchid
// serialNo商户证书的证书序列号
// apiV3KeyapiV3Key商户平台获取
// privateKey私钥 apiclient_key.pem 读取后的内容
pay.Client, err = wechat.NewClientV3(MchId, SerialNo, APIv3Key, PrivateKey)
if err != nil {
g.Log().Error(ctx, err)
return nil
}
err = pay.Client.AutoVerifySign()
if err != nil {
g.Log().Error(ctx, err)
return nil
}
return pay
}
// v3 鉴权请求Header
func (c *WechatPay) Authorization(appid string, timestamp int64, nonceStr string, prepay_id string) (string, error) {
//var (
// jb = ""
// timestamp = time.Now().Unix()
// nonceStr = util.RandomString(32)
//)
//if bm != nil {
// jb = bm.JsonBody()
//}
//path = strings.TrimSuffix(path, "?")
ts := convert.Int642String(timestamp)
_str := strings.Join([]string{appid, ts, nonceStr, prepay_id}, "\n") + "\n"
//_str := appid + "\n" + timestamp + "\n" + nonceStr + "\n" + jb + "\n"
sign, err := c.rsaSign(_str)
if err != nil {
return "", err
}
return sign, nil
}
func (c *WechatPay) rsaSign(str string) (string, error) {
//if c.privateKey == nil {
// return "", errors.New("privateKey can't be nil")
//}
privateKey := gfile.GetContents("manifest/pay/apiclient_key.pem")
priKey, err := xpem.DecodePrivateKey([]byte(privateKey))
h := sha256.New()
h.Write([]byte(str))
result, err := rsa.SignPKCS1v15(rand.Reader, priKey, crypto.SHA256, h.Sum(nil))
if err != nil {
return gopay.NULL, fmt.Errorf("[%w]: %+v", gopay.SignatureErr, err)
}
return base64.StdEncoding.EncodeToString(result), nil
}