74 Star 423 Fork 138

ShirDon-廖显东 / go支付合集

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
wechatapp.go 3.19 KB
一键复制 编辑 原始数据 按行查看 历史
shirdon 提交于 2019-07-06 10:50 . 修改包目录为绝对目录
package client
import (
"bytes"
"crypto/md5"
"encoding/json"
"encoding/xml"
"errors"
"fmt"
"gitee.com/shirdonl/pays_with_go/common"
"gitee.com/shirdonl/pays_with_go/util"
"sort"
"strings"
"time"
)
var defaultWechatAppClient *WechatAppClient
// DefaultWechatAppClient 默认微信app客户端
func DefaultWechatAppClient() *WechatAppClient {
return defaultWechatAppClient
}
// WechatAppClient 微信app支付
type WechatAppClient struct {
AppID string // AppID
MchID string // 商户号ID
callbackURL string // 回调地址
Key string // 密钥
PayURL string // 支付地址
}
func InitWechatClient(c *WechatAppClient) {
defaultWechatAppClient = c
}
// Pay 支付
func (wechat *WechatAppClient) Pay(charge *common.Charge) (string, error) {
var m = make(map[string]string)
m["appid"] = wechat.AppID
m["mch_id"] = wechat.MchID
m["nonce_str"] = util.RandomStr()
m["body"] = charge.Describe
m["out_trade_no"] = charge.TradeNum
m["total_fee"] = fmt.Sprintf("%d", charge.MoneyFee)
m["spbill_create_ip"] = util.LocalIP()
m["notify_url"] = wechat.callbackURL
m["trade_type"] = "APP"
sign, err := wechat.GenSign(m)
if err != nil {
return "", err
}
m["sign"] = sign
// 转出xml结构
buf := bytes.NewBufferString("")
for k, v := range m {
buf.WriteString(fmt.Sprintf("<%s><![CDATA[%s]]></%s>", k, v, k))
}
xmlStr := fmt.Sprintf("<xml>%s</xml>", buf.String())
re, err := HTTPSC.PostData(wechat.PayURL, "text/xml:charset=UTF-8", xmlStr)
if err != nil {
return "", err
}
var xmlRe common.WeChatReResult
err = xml.Unmarshal(re, &xmlRe)
if err != nil {
return "", err
}
if xmlRe.ReturnCode != "SUCCESS" {
// 通信失败
return "", errors.New(xmlRe.ReturnMsg)
}
if xmlRe.ResultCode != "SUCCESS" {
// 支付失败
return "", errors.New(xmlRe.ErrCodeDes)
}
var c = make(map[string]string)
c["appid"] = wechat.AppID
c["partnerid"] = wechat.MchID
c["prepayid"] = xmlRe.PrepayID
c["package"] = "Sign=WXPay"
c["noncestr"] = util.RandomStr()
c["timestamp"] = fmt.Sprintf("%d", time.Now().Unix())
sign2, err := wechat.GenSign(c)
if err != nil {
return "", err
}
//c["signType"] = "MD5"
c["paySign"] = strings.ToUpper(sign2)
jsonC, err := json.Marshal(c)
if err != nil {
return "", err
}
return string(jsonC), nil
}
// GenSign 产生签名
func (wechat *WechatAppClient) GenSign(m map[string]string) (string, error) {
delete(m, "sign")
delete(m, "key")
var signData []string
for k, v := range m {
if v != "" {
signData = append(signData, fmt.Sprintf("%s=%s", k, v))
}
}
sort.Strings(signData)
signStr := strings.Join(signData, "&")
signStr = signStr + "&key=" + wechat.Key
c := md5.New()
_, err := c.Write([]byte(signStr))
if err != nil {
return "", err
}
signByte := c.Sum(nil)
if err != nil {
return "", err
}
return fmt.Sprintf("%x", signByte), nil
}
// CheckSign 检查签名
func (wechat *WechatAppClient) CheckSign(data string, sign string) error {
signData := data + "&key=" + wechat.Key
c := md5.New()
_, err := c.Write([]byte(signData))
if err != nil {
return err
}
signOut := fmt.Sprintf("%x", c.Sum(nil))
if strings.ToUpper(sign) == strings.ToUpper(signOut) {
return nil
}
return errors.New("签名交易错误")
}
Go
1
https://gitee.com/shirdonl/pays_with_go.git
git@gitee.com:shirdonl/pays_with_go.git
shirdonl
pays_with_go
go支付合集
229bd58f002d

搜索帮助