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  }