mirror of
https://github.com/silenceper/wechat.git
synced 2026-02-09 15:12:26 +08:00
增加订单失效时间的参数 (#432)
* 增加订单失效时间的参数 * fix error golangci-lint: Function 'PrePayOrder' has too many statements * 增加一个支持 APP 支付的 Bridge 函数
This commit is contained in:
136
pay/order/pay.go
136
pay/order/pay.go
@@ -35,6 +35,7 @@ type Params struct {
|
|||||||
CreateIP string
|
CreateIP string
|
||||||
Body string
|
Body string
|
||||||
OutTradeNo string
|
OutTradeNo string
|
||||||
|
TimeExpire string // 订单失效时间,格式为yyyyMMddHHmmss,如2009年12月27日9点10分10秒表示为20091227091010。
|
||||||
OpenID string
|
OpenID string
|
||||||
TradeType string
|
TradeType string
|
||||||
SignType string
|
SignType string
|
||||||
@@ -54,6 +55,17 @@ type Config struct {
|
|||||||
PaySign string `json:"paySign"`
|
PaySign string `json:"paySign"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ConfigForApp 是传出用于 app sdk 用的参数
|
||||||
|
type ConfigForApp struct {
|
||||||
|
AppID string `json:"appid"`
|
||||||
|
MchID string `json:"partnerid"` // 微信支付分配的商户号
|
||||||
|
PrePayID string `json:"prepayid"`
|
||||||
|
Package string `json:"package"`
|
||||||
|
NonceStr string `json:"nonceStr"`
|
||||||
|
Timestamp string `json:"timestamp"`
|
||||||
|
Sign string `json:"sign"`
|
||||||
|
}
|
||||||
|
|
||||||
// PreOrder 是 Unified order 接口的返回
|
// PreOrder 是 Unified order 接口的返回
|
||||||
type PreOrder struct {
|
type PreOrder struct {
|
||||||
ReturnCode string `xml:"return_code"`
|
ReturnCode string `xml:"return_code"`
|
||||||
@@ -99,6 +111,27 @@ type payRequest struct {
|
|||||||
XMLName struct{} `xml:"xml"`
|
XMLName struct{} `xml:"xml"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (req *payRequest) BridgePayRequest(p *Params, AppID, MchID, nonceStr, sign string) *payRequest {
|
||||||
|
request := payRequest{
|
||||||
|
AppID: AppID,
|
||||||
|
MchID: MchID,
|
||||||
|
NonceStr: nonceStr,
|
||||||
|
Sign: sign,
|
||||||
|
Body: p.Body,
|
||||||
|
OutTradeNo: p.OutTradeNo,
|
||||||
|
TotalFee: p.TotalFee,
|
||||||
|
SpbillCreateIP: p.CreateIP,
|
||||||
|
NotifyURL: p.NotifyURL,
|
||||||
|
TradeType: p.TradeType,
|
||||||
|
OpenID: p.OpenID,
|
||||||
|
SignType: p.SignType,
|
||||||
|
Detail: p.Detail,
|
||||||
|
Attach: p.Attach,
|
||||||
|
GoodsTag: p.GoodsTag,
|
||||||
|
}
|
||||||
|
return &request
|
||||||
|
}
|
||||||
|
|
||||||
// BridgeConfig get js bridge config
|
// BridgeConfig get js bridge config
|
||||||
func (o *Order) BridgeConfig(p *Params) (cfg Config, err error) {
|
func (o *Order) BridgeConfig(p *Params) (cfg Config, err error) {
|
||||||
var (
|
var (
|
||||||
@@ -136,54 +169,85 @@ func (o *Order) BridgeConfig(p *Params) (cfg Config, err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// BridgeAppConfig get app bridge config
|
||||||
|
func (o *Order) BridgeAppConfig(p *Params) (cfg ConfigForApp, err error) {
|
||||||
|
var (
|
||||||
|
timestamp string = strconv.FormatInt(time.Now().Unix(), 10)
|
||||||
|
noncestr string = util.RandomStr(32)
|
||||||
|
_package string = "Sign=WXPay"
|
||||||
|
)
|
||||||
|
order, err := o.PrePayOrder(p)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
result := map[string]string{
|
||||||
|
"appid": order.AppID,
|
||||||
|
"partnerid": order.MchID,
|
||||||
|
"prepayid": order.PrePayID,
|
||||||
|
"package": _package,
|
||||||
|
"noncestr": noncestr,
|
||||||
|
"timestamp": timestamp,
|
||||||
|
}
|
||||||
|
// 签名
|
||||||
|
sign, err := util.ParamSign(result, o.Key)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
result["sign"] = sign
|
||||||
|
cfg = ConfigForApp{
|
||||||
|
AppID: result["appid"],
|
||||||
|
MchID: result["partnerid"],
|
||||||
|
PrePayID: result["prepayid"],
|
||||||
|
Package: result["package"],
|
||||||
|
NonceStr: result["noncestr"],
|
||||||
|
Timestamp: result["timestamp"],
|
||||||
|
Sign: result["sign"],
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// PrePayOrder return data for invoke wechat payment
|
// PrePayOrder return data for invoke wechat payment
|
||||||
func (o *Order) PrePayOrder(p *Params) (payOrder PreOrder, err error) {
|
func (o *Order) PrePayOrder(p *Params) (payOrder PreOrder, err error) {
|
||||||
nonceStr := util.RandomStr(32)
|
nonceStr := util.RandomStr(32)
|
||||||
notifyURL := o.NotifyURL
|
param := map[string]string{
|
||||||
// 签名类型
|
"appid": o.AppID,
|
||||||
if p.SignType == "" {
|
"body": p.Body,
|
||||||
p.SignType = util.SignTypeMD5
|
"mch_id": o.MchID,
|
||||||
|
"nonce_str": nonceStr,
|
||||||
|
"out_trade_no": p.OutTradeNo,
|
||||||
|
"spbill_create_ip": p.CreateIP,
|
||||||
|
"total_fee": p.TotalFee,
|
||||||
|
"trade_type": p.TradeType,
|
||||||
|
"openid": p.OpenID,
|
||||||
|
"sign_type": p.SignType,
|
||||||
|
"detail": p.Detail,
|
||||||
|
"attach": p.Attach,
|
||||||
|
"goods_tag": p.GoodsTag,
|
||||||
}
|
}
|
||||||
|
// 签名类型
|
||||||
|
if param["sign_type"] == "" {
|
||||||
|
param["sign_type"] = util.SignTypeMD5
|
||||||
|
}
|
||||||
|
|
||||||
// 通知地址
|
// 通知地址
|
||||||
if p.NotifyURL != "" {
|
if p.NotifyURL != "" {
|
||||||
notifyURL = p.NotifyURL
|
param["notify_url"] = p.NotifyURL
|
||||||
|
}
|
||||||
|
|
||||||
|
if p.TimeExpire != "" {
|
||||||
|
// 如果有传入交易结束时间
|
||||||
|
param["time_expire"] = p.TimeExpire
|
||||||
}
|
}
|
||||||
param := make(map[string]string)
|
|
||||||
param["appid"] = o.AppID
|
|
||||||
param["body"] = p.Body
|
|
||||||
param["mch_id"] = o.MchID
|
|
||||||
param["nonce_str"] = nonceStr
|
|
||||||
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["sign_type"] = p.SignType
|
|
||||||
param["detail"] = p.Detail
|
|
||||||
param["attach"] = p.Attach
|
|
||||||
param["goods_tag"] = p.GoodsTag
|
|
||||||
param["notify_url"] = notifyURL
|
|
||||||
|
|
||||||
sign, err := util.ParamSign(param, o.Key)
|
sign, err := util.ParamSign(param, o.Key)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
request := payRequest{
|
request := new(payRequest).BridgePayRequest(p, o.AppID, o.MchID, nonceStr, sign)
|
||||||
AppID: o.AppID,
|
if len(p.TimeExpire) > 0 {
|
||||||
MchID: o.MchID,
|
// 如果有传入交易结束时间
|
||||||
NonceStr: nonceStr,
|
request.TimeExpire = p.TimeExpire
|
||||||
Sign: sign,
|
|
||||||
Body: p.Body,
|
|
||||||
OutTradeNo: p.OutTradeNo,
|
|
||||||
TotalFee: p.TotalFee,
|
|
||||||
SpbillCreateIP: p.CreateIP,
|
|
||||||
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)
|
rawRet, err := util.PostXML(payGateway, request)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
Reference in New Issue
Block a user