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