| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427 |
- /*
- * Copyright silenceper/wechat Author(https://silenceper.com/wechat/). All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * You can obtain one at https://github.com/silenceper/wechat.
- *
- */
- package virtualpayment
- import (
- "github.com/silenceper/wechat/v2/miniprogram/context"
- "github.com/silenceper/wechat/v2/util"
- )
- // VirtualPayment mini program virtual payment
- // https://developers.weixin.qq.com/miniprogram/dev/platform-capabilities/industry/virtual-payment.html#_2-3-%E6%9C%8D%E5%8A%A1%E5%99%A8API
- type VirtualPayment struct {
- ctx *context.Context
- sessionKey string
- }
- // Env Environment 0 - Production environment 1 - Sandbox environment
- type Env int
- // ErrCode error code
- type ErrCode int
- // OrderStatus 订单状态
- type OrderStatus int
- // CommonRequest common request parameters
- type CommonRequest struct {
- OpenID string `json:"openid"` // The user's openID
- Env Env `json:"env"` // Environment 0 - Production environment 1 - Sandbox environment
- }
- // PaymentRequest payment request parameters
- type PaymentRequest struct {
- SignData string `json:"sign_data"` // 具体支付参数见 signData, 该参数需以 string 形式传递,例如 signData: '{"offerId":"123","buyQuantity":1,"env":0,"currencyType":"CNY","platform":"android","productId":"testproductId","goodsPrice":10,"outTradeNo":"xxxxxx","attach":"testdata"}'
- Mode string `json:"mode"` // 支付模式,枚举值:short_series_goods: 道具直购,short_series_coin: 代币充值
- PaySig string `json:"pay_sig"` // 支付签名,具体生成方式见下方说明
- Signature string `json:"signature"` // 用户态签名,具体生成方式见下方说明
- }
- // SignData 签名数据
- type SignData struct {
- OfferID string `json:"offerId"` // 在米大师侧申请的应用 id, mp-支付基础配置中的 offerid
- BuyQuantity int `json:"buyQuantity"` // 购买数量
- Env Env `json:"env"` // 环境 0-正式环境 1-沙箱环境
- CurrencyType string `json:"currencyType"` // 币种 默认值:CNY 人民币
- Platform string `json:"platform,omitempty"` // 申请接入时的平台,platform 与应用 id 有关 默认值:android 安卓平台
- ProductID string `json:"productId,omitempty"` // 道具 ID, **该字段仅 mode=short_series_goods 时可用**
- GoodsPrice int `json:"goodsPrice"` // 道具单价 (分), **该字段仅 mode=short_series_goods 时可用**, 用来校验价格与后台道具价格是否一致,避免用户在业务商城页看到的价格与实际价格不一致导致投诉
- OutTradeNo string `json:"outTradeNo"` // 业务订单号,每个订单号只能使用一次,重复使用会失败 (极端情况不保证唯一,不建议业务强依赖唯一性). 要求 8-32 个字符内,只能是数字、大小写字母、符号 _-|*@组成,不能以下划线 (_) 开头
- Attach string `json:"attach"` // 透传数据,发货通知时会透传给开发者
- }
- // QueryUserBalanceRequest 查询用户代币余额,请求参数
- // 1. 需要用户态签名与支付签名
- // POST,请求参数为 json 字符串,Content-Type 为 application/json
- type QueryUserBalanceRequest struct {
- CommonRequest
- UserIP string `json:"user_ip"` // 用户 ip,例如:1.1.1.1
- }
- // QueryUserBalanceResponse 查询虚拟支付余额 响应参数
- type QueryUserBalanceResponse struct {
- util.CommonError
- Balance int `json:"balance"` // 代币总余额,包括有价和赠送部分
- PresentBalance int `json:"present_balance"` // 赠送账户的代币余额
- SumSave int `json:"sum_save"` // 累计有价货币充值数量
- SumPresent int `json:"sum_present"` // 累计赠送无价货币数量
- SumBalance int `json:"sum_balance"` // 历史总增加的代币金额
- SumCost int `json:"sum_cost"` // 历史总消耗代币金额
- FirstSaveFlag int `json:"first_save_flag"` // 是否满足首充活动标记。0:不满足。1:满足
- }
- // CurrencyPayRequest 扣减代币(一般用于代币支付)
- // 1. 需要用户态签名与支付签名
- // POST,请求参数为 json 字符串,Content-Type 为 application/json
- type CurrencyPayRequest struct {
- CommonRequest
- UserIP string `json:"user_ip"` // 用户 ip,例如:1.1.1.1
- Amount int `json:"amount"` // 支付的代币数量
- OrderID string `json:"order_id"` // 商户订单号,需要保证唯一性
- PayItem string `json:"payitem"` // 物品信息。记录到账户流水中。如:[{"productid":"物品 id", "unit_price": 单价,"quantity": 数量}]
- Remark string `json:"remark"` // 备注信息。需要在账单中展示
- DeviceType string `json:"device_type"` // 平台类型 1-安卓 2-苹果
- }
- // PayItem 物品信息
- type PayItem struct {
- ProductID string `json:"productid"` // 物品 id
- UnitPrice int `json:"unit_price"` // 单价
- Quantity int `json:"quantity"` // 数量
- }
- // CurrencyPayResponse 扣减代币(一般用于代币支付)响应参数
- type CurrencyPayResponse struct {
- util.CommonError
- OrderID string `json:"order_id"` // 商户订单号
- Balance int `json:"balance"` // 总余额,包括有价和赠送部分
- UsedPresentAmount int `json:"used_present_amount"` // 使用赠送部分的代币数量
- }
- // QueryOrderRequest 查询创建的订单(现金单,非代币单),请求参数
- // 1. 使用支付签名
- // POST,请求参数为 json 字符串,Content-Type 为 application/json
- type QueryOrderRequest struct {
- CommonRequest
- OrderID string `json:"order_id,omitempty"` // 商户订单号 创建的订单号
- WxOrderID string `json:"wx_order_id,omitempty"` // 微信内部单号 (与 order_id 二选一)
- }
- // OrderItem 订单信息
- type OrderItem struct {
- OrderID string `json:"order_id"` // 商户订单号
- CreateTime int64 `json:"create_time"` // 订单创建时间
- UpdateTime int64 `json:"update_time"` // 订单更新时间
- Status OrderStatus `json:"status"` // 订单状态 当前状态 0-订单初始化(未创建成功,不可用于支付)1-订单创建成功 2-订单已经支付,待发货 3-订单发货中 4-订单已发货 5-订单已经退款 6-订单已经关闭(不可再使用)7-订单退款失败
- BizType int `json:"biz_type"` // 业务类型 0-短剧
- OrderFee int `json:"order_fee"` // 订单金额,单位:分
- CouponFee int `json:"coupon_fee"` // 优惠金额,单位:分
- PaidFee int `json:"paid_fee"` // 用户支付金额,单位:分
- OrderType int `json:"order_type"` // 订单类型 0-支付单 1-退款单
- RefundFee int `json:"refund_fee"` // 当类型为退款单时表示退款金额,单位分
- PaidTime int64 `json:"paid_time"` // 支付/退款时间,unix 秒级时间戳
- ProvideTime int64 `json:"provide_time"` // 发货时间,unix 秒级时间戳
- BizMeta string `json:"biz_meta"` // 业务自定义数据 订单创建时传的信息
- EnvType int `json:"env_type"` // 环境类型 1-现网 2-沙箱
- Token string `json:"token"` // 下单时米大师返回的 token
- LeftFee int `json:"left_fee"` // 支付单类型时表示此单经过退款还剩余的金额,单位:分
- WxOrderID string `json:"wx_order_id"` // 微信内部单号
- ChannelOrderID string `json:"channel_order_id"` // 渠道订单号,为用户微信支付详情页面上的商户单号
- WxPayOrderID string `json:"wxpay_order_id"` // 微信支付交易单号,为用户微信支付详情页面上的交易单号
- }
- // QueryOrderResponse 查询创建的订单(现金单,非代币单)响应参数
- type QueryOrderResponse struct {
- util.CommonError
- Order *OrderItem `json:"order"` // 订单信息
- }
- // CancelCurrencyPayRequest 取消订单(现金单,非代币单),请求参数
- // 1. 使用支付签名
- // POST,请求参数为 json 字符串,Content-Type 为 application/json
- type CancelCurrencyPayRequest struct {
- CommonRequest
- UserIP string `json:"user_ip"` // 用户 ip,例如:1.1.1.1
- PayOrderID string `json:"pay_order_id"` // 支付单号 代币支付 (调用 currency_pay 接口时) 时传的 order_id
- OrderID string `json:"order_id"` // 本次退款单的单号
- Amount int `json:"amount"` // 退款金额
- DeviceType int `json:"device_type"` // 平台类型 1-安卓 2-苹果
- }
- // CancelCurrencyPayResponse 取消订单(现金单,非代币单)响应参数
- type CancelCurrencyPayResponse struct {
- util.CommonError
- OrderID string `json:"order_id"` // 退款订单号
- }
- // NotifyProvideGoodsRequest 通知发货,请求参数
- // 通知已经发货完成(只能通知现金单),正常通过 xpay_goods_deliver_notify 消息推送返回成功就不需要调用这个 api 接口。这个接口用于异常情况推送不成功时手动将单改成已发货状态
- // 1. 使用支付签名
- // POST,请求参数为 json 字符串,Content-Type 为 application/json
- type NotifyProvideGoodsRequest struct {
- OrderID string `json:"order_id,omitempty"` // 商户订单号 下单时传的单号
- WxOrderID string `json:"wx_order_id,omitempty"` // 微信内部单号 (与 order_id 二选一)
- Env Env `json:"env"` // 环境 0-正式环境 1-沙箱环境
- }
- // NotifyProvideGoodsResponse 通知发货响应参数
- type NotifyProvideGoodsResponse struct {
- util.CommonError
- }
- // PresentCurrencyRequest 赠送代币,请求参数
- // 代币赠送接口,由于目前不支付按单号查赠送单的功能,所以当需要赠送的时候可以一直重试到返回 0 或者返回 268490004(重复操作)为止
- // 1. 需要用户态签名与支付签名
- // POST,请求参数为 json 字符串,Content-Type 为 application/json
- type PresentCurrencyRequest struct {
- CommonRequest
- OrderID string `json:"order_id"` // 赠送单号,商户订单号,需要保证唯一性
- Amount int `json:"amount"` // 赠送的代币数量
- DeviceType string `json:"device_type"` // 平台类型 1-安卓 2-苹果
- }
- // PresentCurrencyResponse 赠送代币响应参数
- type PresentCurrencyResponse struct {
- util.CommonError
- Balance int `json:"balance"` // 赠送后用户的代币余额
- OrderID string `json:"order_id"` // 赠送单号
- PresentBalance int `json:"present_balance"` // 用户收到的总赠送金额
- }
- // DownloadBillRequest 下载账单,请求参数
- // 用于下载小程序账单,第一次调用触发生成下载 url,可以间隔轮训来获取最终生成的下载 url。账单中金额相关字段是以分为单位。
- // 1. 使用支付签名
- // POST,请求参数为 json 字符串,Content-Type 为 application/json
- type DownloadBillRequest struct {
- BeginDs string `json:"begin_ds"` // 账单开始日期,格式为 yyyymmdd 起始时间(如 20230801)
- EndDs string `json:"end_ds"` // 账单结束日期,格式为 yyyymmdd 结束时间(如 20230801)
- }
- // DownloadBillResponse 下载账单响应参数
- type DownloadBillResponse struct {
- util.CommonError
- URL string `json:"url"` // 账单下载地址
- }
- // RefundOrderRequest 退款,请求参数
- // 对使用 jsapi 接口下的单进行退款
- // 1. 使用支付签名
- // POST,请求参数为 json 字符串,Content-Type 为 application/json
- type RefundOrderRequest struct {
- CommonRequest
- OrderID string `json:"order_id"` // 商户订单号,需要保证唯一性
- WxOrderID string `json:"wx_order_id"` // 微信内部单号 (与 order_id 二选一)
- RefundOrderID string `json:"refund_order_id"` // 退款单号,本次退款时需要传的单号,长度为 [8,32],字符只允许使用字母、数字、'_'、'-'
- LeftFee int `json:"left_fee"` // 退款金额,单位:分 当前单剩余可退金额,单位分,可以通过调用 query_order 接口查到
- RefundFee int `json:"refund_fee"` // 退款金额,单位:分 需要 (0,left_fee] 之间
- BizMeta string `json:"biz_meta"` // 商家自定义数据,传入后可在 query_order 接口查询时原样返回,长度需要 [0,1024]
- RefundReason string `json:"refund_reason"` // 退款原因,当前仅支持以下值 0-暂无描述 1-产品问题,影响使用或效果不佳 2-售后问题,无法满足需求 3-意愿问题,用户主动退款 4-价格问题 5:其他原因
- ReqFrom string `json:"req_from"` // 退款来源,当前仅支持以下值 1-人工客服退款,即用户电话给客服,由客服发起退款流程 2-用户自己发起退款流程 3-其它
- }
- // RefundOrderResponse 退款响应参数
- type RefundOrderResponse struct {
- util.CommonError
- RefundOrderID string `json:"refund_order_id"` // 退款单号
- RefundWxOrderID string `json:"refund_wx_order_id"` // 退款单的微信侧单号
- PayOrderID string `json:"pay_order_id"` // 该退款单对应的支付单单号
- PayWxOrderID string `json:"pay_wx_order_id"` // 该退款单对应的支付单微信侧单号
- }
- // CreateWithdrawOrderRequest 创建提现单,请求参数
- // 1. 使用支付签名
- // POST,请求参数为 json 字符串,Content-Type 为 application/json
- type CreateWithdrawOrderRequest struct {
- WithdrawNO string `json:"withdraw_no"` // 提现单单号,长度为 [8,32],字符只允许使用字母、数字、'_'、'-'
- WithdrawAmount string `json:"withdraw_amount"` // 提现的金额,单位元,例如提现 1 分钱请使用 0.01
- Env Env `json:"env"` // 环境 0-正式环境 1-沙箱环境
- }
- // CreateWithdrawOrderResponse 创建提现单响应参数
- type CreateWithdrawOrderResponse struct {
- util.CommonError
- WithdrawNO string `json:"withdraw_no"` // 提现单单号
- WxWithdrawNO string `json:"wx_withdraw_no"` // 提现单的微信侧单号
- }
- // QueryWithdrawOrderRequest 查询提现单,请求参数
- // 1. 使用支付签名
- // POST,请求参数为 json 字符串,Content-Type 为 application/json
- type QueryWithdrawOrderRequest struct {
- WithdrawNO string `json:"withdraw_no"` // 提现单单号,长度为 [8,32],字符只允许使用字母、数字、'_'、'-' (与 wx_withdraw_no 二选一)
- Env Env `json:"env"` // 环境 0-正式环境 1-沙箱环境
- }
- // QueryWithdrawOrderResponse 查询提现单响应参数
- type QueryWithdrawOrderResponse struct {
- util.CommonError
- WithdrawNO string `json:"withdraw_no"` // 提现单单号
- Status int `json:"status"` // 提现单的微信侧单号 1-创建成功,提现中 2-提现成功 3-提现失败
- WithdrawAmount string `json:"withdraw_amount"` // 提现的金额,单位元,例如提现 1 分钱请使用 0.01
- WxWithdrawNo string `json:"wx_withdraw_no"` // 提现单的微信侧单号
- WithdrawSuccessTimestamp int64 `json:"withdraw_success_timestamp"` // 提现单成功的秒级时间戳,unix 秒级时间戳
- CreateTime string `json:"create_time"` // 提现单创建时间
- FailReason string `json:"failReason"` // 提现失败的原因
- }
- // StartUploadGoodsRequest 启动批量上传道具任务,请求参数
- // 1. 使用支付签名
- // POST,请求参数为 json 字符串,Content-Type 为 application/json
- type StartUploadGoodsRequest struct {
- UploadItem []*UploadItem `json:"upload_item"` // 道具信息
- Env Env `json:"env"` // 环境 0-正式环境 1-沙箱环境
- }
- // UploadItem 道具信息
- type UploadItem struct {
- ID string `json:"id"` // 道具 id,长度 (0,64],字符只允许使用字母、数字、'_'、'-'
- Name string `json:"name"` // 道具名称,长度 (0,1024]
- Price int `json:"price"` // 道具单价,单位分,需要大于 0
- Remark string `json:"remark"` // 道具备注,长度 (0,1024]
- ItemURL string `json:"item_url"` // 道具图片的 url 地址,当前仅支持 jpg,png 等格式
- UploadStatus int `json:"upload_status,omitempty"` // 上传状态 0-上传中 1-id 已经存在 2-上传成功 3-上传失败
- ErrMsg string `json:"errmsg,omitempty"` // 上传失败的原因
- }
- // StartUploadGoodsResponse 启动批量上传道具任务响应参数
- type StartUploadGoodsResponse struct {
- util.CommonError
- }
- // QueryUploadGoodsRequest 查询批量上传道具任务,请求参数
- // 1. 使用支付签名
- // POST,请求参数为 json 字符串,Content-Type 为 application/json
- type QueryUploadGoodsRequest struct {
- Env Env `json:"env"` // 环境 0-正式环境 1-沙箱环境
- }
- // QueryUploadGoodsResponse 查询批量上传道具任务响应参数
- type QueryUploadGoodsResponse struct {
- util.CommonError
- UploadItem []*UploadItem `json:"upload_item"` // 道具信息列表
- Status int `json:"status"` // 任务状态 0-无任务在运行 1-任务运行中 2-上传失败或部分失败(上传任务已经完成)3-上传成功
- }
- // StartPublishGoodsRequest 启动批量发布道具任务,请求参数
- // 1. 使用支付签名
- // POST,请求参数为 json 字符串,Content-Type 为 application/json
- type StartPublishGoodsRequest struct {
- Env Env `json:"env"` // 环境 0-正式环境 1-沙箱环境
- PublishItem []*PublishItem `json:"publish_item"` // 道具信息 发布的商品列表
- }
- // PublishItem 道具信息
- type PublishItem struct {
- ID string `json:"id"` // 道具 id,添加到开发环境时传的道具 id,长度 (0,64],字符只允许使用字母、数字、'_'、'-'
- PublishStatus int `json:"publish_status,omitempty"` // 发布状态 0-上传中 1-id 已经存在 2-发布成功 3-发布失败
- ErrMsg string `json:"errmsg,omitempty"` // 发布失败的原因
- }
- // StartPublishGoodsResponse 启动批量发布道具任务响应参数
- type StartPublishGoodsResponse struct {
- util.CommonError
- }
- // QueryPublishGoodsRequest 查询批量发布道具任务,请求参数
- // 1. 使用支付签名
- // POST,请求参数为 json 字符串,Content-Type 为 application/json
- type QueryPublishGoodsRequest struct {
- Env Env `json:"env"` // 环境 0-正式环境 1-沙箱环境
- }
- // QueryPublishGoodsResponse 查询批量发布道具任务响应参数
- type QueryPublishGoodsResponse struct {
- util.CommonError
- PublishItem []*PublishItem `json:"publish_item"` // 道具信息列表
- Status int `json:"status"` // 任务状态 0-无任务在运行 1-任务运行中 2-上传失败或部分失败(上传任务已经完成)3-上传成功
- }
- // AsyncXPayGoodsDeliverNotifyRequest 异步通知发货,请求参数
- // 1. 使用支付签名
- // POST,请求参数为 json 字符串,Content-Type 为 application/json
- type AsyncXPayGoodsDeliverNotifyRequest struct {
- ToUserName string `json:"ToUserName"` // 小程序的原始 ID
- FromUserName string `json:"FromUserName"` // 发送方帐号(一个 OpenID)该事件消息的 openid,道具发货场景固定为微信官方的 openid
- CreateTime int `json:"CreateTime"` // 消息发送时间(整型)
- MsgType string `json:"MsgType"` // 消息类型,此时固定为:event
- Event string `json:"Event"` // 事件类型,此时固定为:xpay_goods_deliver_notify
- Openid string `json:"openid"` // 用户 openid
- OutTradeNo string `json:"OutTradeNo"` // 业务订单号
- Env Env `json:"env"` // 环境 0-正式环境 1-沙箱环境
- WechatPayInfo *WeChatPayInfo `json:"WechatPayInfo"` // 微信支付订单信息
- GoodsInfo *GoodsInfo `json:"GoodsInfo"` // 道具信息
- }
- // WeChatPayInfo 微信支付信息 非微信支付渠道可能没有
- type WeChatPayInfo struct {
- MchOrderNo string `json:"MchOrderNo"` // 商户订单号
- TransactionID string `json:"TransactionId"` // 微信支付订单号
- }
- // GoodsInfo 道具参数信息
- type GoodsInfo struct {
- ProductID string `json:"ProductId"` // 道具 ID
- Quantity int `json:"Quantity"` // 数量
- OrigPrice int `json:"OrigPrice"` // 物品原始价格(单位:分)
- ActualPrice int `json:"ActualPrice"` // 物品实际支付价格(单位:分)
- Attach string `json:"Attach"` // 透传信息
- }
- // AsyncXPayGoodsDeliverNotifyResponse 异步通知发货响应参数
- type AsyncXPayGoodsDeliverNotifyResponse struct {
- util.CommonError
- }
- // AsyncXPayCoinPayNotifyRequest 异步通知代币支付推送,请求参数
- type AsyncXPayCoinPayNotifyRequest struct {
- ToUserName string `json:"ToUserName"` // 小程序的原始 ID
- FromUserName string `json:"FromUserName"` // 发送方帐号(一个 OpenID)该事件消息的 openid,道具发货场景固定为微信官方的 openid
- CreateTime int `json:"CreateTime"` // 消息发送时间(整型)
- MsgType string `json:"MsgType"` // 消息类型,此时固定为:event
- Event string `json:"Event"` // 事件类型,此时固定为:xpay_goods_deliver_notify
- Openid string `json:"openid"` // 用户 openid
- OutTradeNo string `json:"OutTradeNo"` // 业务订单号
- Env Env `json:"env"` // 环境 0-正式环境 1-沙箱环境
- WechatPayInfo *WeChatPayInfo `json:"WechatPayInfo"` // 微信支付订单信息
- CoinInfo *CoinInfo `json:"GoodsInfo"` // 道具信息
- }
- // CoinInfo 代币信息
- type CoinInfo struct {
- Quantity int `json:"Quantity"` // 数量
- OrigPrice int `json:"OrigPrice"` // 物品原始价格(单位:分)
- ActualPrice int `json:"ActualPrice"` // 物品实际支付价格(单位:分)
- Attach string `json:"Attach"` // 透传信息
- }
- // AsyncXPayCoinPayNotifyResponse 异步通知代币支付推送响应参数
- type AsyncXPayCoinPayNotifyResponse struct {
- util.CommonError
- }
- // URLParams url parameter
- type URLParams struct {
- Path string `json:"path"`
- AccessToken string `json:"access_token"`
- PaySign string `json:"paySign"`
- Signature string `json:"signature"`
- Content string `json:"content"`
- }
|