更新卡商网服务

master
李光春 3 years ago
parent ab39efe8d0
commit 31594c38da

@ -1,12 +1,13 @@
package kashangwl package kashangwl
import ( import (
"bytes"
"crypto/md5"
"encoding/hex"
"encoding/json" "encoding/json"
"fmt"
"github.com/bitly/go-simplejson" "github.com/bitly/go-simplejson"
md52 "gopkg.in/dtapps/go-library.v2/md5"
params2 "gopkg.in/dtapps/go-library.v2/params" params2 "gopkg.in/dtapps/go-library.v2/params"
string2 "gopkg.in/dtapps/go-library.v2/string" "io"
"io/ioutil" "io/ioutil"
"net/http" "net/http"
"sort" "sort"
@ -16,6 +17,12 @@ import (
const api = "http://www.kashangwl.com/api/" const api = "http://www.kashangwl.com/api/"
// Parameter 参数
type Parameter map[string]interface{}
// ParameterEncode 参数
type ParameterEncode []string
// KaShangWl 每次请求需传入以下参数 // KaShangWl 每次请求需传入以下参数
type KaShangWl struct { type KaShangWl struct {
CustomerId int // 商家编号 CustomerId int // 商家编号
@ -23,26 +30,16 @@ type KaShangWl struct {
} }
// Send 发送 http://cha.kashangwl.com/api-doc/ // Send 发送 http://cha.kashangwl.com/api-doc/
func (w *KaShangWl) Send(msg interface{}, url string) (*simplejson.Json, error) { func (w *KaShangWl) Send(url string, param Parameter) (*simplejson.Json, error) {
// 当前时间戳(单位:秒)
timestamp := time.Now().UnixNano() / 1e6
// 处理数据 // 处理数据
marshal, _ := json.Marshal(msg) param.setRequestData(w)
newJson, _ := simplejson.NewJson(marshal) // 请求
newJson.Set("customer_id", w.CustomerId) resp, e := http.Post(api+url, "application/json", strings.NewReader(param.getRequestData()))
newJson.Set("timestamp", timestamp)
signStr := sign(newJson, w.CustomerKey)
newJson.Set("sign", signStr)
j, e := newJson.MarshalJSON()
if e != nil {
return nil, e
}
resp, e := http.Post(api+url, "application/json", strings.NewReader(string(j)))
if e != nil { if e != nil {
return nil, e return nil, e
} }
defer resp.Body.Close() defer resp.Body.Close()
// 返回结果
body, _ := ioutil.ReadAll(resp.Body) body, _ := ioutil.ReadAll(resp.Body)
respJson, err := simplejson.NewJson(body) respJson, err := simplejson.NewJson(body)
if err != nil { if err != nil {
@ -52,21 +49,37 @@ func (w *KaShangWl) Send(msg interface{}, url string) (*simplejson.Json, error)
} }
// md5(key + 参数1名称 + 参数1值 + 参数2名称 + 参数2值...) 加密源串应为{key}customer_id1192442order_id827669582783timestamp1626845767 // md5(key + 参数1名称 + 参数1值 + 参数2名称 + 参数2值...) 加密源串应为{key}customer_id1192442order_id827669582783timestamp1626845767
func sign(params *simplejson.Json, key string) string { func sign(params Parameter, customerKey string) string {
var dataParams string
// 参数按照参数名的字典升序排列 // 参数按照参数名的字典升序排列
var keys []string var keys []string
for k := range params.MustMap() { for k := range params {
keys = append(keys, k) keys = append(keys, k)
} }
sort.Strings(keys) sort.Strings(keys)
// 拼接 // 拼接
dataParams = fmt.Sprintf("%s%s", dataParams, key) query := bytes.NewBufferString(customerKey)
for _, k := range keys { for _, k := range keys {
dataParams = fmt.Sprintf("%s%s%s", dataParams, k, params2.GetParamsString(params.Get(k))) query.WriteString(k)
query.WriteString(params2.GetParamsString(params[k]))
} }
// MD5加密 // MD5加密
md5Str := md52.GetMD5Encode(dataParams) h := md5.New()
str := string2.ToLower(md5Str) io.Copy(h, query)
return str return strings.ToLower(hex.EncodeToString(h.Sum(nil)))
}
// 设置请求数据
func (p Parameter) setRequestData(w *KaShangWl) {
// 当前时间戳(单位:秒)
timestamp := time.Now().UnixNano() / 1e6
p["timestamp"] = timestamp
p["customer_id"] = w.CustomerId
// 设置签名
p["sign"] = sign(p, w.CustomerKey)
}
// 获取请求数据
func (p Parameter) getRequestData() string {
j, _ := json.Marshal(p)
return string(j)
} }

@ -1,21 +1,21 @@
package kashangwl package kashangwl
import ( import (
"gopkg.in/dtapps/go-library.v2/kashangwl/message" _url "gopkg.in/dtapps/go-library.v2/kashangwl/url"
"gopkg.in/dtapps/go-library.v2/kashangwl/url"
"log" "log"
"testing" "testing"
) )
func TestName(t *testing.T) { func TestName(t *testing.T) {
wl := KaShangWl{ wl := KaShangWl{
CustomerId: 0000000, CustomerId: 0,
CustomerKey: "xxx", CustomerKey: "",
} }
msg := message.Order{
OrderId: 827669582783, param := Parameter{
"order_id": 827669582783,
} }
send, err := wl.Send(msg, url.Order) send, err := wl.Send(_url.Order, param)
log.Printf("send%s\n", send) log.Printf("send%s\n", send)
if err != nil { if err != nil {
t.Errorf("err%v\n", err) t.Errorf("err%v\n", err)

@ -1,30 +0,0 @@
package message
type Product struct {
ProductId int `json:"product_id"` //true 商品编号
}
// ProductRechargeParams 获取商品的充值参数。
type ProductRechargeParams struct {
ProductId int `json:"product_id"` //true 商品编号
}
// Buy 购买商品(不支持购买选号类型的商品)
type Buy struct {
ProductId int `json:"product_id"` //true 商品编号
RechargeAccount string `json:"recharge_account"` //false 充值账号
RechargeTemplateInputItems interface{} `json:"recharge_template_input_items"` //false 模板充值参数([1]见下方说明)
Quantity int `json:"quantity"` //true 购买数量
NotifyUrl string `json:"notify_url"` //false 异步通知地址
OuterOrderId string `json:"outer_order_id"` //false 外部订单号
}
// Order 获取单个订单信息
type Order struct {
OrderId int64 `json:"order_id"` //true 订单号
}
// Customer 获取商家信息
type Customer struct {
CustomerId int `json:"customer_id"` //true 商家编号
}

@ -1,9 +1,9 @@
package url package _url
const ( const (
Product = "product" // 获取单个商品信息 Product = "product" // 获取单个商品信息 http://cha.kashangwl.com/api-doc/basic/product.html
ProductRechargeParams = "product/recharge-params" // 获取商品的充值参数 ProductRechargeParams = "product/recharge-params" // 获取商品的充值参数 http://cha.kashangwl.com/api-doc/basic/product-recharge-params.html
Buy = "buy" // 购买商品(不支持购买选号类型的商品) Buy = "buy" // 购买商品(不支持购买选号类型的商品) http://cha.kashangwl.com/api-doc/basic/buy.html
Order = "order" // 获取单个订单信息 Order = "order" // 获取单个订单信息 http://cha.kashangwl.com/api-doc/basic/order.html
Customer = "customer" // 获取商家信息 Customer = "customer" // 获取商家信息 http://cha.kashangwl.com/api-doc/basic/customer.html
) )

@ -1,5 +1,5 @@
package library package library
func Version() string { func Version() string {
return "2.0.2" return "2.0.3"
} }

@ -31,14 +31,16 @@ type PinDuoDuo struct {
} }
func (d *PinDuoDuo) Send(method string, param Parameter) (*simplejson.Json, error) { func (d *PinDuoDuo) Send(method string, param Parameter) (*simplejson.Json, error) {
// 处理数据
param["type"] = method param["type"] = method
param.setRequestData(d) param.setRequestData(d)
// 请求
resp, err := http.Post(api, "application/x-www-form-urlencoded;charset=utf-8", strings.NewReader(param.getRequestData())) resp, err := http.Post(api, "application/x-www-form-urlencoded;charset=utf-8", strings.NewReader(param.getRequestData()))
if err != nil { if err != nil {
return nil, err return nil, err
} }
defer resp.Body.Close() defer resp.Body.Close()
// 返回结果
body, _ := ioutil.ReadAll(resp.Body) body, _ := ioutil.ReadAll(resp.Body)
respJson, err := simplejson.NewJson(body) respJson, err := simplejson.NewJson(body)
if err != nil { if err != nil {

Loading…
Cancel
Save