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
d53783a9
Commit
d53783a9
authored
Aug 12, 2017
by
jmdhappy
Browse files
初始化提交
parent
324ccaaf
Changes
465
Hide whitespace changes
Inline
Side-by-side
xxpay4spring-cloud/xxpay-web/src/main/java/org/xxpay/web/controller/PayOrderController.java
0 → 100644
View file @
d53783a9
package
org.xxpay.web.controller
;
import
com.alibaba.fastjson.JSON
;
import
com.alibaba.fastjson.JSONObject
;
import
org.apache.commons.lang.StringUtils
;
import
org.apache.commons.lang.math.NumberUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.cloud.client.ServiceInstance
;
import
org.springframework.cloud.client.discovery.DiscoveryClient
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RequestMethod
;
import
org.springframework.web.bind.annotation.RequestParam
;
import
org.springframework.web.bind.annotation.RestController
;
import
org.xxpay.common.constant.PayConstant
;
import
org.xxpay.common.util.MyLog
;
import
org.xxpay.common.util.MySeq
;
import
org.xxpay.common.util.PayDigestUtil
;
import
org.xxpay.common.util.XXPayUtil
;
import
org.xxpay.web.service.MchInfoServiceClient
;
import
org.xxpay.web.service.PayChannelServiceClient
;
import
org.xxpay.web.service.PayOrderServiceClient
;
import
java.util.Map
;
/**
* @Description: 支付订单,包括:统一下单,订单查询,补单等接口
* @author dingzhiwei jmdhappy@126.com
* @date 2017-07-05
* @version V1.0
* @Copyright: www.xxpay.org
*/
@RestController
public
class
PayOrderController
{
private
final
MyLog
_log
=
MyLog
.
getLog
(
PayOrderController
.
class
);
@Autowired
private
DiscoveryClient
client
;
@Autowired
private
PayOrderServiceClient
payOrderServiceClient
;
@Autowired
private
MchInfoServiceClient
mchInfoServiceClient
;
@Autowired
private
PayChannelServiceClient
payChannelServiceClient
;
/**
* 统一下单接口:
* 1)先验证接口参数以及签名信息
* 2)验证通过创建支付订单
* 3)根据商户选择渠道,调用支付服务进行下单
* 4)返回下单数据
* @param params
* @return
*/
@RequestMapping
(
value
=
"/pay/create_order"
,
method
=
RequestMethod
.
POST
)
public
String
payOrder
(
@RequestParam
String
params
)
{
ServiceInstance
instance
=
client
.
getLocalServiceInstance
();
_log
.
info
(
"###### 开始接收商户统一下单请求 ######"
);
_log
.
info
(
"/pay_order, host:"
+
instance
.
getHost
()
+
", service_id:"
+
instance
.
getServiceId
()
+
", params:"
+
params
);
JSONObject
po
=
JSONObject
.
parseObject
(
params
);
JSONObject
payOrder
=
null
;
try
{
// 验证参数有效性
Object
object
=
validateParams
(
po
);
if
(
object
instanceof
String
)
{
// 参数错误
_log
.
info
(
"请求参数错误:{}"
,
object
);
return
XXPayUtil
.
makeRetFail
(
XXPayUtil
.
makeRetMap
(
PayConstant
.
RETURN_VALUE_FAIL
,
object
.
toString
(),
null
,
null
));
}
if
(
object
instanceof
JSONObject
)
payOrder
=
(
JSONObject
)
object
;
if
(
payOrder
==
null
)
return
XXPayUtil
.
makeRetFail
(
XXPayUtil
.
makeRetMap
(
PayConstant
.
RETURN_VALUE_FAIL
,
"支付中心下单失败"
,
null
,
null
));
String
result
=
payOrderServiceClient
.
createPayOrder
(
payOrder
.
toJSONString
());
_log
.
info
(
"插入支付订单数据,结果:{}"
,
result
);
String
channelId
=
payOrder
.
getString
(
"channelId"
);
switch
(
channelId
)
{
case
PayConstant
.
PAY_CHANNEL_WX_APP
:
return
payOrderServiceClient
.
doWxPayReq
(
getJsonParam
(
new
String
[]{
"tradeType"
,
"payOrder"
},
new
Object
[]{
PayConstant
.
WxConstant
.
TRADE_TYPE_APP
,
payOrder
}));
case
PayConstant
.
PAY_CHANNEL_WX_JSAPI
:
return
payOrderServiceClient
.
doWxPayReq
(
getJsonParam
(
new
String
[]{
"tradeType"
,
"payOrder"
},
new
Object
[]{
PayConstant
.
WxConstant
.
TRADE_TYPE_JSPAI
,
payOrder
}));
case
PayConstant
.
PAY_CHANNEL_WX_NATIVE
:
return
payOrderServiceClient
.
doWxPayReq
(
getJsonParam
(
new
String
[]{
"tradeType"
,
"payOrder"
},
new
Object
[]{
PayConstant
.
WxConstant
.
TRADE_TYPE_NATIVE
,
payOrder
}));
case
PayConstant
.
PAY_CHANNEL_ALIPAY_MOBILE
:
return
payOrderServiceClient
.
doAliPayMobileReq
(
getJsonParam
(
"payOrder"
,
payOrder
));
case
PayConstant
.
PAY_CHANNEL_ALIPAY_PC
:
return
payOrderServiceClient
.
doAliPayPcReq
(
getJsonParam
(
"payOrder"
,
payOrder
));
case
PayConstant
.
PAY_CHANNEL_ALIPAY_WAP
:
return
payOrderServiceClient
.
doAliPayWapReq
(
getJsonParam
(
"payOrder"
,
payOrder
));
default
:
break
;
}
}
catch
(
Exception
e
)
{
_log
.
error
(
e
,
""
);
return
XXPayUtil
.
makeRetFail
(
XXPayUtil
.
makeRetMap
(
PayConstant
.
RETURN_VALUE_FAIL
,
"支付中心系统异常"
,
null
,
null
));
}
return
null
;
}
/**
* 验证创建订单请求参数,参数通过返回JSONObject对象,否则返回错误文本信息
* @param params
* @return
*/
private
Object
validateParams
(
JSONObject
params
)
{
// 验证请求参数,参数有问题返回错误提示
String
errorMessage
;
// 支付参数
String
mchId
=
params
.
getString
(
"mchId"
);
// 商户ID
String
mchOrderNo
=
params
.
getString
(
"mchOrderNo"
);
// 商户订单号
String
channelId
=
params
.
getString
(
"channelId"
);
// 渠道ID
String
amount
=
params
.
getString
(
"amount"
);
// 支付金额(单位分)
String
currency
=
params
.
getString
(
"currency"
);
// 币种
String
clientIp
=
params
.
getString
(
"clientIp"
);
// 客户端IP
String
device
=
params
.
getString
(
"device"
);
// 设备
String
extra
=
params
.
getString
(
"extra"
);
// 特定渠道发起时额外参数
String
param1
=
params
.
getString
(
"param1"
);
// 扩展参数1
String
param2
=
params
.
getString
(
"param2"
);
// 扩展参数2
String
notifyUrl
=
params
.
getString
(
"notifyUrl"
);
// 支付结果回调URL
String
sign
=
params
.
getString
(
"sign"
);
// 签名
String
subject
=
params
.
getString
(
"subject"
);
// 商品主题
String
body
=
params
.
getString
(
"body"
);
// 商品描述信息
// 验证请求参数有效性(必选项)
if
(
StringUtils
.
isBlank
(
mchId
))
{
errorMessage
=
"request params[mchId] error."
;
return
errorMessage
;
}
if
(
StringUtils
.
isBlank
(
mchOrderNo
))
{
errorMessage
=
"request params[mchOrderNo] error."
;
return
errorMessage
;
}
if
(
StringUtils
.
isBlank
(
channelId
))
{
errorMessage
=
"request params[channelId] error."
;
return
errorMessage
;
}
if
(!
NumberUtils
.
isNumber
(
amount
))
{
errorMessage
=
"request params[amount] error."
;
return
errorMessage
;
}
if
(
StringUtils
.
isBlank
(
currency
))
{
errorMessage
=
"request params[currency] error."
;
return
errorMessage
;
}
if
(
StringUtils
.
isBlank
(
notifyUrl
))
{
errorMessage
=
"request params[notifyUrl] error."
;
return
errorMessage
;
}
if
(
StringUtils
.
isBlank
(
subject
))
{
errorMessage
=
"request params[subject] error."
;
return
errorMessage
;
}
if
(
StringUtils
.
isBlank
(
body
))
{
errorMessage
=
"request params[body] error."
;
return
errorMessage
;
}
// 根据不同渠道,判断extra参数
if
(
PayConstant
.
PAY_CHANNEL_WX_JSAPI
.
equalsIgnoreCase
(
channelId
))
{
if
(
StringUtils
.
isEmpty
(
extra
))
{
errorMessage
=
"request params[extra] error."
;
return
errorMessage
;
}
JSONObject
extraObject
=
JSON
.
parseObject
(
extra
);
String
openId
=
extraObject
.
getString
(
"openId"
);
if
(
StringUtils
.
isBlank
(
openId
))
{
errorMessage
=
"request params[extra.openId] error."
;
return
errorMessage
;
}
}
else
if
(
PayConstant
.
PAY_CHANNEL_WX_NATIVE
.
equalsIgnoreCase
(
channelId
))
{
if
(
StringUtils
.
isEmpty
(
extra
))
{
errorMessage
=
"request params[extra] error."
;
return
errorMessage
;
}
JSONObject
extraObject
=
JSON
.
parseObject
(
extra
);
String
productId
=
extraObject
.
getString
(
"productId"
);
if
(
StringUtils
.
isBlank
(
productId
))
{
errorMessage
=
"request params[extra.productId] error."
;
return
errorMessage
;
}
}
// 签名信息
if
(
StringUtils
.
isEmpty
(
sign
))
{
errorMessage
=
"request params[sign] error."
;
return
errorMessage
;
}
// 查询商户信息
String
retStr
=
mchInfoServiceClient
.
selectMchInfo
(
getJsonParam
(
"mchId"
,
mchId
));
JSONObject
retObj
=
JSON
.
parseObject
(
retStr
);
JSONObject
mchInfo
=
retObj
.
getJSONObject
(
"result"
);
if
(
mchInfo
==
null
)
{
errorMessage
=
"Can't found mchInfo[mchId="
+
mchId
+
"] record in db."
;
return
errorMessage
;
}
if
(
mchInfo
.
getByte
(
"state"
)
!=
1
)
{
errorMessage
=
"mchInfo not available [mchId="
+
mchId
+
"] record in db."
;
return
errorMessage
;
}
String
reqKey
=
mchInfo
.
getString
(
"reqKey"
);
if
(
StringUtils
.
isBlank
(
reqKey
))
{
errorMessage
=
"reqKey is null[mchId="
+
mchId
+
"] record in db."
;
return
errorMessage
;
}
// 查询商户对应的支付渠道
retStr
=
payChannelServiceClient
.
selectPayChannel
(
getJsonParam
(
new
String
[]{
"channelId"
,
"mchId"
},
new
String
[]{
channelId
,
mchId
}));
retObj
=
JSON
.
parseObject
(
retStr
);
JSONObject
payChannel
=
retObj
.
getJSONObject
(
"result"
);
if
(
payChannel
==
null
)
{
errorMessage
=
"Can't found payChannel[channelId="
+
channelId
+
",mchId="
+
mchId
+
"] record in db."
;
return
errorMessage
;
}
if
(
payChannel
.
getByte
(
"state"
)
!=
1
)
{
errorMessage
=
"channel not available [channelId="
+
channelId
+
",mchId="
+
mchId
+
"]"
;
return
errorMessage
;
}
// 验证签名数据
boolean
verifyFlag
=
XXPayUtil
.
verifyPaySign
(
params
,
reqKey
);
if
(!
verifyFlag
)
{
errorMessage
=
"Verify XX pay sign failed."
;
return
errorMessage
;
}
// 验证参数通过,返回JSONObject对象
JSONObject
payOrder
=
new
JSONObject
();
payOrder
.
put
(
"payOrderId"
,
MySeq
.
getPay
());
payOrder
.
put
(
"mchId"
,
mchId
);
payOrder
.
put
(
"mchOrderNo"
,
mchOrderNo
);
payOrder
.
put
(
"channelId"
,
channelId
);
payOrder
.
put
(
"amount"
,
Long
.
parseLong
(
amount
));
payOrder
.
put
(
"currency"
,
currency
);
payOrder
.
put
(
"clientIp"
,
clientIp
);
payOrder
.
put
(
"device"
,
device
);
payOrder
.
put
(
"subject"
,
subject
);
payOrder
.
put
(
"body"
,
body
);
payOrder
.
put
(
"extra"
,
extra
);
payOrder
.
put
(
"channelMchId"
,
payChannel
.
getString
(
"channelMchId"
));
payOrder
.
put
(
"param1"
,
param1
);
payOrder
.
put
(
"param2"
,
param2
);
payOrder
.
put
(
"notifyUrl"
,
notifyUrl
);
return
payOrder
;
}
/*String makeRetData(Map retMap) {
if(retMap.get(PayConstant.RETURN_PARAM_RETCODE).equals(PayConstant.RETURN_VALUE_SUCCESS)) {
String repKey = "Hpcl522AV6q613KIi46u6g6XuW8vM1N8bFgyv769770MdYe9u37M4y7rIpl8";
String sign = PayDigestUtil.getSign(retMap, repKey, "payParams");
retMap.put(PayConstant.RESULT_PARAM_SIGN, sign);
}
_log.info("生成响应数据:{}", retMap);
return JSON.toJSONString(retMap);
}*/
String
getJsonParam
(
String
[]
names
,
Object
[]
values
)
{
JSONObject
jsonParam
=
new
JSONObject
();
for
(
int
i
=
0
;
i
<
names
.
length
;
i
++)
{
jsonParam
.
put
(
names
[
i
],
values
[
i
]);
}
return
jsonParam
.
toJSONString
();
}
String
getJsonParam
(
String
name
,
Object
value
)
{
JSONObject
jsonParam
=
new
JSONObject
();
jsonParam
.
put
(
name
,
value
);
return
jsonParam
.
toJSONString
();
}
}
xxpay4spring-cloud/xxpay-web/src/main/java/org/xxpay/web/service/MchInfoServiceClient.java
0 → 100644
View file @
d53783a9
package
org.xxpay.web.service
;
import
com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
org.springframework.web.client.RestTemplate
;
import
org.xxpay.common.util.MyBase64
;
/**
* @Description:
* @author dingzhiwei jmdhappy@126.com
* @date 2017-07-05
* @version V1.0
* @Copyright: www.xxpay.org
*/
@Service
public
class
MchInfoServiceClient
{
@Autowired
RestTemplate
restTemplate
;
@HystrixCommand
(
fallbackMethod
=
"selectMchInfoFallback"
)
public
String
selectMchInfo
(
String
jsonParam
)
{
return
restTemplate
.
getForEntity
(
"http://XXPAY-SERVICE/mch_info/select?jsonParam="
+
MyBase64
.
encode
(
jsonParam
.
getBytes
()),
String
.
class
).
getBody
();
}
public
String
selectMchInfoFallback
(
String
jsonParam
)
{
return
"error"
;
}
}
\ No newline at end of file
xxpay4spring-cloud/xxpay-web/src/main/java/org/xxpay/web/service/PayChannelServiceClient.java
0 → 100644
View file @
d53783a9
package
org.xxpay.web.service
;
import
com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.cloud.netflix.feign.FeignClient
;
import
org.springframework.stereotype.Component
;
import
org.springframework.stereotype.Service
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RequestMethod
;
import
org.springframework.web.bind.annotation.RequestParam
;
import
org.springframework.web.client.RestTemplate
;
import
org.xxpay.common.util.MyBase64
;
/**
* @Description:
* @author dingzhiwei jmdhappy@126.com
* @date 2017-07-05
* @version V1.0
* @Copyright: www.xxpay.org
*/
@Service
public
class
PayChannelServiceClient
{
@Autowired
RestTemplate
restTemplate
;
@HystrixCommand
(
fallbackMethod
=
"selectPayChannelFallback"
)
public
String
selectPayChannel
(
String
jsonParam
)
{
return
restTemplate
.
getForEntity
(
"http://XXPAY-SERVICE/pay_channel/select?jsonParam="
+
MyBase64
.
encode
(
jsonParam
.
getBytes
()),
String
.
class
).
getBody
();
}
public
String
selectPayChannelFallback
(
String
jsonParam
)
{
return
"error"
;
}
}
\ No newline at end of file
xxpay4spring-cloud/xxpay-web/src/main/java/org/xxpay/web/service/PayOrderServiceClient.java
0 → 100644
View file @
d53783a9
package
org.xxpay.web.service
;
import
com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
org.springframework.web.client.RestTemplate
;
import
org.xxpay.common.util.MyBase64
;
/**
* @Description:
* @author dingzhiwei jmdhappy@126.com
* @date 2017-07-05
* @version V1.0
* @Copyright: www.xxpay.org
*/
@Service
public
class
PayOrderServiceClient
{
@Autowired
RestTemplate
restTemplate
;
/**
* 创建支付订单
* @param jsonParam
* @return
*/
@HystrixCommand
(
fallbackMethod
=
"createPayOrderFallback"
)
public
String
createPayOrder
(
String
jsonParam
)
{
return
restTemplate
.
getForEntity
(
"http://XXPAY-SERVICE/pay/create?jsonParam="
+
MyBase64
.
encode
(
jsonParam
.
getBytes
()),
String
.
class
).
getBody
();
}
public
String
createPayOrderFallback
(
String
jsonParam
)
{
return
"error"
;
}
/**
* 处理微信支付
* @param jsonParam
* @return
*/
@HystrixCommand
(
fallbackMethod
=
"doWxPayReqFallback"
)
public
String
doWxPayReq
(
String
jsonParam
)
{
return
restTemplate
.
getForEntity
(
"http://XXPAY-SERVICE/pay/channel/wx?jsonParam="
+
MyBase64
.
encode
(
jsonParam
.
getBytes
()),
String
.
class
).
getBody
();
}
public
String
doWxPayReqFallback
(
String
jsonParam
)
{
return
"error"
;
}
/**
* 处理支付宝wap支付
* @param jsonParam
* @return
*/
@HystrixCommand
(
fallbackMethod
=
"doAliPayWapReqFallback"
)
public
String
doAliPayWapReq
(
String
jsonParam
)
{
return
restTemplate
.
getForEntity
(
"http://XXPAY-SERVICE/pay/channel/ali_wap?jsonParam="
+
MyBase64
.
encode
(
jsonParam
.
getBytes
()),
String
.
class
).
getBody
();
}
public
String
doAliPayWapReqFallback
(
String
jsonParam
)
{
return
"error"
;
}
/**
* 处理支付宝即时到账支付
* @param jsonParam
* @return
*/
@HystrixCommand
(
fallbackMethod
=
"doAliPayPcReqFallback"
)
public
String
doAliPayPcReq
(
String
jsonParam
)
{
return
restTemplate
.
getForEntity
(
"http://XXPAY-SERVICE/pay/channel/ali_pc?jsonParam="
+
MyBase64
.
encode
(
jsonParam
.
getBytes
()),
String
.
class
).
getBody
();
}
public
String
doAliPayPcReqFallback
(
String
jsonParam
)
{
return
"error"
;
}
/**
* 处理支付宝手机支付
* @param jsonParam
* @return
*/
@HystrixCommand
(
fallbackMethod
=
"doAliPayMobileReqFallback"
)
public
String
doAliPayMobileReq
(
String
jsonParam
)
{
return
restTemplate
.
getForEntity
(
"http://XXPAY-SERVICE/pay/channel/ali_mobile?jsonParam="
+
MyBase64
.
encode
(
jsonParam
.
getBytes
()),
String
.
class
).
getBody
();
}
public
String
doAliPayMobileReqFallback
(
String
jsonParam
)
{
return
"error"
;
}
}
\ No newline at end of file
xxpay4spring-cloud/xxpay-web/src/main/resources/bootstrap.yml
0 → 100755
View file @
d53783a9
spring
:
application
:
name
:
xxpay-web
cloud
:
config
:
discovery
:
enabled
:
true
# 默认false,设为true表示使用注册中心中的configserver配置而不自己配置configserver的uri
serviceId
:
xxpay-config
# 指定config server在服务发现中的serviceId,默认为:configserver
fail-fast
:
true
password
:
xxpay
username
:
user
eureka
:
client
:
serviceUrl
:
defaultZone
:
http://localhost:2000/eureka/
\ No newline at end of file
Prev
1
…
20
21
22
23
24
Next
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