@@ -9,6 +9,9 @@ import ( | |||||
"applet/app/db/model" | "applet/app/db/model" | ||||
"applet/app/e" | "applet/app/e" | ||||
"applet/app/enum" | "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" | svc3 "applet/app/svc" | ||||
"applet/app/utils" | "applet/app/utils" | ||||
"context" | "context" | ||||
@@ -16,9 +19,6 @@ import ( | |||||
"github.com/chromedp/chromedp" | "github.com/chromedp/chromedp" | ||||
"github.com/chromedp/chromedp/device" | "github.com/chromedp/chromedp/device" | ||||
"github.com/gin-gonic/gin" | "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" | "io/ioutil" | ||||
"strconv" | "strconv" | ||||
"time" | "time" | ||||
@@ -148,6 +148,62 @@ func WxPay(c *gin.Context) { | |||||
return | 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) { | func Demo(c *gin.Context) { | ||||
sysCfgDb := db.SysCfgDb{} | sysCfgDb := db.SysCfgDb{} | ||||
sysCfgDb.Set() | sysCfgDb.Set() | ||||
@@ -1094,7 +1094,6 @@ func (o StoreInfo) Clone() *StoreInfo { | |||||
return &ret | return &ret | ||||
} | } | ||||
// CombineTransactionsPrepayRequest | // CombineTransactionsPrepayRequest | ||||
type CombineTransactionsPrepayRequest struct { | type CombineTransactionsPrepayRequest struct { | ||||
// 【合单商户Appid】 合单发起方的Appid | // 【合单商户Appid】 合单发起方的Appid | ||||
@@ -1102,27 +1101,47 @@ type CombineTransactionsPrepayRequest struct { | |||||
// 【合单商户订单号】 合单支付总订单号,最短2个字符,最长32个字符,只能是数字、大小写字母,以及_-|* ,且在同一个商户号下唯一 | // 【合单商户订单号】 合单支付总订单号,最短2个字符,最长32个字符,只能是数字、大小写字母,以及_-|* ,且在同一个商户号下唯一 | ||||
CombineOutTradeNo *string `json:"combine_out_trade_no"` | 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格式 | // 订单失效时间,格式为rfc3339格式 | ||||
TimeExpire *time.Time `json:"time_expire,omitempty"` | TimeExpire *time.Time `json:"time_expire,omitempty"` | ||||
// 附加数据 | |||||
Attach *string `json:"attach,omitempty"` | |||||
// 有效性:1. HTTPS;2. 不允许携带查询串。 | // 有效性:1. HTTPS;2. 不允许携带查询串。 | ||||
NotifyUrl *string `json:"notify_url"` | NotifyUrl *string `json:"notify_url"` | ||||
// 商品标记,代金券或立减优惠功能的参数。 | |||||
GoodsTag *string `json:"goods_tag,omitempty"` | |||||
// 商户订单号 | |||||
// 指定支付方式 | // 指定支付方式 | ||||
LimitPay []string `json:"limit_pay,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"` | |||||
} | |||||
} | |||||
// 【子单信息】 子单列表,最多支持子单条数: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"` | |||||
} |
@@ -32,6 +32,7 @@ func CustomerInit(r *gin.RouterGroup) { | |||||
r.POST("/wxDecryptUserInfo", hdl.WxDecryptUserInfo) | r.POST("/wxDecryptUserInfo", hdl.WxDecryptUserInfo) | ||||
r.POST("/wxDecryptMobile", hdl.WxDecryptMobile) | r.POST("/wxDecryptMobile", hdl.WxDecryptMobile) | ||||
r.POST("/wxPay", hdl.WxPay) | r.POST("/wxPay", hdl.WxPay) | ||||
r.POST("/wxCombineTransactionsPay", hdl.WxCombineTransactionsPay) | |||||
r.POST("/register", hdl.Register) | r.POST("/register", hdl.Register) | ||||
r.POST("/aesDecrypt", hdl.AesDecrypt) //TODO::专门给解密支付宝手机号 | r.POST("/aesDecrypt", hdl.AesDecrypt) //TODO::专门给解密支付宝手机号 | ||||