Ver código fonte

Merge pull request #100 from aikangs/develop

Develop
silenceper 7 anos atrás
pai
commit
91d1c77abc
3 arquivos alterados com 102 adições e 6 exclusões
  1. 0 1
      .travis.yml
  2. 23 0
      message/message.go
  3. 79 5
      pay/pay.go

+ 0 - 1
.travis.yml

@@ -4,7 +4,6 @@ go:
   - 1.11.x
   - 1.10.x
   - 1.9.x
-  - 1.8.x
 
 services:
   - memcached

+ 23 - 0
message/message.go

@@ -8,6 +8,9 @@ type MsgType string
 // EventType 事件类型
 type EventType string
 
+// InfoType 第三方平台授权事件类型
+type InfoType string
+
 const (
 	//MsgTypeText 表示文本消息
 	MsgTypeText MsgType = "text"
@@ -62,6 +65,17 @@ const (
 	EventTemplateSendJobFinish = "TEMPLATESENDJOBFINISH"
 )
 
+const (
+	// InfoTypeVerifyTicket 返回ticket
+	InfoTypeVerifyTicket InfoType = "component_verify_ticket"
+	// InfoTypeAuthorized 授权
+	InfoTypeAuthorized = "authorized"
+	// InfoTypeUnauthorized 取消授权
+	InfoTypeUnauthorized = "unauthorized"
+	// InfoTypeUpdateAuthorized 更新授权
+	InfoTypeUpdateAuthorized = "updateauthorized"
+)
+
 //MixMessage 存放所有微信发送过来的消息和事件
 type MixMessage struct {
 	CommonToken
@@ -110,6 +124,15 @@ type MixMessage struct {
 		Label     string  `xml:"Label"`
 		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 发图事件推送

+ 79 - 5
pay/pay.go

@@ -1,9 +1,11 @@
 package pay
 
 import (
+	"bytes"
 	"encoding/xml"
 	"errors"
-	"fmt"
+	"sort"
+	"strconv"
 
 	"github.com/silenceper/wechat/context"
 	"github.com/silenceper/wechat/util"
@@ -24,6 +26,7 @@ type Params struct {
 	Body       string
 	OutTradeNo string
 	OpenID     string
+	TradeType  string
 }
 
 // Config 是传出用于 jsdk 用的参数
@@ -86,9 +89,20 @@ func NewPay(ctx *context.Context) *Pay {
 // PrePayOrder return data for invoke wechat payment
 func (pcf *Pay) PrePayOrder(p *Params) (payOrder PreOrder, err error) {
 	nonceStr := util.RandomStr(32)
-	tradeType := "JSAPI"
-	template := "appid=%s&body=%s&mch_id=%s&nonce_str=%s&notify_url=%s&openid=%s&out_trade_no=%s&spbill_create_ip=%s&total_fee=%s&trade_type=%s&key=%s"
-	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 := make(map[string]interface{})
+	param["appid"] = pcf.AppID
+	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)
 	request := payRequest{
 		AppID:          pcf.AppID,
@@ -100,7 +114,7 @@ func (pcf *Pay) PrePayOrder(p *Params) (payOrder PreOrder, err error) {
 		TotalFee:       p.TotalFee,
 		SpbillCreateIP: p.CreateIP,
 		NotifyURL:      pcf.PayNotifyURL,
-		TradeType:      tradeType,
+		TradeType:      p.TradeType,
 		OpenID:         p.OpenID,
 	}
 	rawRet, err := util.PostXML(payGateway, request)
@@ -136,3 +150,63 @@ func (pcf *Pay) PrePayID(p *Params) (prePayID string, err error) {
 	prePayID = order.PrePayID
 	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
+}