diff --git a/app/customer/hdl/hdl_demo.go b/app/customer/hdl/hdl_demo.go index 65902b3..b15032d 100644 --- a/app/customer/hdl/hdl_demo.go +++ b/app/customer/hdl/hdl_demo.go @@ -9,6 +9,9 @@ import ( "applet/app/db/model" "applet/app/e" "applet/app/enum" + "applet/app/lib/wechatpay/core" + "applet/app/lib/wechatpay/services/certificates" + "applet/app/lib/wechatpay/services/partnerpayments/jsapi" svc3 "applet/app/svc" "applet/app/utils" "context" @@ -16,9 +19,6 @@ import ( "github.com/chromedp/chromedp" "github.com/chromedp/chromedp/device" "github.com/gin-gonic/gin" - "applet/app/lib/wechatpay/core" - "applet/app/lib/wechatpay/services/certificates" - "applet/app/lib/wechatpay/services/partnerpayments/jsapi" "io/ioutil" "strconv" "time" @@ -148,6 +148,62 @@ func WxPay(c *gin.Context) { return } +func WxCombineTransactionsPay(c *gin.Context) { + client, err := svc3.NewWxPayClient(c) + if err != nil { + e.OutErr(c, e.ERR, err.Error()) + return + } + wxSvc := jsapi.JsapiCombineTransactionsApiService{Client: client} + sysCfgDb := db.SysCfgDb{} + sysCfgDb.Set() + sysCfg := sysCfgDb.SysCfgFindWithDb(enum.WxSpAppId, enum.WxSpMchId, enum.WxAppletAppId, enum.WxMchId) + + outTradeNo := strconv.FormatInt(time.Now().Unix(), 10) + resp, result, err := wxSvc.Prepay(c, + jsapi.CombineTransactionsPrepayRequest{ + CombineAppid: core.String(sysCfg[enum.WxSpAppId]), + CombineOutTradeNo: core.String(outTradeNo), + CombineMchid: core.String(sysCfg[enum.WxSpMchId]), + SceneInfo: nil, + CombinePayerInfo: &jsapi.CombinePayerInfo{ + SubOpenid: core.String("o0mnM4nlX9W5HXbagffM9eTDHaPo"), + }, + SubOrders: &[]jsapi.SubOrders{ + jsapi.SubOrders{ + Mchid: core.String(sysCfg[enum.WxSpMchId]), + Attach: core.String("自定义数据说明"), + Amount: &struct { + // 订单总金额,单位为分 + TotalAmount *int64 `json:"total_amount"` + // CNY:人民币,境内商户号仅支持人民币。 + Currency *string `json:"currency,omitempty"` + }{ + Currency: core.String("CNY"), + TotalAmount: core.Int64(100), + }, + OutTradeNo: core.String(outTradeNo + "_1"), + SubMchid: core.String(sysCfg[enum.WxMchId]), + Detail: "", + Description: core.String("腾讯充值中心-QQ会员充值"), + SettleInfo: nil, + }, + }, + NotifyUrl: core.String("https://www.weixin.qq.com/wxpay/pay.php"), + LimitPay: nil, + }, + ) + if err != nil { + // 处理错误 + e.OutErr(c, e.ERR, err.Error()) + return + } else { + // 处理返回结果 + println("status=%d resp=%s", result.Response.StatusCode, resp) + } + return +} + func Demo(c *gin.Context) { sysCfgDb := db.SysCfgDb{} sysCfgDb.Set() diff --git a/app/lib/wechatpay/services/partnerpayments/jsapi/models.go b/app/lib/wechatpay/services/partnerpayments/jsapi/models.go index db7f5af..ef2d585 100644 --- a/app/lib/wechatpay/services/partnerpayments/jsapi/models.go +++ b/app/lib/wechatpay/services/partnerpayments/jsapi/models.go @@ -1094,7 +1094,6 @@ func (o StoreInfo) Clone() *StoreInfo { return &ret } - // CombineTransactionsPrepayRequest type CombineTransactionsPrepayRequest struct { // 【合单商户Appid】 合单发起方的Appid @@ -1102,27 +1101,47 @@ type CombineTransactionsPrepayRequest struct { // 【合单商户订单号】 合单支付总订单号,最短2个字符,最长32个字符,只能是数字、大小写字母,以及_-|* ,且在同一个商户号下唯一 CombineOutTradeNo *string `json:"combine_out_trade_no"` // 【合单商户号】 合单发起方商户号 - CombineMchid *string `json:"combine_mchid"` - SceneInfo *SceneInfo `json:"scene_info,omitempty"` - - // 商品描述 - Description *string `json:"description"` - // 商户订单号 - OutTradeNo *string `json:"out_trade_no"` + CombineMchid *string `json:"combine_mchid"` + SceneInfo *SceneInfo `json:"scene_info,omitempty"` + CombinePayerInfo *CombinePayerInfo `json:"combine_payer_info"` + SubOrders *[]SubOrders `json:"sub_orders"` + // 【交易起始时间】 订单生效时间,按照rfc3339格式,格式为yyyy-MM-DDTHH:mm:ss+TIMEZONE,yyyy-MM-DD表示年月日,T出现在字符串中,表示time元素的开头,HH:mm:ss表示时分秒,TIMEZONE表示时区(+08:00表示东八区时间,领先UTC8小时,即北京时间)如 2018-06-08T10:34:56+08:00 代表,北京时间2018年06月08日10时34分56秒。 + Timetart *string `json:"time_start,omitempty"` // 订单失效时间,格式为rfc3339格式 TimeExpire *time.Time `json:"time_expire,omitempty"` - // 附加数据 - Attach *string `json:"attach,omitempty"` // 有效性:1. HTTPS;2. 不允许携带查询串。 NotifyUrl *string `json:"notify_url"` - // 商品标记,代金券或立减优惠功能的参数。 - GoodsTag *string `json:"goods_tag,omitempty"` + // 商户订单号 // 指定支付方式 LimitPay []string `json:"limit_pay,omitempty"` - // 传入true时,支付成功消息和支付详情页将出现开票入口。需要在微信支付商户平台或微信公众平台开通电子发票功能,传此字段才可生效。 - SupportFapiao *bool `json:"support_fapiao,omitempty"` - Amount *Amount `json:"amount"` - Payer *Payer `json:"payer"` - Detail *Detail `json:"detail,omitempty"` - SettleInfo *SettleInfo `json:"settle_info,omitempty"` -} \ No newline at end of file +} + +// 【子单信息】 子单列表,最多支持子单条数:50。 +type SubOrders struct { + // 【子单商户号】 子单发起方商户号,与发起方Appid有绑定关系 + Mchid *string `json:"mchid"` + Attach *string `json:"attach"` + Amount *struct { + // 订单总金额,单位为分 + TotalAmount *int64 `json:"total_amount"` + // CNY:人民币,境内商户号仅支持人民币。 + Currency *string `json:"currency,omitempty"` + } `json:"amount"` + //【子单商户订单号】 商户系统内部订单号,最短2个字符,最长32个字符,只能是数字、大小写字母_-|* ,且在同一个商户号下唯一。 + OutTradeNo *string `json:"out_trade_no"` + // 子商户的商户号,由微信支付生成并下发 + SubMchid *string `json:"sub_mchid"` + // 【商品详情】 商品详细描述 + Detail string `json:"detail,omitempty"` + // 商品描述 + Description *string `json:"description"` + SettleInfo *SettleInfo `json:"settle_info,omitempty"` +} + +// 【支付者】 支付者信息,可以指定用户的实名信息,必须指定用户的openid或sub_openid。 +type CombinePayerInfo struct { + // 【用户标识】 使用合单Appid获取的对应用户Openid。是用户在商户Appid下的唯一标识。 + Openid *string `json:"openid,omitempty"` + // 【用户子标识】 服务商模式下,使用某个子商户的Appid获取的对应用户Openid,是用户在该子商户Appid下的唯一标识。openid和sub_openid可以选传其中之一,如果选择传sub_openid,则必须传sub_appid。 + SubOpenid *string `json:"sub_openid,omitempty"` +} diff --git a/app/router/customer_router.go b/app/router/customer_router.go index 8f848e3..44c35e0 100644 --- a/app/router/customer_router.go +++ b/app/router/customer_router.go @@ -32,6 +32,7 @@ func CustomerInit(r *gin.RouterGroup) { r.POST("/wxDecryptUserInfo", hdl.WxDecryptUserInfo) r.POST("/wxDecryptMobile", hdl.WxDecryptMobile) r.POST("/wxPay", hdl.WxPay) + r.POST("/wxCombineTransactionsPay", hdl.WxCombineTransactionsPay) r.POST("/register", hdl.Register) r.POST("/aesDecrypt", hdl.AesDecrypt) //TODO::专门给解密支付宝手机号