Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
jinli gu
Jeepay
Commits
b057b58f
Commit
b057b58f
authored
Jul 19, 2021
by
zhuxiao
Browse files
优化微信V3支付返回支付包
parent
d4e302cc
Changes
6
Hide whitespace changes
Inline
Side-by-side
jeepay-payment/src/main/java/com/jeequan/jeepay/pay/channel/wxpay/kits/WxpayV3Util.java
View file @
b057b58f
...
...
@@ -27,6 +27,7 @@ import com.github.binarywang.wxpay.v3.auth.PrivateKeySigner;
import
com.github.binarywang.wxpay.v3.auth.WxPayCredentials
;
import
com.github.binarywang.wxpay.v3.auth.WxPayValidator
;
import
com.github.binarywang.wxpay.v3.util.PemUtils
;
import
com.github.binarywang.wxpay.v3.util.SignUtils
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.http.HttpStatus
;
import
org.apache.http.client.config.RequestConfig
;
...
...
@@ -71,9 +72,9 @@ public class WxpayV3Util {
ISV_URL_MAP
.
put
(
WxPayConstants
.
TradeType
.
MWEB
,
"/v3/pay/partner/transactions/h5"
);
}
public
static
JSONObject
unifiedOrderV3
(
String
u
rl
,
JSONObject
reqJSON
,
WxPayConfig
wxPayConfig
)
throws
WxPayException
{
String
response
=
postV3
(
PAY_BASE_URL
+
u
rl
,
reqJSON
.
toJSONString
(),
wxPayConfig
);
return
JSON
.
parseObject
(
response
);
public
static
JSONObject
unifiedOrderV3
(
String
reqU
rl
,
JSONObject
reqJSON
,
WxPayConfig
wxPayConfig
)
throws
WxPayException
{
String
response
=
postV3
(
PAY_BASE_URL
+
reqU
rl
,
reqJSON
.
toJSONString
(),
wxPayConfig
);
return
JSON
Object
.
parseObject
(
getPayInfo
(
response
,
wxPayConfig
)
);
}
public
static
JSONObject
queryOrderV3
(
String
url
,
WxPayConfig
wxPayConfig
)
throws
WxPayException
{
...
...
@@ -215,4 +216,59 @@ public class WxpayV3Util {
return
httpPost
;
}
public
static
String
getPayInfo
(
String
response
,
WxPayConfig
wxPayConfig
)
throws
WxPayException
{
try
{
JSONObject
resJSON
=
JSON
.
parseObject
(
response
);
String
timestamp
=
String
.
valueOf
(
System
.
currentTimeMillis
()
/
1000L
);
String
nonceStr
=
SignUtils
.
genRandomStr
();
String
prepayId
=
resJSON
.
getString
(
"prepay_id"
);
switch
(
wxPayConfig
.
getTradeType
())
{
case
WxPayConstants
.
TradeType
.
JSAPI
:
{
Map
<
String
,
String
>
payInfo
=
new
HashMap
<>();
// 如果用JsonObject会出现签名错误
payInfo
.
put
(
"appId"
,
wxPayConfig
.
getAppId
());
payInfo
.
put
(
"timeStamp"
,
timestamp
);
payInfo
.
put
(
"nonceStr"
,
nonceStr
);
payInfo
.
put
(
"package"
,
"prepay_id="
+
prepayId
);
payInfo
.
put
(
"signType"
,
"RSA"
);
String
beforeSign
=
String
.
format
(
"%s\n%s\n%s\n%s\n"
,
wxPayConfig
.
getAppId
(),
timestamp
,
nonceStr
,
"prepay_id="
+
prepayId
);
payInfo
.
put
(
"paySign"
,
SignUtils
.
sign
(
beforeSign
,
PemUtils
.
loadPrivateKey
(
new
FileInputStream
(
wxPayConfig
.
getPrivateKeyPath
()))));
// 签名以后在增加prepayId参数
payInfo
.
put
(
"prepayId"
,
prepayId
);
return
JSON
.
toJSONString
(
payInfo
);
}
case
WxPayConstants
.
TradeType
.
MWEB
:
{
return
response
;
}
case
WxPayConstants
.
TradeType
.
APP
:
{
Map
<
String
,
String
>
payInfo
=
new
HashMap
<>();
// APP支付绑定的是微信开放平台上的账号,APPID为开放平台上绑定APP后发放的参数
String
wxAppId
=
wxPayConfig
.
getSubAppId
();
// 此map用于参与调起sdk支付的二次签名,格式全小写,timestamp只能是10位,格式固定,切勿修改
String
partnerId
=
wxPayConfig
.
getSubMchId
();
String
packageValue
=
"Sign=WXPay"
;
// 此map用于客户端与微信服务器交互
String
beforeSign
=
String
.
format
(
"%s\n%s\n%s\n%s\n"
,
wxAppId
,
timestamp
,
nonceStr
,
"prepay_id="
+
prepayId
);
payInfo
.
put
(
"sign"
,
SignUtils
.
sign
(
beforeSign
,
PemUtils
.
loadPrivateKey
(
new
FileInputStream
(
wxPayConfig
.
getPrivateKeyPath
()))));
payInfo
.
put
(
"prepayId"
,
prepayId
);
payInfo
.
put
(
"partnerId"
,
partnerId
);
payInfo
.
put
(
"appId"
,
wxAppId
);
payInfo
.
put
(
"package"
,
packageValue
);
payInfo
.
put
(
"timeStamp"
,
timestamp
);
payInfo
.
put
(
"nonceStr"
,
nonceStr
);
return
JSON
.
toJSONString
(
payInfo
);
}
case
WxPayConstants
.
TradeType
.
NATIVE
:
return
response
;
default
:
return
null
;
}
}
catch
(
Exception
e
)
{
throw
(
e
instanceof
WxPayException
)
?
(
WxPayException
)
e
:
new
WxPayException
(
e
.
getMessage
(),
e
);
}
}
}
jeepay-payment/src/main/java/com/jeequan/jeepay/pay/channel/wxpay/paywayV3/WxApp.java
View file @
b057b58f
...
...
@@ -23,12 +23,12 @@ import com.jeequan.jeepay.core.entity.PayOrder;
import
com.jeequan.jeepay.pay.channel.wxpay.WxpayPaymentService
;
import
com.jeequan.jeepay.pay.channel.wxpay.kits.WxpayKit
;
import
com.jeequan.jeepay.pay.channel.wxpay.kits.WxpayV3Util
;
import
com.jeequan.jeepay.pay.model.MchAppConfigContext
;
import
com.jeequan.jeepay.pay.rqrs.AbstractRS
;
import
com.jeequan.jeepay.pay.rqrs.msg.ChannelRetMsg
;
import
com.jeequan.jeepay.pay.rqrs.payorder.UnifiedOrderRQ
;
import
com.jeequan.jeepay.pay.rqrs.payorder.payway.WxAppOrderRS
;
import
com.jeequan.jeepay.pay.rqrs.msg.ChannelRetMsg
;
import
com.jeequan.jeepay.pay.util.ApiResBuilder
;
import
com.jeequan.jeepay.pay.model.MchAppConfigContext
;
import
org.springframework.stereotype.Service
;
/*
...
...
@@ -50,6 +50,7 @@ public class WxApp extends WxpayPaymentService {
public
AbstractRS
pay
(
UnifiedOrderRQ
rq
,
PayOrder
payOrder
,
MchAppConfigContext
mchAppConfigContext
)
{
WxPayService
wxPayService
=
mchAppConfigContext
.
getWxServiceWrapper
().
getWxPayService
();
wxPayService
.
getConfig
().
setTradeType
(
WxPayConstants
.
TradeType
.
APP
);
// 构造请求数据
JSONObject
reqJSON
=
buildV3OrderRequest
(
payOrder
,
mchAppConfigContext
);
...
...
jeepay-payment/src/main/java/com/jeequan/jeepay/pay/channel/wxpay/paywayV3/WxH5.java
View file @
b057b58f
...
...
@@ -24,13 +24,13 @@ import com.jeequan.jeepay.core.entity.PayOrder;
import
com.jeequan.jeepay.pay.channel.wxpay.WxpayPaymentService
;
import
com.jeequan.jeepay.pay.channel.wxpay.kits.WxpayKit
;
import
com.jeequan.jeepay.pay.channel.wxpay.kits.WxpayV3Util
;
import
com.jeequan.jeepay.pay.model.MchAppConfigContext
;
import
com.jeequan.jeepay.pay.rqrs.AbstractRS
;
import
com.jeequan.jeepay.pay.rqrs.msg.ChannelRetMsg
;
import
com.jeequan.jeepay.pay.rqrs.payorder.UnifiedOrderRQ
;
import
com.jeequan.jeepay.pay.rqrs.payorder.payway.WxH5OrderRQ
;
import
com.jeequan.jeepay.pay.rqrs.payorder.payway.WxH5OrderRS
;
import
com.jeequan.jeepay.pay.rqrs.msg.ChannelRetMsg
;
import
com.jeequan.jeepay.pay.util.ApiResBuilder
;
import
com.jeequan.jeepay.pay.model.MchAppConfigContext
;
import
org.springframework.stereotype.Service
;
/*
...
...
@@ -54,6 +54,7 @@ public class WxH5 extends WxpayPaymentService {
WxH5OrderRQ
bizRQ
=
(
WxH5OrderRQ
)
rq
;
WxPayService
wxPayService
=
mchAppConfigContext
.
getWxServiceWrapper
().
getWxPayService
();
wxPayService
.
getConfig
().
setTradeType
(
WxPayConstants
.
TradeType
.
MWEB
);
// 构造请求数据
JSONObject
reqJSON
=
buildV3OrderRequest
(
payOrder
,
mchAppConfigContext
);
...
...
jeepay-payment/src/main/java/com/jeequan/jeepay/pay/channel/wxpay/paywayV3/WxJsapi.java
View file @
b057b58f
...
...
@@ -23,13 +23,13 @@ import com.jeequan.jeepay.core.entity.PayOrder;
import
com.jeequan.jeepay.pay.channel.wxpay.WxpayPaymentService
;
import
com.jeequan.jeepay.pay.channel.wxpay.kits.WxpayKit
;
import
com.jeequan.jeepay.pay.channel.wxpay.kits.WxpayV3Util
;
import
com.jeequan.jeepay.pay.model.MchAppConfigContext
;
import
com.jeequan.jeepay.pay.rqrs.AbstractRS
;
import
com.jeequan.jeepay.pay.rqrs.msg.ChannelRetMsg
;
import
com.jeequan.jeepay.pay.rqrs.payorder.UnifiedOrderRQ
;
import
com.jeequan.jeepay.pay.rqrs.payorder.payway.WxJsapiOrderRQ
;
import
com.jeequan.jeepay.pay.rqrs.payorder.payway.WxJsapiOrderRS
;
import
com.jeequan.jeepay.pay.rqrs.msg.ChannelRetMsg
;
import
com.jeequan.jeepay.pay.util.ApiResBuilder
;
import
com.jeequan.jeepay.pay.model.MchAppConfigContext
;
import
org.springframework.stereotype.Service
;
/*
...
...
@@ -57,16 +57,15 @@ public class WxJsapi extends WxpayPaymentService {
// 构造请求数据
JSONObject
reqJSON
=
buildV3OrderRequest
(
payOrder
,
mchAppConfigContext
);
String
reqUrl
;
// 请求地址
wxPayService
.
getConfig
().
setTradeType
(
WxPayConstants
.
TradeType
.
JSAPI
);
String
reqUrl
;
if
(
mchAppConfigContext
.
isIsvsubMch
()){
// 特约商户
reqUrl
=
WxpayV3Util
.
ISV_URL_MAP
.
get
(
WxPayConstants
.
TradeType
.
JSAPI
);
JSONObject
payer
=
new
JSONObject
();
payer
.
put
(
"sp_openid"
,
bizRQ
.
getOpenid
());
reqJSON
.
put
(
"payer"
,
payer
);
}
else
{
reqUrl
=
WxpayV3Util
.
NORMALMCH_URL_MAP
.
get
(
WxPayConstants
.
TradeType
.
JSAPI
);
JSONObject
payer
=
new
JSONObject
();
payer
.
put
(
"openid"
,
bizRQ
.
getOpenid
());
reqJSON
.
put
(
"payer"
,
payer
);
...
...
jeepay-payment/src/main/java/com/jeequan/jeepay/pay/channel/wxpay/paywayV3/WxLite.java
View file @
b057b58f
...
...
@@ -23,13 +23,13 @@ import com.jeequan.jeepay.core.entity.PayOrder;
import
com.jeequan.jeepay.pay.channel.wxpay.WxpayPaymentService
;
import
com.jeequan.jeepay.pay.channel.wxpay.kits.WxpayKit
;
import
com.jeequan.jeepay.pay.channel.wxpay.kits.WxpayV3Util
;
import
com.jeequan.jeepay.pay.model.MchAppConfigContext
;
import
com.jeequan.jeepay.pay.rqrs.AbstractRS
;
import
com.jeequan.jeepay.pay.rqrs.msg.ChannelRetMsg
;
import
com.jeequan.jeepay.pay.rqrs.payorder.UnifiedOrderRQ
;
import
com.jeequan.jeepay.pay.rqrs.payorder.payway.WxJsapiOrderRQ
;
import
com.jeequan.jeepay.pay.rqrs.payorder.payway.WxJsapiOrderRS
;
import
com.jeequan.jeepay.pay.rqrs.msg.ChannelRetMsg
;
import
com.jeequan.jeepay.pay.util.ApiResBuilder
;
import
com.jeequan.jeepay.pay.model.MchAppConfigContext
;
import
org.springframework.stereotype.Service
;
/*
...
...
@@ -57,6 +57,8 @@ public class WxLite extends WxpayPaymentService {
// 构造请求数据
JSONObject
reqJSON
=
buildV3OrderRequest
(
payOrder
,
mchAppConfigContext
);
wxPayService
.
getConfig
().
setTradeType
(
WxPayConstants
.
TradeType
.
JSAPI
);
String
reqUrl
;
// 请求地址
if
(
mchAppConfigContext
.
isIsvsubMch
()){
// 特约商户
reqUrl
=
WxpayV3Util
.
ISV_URL_MAP
.
get
(
WxPayConstants
.
TradeType
.
JSAPI
);
...
...
jeepay-payment/src/main/java/com/jeequan/jeepay/pay/channel/wxpay/paywayV3/WxNative.java
View file @
b057b58f
...
...
@@ -58,7 +58,8 @@ public class WxNative extends WxpayPaymentService {
// 构造请求数据
JSONObject
reqJSON
=
buildV3OrderRequest
(
payOrder
,
mchAppConfigContext
);
String
reqUrl
;
// 请求地址
wxPayService
.
getConfig
().
setTradeType
(
WxPayConstants
.
TradeType
.
NATIVE
);
String
reqUrl
;
if
(
mchAppConfigContext
.
isIsvsubMch
()){
// 特约商户
reqUrl
=
WxpayV3Util
.
ISV_URL_MAP
.
get
(
WxPayConstants
.
TradeType
.
NATIVE
);
}
else
{
...
...
Write
Preview
Supports
Markdown
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