mirror of
https://github.com/silenceper/wechat.git
synced 2026-02-09 07:02:27 +08:00
@@ -4,7 +4,6 @@ go:
|
|||||||
- 1.11.x
|
- 1.11.x
|
||||||
- 1.10.x
|
- 1.10.x
|
||||||
- 1.9.x
|
- 1.9.x
|
||||||
- 1.8.x
|
|
||||||
|
|
||||||
services:
|
services:
|
||||||
- memcached
|
- memcached
|
||||||
|
|||||||
@@ -8,6 +8,9 @@ type MsgType string
|
|||||||
// EventType 事件类型
|
// EventType 事件类型
|
||||||
type EventType string
|
type EventType string
|
||||||
|
|
||||||
|
// InfoType 第三方平台授权事件类型
|
||||||
|
type InfoType string
|
||||||
|
|
||||||
const (
|
const (
|
||||||
//MsgTypeText 表示文本消息
|
//MsgTypeText 表示文本消息
|
||||||
MsgTypeText MsgType = "text"
|
MsgTypeText MsgType = "text"
|
||||||
@@ -62,6 +65,17 @@ const (
|
|||||||
EventTemplateSendJobFinish = "TEMPLATESENDJOBFINISH"
|
EventTemplateSendJobFinish = "TEMPLATESENDJOBFINISH"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
// InfoTypeVerifyTicket 返回ticket
|
||||||
|
InfoTypeVerifyTicket InfoType = "component_verify_ticket"
|
||||||
|
// InfoTypeAuthorized 授权
|
||||||
|
InfoTypeAuthorized = "authorized"
|
||||||
|
// InfoTypeUnauthorized 取消授权
|
||||||
|
InfoTypeUnauthorized = "unauthorized"
|
||||||
|
// InfoTypeUpdateAuthorized 更新授权
|
||||||
|
InfoTypeUpdateAuthorized = "updateauthorized"
|
||||||
|
)
|
||||||
|
|
||||||
//MixMessage 存放所有微信发送过来的消息和事件
|
//MixMessage 存放所有微信发送过来的消息和事件
|
||||||
type MixMessage struct {
|
type MixMessage struct {
|
||||||
CommonToken
|
CommonToken
|
||||||
@@ -110,6 +124,15 @@ type MixMessage struct {
|
|||||||
Label string `xml:"Label"`
|
Label string `xml:"Label"`
|
||||||
Poiname string `xml:"Poiname"`
|
Poiname string `xml:"Poiname"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 第三方平台相关
|
||||||
|
InfoType InfoType `xml:"InfoType"`
|
||||||
|
AppID string `xml:"AppId"`
|
||||||
|
ComponentVerifyTicket string `xml:"ComponentVerifyTicket"`
|
||||||
|
AuthorizerAppid string `xml:"AuthorizerAppid"`
|
||||||
|
AuthorizationCode string `xml:"AuthorizationCode"`
|
||||||
|
AuthorizationCodeExpiredTime int64 `xml:"AuthorizationCodeExpiredTime"`
|
||||||
|
PreAuthCode string `xml:"PreAuthCode"`
|
||||||
}
|
}
|
||||||
|
|
||||||
//EventPic 发图事件推送
|
//EventPic 发图事件推送
|
||||||
|
|||||||
84
pay/pay.go
84
pay/pay.go
@@ -1,9 +1,11 @@
|
|||||||
package pay
|
package pay
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"encoding/xml"
|
"encoding/xml"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"sort"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
"github.com/silenceper/wechat/context"
|
"github.com/silenceper/wechat/context"
|
||||||
"github.com/silenceper/wechat/util"
|
"github.com/silenceper/wechat/util"
|
||||||
@@ -24,6 +26,7 @@ type Params struct {
|
|||||||
Body string
|
Body string
|
||||||
OutTradeNo string
|
OutTradeNo string
|
||||||
OpenID string
|
OpenID string
|
||||||
|
TradeType string
|
||||||
}
|
}
|
||||||
|
|
||||||
// Config 是传出用于 jsdk 用的参数
|
// Config 是传出用于 jsdk 用的参数
|
||||||
@@ -86,9 +89,20 @@ func NewPay(ctx *context.Context) *Pay {
|
|||||||
// PrePayOrder return data for invoke wechat payment
|
// PrePayOrder return data for invoke wechat payment
|
||||||
func (pcf *Pay) PrePayOrder(p *Params) (payOrder PreOrder, err error) {
|
func (pcf *Pay) PrePayOrder(p *Params) (payOrder PreOrder, err error) {
|
||||||
nonceStr := util.RandomStr(32)
|
nonceStr := util.RandomStr(32)
|
||||||
tradeType := "JSAPI"
|
param := make(map[string]interface{})
|
||||||
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"
|
param["appid"] = pcf.AppID
|
||||||
str := fmt.Sprintf(template, pcf.AppID, p.Body, pcf.PayMchID, nonceStr, pcf.PayNotifyURL, p.OpenID, p.OutTradeNo, p.CreateIP, p.TotalFee, tradeType, pcf.PayKey)
|
param["body"] = p.Body
|
||||||
|
param["mch_id"] = pcf.PayMchID
|
||||||
|
param["nonce_str"] =nonceStr
|
||||||
|
param["notify_url"] =pcf.PayNotifyURL
|
||||||
|
param["out_trade_no"] =p.OutTradeNo
|
||||||
|
param["spbill_create_ip"] =p.CreateIP
|
||||||
|
param["total_fee"] =p.TotalFee
|
||||||
|
param["trade_type"] =p.TradeType
|
||||||
|
param["openid"] = p.OpenID
|
||||||
|
|
||||||
|
bizKey := "&key="+pcf.PayKey
|
||||||
|
str := orderParam(param,bizKey)
|
||||||
sign := util.MD5Sum(str)
|
sign := util.MD5Sum(str)
|
||||||
request := payRequest{
|
request := payRequest{
|
||||||
AppID: pcf.AppID,
|
AppID: pcf.AppID,
|
||||||
@@ -100,7 +114,7 @@ func (pcf *Pay) PrePayOrder(p *Params) (payOrder PreOrder, err error) {
|
|||||||
TotalFee: p.TotalFee,
|
TotalFee: p.TotalFee,
|
||||||
SpbillCreateIP: p.CreateIP,
|
SpbillCreateIP: p.CreateIP,
|
||||||
NotifyURL: pcf.PayNotifyURL,
|
NotifyURL: pcf.PayNotifyURL,
|
||||||
TradeType: tradeType,
|
TradeType: p.TradeType,
|
||||||
OpenID: p.OpenID,
|
OpenID: p.OpenID,
|
||||||
}
|
}
|
||||||
rawRet, err := util.PostXML(payGateway, request)
|
rawRet, err := util.PostXML(payGateway, request)
|
||||||
@@ -136,3 +150,63 @@ func (pcf *Pay) PrePayID(p *Params) (prePayID string, err error) {
|
|||||||
prePayID = order.PrePayID
|
prePayID = order.PrePayID
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// order params
|
||||||
|
func orderParam(source interface{}, bizKey string) (returnStr string) {
|
||||||
|
switch v := source.(type) {
|
||||||
|
case map[string]string:
|
||||||
|
keys := make([]string, 0, len(v))
|
||||||
|
for k := range v {
|
||||||
|
if k == "sign" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
keys = append(keys, k)
|
||||||
|
}
|
||||||
|
sort.Strings(keys)
|
||||||
|
var buf bytes.Buffer
|
||||||
|
for _, k := range keys {
|
||||||
|
if v[k] == "" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if buf.Len() > 0 {
|
||||||
|
buf.WriteByte('&')
|
||||||
|
}
|
||||||
|
buf.WriteString(k)
|
||||||
|
buf.WriteByte('=')
|
||||||
|
buf.WriteString(v[k])
|
||||||
|
}
|
||||||
|
buf.WriteString(bizKey)
|
||||||
|
returnStr = buf.String()
|
||||||
|
case map[string]interface{}:
|
||||||
|
keys := make([]string, 0, len(v))
|
||||||
|
for k := range v {
|
||||||
|
if k == "sign" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
keys = append(keys, k)
|
||||||
|
}
|
||||||
|
sort.Strings(keys)
|
||||||
|
var buf bytes.Buffer
|
||||||
|
for _, k := range keys {
|
||||||
|
if v[k] == "" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if buf.Len() > 0 {
|
||||||
|
buf.WriteByte('&')
|
||||||
|
}
|
||||||
|
buf.WriteString(k)
|
||||||
|
buf.WriteByte('=')
|
||||||
|
switch vv := v[k].(type) {
|
||||||
|
case string:
|
||||||
|
buf.WriteString(vv)
|
||||||
|
case int:
|
||||||
|
buf.WriteString(strconv.FormatInt(int64(vv), 10))
|
||||||
|
default:
|
||||||
|
panic("params type not supported")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
buf.WriteString(bizKey)
|
||||||
|
returnStr = buf.String()
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user