diff --git a/platformapi/ebaiapi/order_test.go b/platformapi/ebaiapi/order_test.go index b3dcb9b2..d473fd86 100644 --- a/platformapi/ebaiapi/order_test.go +++ b/platformapi/ebaiapi/order_test.go @@ -18,7 +18,7 @@ func TestCancelOrder(t *testing.T) { } func TestOrderGet(t *testing.T) { - result, err := api.OrderGet("4097516027266349568") + result, err := api.OrderGet("4042556041071971860") products := result["products"].([]interface{})[0].([]interface{}) for _, product2 := range products { product := product2.(map[string]interface{}) diff --git a/platformapi/lakala/lakala_api.go b/platformapi/lakala/lakala_api.go index 1bd8accb..4f134a5e 100644 --- a/platformapi/lakala/lakala_api.go +++ b/platformapi/lakala/lakala_api.go @@ -128,9 +128,7 @@ func (a *API) AccessAPI2(baseUrl, action, method string, pathParam string, bizPa } request, _ = http.NewRequest(http.MethodGet, getUrl, nil) } - //if action == IncomingAction { request.Header.Set("Content-Type", "application/json") - //} switch IncomingTokenActive[action] { case IncomingToken: request.Header.Set("Authorization", fmt.Sprintf("bearer %s", a.incomingToken)) diff --git a/platformapi/lakala/lakala_incoming.go b/platformapi/lakala/lakala_incoming.go index 7dbf60c2..c5d0ad3e 100644 --- a/platformapi/lakala/lakala_incoming.go +++ b/platformapi/lakala/lakala_incoming.go @@ -1,6 +1,7 @@ package lakala import ( + "encoding/base64" "encoding/json" "fmt" "git.rosy.net.cn/baseapi/utils" @@ -20,8 +21,12 @@ func (a *API) MerchantIncoming(incoming *MerchantIncomingReq) (string, string, e // GetMerchantInfo 获取商户详细信息 func (a *API) GetMerchantInfo(customerNo string) (*MerchantObj, error) { - data := map[string]interface{}{"customerNo": customerNo} - result, err := a.AccessAPI2(BaseProdChangeUrl, GetMerchantInfo, http.MethodPost, "", data) + parameters, _ := json.Marshal(map[string]string{"customerNo": customerNo}) + encryptParam, err := EncryptByPrivateKey(parameters, PrivateKeyBegin) + if err != nil { + return nil, err + } + result, err := a.AccessAPI2(BaseProdChangeUrl, GetMerchantInfo, http.MethodPost, "", map[string]interface{}{"data": encryptParam}) if err != nil { return nil, err } @@ -30,9 +35,48 @@ func (a *API) GetMerchantInfo(customerNo string) (*MerchantObj, error) { return nil, fmt.Errorf(result["message"].(string)) } + decryptData := result["data"].(string) + base64DecryData, _ := base64.StdEncoding.DecodeString(decryptData) + resultData, err := DecryptByPublicKey(base64DecryData, PublicKeyBegin) + if err != nil { + return nil, err + } + merchant := &MerchantObj{} - merchantInfo, _ := json.Marshal(result["data"]) - json.Unmarshal(merchantInfo, merchant) + if err = json.Unmarshal(resultData, merchant); err != nil { + return nil, err + } + + return merchant, nil +} + +// GetTerminalInfo 获取终端信息 +func (a *API) GetTerminalInfo(posSn string) (*TerminalInfo, error) { + parameters, _ := json.Marshal(map[string]string{"posSn": posSn}) + encryptParam, err := EncryptByPrivateKey(parameters, PrivateKeyBegin) + if err != nil { + return nil, err + } + result, err := a.AccessAPI2(BaseProdChangeUrl, GetTerminalInfo, http.MethodPost, "", map[string]interface{}{"data": encryptParam}) + if err != nil { + return nil, err + } + + if result["code"].(string) != Success { + return nil, fmt.Errorf(result["message"].(string)) + } + + decryptData := result["data"].(string) + base64DecryData, _ := base64.StdEncoding.DecodeString(decryptData) + resultData, err := DecryptByPublicKey(base64DecryData, PublicKeyBegin) + if err != nil { + return nil, err + } + + merchant := &TerminalInfo{} + if err = json.Unmarshal(resultData, merchant); err != nil { + return nil, err + } return merchant, nil } diff --git a/platformapi/lakala/lakala_incoming_model.go b/platformapi/lakala/lakala_incoming_model.go index ba422a41..1c6f044e 100644 --- a/platformapi/lakala/lakala_incoming_model.go +++ b/platformapi/lakala/lakala_incoming_model.go @@ -31,6 +31,7 @@ const ( SupplementBusinessLicense = "channel/customer/update/supplement/businessLicense" // 变更营业执照 UnionPayMerInfo = "open/merchant/unionPayMerInfo" // 是否为失信人 GetMerchantInfo = "open/merchant/info" // 获取商户信息 + GetTerminalInfo = "open/terminal/info" // 获取商户信息 ) const ( @@ -60,6 +61,7 @@ var IncomingTokenActive = map[string]string{ SupplementBusinessLicense: ModifiedToken, UnionPayMerInfo: ModifiedToken, GetMerchantInfo: IncomingToken, + GetTerminalInfo: IncomingToken, } const ( @@ -259,7 +261,7 @@ type CustomerObj struct { ChannelType string `json:"channelType"` // 商户类型 TP_MERCHANT:企业,TP_PERSONAL:小微,可用值:TP_MERCHANT,TP_PERSONAL string CloseTime string `json:"closeTime"` // 撤机时间 string(date-time) ContactManName string `json:"contactManName"` // 联系人改名 string - CreateTime string `json:"createTime"` // string(date-time) + CreateTime int64 `json:"createTime"` // string(date-time) CustomerName string `json:"customerName"` // 商户名称 string CustomerNo int64 `json:"customerNo"` // 商户编号 integer(int64) CustomerStatus string `json:"customerStatus"` // 商户状态 OPEN:开通,CLOSE:关闭,LOSS:流失,WAIT_AUDI:审核中,REJECT:审核拒绝,REVIEW_FAIL:复核失败,REVIEW_AUDIT:复核审核中,ACTIVITY:激活 string @@ -286,7 +288,7 @@ type CustomerObj struct { StandardTime string `json:"standardTime"` // 达标时间 string(date-time) TermNo string `json:"termNo"` // 虚拟终端号 string TermNum int32 `json:"termNum"` // 终端数量 integer(int32) - UpdateTime string `json:"updateTime"` // string(date-time) + UpdateTime int64 `json:"updateTime"` // string(date-time) YsfDiscount string `json:"ysfDiscount"` // 云闪付小额优惠[FALSE:否,TRUE:是] string ProvinceName string `json:"provinceName"` // 省份名称 string CityName string `json:"cityName"` // 城市名称 string @@ -298,7 +300,7 @@ type CustomerObj struct { type CustomerFeeObj struct { Id int64 `json:"id"` // integer(int64) CardType string `json:"cardType"` // 卡类型, 可用值:CREDIT_CARD, QR_CORD, DEBIT_CARD, YSF_LE_1000_CREDIT, YSF_LE_1000_DEBIT string - CreateTime string `json:"createTime"` // string(date-time) + CreateTime int64 `json:"createTime"` // string(date-time) CustomerNo int64 `json:"customerNo"` // 商户编号 integer(int64) DayLimit float64 `json:"dayLimit"` // 日限额 number(double) ExternalCustomerNo string `json:"externalCustomerNo"` // string @@ -312,7 +314,7 @@ type CustomerFeeObj struct { TransSettleType string `json:"transSettleType"` // 结算类型, 可用值:D0, D1, T1 string TransType string `json:"transType"` // 交易类型 string TremNo string `json:"tremNo"` // 终端号 string 根据transType判断是刷卡还是扫码的终端号信息 - UpdateTime string `json:"updateTime"` // string(date-time) + UpdateTime int64 `json:"updateTime"` // string(date-time) CustomerManagementFee float64 `json:"customerManagementFee"` // 商户管理费费率 number(double) CustomerManagementdFee float64 `json:"customerManagementdFee"` // 商户管理费d number(double) CustomerManagementeFee float64 `json:"customerManagementeFee"` // 商户管理费e number(double) @@ -344,7 +346,7 @@ type SettleCardObj struct { ClearingBankNo string `json:"clearingBankNo"` // 清算行号 string CountyCode string `json:"countyCode"` // 区编号 string CountyName string `json:"countyName"` // 区名称 string - CreateTime string `json:"createTime"` // string(date-time) + CreateTime int64 `json:"createTime"` // string(date-time) ExternalCustomerNo string `json:"externalCustomerNo"` // string Id int64 `json:"id"` // integer(int64) IdCard string `json:"idCard"` // 身份证号 string @@ -352,7 +354,7 @@ type SettleCardObj struct { OwnNo string `json:"ownNo"` // 所有者 string ProvinceCode string `json:"provinceCode"` // 省份编号 string ProvinceName string `json:"provinceName"` // 省份名称 string - UpdateTime string `json:"updateTime"` // string(date-time) + UpdateTime int64 `json:"updateTime"` // string(date-time) Validate string `json:"validate"` // string } @@ -391,6 +393,48 @@ type ProductVoObj struct { ProductName string `json:"productName"` // 商户产品名称 String } +// TerminalInfo 获取终端信息 +type TerminalInfo struct { + Customer TerminalCustomer `json:"customer"` + Pos TerminalPos `json:"pos"` + ExternalNo string `json:"externalNo"` +} + +type TerminalPos struct { + ActivityFlag string `json:"activityFlag"` // 活动标识 string + AgencyNo int64 `json:"agencyNo"` // 服务商编号 integer(int64) + AgentNo int64 `json:"agentNo"` // 合作方编号 integer(int64) + AllotTime string `json:"allotTime"` // 分配时间 + AntiActivateFlag string `json:"antiActivateFlag"` // 反激活状态 + BindTime string `json:"bindTime"` // pos激活时间 + CreateTime string `json:"createTime"` // + DepositType string `json:"depositType"` // 押金类型,可用值:DEPOSIT_TYPE_299,DEPOSIT_TYPE_DQ_100,DEPOSIT_TYPE_DQ_NONE,DEPOSIT_TYPE_NONE,DEPOSIT_TYPE_KLB_99 + FeeRateType string `json:"feeRateType"` // + Id string `json:"id"` // + IncomeUserNo string `json:"incomeUserNo"` // + Optimistic int64 `json:"optimistic"` // + Platform string `json:"platform"` // 平台标识 + PosModel string `json:"posModel"` // 机具型号 + PosName string `json:"posName"` // pos机名称 + PosSn string `json:"posSn"` // 机具编号 + PosType string `json:"posType"` // 机具类型,可用值:BPOS,ZPOS + PurchaseAgencyNo string `json:"purchaseAgencyNo"` // 采购服务商编号 + Status string `json:"status"` // 状态:INIT:未分配 ALLOCATE:己分配 BIND:己绑定 ACTIVE:己激活,可用值:INIT,ALLOCATE,BIND,ACTIVE,UN_ACTIVE + SyncStatus string `json:"sync_status"` // 是否同步服务费管理平台 YES 同步 NO 未同步,可用值:YES,NO + TermNo string `json:"termNo"` // 拉卡拉虚拟终端号 + UpdateTime string `json:"updateTime"` // + ActiveNo string `json:"activeNo"` // 激活码 string + OpenTime string `json:"openTime"` // 开通时间 string +} +type TerminalCustomer struct { + AgencyNo int64 `json:"agencyNo"` // 服务商编号 integer(int64) + AgentNo int64 `json:"agentNo"` // 合作方编号 integer(int64) + CustomerName string `json:"customerName"` // 商户名称 string + CustomerNo string `json:"customerNo"` // 商户编号 integer(int64) + ExternalCustomerNo string `json:"externalCustomerNo"` // 外部商户编号 string + TermNo string `json:"termNo"` // 虚拟终端号 string +} + // OrganizationList 获取城市组织代码 type OrganizationList struct { Id int64 `json:"id"` diff --git a/platformapi/lakala/lakala_pay_test.go b/platformapi/lakala/lakala_pay_test.go index ef7a3c1e..f1243918 100644 --- a/platformapi/lakala/lakala_pay_test.go +++ b/platformapi/lakala/lakala_pay_test.go @@ -1,15 +1,6 @@ package lakala import ( - "crypto" - "crypto/rand" - "crypto/rsa" - "crypto/sha256" - "crypto/x509" - "encoding/base64" - "encoding/json" - "encoding/pem" - "fmt" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/globals" "testing" @@ -21,42 +12,6 @@ func TestSign(t *testing.T) { } -func TestJiami(t *testing.T) { - sign, err := signParamRSA2("8000000000001", "1610334026688401311", "1621690412", "123456789012", LaKaLaPrivateKey) - globals.SugarLogger.Debugf("---sign := %s", sign) - globals.SugarLogger.Debugf("---err := %v", err) -} - -// signParamRSA 支付签名 -func signParamRSA2(appId, serialNo, timeStamp, nonceStr, RSAPrivate string) (sign string, err error) { - block, _ := pem.Decode([]byte(RSAPrivate)) - private, err := x509.ParsePKCS8PrivateKey(block.Bytes) - if err != nil { - return "", err - } - - // 签名参数 - body1, err := json.Marshal(`{"reqData":....此处省略具体报文......}`) - sm4Key, _ := base64.StdEncoding.DecodeString(SM4Key) - body2, err := SM4ECBEncrypt(body1, sm4Key) - if err != nil { - return "", err - } - bodyData := base64.StdEncoding.EncodeToString(body2) - context := fmt.Sprintf("%s\n%s\n%s\n%s\n%s\n", appId, serialNo, timeStamp, nonceStr, bodyData) - - // 进行rsa加密签名 - hashed := sha256.Sum256([]byte(context)) - signedData, err := rsa.SignPKCS1v15(rand.Reader, private.(*rsa.PrivateKey), crypto.SHA256, hashed[:]) - if err != nil { - return "", err - } - - signData := base64.StdEncoding.EncodeToString(signedData) - authorization := signData // fmt.Sprintf(`LKLAPI-SHA256withRSA appid="%s",serial_no="%s",timestamp="%s",nonce_str="%s",signature="%s"`, a.appID, a.serialNo, timeStamp, nonceStr, signData) - return authorization, nil -} - func TestPayStatusQuery(t *testing.T) { api.PayStatusQuery(&PayStatusQueryReq{ MerchantNo: "822290059430BFA", diff --git a/platformapi/lakala/lakala_token.go b/platformapi/lakala/lakala_token.go index 27e37df3..968b88e2 100644 --- a/platformapi/lakala/lakala_token.go +++ b/platformapi/lakala/lakala_token.go @@ -10,6 +10,7 @@ import ( "encoding/base64" "encoding/json" "encoding/pem" + "errors" "fmt" "git.rosy.net.cn/baseapi/utils" "github.com/tjfoc/gmsm/sm4" @@ -164,6 +165,37 @@ func (a *API) signParamRSA(params map[string]interface{}, RSAPrivate string) (si return authorization, nil } +// signParamRSA 支付签名 +func (a *API) signParamPrivateKey(params map[string]interface{}, RSAPrivate string) (sig string, err error) { + block, _ := pem.Decode([]byte(RSAPrivate)) + private, err := x509.ParsePKCS8PrivateKey(block.Bytes) + if err != nil { + return "", err + } + + // 签名参数 + body, err := json.Marshal(params) + if err != nil { + return "", err + } + + //bodyData := base64.StdEncoding.EncodeToString(body) + nonceStr := GenerateSecureRandomString(12) + timeStamp := utils.Int64ToStr(time.Now().Unix()) + context := fmt.Sprintf("%s\n%s\n%s\n%s\n%s\n", a.appID, a.serialNo, timeStamp, nonceStr, string(body)) + + // 进行rsa加密签名 + hashed := sha256.Sum256([]byte(context)) + signedData, err := rsa.SignPKCS1v15(rand.Reader, private.(*rsa.PrivateKey), crypto.SHA256, hashed[:]) + if err != nil { + return "", err + } + + signData := base64.StdEncoding.EncodeToString(signedData) + authorization := fmt.Sprintf(`LKLAPI-SHA256withRSA appid="%s",serial_no="%s",timestamp="%s",nonce_str="%s",signature="%s"`, a.appID, a.serialNo, timeStamp, nonceStr, signData) + return authorization, nil +} + // GenerateSecureRandomString 获取随机字符串 func GenerateSecureRandomString(length int) string { charset := "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" @@ -234,3 +266,105 @@ func CallBackResultInfo(err error) *CallBackResult { Message: err.Error(), } } + +/****************************/ + +const ( + MAX_ENCRYPT_BLOCK = 117 + MAX_DECRYPT_BLOCK = 128 +) + +func EncryptByPrivateKey(data []byte, privateKeyStr string) (string, error) { + // 解析私钥 + block, _ := pem.Decode([]byte(privateKeyStr)) + if block == nil { + return "", errors.New("failed to parse PEM block") + } + + privKey, err := x509.ParsePKCS8PrivateKey(block.Bytes) + if err != nil { + return "", err + } + + rsaPrivateKey := privKey.(*rsa.PrivateKey) + + // 分段加密 + var encrypted []byte + for offset := 0; offset < len(data); offset += MAX_ENCRYPT_BLOCK { + end := offset + MAX_ENCRYPT_BLOCK + if end > len(data) { + end = len(data) + } + + chunk, err := rsa.SignPKCS1v15(nil, rsaPrivateKey, 0, data[offset:end]) + if err != nil { + return "", err + } + encrypted = append(encrypted, chunk...) + } + + return base64.StdEncoding.EncodeToString(encrypted), nil +} + +// DecryptByPublicKey 解密函数:分段解密(公钥解密,需手动实现模幂运算) +func DecryptByPublicKey(ciphertext []byte, publicKeyStr string) ([]byte, error) { + // 解析公钥 + block, _ := pem.Decode([]byte(publicKeyStr)) + if block == nil { + return nil, errors.New("failed to parse PEM block") + } + + pubKey, err := x509.ParsePKIXPublicKey(block.Bytes) + if err != nil { + return nil, err + } + + rsaPublicKey := pubKey.(*rsa.PublicKey) + + n := rsaPublicKey.N // 公钥模数 + e := rsaPublicKey.E // 公钥指数 + + blockSize := rsaPublicKey.Size() // 密钥的字节长度(128字节) + var result bytes.Buffer + + for len(ciphertext) > 0 { + blockLen := blockSize + if len(ciphertext) < blockLen { + blockLen = len(ciphertext) + } + block := ciphertext[:blockLen] + ciphertext = ciphertext[blockLen:] + + // 将密文块转换为大整数 + c := new(big.Int).SetBytes(block) + + // 计算 m = c^e mod n (由于私钥加密,公钥解密时需要e和n) + m := new(big.Int).Exp(c, big.NewInt(int64(e)), n) + + // 将结果转换为字节数组,并补零到固定长度 + mBytes := m.Bytes() + if len(mBytes) < blockSize { + padding := make([]byte, blockSize-len(mBytes)) + mBytes = append(padding, mBytes...) + } + // 写入最终结果 + result.Write(mBytes) + } + + // 移除PKCS1v15填充(需要实现填充剥离) + // 注意:此处简化,实际需解析填充结构,比如去除00 02和填充字节 + return stripPKCS1v15Padding(result.Bytes()), nil +} + +// 移除PKCS1v15填充(示例逻辑,需根据实际填充调整) +func stripPKCS1v15Padding(data []byte) []byte { + var newData = make([]byte, 0, len(data)) + + for i := 0; i < len(data); i++ { + if data[i] == 0x01 || data[i] == 0xFF || data[i] == 0x00 { + continue + } + newData = append(newData, data[i]) + } + return newData +} diff --git a/platformapi/lakala/lakala_token_model.go b/platformapi/lakala/lakala_token_model.go index 2c9e7915..aeb9f22d 100644 --- a/platformapi/lakala/lakala_token_model.go +++ b/platformapi/lakala/lakala_token_model.go @@ -1,5 +1,7 @@ package lakala +import "fmt" + const ( LaKaLaPrivateKey = `-----BEGIN PRIVATE KEY----- MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCk0RXx20B/AFpr @@ -31,35 +33,6 @@ wmorJON4jA4sZ5SG0xG5xQ== -----END PRIVATE KEY----- ` - // LaKaLaPrivateKey = `-----BEGIN PRIVATE KEY----- - //MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDvDBZyHUDndAGx - //rIcsCV2njhNO3vCEZotTaWYSYwtDvkcAb1EjsBFabXZaKigpqFXk5XXNI3NIHP9M - //8XKzIgGvc65NpLAfRjVql8JiTvLyYd1gIUcOXMInabu+oX7dQSI1mS8XzqaoVRhD - //ZQWhXcJW9bxMulgnzvk0Ggw07AjGF7si+hP/Va8SJmN7EJwfQq6TpSxR+WdIHpbW - //dhZ+NHwitnQwAJTLBFvfk28INM39G7XOsXdVLfsooFdglVTOHpNuRiQAj9gShCCN - //rpGsNQxDiJIxE43qRsNsRwigyo6DPJk/klgDJa417E2wgP8VrwiXparO4FMzOGK1 - //5quuoD7DAgMBAAECggEBANhmWOt1EAx3OBFf3f4/fEjylQgRSiqRqg8Ymw6KGuh4 - //mE4Md6eW/B6geUOmZjVP7nIIR1wte28M0REWgn8nid8LGf+v1sB5DmIwgAf+8G/7 - //qCwd8/VMg3aqgQtRp0ckb5OV2Mv0h2pbnltkWHR8LDIMwymyh5uCApbn/aTrCAZK - //NXcPOyAn9tM8Bu3FHk3Pf24Er3SN+bnGxgpzDrFjsDSHjDFT9UMIc2WdA3tuMv9X - //3DDn0bRCsHnsIw3WrwY6HQ8mumdbURk+2Ey3eRFfMYxyS96kOgBC2hqZOlDwVPAK - //TPtS4hoq+cQ0sRaJQ4T0UALJrBVHa+EESgRaTvrXqAECgYEA+WKmy9hcvp6IWZlk - //9Q1JZ+dgIVxrO65zylK2FnD1/vcTx2JMn73WKtQb6vdvTuk+Ruv9hY9PEsf7S8gH - //STTmzHOUgo5x0F8yCxXFnfji2juoUnDdpkjtQK5KySDcpQb5kcCJWEVi9v+zObM0 - //Zr1Nu5/NreE8EqUl3+7MtHOu1TMCgYEA9WM9P6m4frHPW7h4gs/GISA9LuOdtjLv - //AtgCK4cW2mhtGNAMttD8zOBQrRuafcbFAyU9de6nhGwetOhkW9YSV+xRNa7HWTeI - //RgXJuJBrluq5e1QGTIwZU/GujpNaR4Qiu0B8TodM/FME7htsyxjmCwEfT6SDYlke - //MzTbMa9Q0DECgYBqsR/2+dvD2YMwAgZFKKgNAdoIq8dcwyfamUQ5mZ5EtGQL2yw4 - //8zibHh/LiIxgUD1Kjk/qQgNsX45NP4iOc0mCkrgomtRqdy+rumbPTNmQ0BEVJCBP - //scd+8pIgNiTvnWpMRvj7gMP0NDTzLI3wnnCRIq8WAtR2jZ0Ejt+ZHBziLQKBgQDi - //bEe/zqNmhDuJrpXEXmO7fTv3YB/OVwEj5p1Z/LSho2nHU3Hn3r7lbLYEhUvwctCn - //Ll2fzC7Wic1rsGOqOcWDS5NDrZpUQGGF+yE/JEOiZcPwgH+vcjaMtp0TAfRzuQEz - //NzV8YGwxB4mtC7E/ViIuVULHAk4ZGZI8PbFkDxjKgQKBgG8jEuLTI1tsP3kyaF3j - //Aylnw7SkBc4gfe9knsYlw44YlrDSKr8AOp/zSgwvMYvqT+fygaJ3yf9uIBdrIilq - //CHKXccZ9uA/bT5JfIi6jbg3EoE9YhB0+1aGAS1O2dBvUiD8tJ+BjAT4OB0UDpmM6 - //QsFLQgFyXgvDnzr/o+hQJelW - //-----END PRIVATE KEY----- - //` LaKaLaPublicKey = `-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApNEV8dtAfwBaaxa+DhdB E+zpcrwUcjnPmT9LqwgK2f4Ts9QdHjhj+A+w3Y8NWIHGHuvD+XUJfV/4KQ0tFmvh @@ -70,28 +43,6 @@ RcsV8jlMmhUzWJ7z3LCw46PPWAn5nH4pcF3j9dTf0AKZGnx6bnpeWy4NDPip6PKE oQIDAQAB -----END PUBLIC KEY----- ` - //LaKaLaPublicKey = `-----BEGIN CERTIFICATE----- - //MIIDYTCCAkmgAwIBAgIJAN+6gZTEG4TPMA0GCSqGSIb3DQEBCwUAMEkxCzAJBgNV - //BAYTAlVTMREwDwYDVQQIEwhzaGFuZ2hhaTERMA8GA1UEBxMIc2hhbmdoYWkxFDAS - //BgNVBAMUC2xha2FsYV8yMDIxMB4XDTIxMDYxODA3MjEzNFoXDTMxMDYxOTA3MjEz - //NFowSTELMAkGA1UEBhMCVVMxETAPBgNVBAgTCHNoYW5naGFpMREwDwYDVQQHEwhz - //aGFuZ2hhaTEUMBIGA1UEAxQLbGFrYWxhXzIwMjEwggEiMA0GCSqGSIb3DQEBAQUA - //A4IBDwAwggEKAoIBAQDvDBZyHUDndAGxrIcsCV2njhNO3vCEZotTaWYSYwtDvkcA - //b1EjsBFabXZaKigpqFXk5XXNI3NIHP9M8XKzIgGvc65NpLAfRjVql8JiTvLyYd1g - //IUcOXMInabu+oX7dQSI1mS8XzqaoVRhDZQWhXcJW9bxMulgnzvk0Ggw07AjGF7si - //+hP/Va8SJmN7EJwfQq6TpSxR+WdIHpbWdhZ+NHwitnQwAJTLBFvfk28INM39G7XO - //sXdVLfsooFdglVTOHpNuRiQAj9gShCCNrpGsNQxDiJIxE43qRsNsRwigyo6DPJk/ - //klgDJa417E2wgP8VrwiXparO4FMzOGK15quuoD7DAgMBAAGjTDBKMAkGA1UdEwQC - //MAAwEQYJYIZIAYb4QgEBBAQDAgTwMAsGA1UdDwQEAwIFoDAdBgNVHSUEFjAUBggr - //BgEFBQcDAgYIKwYBBQUHAwEwDQYJKoZIhvcNAQELBQADggEBAI21YYAlH+Pc1ISv - //nbQrGqL8suGL0Hh/8hGaFfrJEJEKr9OeC8jElUhck2MTmfu/Y1lB7r8RBrhGPXi4 - //kTXmB6ADs/9+ezNW3WXyFj7fhs3JcZ3mo33T9wyQySDKd//JrEtrTsc/s2PZ602y - //qNmPomXSzjrlugaMyC7LI9sR44mc7sQnchjHoxrQFD5/usTFW72UQfYCORsQWYMt - //0KKEyAcpRL51RE3xbX1WDtduFYGP62PbwLAn2nCL/j1wlF5hltWj7sditWqKgso5 - //F8BTffn2Bb0RdsNxqwMy1cTPrWLeXVOqMDu3ge7hvoav8lZKTjk5Kmqhs7wNAQXK - //mg9qSwo= - //-----END CERTIFICATE----- - //` ) // 私钥文件目录C:\Users\Administrator\Desktop\拉克拉\拉卡拉私钥生成\RSA密钥生成工具V1.0.0\RSAKeys @@ -119,6 +70,11 @@ const ( PrivateKey = "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAJIJZFCJV48a9enuBQrcYuJ5crBIKTzS64jQluYsTlAJklT1759g0xE8LnEB4a52vExG7AoIAPJbByw7OqNXBkc/ZGoE3wmajE6EpsMBr/EMmWELJK3fcC351UjLSfuT1KADmpeibcU3b05AvaA4xBRWGWP9kdimZJeyiqeaCSiHAgMBAAECgYBenAsLSg8ZvSO4C+XkZWcCxh+RKQ7eQt8o4coBEI8jty/ALxywqm/TaKPFvqxQ9MeEuyXMUecbG/IHq8+PZp+/qj831bIt+v2Or5mZ/grkr/ZPt96sHJwY5GtIGyHrDfiEmAmHazo6clEf8+qC4z7AhqwWmjjRF3Zl404BkeiKUQJBAMJx7UuwpepryKyeHSOWf44nLwAM9Ejmeg6zPPVjQyI02btqWcgVhpwhers7ikyV37eE1WX2gtEM3DSb38o2xVUCQQDARGQqcGPftuygq1aIodBbUwZjhM+A5yBvISaUceqGg0mvb8icaXRmAYPzOt9ehp+S8I8uZU2bgsyFX671cfZrAkA43VSGVCzRd6ACS2M+Kx82lWL7Ys52G2EKt4RWRyc087vRQXLsPs9VDb100B7L8vCwHNrDrOno9RfZEtTJsGbZAkA+2hykgvkjOPlBzMENCVjDgfCkt9XdnbDMo1mpTVQNhP2hjDlYaGDUt8oayTQcAoZH0rv7vsIQBEI3l3/qXMbhAkAnwX9+BfhkN+4e68051kAOcjxJEDd+p9B6oyvv4ln+YswWcNuqjbrgZM1K7WUksBtgV0Zpp5aX/RN6CCVWsb9v" ) +var ( + PrivateKeyBegin = fmt.Sprintf("-----BEGIN RSA PRIVATE KEY-----\n%s\n-----END RSA PRIVATE KEY-----", PrivateKey) + PublicKeyBegin = fmt.Sprintf("-----BEGIN PUBLIC KEY-----\n%s\n-----END PUBLIC KEY-----", PublicKey) +) + // token访问路由 const ( IncomingUrlTest = "https://test.wsmsd.cn/sit/htkauth/oauth" // 进件获取token测试地址,变更接口token测试地址 diff --git a/platformapi/lakala/lakala_token_test.go b/platformapi/lakala/lakala_token_test.go index 9d0e3e63..f1112cb1 100644 --- a/platformapi/lakala/lakala_token_test.go +++ b/platformapi/lakala/lakala_token_test.go @@ -1,6 +1,7 @@ package lakala import ( + "encoding/base64" "fmt" "git.rosy.net.cn/baseapi" "git.rosy.net.cn/baseapi/utils" @@ -157,7 +158,18 @@ func TestIncoming(t *testing.T) { } func TestGetMerchantInfo(t *testing.T) { - api.GetMerchantInfo("100139367") + result, err := api.GetMerchantInfo("141429349") + globals.SugarLogger.Debugf("---------result:;= %s", utils.Format4Output(result, false)) + globals.SugarLogger.Debugf("---------result:;= %v", err) +} + +func TestNameDecryptByPublicKey(t *testing.T) { + decryptData := `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` + base64DecryData, _ := base64.StdEncoding.DecodeString(decryptData) + resultData, err := DecryptByPublicKey(base64DecryData, PublicKeyBegin) + globals.SugarLogger.Debugf("---------result:1= %s", string(resultData)) + globals.SugarLogger.Debugf("---------result:2= %s", base64.StdEncoding.EncodeToString(resultData)) + globals.SugarLogger.Debugf("---------result:3= %v", err) } // TestFeeQuery 商户费率信息查询