Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
S
system_pay
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
王沛
system_pay
Commits
da55a1f2
Commit
da55a1f2
authored
Jun 29, 2023
by
wangp
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
卡拉卡
parent
d115f679
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
139 additions
and
48 deletions
+139
-48
pay.go
repository/pay/pay.go
+100
-46
cert.go
utils/cert.go
+39
-2
No files found.
repository/pay/pay.go
View file @
da55a1f2
...
...
@@ -18,7 +18,6 @@ import (
"system_pay/models"
"system_pay/mysql"
"system_pay/setting"
"system_pay/utils"
)
// 拉卡拉支付
...
...
@@ -65,8 +64,10 @@ func UnifiedOrder(input *models.PlaceAnOrderParamInput, ip string) (interface{},
var
url
string
if
false
{
//聚合收银台(微信H5+支付宝H5)
//source_code 1: 微信 Native 2:微信小程序 3:微信内支付 4:h5 跳微信
//5:支付宝(web)-扫码或登录支付宝账户 6:alipay(mobile) 7:alipay(app)
if
input
.
SourceCode
==
4
||
input
.
SourceCode
==
6
{
//聚合收银台(微信H5、支付宝H5、微信扫码、支付宝扫码)
url
=
"https://test.wsmsd.cn/sit/api/v3/ccss/counter/order/create"
//聚合收银台
data
[
"req_time"
]
=
"20230626100000"
...
...
@@ -83,10 +84,10 @@ if false {
data2
:=
make
(
map
[
string
]
interface
{})
//data2["merchant_no"] = "8222900701107M5"
data2
[
"merchant_no"
]
=
"8221210701101SB"
data2
[
"term_no"
]
=
"29034705"
//data2["term_no"] = "29034705" //不需要传?
//data2["total_amount"] = "1"
data2
[
"total_amount"
]
=
input
.
GoodsPrice
data2
[
"total_amount"
]
=
input
.
GoodsPrice
*
100
//data2["out_trade_no"] = orderID //随机生成的订单号 //商户交易流水号
//data2["out_trade_no"] = RandomString(32)
data2
[
"out_order_no"
]
=
orderID
//随机生成的订单号 //商户订单号
...
...
@@ -94,8 +95,13 @@ if false {
//data2["out_trade_no"] = input.AttachInfo
//data2["out_order_no"] = input.AttachInfo
data2
[
"counter_param"
]
=
"{
\"
pay_mode
\"
:
\"
ALIPAY
\"
}"
//data2["counter_param"] = "{\"pay_mode\":\"WECHAT\"}"
if
input
.
SourceCode
<
5
{
//微信
data2
[
"counter_param"
]
=
"{
\"
pay_mode
\"
:
\"
WECHAT
\"
}"
}
else
{
//支付宝
data2
[
"counter_param"
]
=
"{
\"
pay_mode
\"
:
\"
ALIPAY
\"
}"
}
data2
[
"order_efficient_time"
]
=
"20230630235959"
//订单有效期 格式yyyyMMddHHmmss,最大支持下单时间+2天
data2
[
"notify_url"
]
=
input
.
NoticeURL
//订单支付成功后商户接收订单通知的地址 http://xxx.xxx.com
...
...
@@ -105,8 +111,9 @@ if false {
data
[
"req_data"
]
=
make
(
map
[
string
]
interface
{})
data
[
"req_data"
]
=
data2
}
else
{
//聚合主扫(微信JSAPI+微信小程序)
}
else
if
input
.
SourceCode
==
2
||
input
.
SourceCode
==
3
||
input
.
SourceCode
==
1
||
input
.
SourceCode
==
5
{
//聚合主扫(微信JSAPI、微信小程序)
url
=
"https://test.wsmsd.cn/sit/api/v3/labs/trans/preorder"
//聚合主扫
data
[
"req_time"
]
=
"20230626100000"
...
...
@@ -122,11 +129,14 @@ if false {
data2
:=
make
(
map
[
string
]
interface
{})
//data2["merchant_no"] = "8222900701107M5"
data2
[
"merchant_no"
]
=
"8221210701101SB"
data2
[
"term_no"
]
=
"29034705"
//data2["term_no"] = "A1062976"
//data2["merchant_no"] = "8221210701101SB"
data2
[
"merchant_no"
]
=
"8222900581201QB"
data2
[
"term_no"
]
=
"D0027598"
//data2["total_amount"] = "1"
data2
[
"total_amount"
]
=
input
.
GoodsPrice
//tempMoney, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", p.GoodsPrice*100), 64)
data2
[
"total_amount"
]
=
input
.
GoodsPrice
*
100
data2
[
"out_trade_no"
]
=
orderID
//随机生成的订单号 //商户交易流水号
//data2["out_trade_no"] = RandomString(32)
//data2["out_order_no"] = orderID //随机生成的订单号 //商户订单号
...
...
@@ -134,18 +144,28 @@ if false {
//data2["out_trade_no"] = input.AttachInfo
//data2["out_order_no"] = input.AttachInfo
//data2["counter_param"] = "{\"pay_mode\":\"ALIPAY\"}"
data2
[
"counter_param"
]
=
"{
\"
pay_mode
\"
:
\"
WECHAT
\"
}"
data2
[
"order_efficient_time"
]
=
"20230630235959"
//订单有效期 格式yyyyMMddHHmmss,最大支持下单时间+2天
data2
[
"notify_url"
]
=
input
.
NoticeURL
//订单支付成功后商户接收订单通知的地址 http://xxx.xxx.com
data2
[
"callback_url"
]
=
input
.
ReturnURL
//客户端下单完成支付后返回的商户网页跳转地址
data2
[
"order_info"
]
=
"必康测试订单标题2"
//订单标题,在使用收银台扫码支付时必输入,交易时送往账户端
//data2["goods_mark"] = input.AttachInfo //商品信息标识 (1:含商品信息,不填默认不含商品信息)
data2
[
"account_type"
]
=
"WECHAT"
//钱包类型
data2
[
"trans_type"
]
=
"51"
//接入方式
if
input
.
SourceCode
==
1
{
//微信native
data2
[
"counter_param"
]
=
"{
\"
pay_mode
\"
:
\"
WECHAT
\"
}"
data2
[
"account_type"
]
=
"WECHAT"
//钱包类型
data2
[
"trans_type"
]
=
"41"
//接入方式
}
else
if
input
.
SourceCode
==
5
{
//支付宝native
data2
[
"counter_param"
]
=
"{
\"
pay_mode
\"
:
\"
ALIPAY
\"
}"
data2
[
"account_type"
]
=
"ALIPAY"
//钱包类型
data2
[
"trans_type"
]
=
"41"
//接入方式
}
else
{
//微信JSAPI、微信小程序
data2
[
"counter_param"
]
=
"{
\"
pay_mode
\"
:
\"
WECHAT
\"
}"
data2
[
"account_type"
]
=
"WECHAT"
//钱包类型
data2
[
"trans_type"
]
=
"51"
//接入方式
}
//地址位置信息
data3
:=
make
(
map
[
string
]
interface
{})
...
...
@@ -153,9 +173,23 @@ if false {
data2
[
"location_info"
]
=
make
(
map
[
string
]
interface
{})
data2
[
"location_info"
]
=
data3
//地址位置信息
data4
:=
make
(
map
[
string
]
interface
{})
//data4["open_id"] = input.OpenID //此参数 支付类型是 JS API 的时候 必传
data4
[
"sub_appid"
]
=
"wxc3e4d1682da3053c"
data4
[
"user_id"
]
=
"oLvoQ5deygCMj2WrDjPVPvV1L1t8"
data2
[
"acc_busi_fields"
]
=
make
(
map
[
string
]
interface
{})
data2
[
"acc_busi_fields"
]
=
data4
data
[
"req_data"
]
=
make
(
map
[
string
]
interface
{})
data
[
"req_data"
]
=
data2
}
else
{
return
nil
,
errors
.
New
(
"输入参数「source_code」错误"
)
}
//数据重组 - end
fmt
.
Println
(
"拉卡拉输入参数"
)
fmt
.
Println
(
data
)
...
...
@@ -180,14 +214,14 @@ if false {
//url := "https://test.wsmsd.cn/sit/api/v3/ccss/counter/order/create" //聚合收银台
//调拉卡拉接口
err
,
m_web_url
,
lakala_rtn
:=
lakala_post
(
url
,
data_json
)
err
,
response
,
lakala_rtn
:=
lakala_post
(
input
.
SourceCode
,
url
,
data_json
)
if
err
!=
nil
{
InsertPayBillDetailResponseBody
(
tx
,
billID
,
lakala_rtn
)
return
nil
,
err
}
response
:=
make
(
map
[
string
]
string
)
response
[
"m_web_url"
]
=
m_web_url
//
response := make(map[string]string)
//
response["m_web_url"] = m_web_url
// 插入下单成功后返回的参数
err
=
InsertPayBillDetailResponseBody
(
tx
,
billID
,
lakala_rtn
)
...
...
@@ -200,15 +234,12 @@ if false {
}
func
lakala_post
(
url
string
,
data_json
[]
byte
)
(
error
,
string
,
interface
{})
{
func
lakala_post
(
source_code
uint8
,
url
string
,
data_json
[]
byte
)
(
error
,
interface
{},
interface
{})
{
authorization
,
err
:=
getAuthorization
(
string
(
data_json
))
if
err
!=
nil
{
return
err
,
""
,
nil
}
fmt
.
Println
(
url
)
fmt
.
Println
(
authorization
)
...
...
@@ -232,19 +263,41 @@ func lakala_post(url string, data_json []byte) (error, string, interface{}) {
fmt
.
Println
(
"拉卡拉返回值"
)
fmt
.
Println
(
temp
)
//todo
if
temp
[
"code"
]
!=
"000000"
{
if
temp
[
"code"
]
!=
"000000"
&&
temp
[
"code"
]
!=
"BBS00000"
{
//this.Data["json"] = utils.CheckError(errors.New("拉卡拉错误"), temp["msg"].(string)) //todo
//this.ServeJSON()
return
errors
.
New
(
temp
[
"msg"
]
.
(
string
)),
""
,
temp
}
//return nil, temp["resp_data"]["counter_url"]
temp2
,
_
:=
temp
[
"resp_data"
]
.
(
map
[
string
]
interface
{})
if
temp2
[
"counter_url"
]
==
""
{
return
errors
.
New
(
"拉卡拉返回值「counter_url」为空错误"
),
""
,
temp
response
:=
make
(
map
[
string
]
string
)
if
source_code
==
4
||
source_code
==
6
||
source_code
==
1
||
source_code
==
5
{
//聚合收银台(微信H5、支付宝H5、微信扫码、支付宝扫码)
temp2
,
_
:=
temp
[
"resp_data"
]
.
(
map
[
string
]
interface
{})
if
temp2
[
"counter_url"
]
==
""
{
return
errors
.
New
(
"拉卡拉返回值「counter_url」为空错误"
),
""
,
temp
}
response
[
"m_web_url"
]
=
temp2
[
"counter_url"
]
.
(
string
)
}
else
if
source_code
==
2
||
source_code
==
3
{
//聚合主扫(微信JSAPI+微信小程序)
temp2
,
_
:=
temp
[
"resp_data"
]
.
(
map
[
string
]
interface
{})
temp3
,
_
:=
temp2
[
"acc_resp_fields"
]
.
(
map
[
string
]
interface
{})
//if temp3["counter_url"]=="" {
// return errors.New("拉卡拉返回值「counter_url」为空错误"), "", temp
//}
response
[
"app_id"
]
=
temp3
[
"app_id"
]
.
(
string
)
response
[
"nonce_str"
]
=
temp3
[
"nonce_str"
]
.
(
string
)
response
[
"package"
]
=
temp3
[
"package"
]
.
(
string
)
response
[
"pay_sign"
]
=
temp3
[
"pay_sign"
]
.
(
string
)
response
[
"prepay_id"
]
=
temp3
[
"prepay_id"
]
.
(
string
)
response
[
"sign_type"
]
=
temp3
[
"sign_type"
]
.
(
string
)
response
[
"timeStamp"
]
=
temp3
[
"time_stamp"
]
.
(
string
)
}
else
{
return
errors
.
New
(
"输入参数「source_code」错误"
),
""
,
temp
}
return
nil
,
temp2
[
"counter_url"
]
.
(
string
)
,
temp
return
nil
,
response
,
temp
}
func
getAuthorization
(
body
string
)
(
string
,
error
)
{
...
...
@@ -281,21 +334,22 @@ func getAuthorization(body string) (string, error) {
fmt
.
Println
(
"签名1:"
,
signature
)
base64Sig
,
err
:=
utils
.
RSASign
([]
byte
(
message
),
"./cert/OP00000003_private_key.pem"
)
if
err
!=
nil
{
return
signature
,
err
}
fmt
.
Println
(
"签名2:"
,
base64Sig
)
err
=
utils
.
RSAVerify
([]
byte
(
message
),
base64Sig
,
"./cert/OP00000003_cert.cer"
)
if
err
==
nil
{
fmt
.
Println
(
"验证成功!"
)
}
else
{
fmt
.
Println
(
"验证失败!"
)
return
""
,
err
}
return
""
,
errors
.
New
(
"wangpei签名测试中。。。。。"
)
//base64Sig, err := utils.RSASign([]byte(message), "./cert/OP00000003_private_key.pem")
//if err != nil {
// return signature, err
//}
//
//fmt.Println("签名2:", base64Sig)
//
//err = utils.RSAVerify([]byte(message), signature, "./cert/OP00000003_cert.cer")
////err = utils.RSAVerify([]byte(message), signature, "./cert/lkl-apigw-v2.cer")
//if err == nil {
// fmt.Println("验证成功!")
//} else {
// fmt.Println("验证失败!")
// return "", err
//}
//return "", errors.New("wangpei签名测试中。。。。。")
authorization
:=
"LKLAPI-SHA256withRSA "
+
"appid=
\"
"
+
appid
+
"
\"
,"
+
"serial_no=
\"
"
+
mchSerialNo
+
"
\"
,"
+
"timestamp=
\"
"
+
timestamp
+
"
\"
,"
+
"nonce_str=
\"
"
+
nonceStr
+
"
\"
,"
+
"signature=
\"
"
+
signature
+
"
\"
"
;
...
...
@@ -629,7 +683,7 @@ func UnifiedOrder2(input *models.PlaceAnOrderParamInput) (interface{}, error) {
//url := "https://test.wsmsd.cn/sit/api/v3/ccss/counter/order/create" //聚合收银台
//调拉卡拉接口
err
,
_
,
_
=
lakala_post
(
url
,
data_json
)
err
,
_
,
_
=
lakala_post
(
input
.
SourceCode
,
url
,
data_json
)
if
err
!=
nil
{
//this.Data["json"] = utils.CheckError(err,"拉卡拉错误")
//this.ServeJSON()
...
...
utils/cert.go
View file @
da55a1f2
...
...
@@ -9,6 +9,7 @@ import (
"encoding/pem"
"errors"
"fmt"
"hash"
"io/ioutil"
)
...
...
@@ -38,7 +39,6 @@ func RSASign(data []byte, filename string) (string, error) {
return
""
,
err
}
// 3、RSA数字签名(参数是随机数、私钥对象、哈希类型、签名文件的哈希串),生成base64编码的签名字符串
//bytes, err := rsa.SignPKCS1v15(rand.Reader, privateKey, myhash, hashed)
bytes
,
err
:=
rsa
.
SignPKCS1v15
(
rand
.
Reader
,
privateKey
,
myhash
,
hashed
)
if
err
!=
nil
{
return
""
,
err
...
...
@@ -84,7 +84,7 @@ func ReadParsePublicKey(filename string) (*rsa.PublicKey, error) {
// 3、解析DER编码的公钥,生成公钥接口
publicKeyInterface
,
err
:=
x509
.
ParsePKIXPublicKey
(
block
.
Bytes
)
if
err
!=
nil
{
fmt
.
Println
(
222
)
fmt
.
Println
(
444
)
return
nil
,
err
}
...
...
@@ -125,4 +125,41 @@ func ReadParsePrivaterKey(filename string) (*rsa.PrivateKey, error) {
privateKey
:=
prkI
.
(
*
rsa
.
PrivateKey
)
return
privateKey
,
nil
}
func
VerifySignCert
(
signData
,
sign
,
signType
,
aliPayPublicKeyPath
string
)
(
err
error
)
{
var
(
h
hash
.
Hash
hashs
crypto
.
Hash
block
*
pem
.
Block
pubKey
*
x509
.
Certificate
publicKey
*
rsa
.
PublicKey
ok
bool
bytes
[]
byte
)
if
bytes
,
err
=
ioutil
.
ReadFile
(
aliPayPublicKeyPath
);
err
!=
nil
{
return
fmt
.
Errorf
(
"支付宝公钥文件读取失败: %w"
,
err
)
}
signBytes
,
_
:=
base64
.
StdEncoding
.
DecodeString
(
sign
)
if
block
,
_
=
pem
.
Decode
(
bytes
);
block
==
nil
{
return
errors
.
New
(
"支付宝公钥Decode错误"
)
}
if
pubKey
,
err
=
x509
.
ParseCertificate
(
block
.
Bytes
);
err
!=
nil
{
return
fmt
.
Errorf
(
"x509.ParseCertificate:%w"
,
err
)
}
if
publicKey
,
ok
=
pubKey
.
PublicKey
.
(
*
rsa
.
PublicKey
);
!
ok
{
return
errors
.
New
(
"支付宝公钥转换错误"
)
}
switch
signType
{
case
"RSA"
:
hashs
=
crypto
.
SHA1
case
"RSA2"
:
hashs
=
crypto
.
SHA256
default
:
hashs
=
crypto
.
SHA256
}
h
=
hashs
.
New
()
h
.
Write
([]
byte
(
signData
))
return
rsa
.
VerifyPKCS1v15
(
publicKey
,
hashs
,
h
.
Sum
(
nil
),
signBytes
)
}
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment