1
This commit is contained in:
@@ -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{})
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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"`
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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测试地址
|
||||
|
||||
@@ -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 := `MJIrfKLnK3vbiEYg4MHUIES1Yhz7KCoMC7HggW5CicapihqM0JTdpVZcpTuoLm1T1nqRbtfCHWN7bYYHlvHztHgd4NqRl/a9Pr5m6ChW5lPwtqApxw+dseaMN8gBrs0nwHPnp5jVTCsHMvW8hHGfmgb726WV7NM68ZMzfw6inIIL1m5sq4WIAZ2hxB/CFCMTl7WY0FZ1bm7Fcc4qMZCTeVPvTb/AeAAImGpo8xxC3cjUybsAlv0+tS9+DKTfxvLdeqw8YsCPfJMuose3Ry9jkDOlctXiLFaQznHQRNSruTnrLUGoDmvXqZrZIfPHU7grvsAzWURGl2Vbd7zPYeFnLATzvRS8noFV70xg8xxdtiEGIGfajM3aLcEbV6HVeaJspJMENDEsoE2UCcfatL0SLcYGoZhrwAxiu7H4ejftH9O41A7XMmamqcPuC8uKErHjWyvHKy2mcDUIrWY/Nb7wjwfk+Vu8WhNea7KXZu4BC/oUajefsVps12Q3zIYSZ9+BNASE4bIdDsmZfVZXSXQ7Bovd9KK1Znagc9sCpUb8S41R2L5vZw+tXiSQD6EzF5/CX4/1xI3Thl/oYDF8BNCT7y0e5UN1uS7Szmt2+eOmYppoE2SbTeC1SWr+/WCF23o14dmhrvLSCk4DkzUBssICWEMqbsYJCnRiXk0/cWlFWop5YjVPgLgjKCTvGqqysQdZLffjZo5CJqKO1ZoSs8ZYcf7nXvP4o10MePX/TfW/MpBPRQ1muH2X4C6JPDNXb/YJwqhXVwqK8QRRVqQk9MXhWqWiDqQzuvB1B0eUwZwRLfZ/N998sg8U2sLGuEBYbC0I/eNKKaM0hZotqHXRIWOOJw6wFeuAPUXsis3vaIhjHK2Il/yZyQGeRMg8vGNgHWAesRe79/vr5yPtrfAVInWiQ2Sy4aAXDFF3nxw+B570GtkQ32nV+GBz42HeYyoZZY7R9jP8Zk8eWFj09e7QUZn2yCHta3AVgR2JpTBRsYredVc6DbLVNhLGrpIfDsOqb3EdRgh3SJN5wVxf+08QhDz140qEywgSlZlvlg0n1wvabq9Yo83sgy/b08QuREBLRZQHGH4ROMihcihVvEypP5n2uZtPUf4h8sDL1tnuk8p9IZojag42YONsFxsWRU80aJbQMMthyGKj3chM5MTfHbgjsiNM6IwLYjlNzhxptFp+/5h9A1t5erxDra5okJIOCxbHwUnq1xWZ/6mAWHkuR0k7IXpZQ7wog+Jm7Rlg4pczRxYoNgbK6KKjeB+I/abcjdez9qq31k/RQWQPBEYCxgjzUlaI4qdVWk9lJJIhW9b3WhKQRWH3fVAQab9Sk/samNyvuR8gw7nSBhTF0wSdEoRjeTV21vF0uiq1C39G5JP+/3I2V9RILWBhLwt560AAV5rEht4ud0AOpBYzTrBr9i+7VQGdGVeDmTXZnFCmVcpy0TvCa+yEIhCVjsA/FvSDbhB3P09vbDXHE71qxnkEBcL8BMZfJDhHG4w+MXOrBLSp7fkSPIVsGG4SPOPPFZwxGTvpaP4EtqzQ1ojkFX2hAXxC2fzmrlkTM0nrm0jHMBY/QwwuAoBHWKmGzxm3zWkEJ21Dfpk8IKb3d7HvT16xuM6i/siHt3SFvTiLCp2Dtv5vCZJfQ53WDXjeVId4lqPOqIos3LkQVA/LE8n3LYsoW1pP0/XxfkLT32Izgz5h+Xj5ewUNxX1MxMyMc2p//n9x0/fjJOH6wn4hR9WX1aoUGkQYPojmJzTCY8lL2tZVuiKzRxOof1FsvcnarDh4mDwsvx1Vzj09M+OmDkjilHl5St7KZzDb5ySXogWdtZD7mB/N3/eAIaANs8pAZJJpVSRaGqbjqo9MA4ATs9n+rB3s+C0ZnW/sgpiANCOhrWBqLheGtvDzIl2Hqn1jp3WuoQovsG+5/jbkvJ3z54/I+dSgUPmEQGT/tTDsZmvtIMmCnymvuIhSwQX1fXDYhkANrzy93GeO4bNMNsNAP+BOjKTKBAYJnXynyJbM5W4JmLwp2kLHKIgqyIYzN6ne2FSO74cSILzsB8nXzpkhzsNAD/GvjDWOZ2fdIt6XnE0mF2gbP15Eok+5ka3RQodf2aekPRCBfirSWjTHkENxAPWtcfcPxxHcjtDYgzAQelf+9OtQY8DpLA++18QuP9WhTfXfBTr5b9kqdYPmw+VYgK2fq6+/GqgkaNpZ6h2nPzNtC7+DImHVpZmHfje3qYbsoi87805e3MFIe9G0qm/7aV4WUyhHiYAkzbzqinHxy8fYmMX0G++7ux5xxkVS7lvl0WsUmJrahrU8eJOj5X4uorbj8tof6DU8L9wfEccJfBUiA/DTVt4r1YKdkHF3vp9zG4nthTEkRvNS1Pv42n8YqrUujHwitE1VlYBYK3QFmj3Smk0FtnP3Hda89wE9NoF8HFxOE99Ds87svwAk6OEPeNRb4ih7x4X+kF4pkLfj3b+ShukX2JkNq3qJw5oiQBa425Fe5SMDOVaCUhMQDw+jwBrx9sU+SldsO70m8tsyB7Va4EVUjS1c4CteLVyBntsE67dllEzUdyTSProCVBaam1Uini94qZ2jDqGZ4sqwSL0ZMB3SRDoIuaUr9DD+EfgetuPEu61KkBo+IsnvGawbyowB5s8mtub9++nn5yl310vxUM6HP+WCeO1o2pVeK2wuOZU2XZPs3UZszw26cpKNqNPS6E92LSJCGLAlj4HfD+6m6Mi0HSLqZbptnNjDHO5wg0s0j2cwuDmuOrMpoZRcOAzxoPXQXixE/Erl2w7o5YbgIdZDHG/jODckf+9K15wil1wi+vJlAdxUchybcHWz5zSVrtNbtQMw2YPfmZgTf8S7YGDZayw//TH4ae/VxU5+ahZTK1Jf6Y31xl30pcYSxK1oyaPkdogJAYf+X6Xc1X8dGDWrsnLdNWUL/SmvXxIPI6K/INQ7Wpd2FKK5F+Tqfjhqa83IA0mISO+5v5/O1RiYh4enV1jzL6EmQg72KtHQjWrI65PFUL/uNt/B4vwd0HRmVCUN/9SEl92TVCnG/ETXQlZ2C3Xna3wchRYTO/UJJnWqLfnsicTFD4Ww8+t+C4zVhGiOaUuBP3/LC1cucre02wqtCgh0Z5Dz6dmn1303c6BTV7NSqzrsaxn3KpfqUrduotdr2ErTMHRuqef33tFbNfH6e1Mfq2iOHYB3HphO6Pi8jGx5ygDEa3Lj4Ztb+glJS6Cv4Msf18UJxP2wN7EUPQR1Yv6fk5h0+4jzC25qVojqBm9FuB2NDjL0Jx8C6UZhqF2mEHqy/LE5YrQKn29etOyFUxB5h+lbVEMp7M7rYwfRAkASGB3nIFvY1GaEt1HUw2aan4S9kX5rbWNWSfR7g4t5vFkNi5odIQl/uxVDDd/2UaMJo5i4qhoo5SNajp/rn3oZK5EOx1jhBqGbpPrYmWEp8FWhCSCBd+dCeF+315LU8JaNqXd7HuLNjrF78Xpo3GYrzBkQWUPUvq0WhsctERyUlue0siehNqQBBLJZefVhIk2WdcYUplzfo0gru9NuyoLjYhE185kCy/KKt/IToZz1krbs0+lJieLa/0upjLX47vnYtJoUODprdFUwK+0Nxsipc+y8LFeANUgS5IemvRi7ndaBCnnV71tIHtVAKHbbk1+RcAEAM+vLNj0OizAPkvCu+S45tq1eRU0tUABb/lxC3/4T+HQbGV89Tr8CdRQnNvKECzKZvNhqzVdxAct0hsMTnjgtWC4kFgYFDvY+FrHBRWajyQlk7/lDw+opplUA3lzGsxNbULl3dNfSGwBAJ9eY6Kxe0AgZ7YN4OKUumXzvoCxEhRdg5lgxBCVUz3pSLlJskTd+4COZjyRs37Gxw3MUeNjstZsiVdggbVk5GfHxO7YsCmfQmKu4lRkvwjeyWXKJmpHablXLk2oCbXT140RPoFb71Q==`
|
||||
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 商户费率信息查询
|
||||
|
||||
Reference in New Issue
Block a user