github.com/lianghucheng/zrddz@v0.0.0-20200923083010-c71f680932e2/src/game/pay/wxpay/handle.go (about) 1 package wxpay 2 3 import ( 4 "common" 5 "crypto/md5" 6 "fmt" 7 "io" 8 "math/rand" 9 "net/url" 10 "strconv" 11 "time" 12 13 "github.com/name5566/leaf/log" 14 ) 15 16 var ( 17 appid = "wx19083502ba1a6c65" 18 body = "车主斗地主充值" 19 key = "987601DFA5CC4D61A0245AC9C4C66037" 20 mch_id = "1499094482" 21 notify_url = "http://czddz.shenzhouxing.com:8084/wxpay" 22 23 ReturnWXSuccess = "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>" 24 ReturnWXFail = "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[签名失败/参数格式校验错误]]></return_msg></xml>" 25 ) 26 27 type WXPayResult struct { 28 AppID string `xml:"appid"` 29 BankType string `xml:"bank_type"` // 付款银行 30 CashFee string `xml:"cash_fee"` // 现金支付金额 31 FeeType string `xml:"fee_type"` // 货币种类 32 IsSubscribe string `xml:"is_subscribe"` 33 MchID string `xml:"mch_id"` // 商户号 34 NonceStr string `xml:"nonce_str"` // 随机字符串 35 OpenID string `xml:"openid"` // 用户标识 36 OutTradeNo string `xml:"out_trade_no"` // 商户订单号 37 ResultCode string `xml:"result_code"` 38 ReturnCode string `xml:"return_code"` 39 Sign string `xml:"sign"` // 签名 40 TimeEnd string `xml:"time_end"` // 支付完成时间 41 TotalFee int `xml:"total_fee"` // 总金额 42 TradeType string `xml:"trade_type"` // 交易类型 43 TransactionID string `xml:"transaction_id"` // 微信支付订单号 44 } 45 46 func NewWXTradeAppPayParameter(total_fee, ip string) map[string]string { 47 m := map[string]string{} 48 m["appid"] = appid 49 m["body"] = body 50 m["key"] = key 51 m["mch_id"] = mch_id 52 m["notify_url"] = notify_url 53 m["out_trade_no"] = common.GetOutTradeNo() 54 m["total_fee"] = total_fee 55 m["spbill_create_ip"] = ip 56 return m 57 } 58 59 func init() { 60 rand.Seed(time.Now().UnixNano()) 61 } 62 63 func getSignParams(r *WXPayResult) url.Values { 64 p := url.Values{} 65 p.Add("appid", r.AppID) 66 p.Add("bank_type", r.BankType) 67 p.Add("cash_fee", r.CashFee) 68 p.Add("fee_type", r.FeeType) 69 p.Add("is_subscribe", r.IsSubscribe) 70 p.Add("mch_id", r.MchID) 71 p.Add("nonce_str", r.NonceStr) 72 p.Add("openid", r.OpenID) 73 p.Add("out_trade_no", r.OutTradeNo) 74 p.Add("result_code", r.ResultCode) 75 p.Add("return_code", r.ReturnCode) 76 p.Add("time_end", r.TimeEnd) 77 p.Add("total_fee", strconv.Itoa(r.TotalFee)) 78 p.Add("trade_type", r.TradeType) 79 p.Add("transaction_id", r.TransactionID) 80 return p 81 } 82 83 func VerifyPayResult(result *WXPayResult) bool { 84 if result.ReturnCode == "SUCCESS" && verify(generateSign(getSignParams(result)), result.Sign) { 85 return true 86 } 87 return false 88 } 89 90 func generateSign(params url.Values) string { 91 return sign(common.GetSignContent(params) + "&key=" + key) 92 } 93 94 func sign(data string) string { 95 log.Debug("%v", data) 96 m := md5.New() 97 io.WriteString(m, data) 98 return fmt.Sprintf("%X", m.Sum(nil)) 99 } 100 101 func verify(data string, sign string) bool { 102 log.Debug("%v", data) 103 return data == sign 104 }