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
20a57324
Commit
20a57324
authored
Oct 24, 2017
by
jmdhappy
Browse files
提交xxpay4spring-boot版本
parent
c454edfd
Changes
39
Hide whitespace changes
Inline
Side-by-side
pom.xml
View file @
20a57324
...
...
@@ -17,6 +17,7 @@
<module>
xxpay-shop
</module>
<module>
xxpay4spring-cloud
</module>
<module>
xxpay4dubbo
</module>
<module>
xxpay4spring-boot
</module>
</modules>
<properties>
...
...
xxpay4dubbo/xxpay4dubbo-api/src/main/java/org/xxpay/dubbo/api/service/IMchInfoService.java
View file @
20a57324
...
...
@@ -9,6 +9,6 @@ import java.util.Map;
*/
public
interface
IMchInfoService
{
public
Map
selectMchInfo
(
String
jsonParam
);
Map
selectMchInfo
(
String
jsonParam
);
}
xxpay4dubbo/xxpay4dubbo-api/src/main/java/org/xxpay/dubbo/api/service/IPayChannelService.java
View file @
20a57324
...
...
@@ -9,6 +9,6 @@ import java.util.Map;
*/
public
interface
IPayChannelService
{
public
Map
selectPayChannel
(
String
jsonParam
);
Map
selectPayChannel
(
String
jsonParam
);
}
xxpay4dubbo/xxpay4dubbo-api/src/main/java/org/xxpay/dubbo/api/service/IPayOrderService.java
View file @
20a57324
...
...
@@ -9,20 +9,20 @@ import java.util.Map;
*/
public
interface
IPayOrderService
{
public
Map
createPayOrder
(
String
jsonParam
);
Map
createPayOrder
(
String
jsonParam
);
public
Map
selectPayOrder
(
String
jsonParam
);
Map
selectPayOrder
(
String
jsonParam
);
public
Map
selectPayOrderByMchIdAndPayOrderId
(
String
jsonParam
);
Map
selectPayOrderByMchIdAndPayOrderId
(
String
jsonParam
);
public
Map
selectPayOrderByMchIdAndMchOrderNo
(
String
jsonParam
);
Map
selectPayOrderByMchIdAndMchOrderNo
(
String
jsonParam
);
public
Map
updateStatus4Ing
(
String
jsonParam
);
Map
updateStatus4Ing
(
String
jsonParam
);
public
Map
updateStatus4Success
(
String
jsonParam
);
Map
updateStatus4Success
(
String
jsonParam
);
public
Map
updateStatus4Complete
(
String
jsonParam
);
Map
updateStatus4Complete
(
String
jsonParam
);
public
Map
updateNotify
(
String
jsonParam
);
Map
updateNotify
(
String
jsonParam
);
}
xxpay4dubbo/xxpay4dubbo-service/pom.xml
View file @
20a57324
...
...
@@ -35,6 +35,10 @@
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-activemq
</artifactId>
</dependency>
<dependency>
<groupId>
org.apache.activemq
</groupId>
<artifactId>
activemq-pool
</artifactId>
</dependency>
<dependency>
<groupId>
org.mybatis.spring.boot
</groupId>
<artifactId>
mybatis-spring-boot-starter
</artifactId>
...
...
xxpay4dubbo/xxpay4dubbo-service/src/main/java/org/xxpay/dubbo/service/channel/alipay/AlipayConfig.java
View file @
20a57324
...
...
@@ -2,10 +2,8 @@ package org.xxpay.dubbo.service.channel.alipay;
import
com.alibaba.fastjson.JSON
;
import
com.alibaba.fastjson.JSONObject
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.boot.context.properties.ConfigurationProperties
;
import
org.springframework.stereotype.Component
;
import
org.springframework.stereotype.Service
;
import
org.springframework.util.Assert
;
/**
...
...
xxpay4dubbo/xxpay4dubbo-service/src/main/java/org/xxpay/dubbo/service/impl/NotifyPayServiceImpl.java
View file @
20a57324
package
org.xxpay.dubbo.service.impl
;
import
com.alibaba.dubbo.config.annotation.Service
;
import
com.alibaba.fastjson.JSONObject
;
import
com.alipay.api.AlipayApiException
;
import
com.alipay.api.internal.util.AlipaySignature
;
import
com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse
;
...
...
@@ -15,7 +14,10 @@ import org.springframework.util.StringUtils;
import
org.xxpay.common.constant.PayConstant
;
import
org.xxpay.common.domain.BaseParam
;
import
org.xxpay.common.enumm.RetEnum
;
import
org.xxpay.common.util.*
;
import
org.xxpay.common.util.JsonUtil
;
import
org.xxpay.common.util.MyLog
;
import
org.xxpay.common.util.ObjectValidUtil
;
import
org.xxpay.common.util.RpcUtil
;
import
org.xxpay.dal.dao.model.PayChannel
;
import
org.xxpay.dal.dao.model.PayOrder
;
import
org.xxpay.dubbo.api.service.INotifyPayService
;
...
...
xxpay4spring-boot/pom.xml
0 → 100755
View file @
20a57324
<?xml version="1.0" encoding="UTF-8"?>
<project
xmlns=
"http://maven.apache.org/POM/4.0.0"
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
>
<modelVersion>
4.0.0
</modelVersion>
<groupId>
org.xxpay
</groupId>
<artifactId>
xxpay4spring-boot
</artifactId>
<version>
1.0.0
</version>
<packaging>
jar
</packaging>
<name>
xxpay4spring-boot
</name>
<description>
xxpay4spring-boot
</description>
<parent>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-parent
</artifactId>
<version>
1.5.6.RELEASE
</version>
</parent>
<properties>
<project.build.sourceEncoding>
UTF-8
</project.build.sourceEncoding>
<project.reporting.outputEncoding>
UTF-8
</project.reporting.outputEncoding>
<java.version>
1.8
</java.version>
<springboot.version>
1.5.6.RELEASE
</springboot.version>
<springboot.dubbo.version>
1.0.0
</springboot.dubbo.version>
</properties>
<dependencies>
<dependency>
<groupId>
org.xxpay
</groupId>
<artifactId>
xxpay-dal
</artifactId>
<version>
1.0.0
</version>
</dependency>
<dependency>
<groupId>
org.mybatis.spring.boot
</groupId>
<artifactId>
mybatis-spring-boot-starter
</artifactId>
<version>
1.3.0
</version>
</dependency>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter
</artifactId>
</dependency>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-freemarker
</artifactId>
</dependency>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-web
</artifactId>
</dependency>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-test
</artifactId>
<scope>
test
</scope>
</dependency>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-configuration-processor
</artifactId>
</dependency>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-activemq
</artifactId>
</dependency>
<dependency>
<groupId>
org.apache.activemq
</groupId>
<artifactId>
activemq-pool
</artifactId>
</dependency>
<!--wx_pay-->
<dependency>
<groupId>
com.github.binarywang
</groupId>
<artifactId>
weixin-java-pay
</artifactId>
<version>
2.8.0
</version>
</dependency>
<!--ali_pay-->
<dependency>
<groupId>
com.alipay
</groupId>
<artifactId>
sdk
</artifactId>
<version>
1.5
</version>
<scope>
system
</scope>
<systemPath>
${basedir}/src/main/webapp/WEB-INF/lib/alipay-sdk-java20170818173712.jar
</systemPath>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-maven-plugin
</artifactId>
<configuration>
<finalName>
${project.name}
</finalName>
</configuration>
</plugin>
</plugins>
</build>
</project>
\ No newline at end of file
xxpay4spring-boot/src/main/java/org/xxpay/boot/XxPayBootAppliaction.java
0 → 100755
View file @
20a57324
package
org.xxpay.boot
;
import
org.springframework.boot.SpringApplication
;
import
org.springframework.boot.autoconfigure.SpringBootApplication
;
import
org.springframework.context.annotation.ComponentScan
;
/**
*
*/
@SpringBootApplication
@ComponentScan
(
basePackages
={
"org.xxpay"
})
public
class
XxPayBootAppliaction
{
public
static
void
main
(
String
[]
args
)
{
SpringApplication
.
run
(
XxPayBootAppliaction
.
class
,
args
);
}
}
xxpay4spring-boot/src/main/java/org/xxpay/boot/ctrl/Notify4AliPayController.java
0 → 100644
View file @
20a57324
package
org.xxpay.boot.ctrl
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.ResponseBody
;
import
org.springframework.web.bind.annotation.RestController
;
import
org.xxpay.boot.web.NotifyPayService
;
import
org.xxpay.common.constant.PayConstant
;
import
org.xxpay.common.util.MyLog
;
import
javax.servlet.ServletException
;
import
javax.servlet.http.HttpServletRequest
;
import
java.io.IOException
;
import
java.util.HashMap
;
import
java.util.Iterator
;
import
java.util.Map
;
/**
* @Description: 接收处理支付宝通知
* @author dingzhiwei jmdhappy@126.com
* @date 2017-07-05
* @version V1.0
* @Copyright: www.xxpay.org
*/
@RestController
public
class
Notify4AliPayController
{
private
static
final
MyLog
_log
=
MyLog
.
getLog
(
Notify4AliPayController
.
class
);
@Autowired
private
NotifyPayService
notifyPayService
;
/**
* 支付宝移动支付后台通知响应
* @param request
* @return
* @throws ServletException
* @throws IOException
*/
@RequestMapping
(
value
=
"/notify/pay/aliPayNotifyRes.htm"
)
@ResponseBody
public
String
aliPayNotifyRes
(
HttpServletRequest
request
)
throws
ServletException
,
IOException
{
_log
.
info
(
"====== 开始接收支付宝支付回调通知 ======"
);
String
notifyRes
=
doAliPayRes
(
request
);
_log
.
info
(
"响应给支付宝:{}"
,
notifyRes
);
_log
.
info
(
"====== 完成接收支付宝支付回调通知 ======"
);
return
notifyRes
;
}
public
String
doAliPayRes
(
HttpServletRequest
request
)
throws
ServletException
,
IOException
{
String
logPrefix
=
"【支付宝支付回调通知】"
;
//获取支付宝POST过来反馈信息
Map
<
String
,
String
>
params
=
new
HashMap
<
String
,
String
>();
Map
requestParams
=
request
.
getParameterMap
();
for
(
Iterator
iter
=
requestParams
.
keySet
().
iterator
();
iter
.
hasNext
();)
{
String
name
=
(
String
)
iter
.
next
();
String
[]
values
=
(
String
[])
requestParams
.
get
(
name
);
String
valueStr
=
""
;
for
(
int
i
=
0
;
i
<
values
.
length
;
i
++)
{
valueStr
=
(
i
==
values
.
length
-
1
)
?
valueStr
+
values
[
i
]
:
valueStr
+
values
[
i
]
+
","
;
}
//乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
//valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
params
.
put
(
name
,
valueStr
);
}
_log
.
info
(
"{}通知请求数据:reqStr={}"
,
logPrefix
,
params
);
if
(
params
.
isEmpty
())
{
_log
.
error
(
"{}请求参数为空"
,
logPrefix
);
return
PayConstant
.
RETURN_ALIPAY_VALUE_FAIL
;
}
return
notifyPayService
.
doAliPayNotify
(
params
);
}
}
xxpay4spring-boot/src/main/java/org/xxpay/boot/ctrl/Notify4WxPayController.java
0 → 100644
View file @
20a57324
package
org.xxpay.boot.ctrl
;
import
org.apache.commons.io.IOUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.ResponseBody
;
import
org.springframework.web.bind.annotation.RestController
;
import
org.xxpay.boot.web.NotifyPayService
;
import
org.xxpay.common.util.MyLog
;
import
javax.servlet.ServletException
;
import
javax.servlet.http.HttpServletRequest
;
import
java.io.IOException
;
/**
* @Description: 接收处理微信通知
* @author dingzhiwei jmdhappy@126.com
* @date 2017-07-05
* @version V1.0
* @Copyright: www.xxpay.org
*/
@RestController
public
class
Notify4WxPayController
{
private
static
final
MyLog
_log
=
MyLog
.
getLog
(
Notify4WxPayController
.
class
);
@Autowired
private
NotifyPayService
notifyPayService
;
/**
* 微信支付(统一下单接口)后台通知响应
* @param request
* @return
* @throws ServletException
* @throws IOException
*/
@RequestMapping
(
"/notify/pay/wxPayNotifyRes.htm"
)
@ResponseBody
public
String
wxPayNotifyRes
(
HttpServletRequest
request
)
throws
ServletException
,
IOException
{
_log
.
info
(
"====== 开始接收微信支付回调通知 ======"
);
String
notifyRes
=
doWxPayRes
(
request
);
_log
.
info
(
"响应给微信:{}"
,
notifyRes
);
_log
.
info
(
"====== 完成接收微信支付回调通知 ======"
);
return
notifyRes
;
}
public
String
doWxPayRes
(
HttpServletRequest
request
)
throws
ServletException
,
IOException
{
String
logPrefix
=
"【微信支付回调通知】"
;
String
xmlResult
=
IOUtils
.
toString
(
request
.
getInputStream
(),
request
.
getCharacterEncoding
());
_log
.
info
(
"{}通知请求数据:reqStr={}"
,
logPrefix
,
xmlResult
);
return
notifyPayService
.
doWxPayNotify
(
xmlResult
);
}
}
xxpay4spring-boot/src/main/java/org/xxpay/boot/ctrl/PayOrderController.java
0 → 100644
View file @
20a57324
package
org.xxpay.boot.ctrl
;
import
com.alibaba.fastjson.JSON
;
import
com.alibaba.fastjson.JSONObject
;
import
org.apache.commons.lang3.StringUtils
;
import
org.apache.commons.lang3.math.NumberUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RequestParam
;
import
org.springframework.web.bind.annotation.RestController
;
import
org.xxpay.boot.web.MchInfoService
;
import
org.xxpay.boot.web.PayChannelService
;
import
org.xxpay.boot.web.PayOrderService
;
import
org.xxpay.common.constant.PayConstant
;
import
org.xxpay.common.util.MyLog
;
import
org.xxpay.common.util.MySeq
;
import
org.xxpay.common.util.XXPayUtil
;
/**
* @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
PayOrderService
payOrderService
;
@Autowired
private
PayChannelService
payChannelService
;
@Autowired
private
MchInfoService
mchInfoService
;
/**
* 统一下单接口:
* 1)先验证接口参数以及签名信息
* 2)验证通过创建支付订单
* 3)根据商户选择渠道,调用支付服务进行下单
* 4)返回下单数据
* @param params
* @return
*/
@RequestMapping
(
value
=
"/api/pay/create_order"
)
public
String
payOrder
(
@RequestParam
String
params
)
{
_log
.
info
(
"###### 开始接收商户统一下单请求 ######"
);
String
logPrefix
=
"【商户统一下单】"
;
try
{
JSONObject
po
=
JSONObject
.
parseObject
(
params
);
JSONObject
payContext
=
new
JSONObject
();
JSONObject
payOrder
=
null
;
// 验证参数有效性
Object
object
=
validateParams
(
po
,
payContext
);
if
(
object
instanceof
String
)
{
_log
.
info
(
"{}参数校验不通过:{}"
,
logPrefix
,
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
));
int
result
=
payOrderService
.
createPayOrder
(
payOrder
);
_log
.
info
(
"{}创建支付订单,结果:{}"
,
logPrefix
,
result
);
if
(
result
!=
1
)
{
return
XXPayUtil
.
makeRetFail
(
XXPayUtil
.
makeRetMap
(
PayConstant
.
RETURN_VALUE_FAIL
,
"创建支付订单失败"
,
null
,
null
));
}
String
channelId
=
payOrder
.
getString
(
"channelId"
);
switch
(
channelId
)
{
case
PayConstant
.
PAY_CHANNEL_WX_APP
:
return
payOrderService
.
doWxPayReq
(
PayConstant
.
WxConstant
.
TRADE_TYPE_APP
,
payOrder
,
payContext
.
getString
(
"resKey"
));
case
PayConstant
.
PAY_CHANNEL_WX_JSAPI
:
return
payOrderService
.
doWxPayReq
(
PayConstant
.
WxConstant
.
TRADE_TYPE_JSPAI
,
payOrder
,
payContext
.
getString
(
"resKey"
));
case
PayConstant
.
PAY_CHANNEL_WX_NATIVE
:
return
payOrderService
.
doWxPayReq
(
PayConstant
.
WxConstant
.
TRADE_TYPE_NATIVE
,
payOrder
,
payContext
.
getString
(
"resKey"
));
case
PayConstant
.
PAY_CHANNEL_WX_MWEB
:
return
payOrderService
.
doWxPayReq
(
PayConstant
.
WxConstant
.
TRADE_TYPE_MWEB
,
payOrder
,
payContext
.
getString
(
"resKey"
));
case
PayConstant
.
PAY_CHANNEL_ALIPAY_MOBILE
:
return
payOrderService
.
doAliPayReq
(
channelId
,
payOrder
,
payContext
.
getString
(
"resKey"
));
case
PayConstant
.
PAY_CHANNEL_ALIPAY_PC
:
return
payOrderService
.
doAliPayReq
(
channelId
,
payOrder
,
payContext
.
getString
(
"resKey"
));
case
PayConstant
.
PAY_CHANNEL_ALIPAY_WAP
:
return
payOrderService
.
doAliPayReq
(
channelId
,
payOrder
,
payContext
.
getString
(
"resKey"
));
case
PayConstant
.
PAY_CHANNEL_ALIPAY_QR
:
return
payOrderService
.
doAliPayReq
(
channelId
,
payOrder
,
payContext
.
getString
(
"resKey"
));
default
:
return
XXPayUtil
.
makeRetFail
(
XXPayUtil
.
makeRetMap
(
PayConstant
.
RETURN_VALUE_FAIL
,
"不支持的支付渠道类型[channelId="
+
channelId
+
"]"
,
null
,
null
));
}
}
catch
(
Exception
e
)
{
_log
.
error
(
e
,
""
);
return
XXPayUtil
.
makeRetFail
(
XXPayUtil
.
makeRetMap
(
PayConstant
.
RETURN_VALUE_FAIL
,
"支付中心系统异常"
,
null
,
null
));
}
}
/**
* 验证创建订单请求参数,参数通过返回JSONObject对象,否则返回错误文本信息
* @param params
* @return
*/
private
Object
validateParams
(
JSONObject
params
,
JSONObject
payContext
)
{
// 验证请求参数,参数有问题返回错误提示
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
;
}
}
else
if
(
PayConstant
.
PAY_CHANNEL_WX_MWEB
.
equalsIgnoreCase
(
channelId
))
{
if
(
StringUtils
.
isEmpty
(
extra
))
{
errorMessage
=
"request params[extra] error."
;
return
errorMessage
;
}
JSONObject
extraObject
=
JSON
.
parseObject
(
extra
);
String
productId
=
extraObject
.
getString
(
"sceneInfo"
);
if
(
StringUtils
.
isBlank
(
productId
))
{
errorMessage
=
"request params[extra.sceneInfo] error."
;
return
errorMessage
;
}
if
(
StringUtils
.
isBlank
(
clientIp
))
{
errorMessage
=
"request params[clientIp] error."
;
return
errorMessage
;
}
}
// 签名信息
if
(
StringUtils
.
isEmpty
(
sign
))
{
errorMessage
=
"request params[sign] error."
;
return
errorMessage
;
}
// 查询商户信息
JSONObject
mchInfo
=
mchInfoService
.
getByMchId
(
mchId
);
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
;
}
payContext
.
put
(
"resKey"
,
mchInfo
.
getString
(
"resKey"
));
// 查询商户对应的支付渠道
JSONObject
payChannel
=
payChannelService
.
getByMchIdAndChannelId
(
mchId
,
channelId
);
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
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-boot/src/main/java/org/xxpay/boot/ctrl/QueryPayOrderController.java
0 → 100644
View file @
20a57324
package
org.xxpay.boot.ctrl
;
import
com.alibaba.fastjson.JSONObject
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RequestParam
;
import
org.springframework.web.bind.annotation.RestController
;
import
org.xxpay.boot.web.MchInfoService
;
import
org.xxpay.boot.web.PayOrderService
;
import
org.xxpay.common.constant.PayConstant
;
import
org.xxpay.common.util.MyLog
;
import
org.xxpay.common.util.XXPayUtil
;
import
java.util.Map
;
/**
* @Description: 支付订单查询
* @author dingzhiwei jmdhappy@126.com
* @date 2017-08-31
* @version V1.0
* @Copyright: www.xxpay.org
*/
@RestController
public
class
QueryPayOrderController
{
private
final
MyLog
_log
=
MyLog
.
getLog
(
QueryPayOrderController
.
class
);
@Autowired
private
PayOrderService
payOrderService
;
@Autowired
private
MchInfoService
mchInfoService
;
/**
* 查询支付订单接口:
* 1)先验证接口参数以及签名信息
* 2)根据参数查询订单
* 3)返回订单数据
* @param params
* @return
*/
@RequestMapping
(
value
=
"/api/pay/query_order"
)
public
String
queryPayOrder
(
@RequestParam
String
params
)
{
_log
.
info
(
"###### 开始接收商户查询支付订单请求 ######"
);
String
logPrefix
=
"【商户支付订单查询】"
;
try
{
JSONObject
po
=
JSONObject
.
parseObject
(
params
);
JSONObject
payContext
=
new
JSONObject
();
// 验证参数有效性
String
errorMessage
=
validateParams
(
po
,
payContext
);
if
(!
"success"
.
equalsIgnoreCase
(
errorMessage
))
{
_log
.
warn
(
errorMessage
);
return
XXPayUtil
.
makeRetFail
(
XXPayUtil
.
makeRetMap
(
PayConstant
.
RETURN_VALUE_FAIL
,
errorMessage
,
null
,
null
));
}
_log
.
debug
(
"请求参数及签名校验通过"
);
String
mchId
=
po
.
getString
(
"mchId"
);
// 商户ID
String
mchOrderNo
=
po
.
getString
(
"mchOrderNo"
);
// 商户订单号
String
payOrderId
=
po
.
getString
(
"payOrderId"
);
// 支付订单号
String
executeNotify
=
po
.
getString
(
"executeNotify"
);
// 是否执行回调
JSONObject
payOrder
=
payOrderService
.
queryPayOrder
(
mchId
,
payOrderId
,
mchOrderNo
,
executeNotify
);
_log
.
info
(
"{}查询支付订单,结果:{}"
,
logPrefix
,
payOrder
);
if
(
payOrder
==
null
)
{
return
XXPayUtil
.
makeRetFail
(
XXPayUtil
.
makeRetMap
(
PayConstant
.
RETURN_VALUE_FAIL
,
"支付订单不存在"
,
null
,
null
));
}
Map
<
String
,
Object
>
map
=
XXPayUtil
.
makeRetMap
(
PayConstant
.
RETURN_VALUE_SUCCESS
,
""
,
PayConstant
.
RETURN_VALUE_SUCCESS
,
null
);
map
.
put
(
"result"
,
payOrder
);
_log
.
info
(
"###### 商户查询订单处理完成 ######"
);
return
XXPayUtil
.
makeRetData
(
map
,
payContext
.
getString
(
"resKey"
));
}
catch
(
Exception
e
)
{
_log
.
error
(
e
,
""
);
return
XXPayUtil
.
makeRetFail
(
XXPayUtil
.
makeRetMap
(
PayConstant
.
RETURN_VALUE_FAIL
,
"支付中心系统异常"
,
null
,
null
));
}
}
/**
* 验证创建订单请求参数,参数通过返回JSONObject对象,否则返回错误文本信息
* @param params
* @return
*/
private
String
validateParams
(
JSONObject
params
,
JSONObject
payContext
)
{
// 验证请求参数,参数有问题返回错误提示
String
errorMessage
;
// 支付参数
String
mchId
=
params
.
getString
(
"mchId"
);
// 商户ID
String
mchOrderNo
=
params
.
getString
(
"mchOrderNo"
);
// 商户订单号
String
payOrderId
=
params
.
getString
(
"payOrderId"
);
// 支付订单号
String
sign
=
params
.
getString
(
"sign"
);
// 签名
// 验证请求参数有效性(必选项)
if
(
StringUtils
.
isBlank
(
mchId
))
{
errorMessage
=
"request params[mchId] error."
;
return
errorMessage
;
}
if
(
StringUtils
.
isBlank
(
mchOrderNo
)
&&
StringUtils
.
isBlank
(
payOrderId
))
{
errorMessage
=
"request params[mchOrderNo or payOrderId] error."
;
return
errorMessage
;
}
// 签名信息
if
(
StringUtils
.
isEmpty
(
sign
))
{
errorMessage
=
"request params[sign] error."
;
return
errorMessage
;
}
// 查询商户信息
JSONObject
mchInfo
=
mchInfoService
.
getByMchId
(
mchId
);
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
;
}
payContext
.
put
(
"resKey"
,
mchInfo
.
getString
(
"resKey"
));
// 验证签名数据
boolean
verifyFlag
=
XXPayUtil
.
verifyPaySign
(
params
,
reqKey
);
if
(!
verifyFlag
)
{
errorMessage
=
"Verify XX pay sign failed."
;
return
errorMessage
;
}
return
"success"
;
}
}
xxpay4spring-boot/src/main/java/org/xxpay/boot/service/BaseService.java
0 → 100644
View file @
20a57324
package
org.xxpay.boot.service
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
org.springframework.util.CollectionUtils
;
import
org.xxpay.common.constant.PayConstant
;
import
org.xxpay.dal.dao.mapper.MchInfoMapper
;
import
org.xxpay.dal.dao.mapper.PayChannelMapper
;
import
org.xxpay.dal.dao.mapper.PayOrderMapper
;
import
org.xxpay.dal.dao.model.*
;
import
java.util.List
;
/**
* @author: dingzhiwei
* @date: 17/9/9
* @description:
*/
@Service
public
class
BaseService
{
@Autowired
private
PayOrderMapper
payOrderMapper
;
@Autowired
private
MchInfoMapper
mchInfoMapper
;
@Autowired
private
PayChannelMapper
payChannelMapper
;
public
MchInfo
baseSelectMchInfo
(
String
mchId
)
{
return
mchInfoMapper
.
selectByPrimaryKey
(
mchId
);
}
public
PayChannel
baseSelectPayChannel
(
String
mchId
,
String
channelId
)
{
PayChannelExample
example
=
new
PayChannelExample
();
PayChannelExample
.
Criteria
criteria
=
example
.
createCriteria
();
criteria
.
andChannelIdEqualTo
(
channelId
);
criteria
.
andMchIdEqualTo
(
mchId
);
List
<
PayChannel
>
payChannelList
=
payChannelMapper
.
selectByExample
(
example
);
if
(
CollectionUtils
.
isEmpty
(
payChannelList
))
return
null
;
return
payChannelList
.
get
(
0
);
}
public
int
baseCreatePayOrder
(
PayOrder
payOrder
)
{
return
payOrderMapper
.
insertSelective
(
payOrder
);
}
public
PayOrder
baseSelectPayOrder
(
String
payOrderId
)
{
return
payOrderMapper
.
selectByPrimaryKey
(
payOrderId
);
}
public
PayOrder
baseSelectPayOrderByMchIdAndPayOrderId
(
String
mchId
,
String
payOrderId
)
{
PayOrderExample
example
=
new
PayOrderExample
();
PayOrderExample
.
Criteria
criteria
=
example
.
createCriteria
();
criteria
.
andMchIdEqualTo
(
mchId
);
criteria
.
andPayOrderIdEqualTo
(
payOrderId
);
List
<
PayOrder
>
payOrderList
=
payOrderMapper
.
selectByExample
(
example
);
return
CollectionUtils
.
isEmpty
(
payOrderList
)
?
null
:
payOrderList
.
get
(
0
);
}
public
PayOrder
baseSelectPayOrderByMchIdAndMchOrderNo
(
String
mchId
,
String
mchOrderNo
)
{
PayOrderExample
example
=
new
PayOrderExample
();
PayOrderExample
.
Criteria
criteria
=
example
.
createCriteria
();
criteria
.
andMchIdEqualTo
(
mchId
);
criteria
.
andMchOrderNoEqualTo
(
mchOrderNo
);
List
<
PayOrder
>
payOrderList
=
payOrderMapper
.
selectByExample
(
example
);
return
CollectionUtils
.
isEmpty
(
payOrderList
)
?
null
:
payOrderList
.
get
(
0
);
}
public
int
baseUpdateStatus4Ing
(
String
payOrderId
,
String
channelOrderNo
)
{
PayOrder
payOrder
=
new
PayOrder
();
payOrder
.
setStatus
(
PayConstant
.
PAY_STATUS_PAYING
);
if
(
channelOrderNo
!=
null
)
payOrder
.
setChannelOrderNo
(
channelOrderNo
);
payOrder
.
setPaySuccTime
(
System
.
currentTimeMillis
());
PayOrderExample
example
=
new
PayOrderExample
();
PayOrderExample
.
Criteria
criteria
=
example
.
createCriteria
();
criteria
.
andPayOrderIdEqualTo
(
payOrderId
);
criteria
.
andStatusEqualTo
(
PayConstant
.
PAY_STATUS_INIT
);
return
payOrderMapper
.
updateByExampleSelective
(
payOrder
,
example
);
}
public
int
baseUpdateStatus4Success
(
String
payOrderId
)
{
PayOrder
payOrder
=
new
PayOrder
();
payOrder
.
setPayOrderId
(
payOrderId
);
payOrder
.
setStatus
(
PayConstant
.
PAY_STATUS_SUCCESS
);
payOrder
.
setPaySuccTime
(
System
.
currentTimeMillis
());
PayOrderExample
example
=
new
PayOrderExample
();
PayOrderExample
.
Criteria
criteria
=
example
.
createCriteria
();
criteria
.
andPayOrderIdEqualTo
(
payOrderId
);
criteria
.
andStatusEqualTo
(
PayConstant
.
PAY_STATUS_PAYING
);
return
payOrderMapper
.
updateByExampleSelective
(
payOrder
,
example
);
}
public
int
baseUpdateStatus4Complete
(
String
payOrderId
)
{
PayOrder
payOrder
=
new
PayOrder
();
payOrder
.
setPayOrderId
(
payOrderId
);
payOrder
.
setStatus
(
PayConstant
.
PAY_STATUS_COMPLETE
);
PayOrderExample
example
=
new
PayOrderExample
();
PayOrderExample
.
Criteria
criteria
=
example
.
createCriteria
();
criteria
.
andPayOrderIdEqualTo
(
payOrderId
);
criteria
.
andStatusEqualTo
(
PayConstant
.
PAY_STATUS_SUCCESS
);
return
payOrderMapper
.
updateByExampleSelective
(
payOrder
,
example
);
}
public
int
baseUpdateNotify
(
String
payOrderId
,
byte
count
)
{
PayOrder
newPayOrder
=
new
PayOrder
();
newPayOrder
.
setNotifyCount
(
count
);
newPayOrder
.
setLastNotifyTime
(
System
.
currentTimeMillis
());
newPayOrder
.
setPayOrderId
(
payOrderId
);
return
payOrderMapper
.
updateByPrimaryKeySelective
(
newPayOrder
);
}
public
int
baseUpdateNotify
(
PayOrder
payOrder
)
{
return
payOrderMapper
.
updateByPrimaryKeySelective
(
payOrder
);
}
}
xxpay4spring-boot/src/main/java/org/xxpay/boot/service/IMchInfoService.java
0 → 100644
View file @
20a57324
package
org.xxpay.boot.service
;
import
java.util.Map
;
/**
* @author: dingzhiwei
* @date: 17/9/8
* @description:
*/
public
interface
IMchInfoService
{
Map
selectMchInfo
(
String
jsonParam
);
}
xxpay4spring-boot/src/main/java/org/xxpay/boot/service/INotifyPayService.java
0 → 100644
View file @
20a57324
package
org.xxpay.boot.service
;
import
java.util.Map
;
/**
* @author: dingzhiwei
* @date: 17/9/10
* @description:
*/
public
interface
INotifyPayService
{
Map
doAliPayNotify
(
String
jsonParam
);
Map
doWxPayNotify
(
String
jsonParam
);
Map
sendBizPayNotify
(
String
jsonParam
);
}
xxpay4spring-boot/src/main/java/org/xxpay/boot/service/IPayChannel4AliService.java
0 → 100644
View file @
20a57324
package
org.xxpay.boot.service
;
import
java.util.Map
;
/**
* @author: dingzhiwei
* @date: 17/9/10
* @description:
*/
public
interface
IPayChannel4AliService
{
Map
doAliPayWapReq
(
String
jsonParam
);
Map
doAliPayPcReq
(
String
jsonParam
);
Map
doAliPayMobileReq
(
String
jsonParam
);
Map
doAliPayQrReq
(
String
jsonParam
);
}
xxpay4spring-boot/src/main/java/org/xxpay/boot/service/IPayChannel4WxService.java
0 → 100644
View file @
20a57324
package
org.xxpay.boot.service
;
import
java.util.Map
;
/**
* @author: dingzhiwei
* @date: 17/9/9
* @description:
*/
public
interface
IPayChannel4WxService
{
Map
doWxPayReq
(
String
jsonParam
);
}
xxpay4spring-boot/src/main/java/org/xxpay/boot/service/IPayChannelService.java
0 → 100644
View file @
20a57324
package
org.xxpay.boot.service
;
import
java.util.Map
;
/**
* @author: dingzhiwei
* @date: 17/9/8
* @description:
*/
public
interface
IPayChannelService
{
Map
selectPayChannel
(
String
jsonParam
);
}
xxpay4spring-boot/src/main/java/org/xxpay/boot/service/IPayOrderService.java
0 → 100644
View file @
20a57324
package
org.xxpay.boot.service
;
import
java.util.Map
;
/**
* @author: dingzhiwei
* @date: 17/9/8
* @description:
*/
public
interface
IPayOrderService
{
Map
createPayOrder
(
String
jsonParam
);
Map
selectPayOrder
(
String
jsonParam
);
Map
selectPayOrderByMchIdAndPayOrderId
(
String
jsonParam
);
Map
selectPayOrderByMchIdAndMchOrderNo
(
String
jsonParam
);
Map
updateStatus4Ing
(
String
jsonParam
);
Map
updateStatus4Success
(
String
jsonParam
);
Map
updateStatus4Complete
(
String
jsonParam
);
Map
updateNotify
(
String
jsonParam
);
}
Prev
1
2
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