Documentation
¶
Overview ¶
定义微信支付相关数据结构和 helper 函数
Index ¶
- Constants
- func FormatTime(t time.Time) string
- func MakeOrderQueryRequestPackage(OutTradeNo string, PartnerId string, PartnerKey string) string
- func ParseTime(value string) (time.Time, error)
- func URLEscape(s string) string
- type AlarmNotifyData
- type Bill
- type DeliverNotifyData
- type GetPartnerKey
- type OrderNotifyPostData
- type OrderNotifyURLDataVer1
- type OrderQueryRequest
- type OrderQueryResponse
Constants ¶
const ( BANK_TYPE_WX = "WX" FEE_TYPE_RMB = 1 SIGN_METHOD_SHA1 = "sha1" IS_SUBSCRIBE_TRUE = 1 IS_SUBSCRIBE_FALSE = 0 CHARSET_GBK = "GBK" CHARSET_UTF8 = "UTF-8" )
const ( // 用户支付成功后, 通知商户后台消息中的字段常量 ORDER_NOTIFY_TRADE_MODE_IMMEDIATE = 1 // TradeMode 即时到账 ORDER_NOTIFY_TRADE_STATE_SUCCESS = 0 // TradeState 成功 )
const ( // 微信后台通过 notify_url 通知商户, 商户做业务处理后, 需要以字符串的形式反馈处理结果 // success: 处理成功, 微信系统收到此结果后不再进行后续通知 // fail 或其它字符: 处理不成功, 微信收到此结果或者没有收到任何结果, 系统通过补单机制再次通知 ORDER_NOTIFY_RESPONSE_SUCCESS = "success" // 商户收到告警通知后, 需要成功返回success. 在通过功能发布检测时, 请保证已调通. ALARM_NOTIFY_RESPONSE_SUCCESS = "success" )
const ( // 发货通知 DELIVER_NOTIFY_STATUS_SUCCESS = 1 DELIVER_NOTIFY_STATUS_FAIL = 0 )
Variables ¶
This section is empty.
Functions ¶
func MakeOrderQueryRequestPackage ¶
创建订单查询的 package 数据
Types ¶
type AlarmNotifyData ¶
type AlarmNotifyData struct { XMLName struct{} `xml:"xml" json:"-"` AppId string `xml:"AppId"` TimeStamp int64 `xml:"TimeStamp"` ErrCode int `xml:"ErrorType"` Description string `xml:"Description"` Content string `xml:"AlarmContent"` Signature string `xml:"AppSignature"` SignMethod string `xml:"SignMethod"` }
告警通知. 为了及时通知商户异常, 提高商户在微信平台的服务质量. 微信后台会向商户推送告警通知, 包括发货延迟, 调用失败, 通知失败等情况, 通知的地址是商户在申请支付时填写的告警通知 URL, 在"公众平台-服务-服务中心-商户功能-商户基本资料-告警通知URL"可以查看. 商户接收到告警通知后请尽快修复其中提到的问题, 以免影响线上经营
商户收到告警通知后, 需要成功返回 success. 在通过功能发布检测时, 请保证已调通.
这是告警通知URL接收的postData的xml数据结构.
func (*AlarmNotifyData) Check ¶
func (data *AlarmNotifyData) Check(paySignKey string) (err error)
检查 data *AlarmNotifyData 是否合法(包括签名的检查), 合法返回 nil, 否则返回错误信息.
@paySignKey: 公众号支付请求中用于加密的密钥 Key, 对应于支付场景中的 appKey
type Bill ¶
type Bill struct { BankType string // 必须, 银行通道类型, 固定为 "WX" Body string // 必须, 商品描述, 128字节以内 Attach string // 可选, 附加数据, 128字节以内 PartnerId string // 必须, 注册时分配的财付通商户号 partnerId OutTradeNo string // 必须, 商户系统内部订单号, 32个字符内, 可包含字母, *** 确保在商户系统中唯一 *** TotalFee int // 必须, 订单总金额, 单位为分 TransportFee int // 可选, 物流费用, 单位为分; 如果有值, 必须保证 TransportFee + ProductFee == TotalFee ProductFee int // 可选, 商品费用, 单位为分; 如果有值, 必须保证 TransportFee + ProductFee == TotalFee ProductTag string // 可选, 商品标记, 优惠卷时可能用到 FeeType int // 必须, 取值: 1(人民币); 目前暂只支持 1 NotifyURL string // 必须, 在支付完成后, 接收微信通知支付结果的 URL, 需要给出绝对路径, 255个字符内 CreateIP string // 必须, 订单生成的机器IP(指用户浏览器端IP, 不是商户服务器IP, 格式为IPV4), 15个字节内 TimeStart time.Time // 可选, 订单生成时间, 该时间取自商户服务器 TimeExpire time.Time // 可选, 订单失效时间, 该时间取自商户服务器 Charset string // 必须, 参数字符编码, 取值范围: "GBK","UTF-8", 留空默认为 "UTF-8" }
订单详情, 微信根据这个信息生成订单. js api 和 native api 都需要这个, 就是那个 订单详情(package) 字符串, see Bill.Package.
type DeliverNotifyData ¶
type DeliverNotifyData struct { AppId string `json:"appid"` // 公众平台账户的 AppId OpenId string `json:"openid"` // 购买用户的 OpenId, 这个已经放在最终支付结果通知的 PostData 里了 TransactionId string `json:"transid"` // 交易单号 OutTradeNo string `json:"out_trade_no"` // 第三方订单号 DeliverTimeStamp int64 `json:"deliver_timestamp,string"` // 发货时间戳, unixtime; DeliverStatus int `json:"deliver_status,string"` // 发货状态, 1表明成功, 0表明失败, 失败时需要在deliver_msg填上失败原因; DeliverMessage string `json:"deliver_msg"` // 发货状态信息, 失败时可以填上UTF8编码的错误提示信息, 比如"该商品已退款"; Signature string `json:"app_signature"` // 签名 SignMethod string `json:"sign_method"` // 签名方法 }
为了更好地跟踪订单的情况, 需要第三方在收到最终支付通知之后, 调用发货通知API告知微信后台该订单的发货状态. 发货时间限制: 虚拟, 服务类24小时内, 实物类72小时内.
请在收到支付通知后, 按时发货, 并使用发货通知接口将相关信息同步到微信后台. 若平台在规定时间内没有收到, 将视作发货超时处理.
发货通知的的数据是放在PostData中的, 格式为 JSON.
func (*DeliverNotifyData) SetSignature ¶
func (data *DeliverNotifyData) SetSignature(paySignKey string) (err error)
设置签名字段.
@paySignKey: 公众号支付请求中用于加密的密钥 Key, 对应于支付场景中的 appKey NOTE: 要求在 data *DeliverNotifyData 其他字段设置完毕后才能调用这个函数, 否则签名就不正确.
type GetPartnerKey ¶
多密钥支持的情况下, 根据密钥 index 获取 partnerKey, 找不到合法的密钥返回空值 ""
type OrderNotifyPostData ¶
type OrderNotifyPostData struct { XMLName struct{} `xml:"xml" json:"-"` // 下面这三个字段和之前传过去的一样? 可以比对下, 确保安全? AppId string `xml:"AppId"` // 必须, 公众号 id NonceStr string `xml:"NonceStr"` // 必须, 随机字符串 TimeStamp int64 `xml:"TimeStamp"` // 必须, 时间戳, unixtime OpenId string `xml:"OpenId"` // 必须, 支付该笔订单的用户 OpenId IsSubscribe int `xml:"IsSubscribe"` // 必须, 标记用户是否订阅该公众帐号, 1为关注, 0为未关注 Signature string `xml:"AppSignature"` // 必须, 参数的加密签名 SignMethod string `xml:"SignMethod"` // 必须, 签名方式, 目前只支持"sha1" }
用户在成功完成支付后, 微信后台通知(POST)商户服务器(notify_url)支付结果. 商户可以使用 notify_url 的通知结果进行个性化页面的展示.
这是支付成功后通知消息 post 部分的数据结构.
func (*OrderNotifyPostData) Check ¶
func (data *OrderNotifyPostData) Check(paySignKey string) (err error)
检查 data *OrderNotifyPostData 是否合法(包括签名的检查), 合法返回 nil, 否则返回错误信息.
@paySignKey: 公众号支付请求中用于加密的密钥 Key, 对应于支付场景中的 appKey
type OrderNotifyURLDataVer1 ¶
type OrderNotifyURLDataVer1 struct { ServiceVersion string // 必须, 版本号 Charset string // 必须, 字符编码, 取值: GBK, UTF-8 Signature string // 必须, 签名 SignMethod string // 必须, 签名类型, 取值: MD5, RSA SignKeyIndex int // 必须, 多密钥支持的密钥序号 NotifyId string // 必须, 支付结果通知 id, 对于某些特定商户, 只返回通知 id, 要求商户据此查询交易结果 TradeMode int // 必须, 交易模式, 1-即时到账, 其他保留 TradeState int // 必须, 交易状态(支付结果), 0-成功, 其他保留 PayInfo string // 可选, 支付结果信息, 支付成功时为 "". BankBillNo string // 可选, 银行订单号 TransactionId string // 必须, 交易号, 28位长的数值, 其中前10位为商户号, 之后8位为订单产生的日期, 如20090415, 最后10位是流水号. TimeEnd time.Time // 必须, 支付完成时间 // 下面这 4 个字段和支付账单 Bill 里的同名字段内容相同 BankType string // 必须, 银行类型, 微信中固定为 WX PartnerId string // 必须, 财付通商户 partnerId OutTradeNo string // 必须, 商户系统的订单号 Attach string // 可选, 商户数据包 TotalFee int // 必须, 支付金额, 单位为分; 如果 discount 有值, 则有 TotalFee + Discount == 支付请求的 Bill.TotalFee Discount int // 可选, 折扣价格, 单位为分; 如果有值, 则有 TotalFee + Discount == 支付请求的 Bill.TotalFee TransportFee int // 可选, 物流费用, 单位为分, 默认0; 如果有值, 必须保证 TransportFee + ProductFee == TotalFee ProductFee int // 可选, 物品费用, 单位为分; 如果有值, 必须保证 TransportFee + ProductFee == TotalFee FeeType int // 必须, 币种, 目前只支持人民币, 默认值是 1-人民币 BuyerAlias string // 可选, 买家别名, 对应买家账号的一个加密串 }
用户在成功完成支付后, 微信后台通知(POST)商户服务器(notify_url)支付结果. 商户可以使用 notify_url 的通知结果进行个性化页面的展示.
这是支付成功后通知消息 url query string 部分, 1.0 版本
func (*OrderNotifyURLDataVer1) CheckAndInit ¶
func (data *OrderNotifyURLDataVer1) CheckAndInit(values url.Values, getPartnerKey GetPartnerKey) (err error)
根据 values url.Values(来自对 notify url query string 的解析) 来初始化 data *OrderNotifyURLDataVer1. 如果 values url.Values 里的参数不合法(包括签名不正确) 则返回错误信息, 否则返回 nil.
type OrderQueryRequest ¶
type OrderQueryRequest struct { AppId string `json:"appid"` // 公众平台账户的 AppId Package string `json:"package"` // 查询订单的关键信息数据, see MakeOrderQueryRequestPackage TimeStamp int64 `json:"timestamp,string"` // 时间戳, unixtime Signature string `json:"app_signature"` // 签名 SignMethod string `json:"sign_method"` // 签名方法 }
因为某一方技术的原因, 可能导致商户在预期时间内都收不到最终支付通知, 此时商户可以通过API来查询订单的详细支付状态.
这是订单查询的请求数据结构
func (*OrderQueryRequest) SetSignature ¶
func (req *OrderQueryRequest) SetSignature(paySignKey string) (err error)
设置签名字段.
@paySignKey: 公众号支付请求中用于加密的密钥 Key, 对应于支付场景中的 appKey NOTE: 要求在 req *OrderQueryRequest 其他字段设置完毕后才能调用这个函数, 否则签名就不正确.
type OrderQueryResponse ¶
type OrderQueryResponse struct { ErrCode int `json:"ret_code"` // 查询结果状态码, 0表明成功, 其他表明错误 ErrMsg string `json:"ret_msg"` // 查询结果出错信息 Charset string `json:"input_charset"` // 返回信息中的编码方式 TradeMode int `json:"trade_mode,string"` // 订单状态, 0为成功, 其他为失败 TradeState int `json:"trade_state,string"` // 交易模式, 1为即时到帐, 其他保留 PartnerId string `json:"partner"` // 财付通商户号 BankType string `json:"bank_type"` // 银行类型 BankBillNo string `json:"bank_billno"` // 银行订单号 TotalFee int `json:"total_fee,string"` // 总金额, 单位为分 FeeType int `json:"fee_type,string"` // 币种, 1为人民币 TransactionId string `json:"transaction_id"` // 财付通订单号 OutTradeNo string `json:"out_trade_no"` // 第三方订单号 IsSplit bool `json:"is_split,string"` // 表明是否分账, false为无分账, true为有分账 IsRefund bool `json:"is_refund,string"` // 表明是否退款, false为无退款, ture为退款 Attach string `json:"attach"` // 商户数据包, 即生成订单package时商户填入的attach TimeEnd string `json:"time_end"` // 支付完成时间 TransportFee int `json:"transport_fee,string"` // 物流费用, 单位为分 ProductFee int `json:"product_fee,string"` // 物品费用, 单位为分 Discount int `json:"discount,string"` // 折扣价格, 单位为分 RMBTotalFee int `json:"rmb_total_fee,string"` // 换算成人民币之后的总金额, 单位为分, 一般看total_fee即可 }
因为某一方技术的原因, 可能导致商户在预期时间内都收不到最终支付通知, 此时商户可以通过API来查询订单的详细支付状态.
这是订单查询成功时返回的数据结构