1 Star 0 Fork 0

h79/goutils

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
callback.go 3.35 KB
一键复制 编辑 原始数据 按行查看 历史
huqiuyun 提交于 2022-06-01 16:56 . go.mod module
package pay
import (
"encoding/xml"
"errors"
"fmt"
"io/ioutil"
"net/http"
"sort"
"strings"
"encoding/json"
"gitee.com/h79/goutils/pay/client"
"gitee.com/h79/goutils/pay/common"
"gitee.com/h79/goutils/pay/util"
)
func AliWebCallback(w http.ResponseWriter, r *http.Request) (*common.AliWebPayResult, error) {
var m = make(map[string]string)
var signSlice []string
r.ParseForm()
for k, v := range r.Form {
// k不会有多个值的情况
m[k] = v[0]
if k == "sign" || k == "sign_type" {
continue
}
signSlice = append(signSlice, fmt.Sprintf("%s=%s", k, v[0]))
}
sort.Strings(signSlice)
signData := strings.Join(signSlice, "&")
if m["sign_type"] != "RSA" {
//错误日志
panic("签名类型未知")
}
client.DefaultAliWebClient().CheckSign(signData, m["sign"])
var aliPay common.AliWebPayResult
err := util.MapStringToStruct(m, &aliPay)
if err != nil {
w.Write([]byte("error"))
panic(err)
}
w.Write([]byte("success"))
return &aliPay, nil
}
// 支付宝app支付回调
func AliAppCallback(w http.ResponseWriter, r *http.Request) (*common.AliWebPayResult, error) {
var result string
defer func() {
w.Write([]byte(result))
}()
var m = make(map[string]string)
var signSlice []string
r.ParseForm()
for k, v := range r.Form {
m[k] = v[0]
if k == "sign" || k == "sign_type" {
continue
}
signSlice = append(signSlice, fmt.Sprintf("%s=%s", k, v[0]))
}
sort.Strings(signSlice)
signData := strings.Join(signSlice, "&")
if m["sign_type"] != "RSA2" {
result = "error"
panic("签名类型未知")
}
client.DefaultAliAppClient().CheckSign(signData, m["sign"])
mByte, err := json.Marshal(m)
if err != nil {
result = "error"
panic(err)
}
var aliPay common.AliWebPayResult
err = json.Unmarshal(mByte, &aliPay)
if err != nil {
result = "error"
panic(fmt.Sprintf("m is %v, err is %v", m, err))
}
result = "success"
return &aliPay, nil
}
// WxCallback 微信支付
func WxCallback(w http.ResponseWriter, r *http.Request) (*common.WxPayResult, error) {
var returnCode = "FAIL"
var returnMsg = ""
defer func() {
formatStr := `<xml><return_code><![CDATA[%s]]></return_code>
<return_msg>![CDATA[%s]]</return_msg></xml>`
returnBody := fmt.Sprintf(formatStr, returnCode, returnMsg)
w.Write([]byte(returnBody))
}()
var reXML common.WxPayResult
body, err := ioutil.ReadAll(r.Body)
if err != nil {
returnCode = "FAIL"
returnMsg = "Bodyerror"
return &reXML, errors.New(returnCode + ":" + returnMsg)
}
err = xml.Unmarshal(body, &reXML)
if err != nil {
returnCode = "FAIL"
returnMsg = "参数错误"
return &reXML, errors.New(returnCode + ":" + returnMsg)
}
if reXML.ReturnCode != "SUCCESS" {
returnCode = "FAIL"
return &reXML, errors.New(reXML.ReturnCode)
}
m := util.XmlToMap(body)
var signData []string
for k, v := range m {
if k == "sign" {
continue
}
signData = append(signData, fmt.Sprintf("%v=%v", k, v))
}
key := client.DefaultWxAppClient().Key
mySign, err := client.WxGenSign(key, m)
if err != nil {
return &reXML, err
}
if mySign != m["sign"] {
panic(errors.New("签名交易错误"))
}
returnCode = "SUCCESS"
return &reXML, nil
}
func WxWebCallback(w http.ResponseWriter, r *http.Request) (*common.WxPayResult, error) {
return WxCallback(w, r)
}
func WxAppCallback(w http.ResponseWriter, r *http.Request) (*common.WxPayResult, error) {
return WxCallback(w, r)
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/h79/goutils.git
git@gitee.com:h79/goutils.git
h79
goutils
goutils
v1.6.1

搜索帮助

Cb406eda 1850385 E526c682 1850385