mirror of
https://github.com/silenceper/wechat.git
synced 2026-02-16 18:52:27 +08:00
16
.travis.yml
16
.travis.yml
@@ -1,14 +1,20 @@
|
|||||||
language: go
|
language: go
|
||||||
|
|
||||||
go:
|
go:
|
||||||
- 1.9
|
- 1.9.x
|
||||||
- 1.8
|
- 1.8.x
|
||||||
- 1.7
|
- 1.7.x
|
||||||
- 1.6
|
- 1.6.x
|
||||||
|
|
||||||
services:
|
services:
|
||||||
- memcached
|
- memcached
|
||||||
- redis-server
|
- redis-server
|
||||||
|
|
||||||
|
before_script:
|
||||||
|
- GO_FILES=$(find . -iname '*.go' -type f | grep -v /vendor/)
|
||||||
|
- go get github.com/golang/lint/golint
|
||||||
|
|
||||||
script:
|
script:
|
||||||
- go test -v ./...
|
- go test -v -race ./...
|
||||||
|
- go vet ./...
|
||||||
|
- golint -set_exit_status $(go list ./...)
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ func hello(ctx *context.Context) {
|
|||||||
|
|
||||||
//回复消息:演示回复用户发送的消息
|
//回复消息:演示回复用户发送的消息
|
||||||
text := message.NewText(msg.Content)
|
text := message.NewText(msg.Content)
|
||||||
return &message.Reply{message.MsgTypeText, text}
|
return &message.Reply{MsgType: message.MsgTypeText, MsgData: text}
|
||||||
})
|
})
|
||||||
|
|
||||||
//处理消息接收以及回复
|
//处理消息接收以及回复
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ func hello(c *gin.Context) {
|
|||||||
|
|
||||||
//回复消息:演示回复用户发送的消息
|
//回复消息:演示回复用户发送的消息
|
||||||
text := message.NewText(msg.Content)
|
text := message.NewText(msg.Content)
|
||||||
return &message.Reply{message.MsgTypeText, text}
|
return &message.Reply{MsgType: message.MsgTypeText, MsgData: text}
|
||||||
})
|
})
|
||||||
|
|
||||||
//处理消息接收以及回复
|
//处理消息接收以及回复
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ func hello(rw http.ResponseWriter, req *http.Request) {
|
|||||||
|
|
||||||
//回复消息:演示回复用户发送的消息
|
//回复消息:演示回复用户发送的消息
|
||||||
text := message.NewText(msg.Content)
|
text := message.NewText(msg.Content)
|
||||||
return &message.Reply{message.MsgTypeText, text}
|
return &message.Reply{MsgType: message.MsgTypeText, MsgData: text}
|
||||||
})
|
})
|
||||||
|
|
||||||
//处理消息接收以及回复
|
//处理消息接收以及回复
|
||||||
|
|||||||
28
pay/pay.go
28
pay/pay.go
@@ -1,9 +1,10 @@
|
|||||||
package pay
|
package pay
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"encoding/xml"
|
"encoding/xml"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/silenceper/wechat/context"
|
"github.com/silenceper/wechat/context"
|
||||||
"github.com/silenceper/wechat/util"
|
"github.com/silenceper/wechat/util"
|
||||||
)
|
)
|
||||||
@@ -15,9 +16,9 @@ type Pay struct {
|
|||||||
*context.Context
|
*context.Context
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Params was NEEDED when request unifiedorder
|
||||||
// 传入的参数,用于生成 prepay_id 的必需参数
|
// 传入的参数,用于生成 prepay_id 的必需参数
|
||||||
// PayParams was NEEDED when request unifiedorder
|
type Params struct {
|
||||||
type PayParams struct {
|
|
||||||
TotalFee string
|
TotalFee string
|
||||||
CreateIP string
|
CreateIP string
|
||||||
Body string
|
Body string
|
||||||
@@ -25,8 +26,8 @@ type PayParams struct {
|
|||||||
OpenID string
|
OpenID string
|
||||||
}
|
}
|
||||||
|
|
||||||
// PayConfig 是传出用于 jsdk 用的参数
|
// Config 是传出用于 jsdk 用的参数
|
||||||
type PayConfig struct {
|
type Config struct {
|
||||||
Timestamp int64
|
Timestamp int64
|
||||||
NonceStr string
|
NonceStr string
|
||||||
PrePayID string
|
PrePayID string
|
||||||
@@ -64,13 +65,13 @@ type payRequest struct {
|
|||||||
OutTradeNo string `xml:"out_trade_no"` //商户订单号
|
OutTradeNo string `xml:"out_trade_no"` //商户订单号
|
||||||
FeeType string `xml:"fee_type,omitempty"` //标价币种
|
FeeType string `xml:"fee_type,omitempty"` //标价币种
|
||||||
TotalFee string `xml:"total_fee"` //标价金额
|
TotalFee string `xml:"total_fee"` //标价金额
|
||||||
SpbillCreateIp string `xml:"spbill_create_ip"` //终端IP
|
SpbillCreateIP string `xml:"spbill_create_ip"` //终端IP
|
||||||
TimeStart string `xml:"time_start,omitempty"` //交易起始时间
|
TimeStart string `xml:"time_start,omitempty"` //交易起始时间
|
||||||
TimeExpire string `xml:"time_expire,omitempty"` //交易结束时间
|
TimeExpire string `xml:"time_expire,omitempty"` //交易结束时间
|
||||||
GoodsTag string `xml:"goods_tag,omitempty"` //订单优惠标记
|
GoodsTag string `xml:"goods_tag,omitempty"` //订单优惠标记
|
||||||
NotifyUrl string `xml:"notify_url"` //通知地址
|
NotifyURL string `xml:"notify_url"` //通知地址
|
||||||
TradeType string `xml:"trade_type"` //交易类型
|
TradeType string `xml:"trade_type"` //交易类型
|
||||||
ProductId string `xml:"product_id,omitempty"` //商品ID
|
ProductID string `xml:"product_id,omitempty"` //商品ID
|
||||||
LimitPay string `xml:"limit_pay,omitempty"` //
|
LimitPay string `xml:"limit_pay,omitempty"` //
|
||||||
OpenID string `xml:"openid,omitempty"` //用户标识
|
OpenID string `xml:"openid,omitempty"` //用户标识
|
||||||
SceneInfo string `xml:"scene_info,omitempty"` //场景信息
|
SceneInfo string `xml:"scene_info,omitempty"` //场景信息
|
||||||
@@ -82,8 +83,8 @@ func NewPay(ctx *context.Context) *Pay {
|
|||||||
return &pay
|
return &pay
|
||||||
}
|
}
|
||||||
|
|
||||||
// PrePayId will request wechat merchant api and request for a pre payment order id
|
// PrePayID will request wechat merchant api and request for a pre payment order id
|
||||||
func (pcf *Pay) PrePayId(p *PayParams) (prePayID string, err error) {
|
func (pcf *Pay) PrePayID(p *Params) (prePayID string, err error) {
|
||||||
nonceStr := util.RandomStr(32)
|
nonceStr := util.RandomStr(32)
|
||||||
tradeType := "JSAPI"
|
tradeType := "JSAPI"
|
||||||
template := "appid=%s&body=%s&mch_id=%s&nonce_str=%s¬ify_url=%s&openid=%s&out_trade_no=%s&spbill_create_ip=%s&total_fee=%s&trade_type=%s&key=%s"
|
template := "appid=%s&body=%s&mch_id=%s&nonce_str=%s¬ify_url=%s&openid=%s&out_trade_no=%s&spbill_create_ip=%s&total_fee=%s&trade_type=%s&key=%s"
|
||||||
@@ -97,8 +98,8 @@ func (pcf *Pay) PrePayId(p *PayParams) (prePayID string, err error) {
|
|||||||
Body: p.Body,
|
Body: p.Body,
|
||||||
OutTradeNo: p.OutTradeNo,
|
OutTradeNo: p.OutTradeNo,
|
||||||
TotalFee: p.TotalFee,
|
TotalFee: p.TotalFee,
|
||||||
SpbillCreateIp: p.CreateIP,
|
SpbillCreateIP: p.CreateIP,
|
||||||
NotifyUrl: pcf.PayNotifyURL,
|
NotifyURL: pcf.PayNotifyURL,
|
||||||
TradeType: tradeType,
|
TradeType: tradeType,
|
||||||
OpenID: p.OpenID,
|
OpenID: p.OpenID,
|
||||||
}
|
}
|
||||||
@@ -117,7 +118,6 @@ func (pcf *Pay) PrePayId(p *PayParams) (prePayID string, err error) {
|
|||||||
return payRet.PrePayID, nil
|
return payRet.PrePayID, nil
|
||||||
}
|
}
|
||||||
return "", errors.New(payRet.ErrCode + payRet.ErrCodeDes)
|
return "", errors.New(payRet.ErrCode + payRet.ErrCodeDes)
|
||||||
} else {
|
}
|
||||||
return "", errors.New("[msg : xmlUnmarshalError] [rawReturn : " + string(rawRet) + "] [params : " + str + "] [sign : " + sign + "]")
|
return "", errors.New("[msg : xmlUnmarshalError] [rawReturn : " + string(rawRet) + "] [params : " + str + "] [sign : " + sign + "]")
|
||||||
}
|
}
|
||||||
}
|
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
package util
|
package util
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
|
||||||
"bufio"
|
"bufio"
|
||||||
|
"bytes"
|
||||||
"crypto/aes"
|
"crypto/aes"
|
||||||
"crypto/cipher"
|
"crypto/cipher"
|
||||||
"crypto/md5"
|
"crypto/md5"
|
||||||
@@ -186,7 +186,7 @@ func decodeNetworkByteOrder(orderBytes []byte) (n uint32) {
|
|||||||
uint32(orderBytes[3])
|
uint32(orderBytes[3])
|
||||||
}
|
}
|
||||||
|
|
||||||
// 计算 32 位长度的 MD5 sum
|
// MD5Sum 计算 32 位长度的 MD5 sum
|
||||||
func MD5Sum(txt string) (sum string) {
|
func MD5Sum(txt string) (sum string) {
|
||||||
h := md5.New()
|
h := md5.New()
|
||||||
buf := bufio.NewWriterSize(h, 128)
|
buf := bufio.NewWriterSize(h, 128)
|
||||||
|
|||||||
Reference in New Issue
Block a user