소스 검색

add nats, tested sms

joe 4 년 전
부모
커밋
bd3276d48c
10개의 변경된 파일125개의 추가작업 그리고 17개의 파일을 삭제
  1. 7 0
      README.cn.md
  2. 1 2
      go.mod
  3. 19 0
      go.sum
  4. 12 7
      mq/mqsvr/nats.go
  5. 61 0
      mq/mqsvr/nats_streaming.go
  6. 1 0
      mq/mqsvr/nats_streaming_test.go
  7. 1 1
      sms/isms.go
  8. 2 2
      sms/smsplat/aliyun.go
  9. 19 2
      sms/smsplat/aliyun_test.go
  10. 2 3
      sms/smsplat/smsbao.go

+ 7 - 0
README.cn.md

@@ -7,4 +7,11 @@ Redistros of many useful libraries
 # composed with
 
 
+# Others
 
+- [qrcode](https://github.com/yeqown/go-qrcode)
+- [xorm]()
+- [gorm]()
+- [viper]()
+- [flag]()
+- [cobra](https://github.com/spf13/cobra)

+ 1 - 2
go.mod

@@ -15,7 +15,6 @@ require (
 	github.com/gin-gonic/gin v1.6.3
 	github.com/go-ole/go-ole v1.2.5 // indirect
 	github.com/go-redis/redis v6.15.9+incompatible
-	github.com/gogo/protobuf v1.2.1 // indirect
 	github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef // indirect
 	github.com/google/btree v1.0.0 // indirect
 	github.com/gorilla/websocket v1.4.2 // indirect
@@ -28,6 +27,7 @@ require (
 	github.com/natefinch/lumberjack v2.0.0+incompatible
 	github.com/nats-io/nats-server/v2 v2.1.9 // indirect
 	github.com/nats-io/nats.go v1.10.0
+	github.com/nats-io/stan.go v0.8.3 // indirect
 	github.com/onsi/ginkgo v1.14.2 // indirect
 	github.com/onsi/gomega v1.10.4 // indirect
 	github.com/prometheus/client_golang v0.9.3 // indirect
@@ -41,7 +41,6 @@ require (
 	go.uber.org/zap v1.16.0
 	golang.org/x/image v0.0.0-20210220032944-ac19c3e999fb // indirect
 	golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 // indirect
-	golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc // indirect
 	google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a // indirect
 	google.golang.org/grpc v1.21.1 // indirect
 	gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect

+ 19 - 0
go.sum

@@ -63,6 +63,8 @@ github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/me
 github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
 github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE=
 github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
+github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
+github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
 github.com/goji/httpauth v0.0.0-20160601135302-2da839ab0f4d/go.mod h1:nnjvkQ9ptGaCkuDUx6wNykzzlUixGxvkme+H/lnzb+A=
 github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g=
 github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
@@ -115,6 +117,7 @@ github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7
 github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
 github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
 github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
+github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
 github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
 github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk=
 github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
@@ -155,6 +158,8 @@ github.com/nats-io/nkeys v0.1.4 h1:aEsHIssIk6ETN5m2/MD8Y4B2X7FfXrBAUdkyRvbVYzA=
 github.com/nats-io/nkeys v0.1.4/go.mod h1:XdZpAbhgyyODYqjTawOnIOI7VlbKSarI9Gfy1tqEu/s=
 github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw=
 github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
+github.com/nats-io/stan.go v0.8.3 h1:XyemjL9vAeGHooHn5RQy+ngljd8AVSM2l65Jdnpv4rI=
+github.com/nats-io/stan.go v0.8.3/go.mod h1:Ejm8bbHnMTSptU6uNMAVuxeapMJYBB/Ml3ej6z4GoSY=
 github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78=
 github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
 github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
@@ -214,6 +219,8 @@ github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs
 github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY=
 github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8=
 github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
+github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 go.etcd.io/bbolt v1.3.2 h1:Z/90sZLPOeCy2PwprqkFa25PdkusRzaj9P8zm/KNyvk=
 go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
 go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk=
@@ -228,6 +235,7 @@ golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnf
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI=
 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
@@ -242,6 +250,8 @@ golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHl
 golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs=
 golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
 golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
+golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -251,7 +261,9 @@ golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73r
 golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
 golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb h1:eBmm0M9fYhWpKZLjQUUKka/LtIxf46G4fxeEz5KJr9U=
 golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
@@ -259,6 +271,8 @@ golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJ
 golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20201207232520-09787c993a3a h1:DcqTD9SDLc+1P/r1EmRBwnVsrOwW+kk2vWf9n+1sGhs=
 golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -298,9 +312,14 @@ golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtn
 golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc h1:NCy3Ohtk6Iny5V/reW2Ktypo4zIpWBdRJ1uFMjBxdg8=
 golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
 google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=

+ 12 - 7
mq/mqsvr/nats.go

@@ -9,12 +9,12 @@ import (
 type NatsCbSubsribe func(subj string, data []byte)
 type NatsCbQueueSubsribe func(subj, queue string, data []byte)
 
-type NatsClient struct {
+type Nats struct {
 	addrs []string
 	conn  *nats.Conn
 }
 
-func NewNatsClient(addrs []string, username, password, name string) (*NatsClient, error) {
+func NewNatsClient(addrs []string, username, password, name string) (*Nats, error) {
 	nc, err := nats.Connect(strings.Join(addrs, ","),
 		nats.NoEcho(),
 		nats.Name(name),
@@ -34,14 +34,19 @@ func NewNatsClient(addrs []string, username, password, name string) (*NatsClient
 	if nil != err {
 		return nil, err
 	}
-	return &NatsClient{addrs: addrs, conn: nc}, nil
+	return &Nats{addrs: addrs, conn: nc}, nil
 }
 
-func (self *NatsClient) Close() {
+func (self *Nats) Close() {
+	self.conn.Drain()
 	self.conn.Close()
 }
 
-func (self *NatsClient) Pub(subj string, content []byte, timeout time.Duration) error {
+func (self *Nats) RawConn() *nats.Conn {
+	return self.conn
+}
+
+func (self *Nats) Pub(subj string, content []byte, timeout time.Duration) error {
 	err := self.conn.Publish(subj, content)
 	if err != nil {
 		return err
@@ -50,7 +55,7 @@ func (self *NatsClient) Pub(subj string, content []byte, timeout time.Duration)
 	return nil
 }
 
-func (self *NatsClient) Sub(subj string, cb NatsCbSubsribe) (*nats.Subscription, error) {
+func (self *Nats) Sub(subj string, cb NatsCbSubsribe) (*nats.Subscription, error) {
 	s, err := self.conn.Subscribe(subj, func(msg *nats.Msg) {
 		cb(msg.Subject, msg.Data)
 	})
@@ -61,7 +66,7 @@ func (self *NatsClient) Sub(subj string, cb NatsCbSubsribe) (*nats.Subscription,
 	return s, nil
 }
 
-func (self *NatsClient) QSub(subj, q string, cb NatsCbQueueSubsribe) (*nats.Subscription, error) {
+func (self *Nats) QSub(subj, q string, cb NatsCbQueueSubsribe) (*nats.Subscription, error) {
 	s, err := self.conn.QueueSubscribe(subj, q, func(msg *nats.Msg) {
 		cb(msg.Subject, msg.Sub.Queue, msg.Data)
 	})

+ 61 - 0
mq/mqsvr/nats_streaming.go

@@ -0,0 +1,61 @@
+package mqsvr
+
+import (
+	"github.com/nats-io/stan.go"
+)
+
+type Stan struct {
+	clusterId, clientId string
+	conn                stan.Conn
+	nats                *Nats
+}
+
+func NewStan(addrs []string, username, password string, clusterId, clientId, name string) (*Stan, error) {
+	nats, err := NewNatsClient(addrs, username, password, name)
+	if err != nil {
+		return nil, err
+	}
+
+	st, err := stan.Connect(clusterId, clientId,
+		stan.NatsConn(nats.RawConn()),
+		stan.SetConnectionLostHandler(func(c stan.Conn, err error) {
+			// fmt.Pr
+		}))
+	if err != nil {
+		return nil, err
+	}
+	return &Stan{
+		clusterId: clusterId,
+		clientId:  clientId,
+		nats:      nats,
+		conn:      st,
+	}, nil
+}
+
+func (self *Stan) Pub(subj string, msg []byte) error {
+	return self.conn.Publish(subj, msg)
+}
+
+func (self *Stan) APub(subj string, msg []byte) error {
+	_, err := self.conn.PublishAsync(subj, msg, func(ackNuid string, err error) {
+
+	})
+	return err
+}
+
+func (self *Stan) Sub(subj, durable string, cb NatsCbSubsribe) (stan.Subscription, error) {
+	return self.conn.Subscribe(subj, func(msg *stan.Msg) {
+		cb(msg.Subject, msg.Data)
+	}, stan.StartWithLastReceived(), stan.DurableName(durable))
+}
+
+func (self *Stan) QSub(subj, durable, qname string, cb NatsCbSubsribe) (stan.Subscription, error) {
+	return self.conn.QueueSubscribe(subj, qname, func(msg *stan.Msg) {
+		cb(msg.Subject, msg.Data)
+	}, stan.StartWithLastReceived(), stan.DurableName(durable))
+}
+
+func (self *Stan) Close() {
+	self.conn.Close()
+	self.nats.Close()
+}

+ 1 - 0
mq/mqsvr/nats_streaming_test.go

@@ -0,0 +1 @@
+package mqsvr

+ 1 - 1
sms/isms.go

@@ -14,7 +14,7 @@ var (
 
 type ISms interface {
 	Send(phone, msg string) error
-	SendTpl(phone, tpl, params string) error
+	SendTpl(phone, tpl string, params []byte) error
 	// BatchSendTpl( phones []string, tpl, params []string) error
 	GetBalance() (float64, error) // balance available
 	GetAvailable() (int64, error) // how many sms times remain we can send

+ 2 - 2
sms/smsplat/aliyun.go

@@ -34,7 +34,7 @@ func (self *aliyunSms) Send(phone, msg string) error {
 	return utl.ErrNotImplement
 }
 
-func (self *aliyunSms) SendTpl(phone, tpl, params string) error {
+func (self *aliyunSms) SendTpl(phone, tpl string, params []byte) error {
 	c, err := dysmsapi.NewClientWithAccessKey(self.region, self.accessKey, self.accessSecret)
 	if err != nil {
 		return err
@@ -52,7 +52,7 @@ func (self *aliyunSms) SendTpl(phone, tpl, params string) error {
 	req.QueryParams["PhoneNumbers"] = phone
 	req.QueryParams["SignName"] = self.signName
 	req.QueryParams["TemplateCode"] = tpl
-	req.QueryParams["TemplateParam"] = params
+	req.QueryParams["TemplateParam"] = string(params)
 	_, err = c.ProcessCommonRequest(req)
 	return err
 }

+ 19 - 2
sms/smsplat/aliyun_test.go

@@ -1,7 +1,24 @@
 package smsplat
 
-import "testing"
+import (
+	"encoding/json"
+	"one.com/kettle/utl"
+	"testing"
+)
 
-func TestAliyun (t *testing.T) {
+const (
+	TPL_CODE      = "SMS_204755043"
+	SIGN_NAME     = "美天旺"
+	ACCESS_KEY    = "LTAI4G1K5gg45Z6A3CjL9dAP"
+	ACCESS_SECRET = "WNJjzkXJ752AC2W8BmRLNqnm91ZbZ5"
+	REGION        = "cn-hangzhou"
+)
 
+func TestAliyun(t *testing.T) {
+	sms := NewAliyunSms(REGION, ACCESS_KEY, ACCESS_SECRET, SIGN_NAME)
+	param, _ := json.Marshal(map[string]interface{}{
+		"code": "111112",
+	})
+	err := sms.SendTpl("18638561215", TPL_CODE, param)
+	utl.AssertNil(err, "send sms", t)
 }

+ 2 - 3
sms/smsplat/smsbao.go

@@ -31,8 +31,7 @@ type smsBao struct {
 }
 
 func (self *smsBao) Send(phone, msg string) error {
-	uri := fmt.Sprintf(url_SENDSMS+"?"+query_SENDSMS, url_SENDSMS,
-		self.username, self.password, phone, url.QueryEscape(msg))
+	uri := fmt.Sprintf(url_SENDSMS+"?"+query_SENDSMS, self.username, self.password, phone, url.QueryEscape(msg))
 
 	var err error = nil
 	data, err := self.c.Get(uri)
@@ -46,7 +45,7 @@ func (self *smsBao) Send(phone, msg string) error {
 }
 
 //TODO: this implement is error. // @see official docs
-func (self *smsBao) SendTpl(phone, tpl, params string) error {
+func (self *smsBao) SendTpl(phone, tpl string, params []byte) error {
 	return self.Send(phone, tpl)
 }