pay

package
v0.0.0-...-f5adc6c Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 26, 2014 License: Apache-2.0 Imports: 13 Imported by: 0

Documentation

Overview

定义微信支付相关数据结构和 helper 函数

Index

Constants

View Source
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"
)
View Source
const (
	// 用户支付成功后, 通知商户后台消息中的字段常量
	ORDER_NOTIFY_TRADE_MODE_IMMEDIATE = 1 // TradeMode 即时到账
	ORDER_NOTIFY_TRADE_STATE_SUCCESS  = 0 // TradeState 成功
)
View Source
const (
	// 微信后台通过 notify_url 通知商户, 商户做业务处理后, 需要以字符串的形式反馈处理结果
	// success:       处理成功, 微信系统收到此结果后不再进行后续通知
	// fail 或其它字符: 处理不成功, 微信收到此结果或者没有收到任何结果, 系统通过补单机制再次通知
	ORDER_NOTIFY_RESPONSE_SUCCESS = "success"

	// 商户收到告警通知后, 需要成功返回success. 在通过功能发布检测时, 请保证已调通.
	ALARM_NOTIFY_RESPONSE_SUCCESS = "success"
)
View Source
const (
	// 发货通知
	DELIVER_NOTIFY_STATUS_SUCCESS = 1
	DELIVER_NOTIFY_STATUS_FAIL    = 0
)

Variables

This section is empty.

Functions

func FormatTime

func FormatTime(t time.Time) string

格式化时间到 yyyyMMDDHHmmss, GMT+8

func MakeOrderQueryRequestPackage

func MakeOrderQueryRequestPackage(
	OutTradeNo string,
	PartnerId string,
	PartnerKey string,

) string

创建订单查询的 package 数据

func ParseTime

func ParseTime(value string) (time.Time, error)

将时间字符串 yyyyMMDDHHmmss, GMT+8 解析成 time.time

func URLEscape

func URLEscape(s string) string

转义 s string 到 URL 编码格式.

NOTE: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_.~ 不转义,
和 net/url.QueryEscape 不同的地方在于 空格" " 转义成 "%20" 而不是 "+"

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.

func (*Bill) Check

func (this *Bill) Check() (err error)

检查 Bill 设置的是否合法, 合法返回 nil, 否则返回错误信息

func (*Bill) Package

func (this *Bill) Package(partnerKey string) (bs []byte)

将 Bill 打包成 订单详情(package)字符串 需要的格式.

@partnerKey: 财付通商户权限密钥 Key
NOTE: 这个函数不对 this *Bill 的字段做有效性检查, 你可以选择调用 Bill.Check()

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

type GetPartnerKey func(keyIndex int) string

多密钥支持的情况下, 根据密钥 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来查询订单的详细支付状态.

这是订单查询成功时返回的数据结构

Directories

Path Synopsis
维权接口相关数据结构
维权接口相关数据结构
定义微信支付 js api 相关的数据结构和 helper 函数.
定义微信支付 js api 相关的数据结构和 helper 函数.
定义微信支付 native api 相关的数据结构和 helper 函数
定义微信支付 native api 相关的数据结构和 helper 函数

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL