From abd7f512baa7df6e229d042f65163023157af13e Mon Sep 17 00:00:00 2001 From: ciel yu Date: Mon, 14 Oct 2019 18:33:50 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E6=94=AF=E4=BB=98=20=E6=96=B0=E5=A2=9E=20B?= =?UTF-8?q?ridgeConfig=20=E6=96=B9=E6=B3=95=EF=BC=8C=E5=8F=AF=E8=8E=B7?= =?UTF-8?q?=E5=BE=97=20prepay=20ID=EF=BC=8C=E5=8F=8Ajs=E6=94=AF=E4=BB=98?= =?UTF-8?q?=E6=97=B6=E6=89=80=E9=9C=80=E8=A6=81=E7=9A=84=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pay/pay.go | 63 ++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 57 insertions(+), 6 deletions(-) diff --git a/pay/pay.go b/pay/pay.go index 1afa094..1e43514 100644 --- a/pay/pay.go +++ b/pay/pay.go @@ -2,10 +2,17 @@ package pay import ( "bytes" + "crypto/hmac" + "crypto/md5" + "crypto/sha256" + "encoding/hex" "encoding/xml" "errors" + "hash" "sort" "strconv" + "strings" + "time" "github.com/silenceper/wechat/context" "github.com/silenceper/wechat/util" @@ -27,15 +34,17 @@ type Params struct { OutTradeNo string OpenID string TradeType string + SignType string } -// Config 是传出用于 jsdk 用的参数 +// Config 是传出用于 js sdk 用的参数 type Config struct { - Timestamp int64 - NonceStr string - PrePayID string - SignType string - Sign string + Timestamp string `json:"timestamp"` + NonceStr string `json:"nonceStr"` + PrePayID string `json:"prePayId"` + SignType string `json:"signType"` + Package string `json:"package"` + PaySign string `json:"paySign"` } // PreOrder 是 unifie order 接口的返回 @@ -86,6 +95,48 @@ func NewPay(ctx *context.Context) *Pay { return &pay } +// BridgeConfig get js bridge config +func (pcf *Pay) BridgeConfig(p *Params) (cfg Config, err error) { + var ( + buffer strings.Builder + h hash.Hash + timestamp = strconv.FormatInt(time.Now().Unix(), 10) + ) + order, err := pcf.PrePayOrder(p) + if err != nil { + return + } + if p.SignType == "" { + p.SignType = "MD5" + } + buffer.WriteString("appId=") + buffer.WriteString(order.AppID) + buffer.WriteString("&nonceStr=") + buffer.WriteString(order.NonceStr) + buffer.WriteString("&package=") + buffer.WriteString("prepay_id=" + order.PrePayID) + buffer.WriteString("&signType=") + buffer.WriteString(p.SignType) + buffer.WriteString("&timeStamp=") + buffer.WriteString(timestamp) + buffer.WriteString("&key=") + buffer.WriteString(pcf.PayKey) + if p.SignType == "MD5" { + h = md5.New() + } else { + h = hmac.New(sha256.New, []byte(pcf.PayKey)) + } + h.Write([]byte(buffer.String())) + // 签名 + cfg.PaySign = strings.ToUpper(hex.EncodeToString(h.Sum(nil))) + cfg.NonceStr = order.NonceStr + cfg.Timestamp = timestamp + cfg.PrePayID = order.PrePayID + cfg.SignType = p.SignType + cfg.Package = "prepay_id=" + order.PrePayID + return +} + // PrePayOrder return data for invoke wechat payment func (pcf *Pay) PrePayOrder(p *Params) (payOrder PreOrder, err error) { nonceStr := util.RandomStr(32) From 546dce2396bcb39857ac5fed51433b4a3524c9dd Mon Sep 17 00:00:00 2001 From: ciel yu Date: Mon, 14 Oct 2019 18:59:42 +0800 Subject: [PATCH 2/6] =?UTF-8?q?=E6=94=AF=E4=BB=98=20=E6=96=B0=E5=A2=9E=20B?= =?UTF-8?q?ridgeConfig=20=E6=96=B9=E6=B3=95=EF=BC=8C=E5=8F=AF=E8=8E=B7?= =?UTF-8?q?=E5=BE=97=20prepay=20ID=EF=BC=8C=E5=8F=8Ajs=E6=94=AF=E4=BB=98?= =?UTF-8?q?=E6=97=B6=E6=89=80=E9=9C=80=E8=A6=81=E7=9A=84=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 统一下单 新增非必传参数 --- pay/pay.go | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/pay/pay.go b/pay/pay.go index 1e43514..0795c79 100644 --- a/pay/pay.go +++ b/pay/pay.go @@ -35,6 +35,10 @@ type Params struct { OpenID string TradeType string SignType string + Detail string + Attach string + GoodsTag string + NotifyUrl string } // Config 是传出用于 js sdk 用的参数 @@ -145,12 +149,23 @@ func (pcf *Pay) PrePayOrder(p *Params) (payOrder PreOrder, err error) { param["body"] = p.Body param["mch_id"] = pcf.PayMchID param["nonce_str"] = nonceStr - param["notify_url"] = pcf.PayNotifyURL param["out_trade_no"] = p.OutTradeNo param["spbill_create_ip"] = p.CreateIP param["total_fee"] = p.TotalFee param["trade_type"] = p.TradeType param["openid"] = p.OpenID + param["detail"] = p.Detail + param["attach"] = p.Attach + param["goods_tag"] = p.GoodsTag + param["notify_url"] = pcf.PayNotifyURL + // 签名类型 + if p.SignType != "" { + param["sign_type"] = p.SignType + } + // 通知地址 + if p.NotifyUrl != "" { + param["notify_url"] = p.NotifyUrl + } bizKey := "&key=" + pcf.PayKey str := orderParam(param, bizKey) From 3ea624f832c64165f112645a2ed6ef157e069a21 Mon Sep 17 00:00:00 2001 From: ciel yu Date: Mon, 14 Oct 2019 19:08:35 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=E6=94=AF=E4=BB=98=20=E6=96=B0=E5=A2=9E=20B?= =?UTF-8?q?ridgeConfig=20=E6=96=B9=E6=B3=95=EF=BC=8C=E5=8F=AF=E8=8E=B7?= =?UTF-8?q?=E5=BE=97=20prepay=20ID=EF=BC=8C=E5=8F=8Ajs=E6=94=AF=E4=BB=98?= =?UTF-8?q?=E6=97=B6=E6=89=80=E9=9C=80=E8=A6=81=E7=9A=84=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 统一下单 新增非必传参数 --- pay/pay.go | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/pay/pay.go b/pay/pay.go index 0795c79..b5da017 100644 --- a/pay/pay.go +++ b/pay/pay.go @@ -38,7 +38,7 @@ type Params struct { Detail string Attach string GoodsTag string - NotifyUrl string + NotifyURL string } // Config 是传出用于 js sdk 用的参数 @@ -67,7 +67,7 @@ type PreOrder struct { ErrCodeDes string `xml:"err_code_des,omitempty"` } -//payRequest 接口请求参数 +// payRequest 接口请求参数 type payRequest struct { AppID string `xml:"appid"` MchID string `xml:"mch_id"` @@ -77,20 +77,20 @@ type payRequest struct { SignType string `xml:"sign_type,omitempty"` Body string `xml:"body"` Detail string `xml:"detail,omitempty"` - Attach string `xml:"attach,omitempty"` //附加数据 - OutTradeNo string `xml:"out_trade_no"` //商户订单号 - FeeType string `xml:"fee_type,omitempty"` //标价币种 - TotalFee string `xml:"total_fee"` //标价金额 - SpbillCreateIP string `xml:"spbill_create_ip"` //终端IP - TimeStart string `xml:"time_start,omitempty"` //交易起始时间 - TimeExpire string `xml:"time_expire,omitempty"` //交易结束时间 - GoodsTag string `xml:"goods_tag,omitempty"` //订单优惠标记 - NotifyURL string `xml:"notify_url"` //通知地址 - TradeType string `xml:"trade_type"` //交易类型 - ProductID string `xml:"product_id,omitempty"` //商品ID + Attach string `xml:"attach,omitempty"` // 附加数据 + OutTradeNo string `xml:"out_trade_no"` // 商户订单号 + FeeType string `xml:"fee_type,omitempty"` // 标价币种 + TotalFee string `xml:"total_fee"` // 标价金额 + SpbillCreateIP string `xml:"spbill_create_ip"` // 终端IP + TimeStart string `xml:"time_start,omitempty"` // 交易起始时间 + TimeExpire string `xml:"time_expire,omitempty"` // 交易结束时间 + GoodsTag string `xml:"goods_tag,omitempty"` // 订单优惠标记 + NotifyURL string `xml:"notify_url"` // 通知地址 + TradeType string `xml:"trade_type"` // 交易类型 + ProductID string `xml:"product_id,omitempty"` // 商品ID LimitPay string `xml:"limit_pay,omitempty"` // - OpenID string `xml:"openid,omitempty"` //用户标识 - SceneInfo string `xml:"scene_info,omitempty"` //场景信息 + OpenID string `xml:"openid,omitempty"` // 用户标识 + SceneInfo string `xml:"scene_info,omitempty"` // 场景信息 } // NewPay return an instance of Pay package @@ -153,7 +153,7 @@ func (pcf *Pay) PrePayOrder(p *Params) (payOrder PreOrder, err error) { param["spbill_create_ip"] = p.CreateIP param["total_fee"] = p.TotalFee param["trade_type"] = p.TradeType - param["openid"] = p.OpenID + param["openid"] = p.OpenIDÒ param["detail"] = p.Detail param["attach"] = p.Attach param["goods_tag"] = p.GoodsTag @@ -192,7 +192,7 @@ func (pcf *Pay) PrePayOrder(p *Params) (payOrder PreOrder, err error) { return } if payOrder.ReturnCode == "SUCCESS" { - //pay success + // pay success if payOrder.ResultCode == "SUCCESS" { err = nil return From 09dabb232d5e39277a239582201b409eccb7fbd0 Mon Sep 17 00:00:00 2001 From: ciel yu Date: Mon, 14 Oct 2019 19:14:02 +0800 Subject: [PATCH 4/6] =?UTF-8?q?=E6=94=AF=E4=BB=98=20=E6=96=B0=E5=A2=9E=20B?= =?UTF-8?q?ridgeConfig=20=E6=96=B9=E6=B3=95=EF=BC=8C=E5=8F=AF=E8=8E=B7?= =?UTF-8?q?=E5=BE=97=20prepay=20ID=EF=BC=8C=E5=8F=8Ajs=E6=94=AF=E4=BB=98?= =?UTF-8?q?=E6=97=B6=E6=89=80=E9=9C=80=E8=A6=81=E7=9A=84=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 统一下单 新增非必传参数 --- pay/pay.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pay/pay.go b/pay/pay.go index b5da017..1aa8062 100644 --- a/pay/pay.go +++ b/pay/pay.go @@ -163,8 +163,8 @@ func (pcf *Pay) PrePayOrder(p *Params) (payOrder PreOrder, err error) { param["sign_type"] = p.SignType } // 通知地址 - if p.NotifyUrl != "" { - param["notify_url"] = p.NotifyUrl + if p.NotifyURL != "" { + param["notify_url"] = p.NotifyURL } bizKey := "&key=" + pcf.PayKey From f68f9d6f5edf086185e6cdddb97f26bf3c5b74e3 Mon Sep 17 00:00:00 2001 From: ciel yu Date: Mon, 14 Oct 2019 19:28:28 +0800 Subject: [PATCH 5/6] =?UTF-8?q?=E6=94=AF=E4=BB=98=20=E6=96=B0=E5=A2=9E=20B?= =?UTF-8?q?ridgeConfig=20=E6=96=B9=E6=B3=95=EF=BC=8C=E5=8F=AF=E8=8E=B7?= =?UTF-8?q?=E5=BE=97=20prepay=20ID=EF=BC=8C=E5=8F=8Ajs=E6=94=AF=E4=BB=98?= =?UTF-8?q?=E6=97=B6=E6=89=80=E9=9C=80=E8=A6=81=E7=9A=84=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 统一下单 新增非必传参数 --- pay/pay.go | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/pay/pay.go b/pay/pay.go index 1aa8062..f4655c1 100644 --- a/pay/pay.go +++ b/pay/pay.go @@ -110,9 +110,6 @@ func (pcf *Pay) BridgeConfig(p *Params) (cfg Config, err error) { if err != nil { return } - if p.SignType == "" { - p.SignType = "MD5" - } buffer.WriteString("appId=") buffer.WriteString(order.AppID) buffer.WriteString("&nonceStr=") @@ -144,6 +141,15 @@ func (pcf *Pay) BridgeConfig(p *Params) (cfg Config, err error) { // PrePayOrder return data for invoke wechat payment func (pcf *Pay) PrePayOrder(p *Params) (payOrder PreOrder, err error) { nonceStr := util.RandomStr(32) + notifyURL := pcf.PayNotifyURL + // 签名类型 + if p.SignType == "" { + p.SignType = "MD5" + } + // 通知地址 + if p.NotifyURL != "" { + notifyURL = p.NotifyURL + } param := make(map[string]interface{}) param["appid"] = pcf.AppID param["body"] = p.Body @@ -153,19 +159,11 @@ func (pcf *Pay) PrePayOrder(p *Params) (payOrder PreOrder, err error) { param["spbill_create_ip"] = p.CreateIP param["total_fee"] = p.TotalFee param["trade_type"] = p.TradeType - param["openid"] = p.OpenIDÒ + param["openid"] = p.OpenID param["detail"] = p.Detail param["attach"] = p.Attach param["goods_tag"] = p.GoodsTag - param["notify_url"] = pcf.PayNotifyURL - // 签名类型 - if p.SignType != "" { - param["sign_type"] = p.SignType - } - // 通知地址 - if p.NotifyURL != "" { - param["notify_url"] = p.NotifyURL - } + param["notify_url"] = notifyURL bizKey := "&key=" + pcf.PayKey str := orderParam(param, bizKey) @@ -179,9 +177,13 @@ func (pcf *Pay) PrePayOrder(p *Params) (payOrder PreOrder, err error) { OutTradeNo: p.OutTradeNo, TotalFee: p.TotalFee, SpbillCreateIP: p.CreateIP, - NotifyURL: pcf.PayNotifyURL, + NotifyURL: notifyURL, TradeType: p.TradeType, OpenID: p.OpenID, + SignType: p.SignType, + Detail: p.Detail, + Attach: p.Attach, + GoodsTag: p.GoodsTag, } rawRet, err := util.PostXML(payGateway, request) if err != nil { From 0c9dd16f1fa97c4f5cc5853cf7bc60f81d61dafe Mon Sep 17 00:00:00 2001 From: ciel yu Date: Mon, 14 Oct 2019 19:35:08 +0800 Subject: [PATCH 6/6] =?UTF-8?q?=E6=94=AF=E4=BB=98=20=E6=96=B0=E5=A2=9E=20B?= =?UTF-8?q?ridgeConfig=20=E6=96=B9=E6=B3=95=EF=BC=8C=E5=8F=AF=E8=8E=B7?= =?UTF-8?q?=E5=BE=97=20prepay=20ID=EF=BC=8C=E5=8F=8Ajs=E6=94=AF=E4=BB=98?= =?UTF-8?q?=E6=97=B6=E6=89=80=E9=9C=80=E8=A6=81=E7=9A=84=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 统一下单 新增非必传参数 --- pay/pay.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pay/pay.go b/pay/pay.go index f4655c1..1e25d18 100644 --- a/pay/pay.go +++ b/pay/pay.go @@ -160,6 +160,7 @@ func (pcf *Pay) PrePayOrder(p *Params) (payOrder PreOrder, err error) { param["total_fee"] = p.TotalFee param["trade_type"] = p.TradeType param["openid"] = p.OpenID + param["sign_type"] = p.SignType param["detail"] = p.Detail param["attach"] = p.Attach param["goods_tag"] = p.GoodsTag