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
"src/main/webapp/templets/1/default/images/03.jpg" did not exist on "c9bf4f7e66b8fafcfe4ad7ff795c691daab54f8b"
Commit
d53783a9
authored
Aug 12, 2017
by
jmdhappy
Browse files
初始化提交
parent
324ccaaf
Changes
465
Show 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