Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
G
gxpt_ht
Overview
Overview
Details
Activity
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
pseer
gxpt_ht
Commits
60fa1790
Commit
60fa1790
authored
Dec 20, 2023
by
YG8999
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
扫呗支付代码
parent
2ec5c75d
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
30 changed files
with
1221 additions
and
40 deletions
+1221
-40
CallbackController.java
.../java/share/web/controller/system/CallbackController.java
+15
-0
SaobeiApiLogController.java
...a/share/web/controller/system/SaobeiApiLogController.java
+104
-0
application-prod.yml
share-admin/src/main/resources/application-prod.yml
+8
-0
SaobeiConfig.java
...ommon/src/main/java/share/common/config/SaobeiConfig.java
+30
-0
PayConstants.java
...mon/src/main/java/share/common/constant/PayConstants.java
+3
-0
PayTypeEnum.java
...-common/src/main/java/share/common/enums/PayTypeEnum.java
+2
-1
SaobeiPayTypeEnum.java
...n/src/main/java/share/common/enums/SaobeiPayTypeEnum.java
+38
-0
SaobeiServiceIdEnum.java
...src/main/java/share/common/enums/SaobeiServiceIdEnum.java
+40
-0
SaobeiStatusEnum.java
...on/src/main/java/share/common/enums/SaobeiStatusEnum.java
+39
-0
application-prod.yml
share-front/src/main/resources/application-prod.yml
+8
-0
pom.xml
share-system/pom.xml
+9
-0
saobei-open-sdk-1.1.8.jar
share-system/src/lib/saobei-open-sdk-1.1.8.jar
+0
-0
SaobeiApiLog.java
...ystem/src/main/java/share/system/domain/SaobeiApiLog.java
+106
-0
SaobeiMiniPayRequestVo.java
...n/java/share/system/domain/vo/SaobeiMiniPayRequestVo.java
+72
-0
SaobeiNotifyResponseVo.java
...n/java/share/system/domain/vo/SaobeiNotifyResponseVo.java
+21
-0
SaobeiNotifyVo.java
.../src/main/java/share/system/domain/vo/SaobeiNotifyVo.java
+72
-0
SaobeiRefundVo.java
.../src/main/java/share/system/domain/vo/SaobeiRefundVo.java
+50
-0
SaobeiApiLogMapper.java
...src/main/java/share/system/mapper/SaobeiApiLogMapper.java
+62
-0
CallbackService.java
...m/src/main/java/share/system/service/CallbackService.java
+11
-0
OrderPayService.java
...m/src/main/java/share/system/service/OrderPayService.java
+8
-1
SaobeiApiLogService.java
...c/main/java/share/system/service/SaobeiApiLogService.java
+62
-0
SaobeiService.java
...tem/src/main/java/share/system/service/SaobeiService.java
+31
-0
CallbackServiceImpl.java
...n/java/share/system/service/impl/CallbackServiceImpl.java
+0
-0
OrderPayServiceImpl.java
...n/java/share/system/service/impl/OrderPayServiceImpl.java
+93
-9
OrderRefundServiceImpl.java
...ava/share/system/service/impl/OrderRefundServiceImpl.java
+73
-8
SOrderServiceImpl.java
...ain/java/share/system/service/impl/SOrderServiceImpl.java
+25
-21
SaobeiApiLogServiceImpl.java
...va/share/system/service/impl/SaobeiApiLogServiceImpl.java
+97
-0
SaobeiServiceImpl.java
...ain/java/share/system/service/impl/SaobeiServiceImpl.java
+0
-0
SaobeiTestMain.java
...ystem/src/main/java/share/system/util/SaobeiTestMain.java
+0
-0
SaobeiApiLogMapper.xml
...m/src/main/resources/mapper/system/SaobeiApiLogMapper.xml
+142
-0
No files found.
share-admin/src/main/java/share/web/controller/system/CallbackController.java
View file @
60fa1790
...
...
@@ -8,6 +8,8 @@ import org.springframework.web.bind.annotation.RequestBody;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RequestMethod
;
import
org.springframework.web.bind.annotation.RestController
;
import
share.system.domain.vo.SaobeiNotifyResponseVo
;
import
share.system.domain.vo.SaobeiNotifyVo
;
import
share.system.service.CallbackService
;
import
javax.servlet.http.HttpServletRequest
;
...
...
@@ -49,6 +51,19 @@ public class CallbackController {
System
.
out
.
println
(
"微信退款回调 response ===> "
+
response
);
return
response
;
}
/**
* 扫呗支付回调
*/
@ApiOperation
(
value
=
"扫呗支付回调"
)
@RequestMapping
(
value
=
"/saobei/wechat"
,
method
=
RequestMethod
.
POST
)
public
SaobeiNotifyResponseVo
saobeiWechat
(
@RequestBody
SaobeiNotifyVo
request
)
{
System
.
out
.
println
(
"扫呗支付回调 request ===> "
+
request
);
SaobeiNotifyResponseVo
response
=
callbackService
.
saobeiWechat
(
request
);
System
.
out
.
println
(
"扫呗支付回调 response ===> "
+
response
);
return
response
;
}
}
...
...
share-admin/src/main/java/share/web/controller/system/SaobeiApiLogController.java
0 → 100644
View file @
60fa1790
package
share
.
web
.
controller
.
system
;
import
java.util.List
;
import
javax.servlet.http.HttpServletResponse
;
import
org.springframework.security.access.prepost.PreAuthorize
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.web.bind.annotation.GetMapping
;
import
org.springframework.web.bind.annotation.PostMapping
;
import
org.springframework.web.bind.annotation.PutMapping
;
import
org.springframework.web.bind.annotation.DeleteMapping
;
import
org.springframework.web.bind.annotation.PathVariable
;
import
org.springframework.web.bind.annotation.RequestBody
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RestController
;
import
share.common.annotation.Log
;
import
share.common.core.controller.BaseController
;
import
share.common.core.domain.AjaxResult
;
import
share.common.enums.BusinessType
;
import
share.system.domain.SaobeiApiLog
;
import
share.system.service.SaobeiApiLogService
;
import
share.common.utils.poi.ExcelUtil
;
import
share.common.core.page.TableDataInfo
;
/**
* 扫呗接口调用日志Controller
*
* @author wuwenlong
* @date 2023-12-14
*/
@RestController
@RequestMapping
(
"/system/saobei/log"
)
public
class
SaobeiApiLogController
extends
BaseController
{
@Autowired
private
SaobeiApiLogService
saobeiApiLogService
;
/**
* 查询扫呗接口调用日志列表
*/
@PreAuthorize
(
"@ss.hasPermi('system:saobeilog:list')"
)
@GetMapping
(
"/list"
)
public
TableDataInfo
list
(
SaobeiApiLog
saobeiApiLog
)
{
startPage
();
List
<
SaobeiApiLog
>
list
=
saobeiApiLogService
.
selectSaobeiApiLogList
(
saobeiApiLog
);
return
getDataTable
(
list
);
}
/**
* 导出扫呗接口调用日志列表
*/
@PreAuthorize
(
"@ss.hasPermi('system:saobeilog:export')"
)
@Log
(
title
=
"扫呗接口调用日志"
,
businessType
=
BusinessType
.
EXPORT
)
@PostMapping
(
"/export"
)
public
void
export
(
HttpServletResponse
response
,
SaobeiApiLog
saobeiApiLog
)
{
List
<
SaobeiApiLog
>
list
=
saobeiApiLogService
.
selectSaobeiApiLogList
(
saobeiApiLog
);
ExcelUtil
<
SaobeiApiLog
>
util
=
new
ExcelUtil
<
SaobeiApiLog
>(
SaobeiApiLog
.
class
);
util
.
exportExcel
(
response
,
list
,
"扫呗接口调用日志数据"
);
}
/**
* 获取扫呗接口调用日志详细信息
*/
@PreAuthorize
(
"@ss.hasPermi('system:saobeilog:query')"
)
@GetMapping
(
value
=
"/{id}"
)
public
AjaxResult
getInfo
(
@PathVariable
(
"id"
)
Long
id
)
{
return
success
(
saobeiApiLogService
.
selectSaobeiApiLogById
(
id
));
}
/**
* 新增扫呗接口调用日志
*/
@PreAuthorize
(
"@ss.hasPermi('system:saobeilog:add')"
)
@Log
(
title
=
"扫呗接口调用日志"
,
businessType
=
BusinessType
.
INSERT
)
@PostMapping
public
AjaxResult
add
(
@RequestBody
SaobeiApiLog
saobeiApiLog
)
{
return
toAjax
(
saobeiApiLogService
.
insertSaobeiApiLog
(
saobeiApiLog
));
}
/**
* 修改扫呗接口调用日志
*/
@PreAuthorize
(
"@ss.hasPermi('system:saobeilog:edit')"
)
@Log
(
title
=
"扫呗接口调用日志"
,
businessType
=
BusinessType
.
UPDATE
)
@PutMapping
public
AjaxResult
edit
(
@RequestBody
SaobeiApiLog
saobeiApiLog
)
{
return
toAjax
(
saobeiApiLogService
.
updateSaobeiApiLog
(
saobeiApiLog
));
}
/**
* 删除扫呗接口调用日志
*/
@PreAuthorize
(
"@ss.hasPermi('system:saobeilog:remove')"
)
@Log
(
title
=
"扫呗接口调用日志"
,
businessType
=
BusinessType
.
DELETE
)
@DeleteMapping
(
"/{ids}"
)
public
AjaxResult
remove
(
@PathVariable
Long
[]
ids
)
{
return
toAjax
(
saobeiApiLogService
.
deleteSaobeiApiLogByIds
(
ids
));
}
}
share-admin/src/main/resources/application-prod.yml
View file @
60fa1790
...
...
@@ -30,6 +30,14 @@ wx:
token
:
coujio
aesKey
:
zf8vTHbI0ZDPTkkCXHEuwh9EbtVtOn6n4vQjMb9OFrS
msgDataFormat
:
XML
#扫呗支付配置
saobei
:
key
:
15490267
accessToken
:
a16f205455bb48b899ec38b9929c8962
instNo
:
15490267
merchantNo
:
852107997000216
terminalId
:
15490267
payVer
:
201
# 开发环境配置
server
:
# 服务器的HTTP端口,默认为8080
...
...
share-common/src/main/java/share/common/config/SaobeiConfig.java
0 → 100644
View file @
60fa1790
package
share
.
common
.
config
;
import
lombok.Data
;
import
org.springframework.boot.context.properties.ConfigurationProperties
;
import
org.springframework.stereotype.Component
;
/**
* @className: share.common.config.SaobeiConfig
* @description: 读取扫呗相关配置
* @author: lwj
* @create: 2023-12-13 12:05
*/
@Data
@Component
@ConfigurationProperties
(
prefix
=
"saobei"
)
public
class
SaobeiConfig
{
//机构秘钥,扫呗分配
private
String
key
;
//支付秘钥,扫呗分配
private
String
accessToken
;
//机构号,扫呗分配
private
String
instNo
;
//商户号,扫呗分配
private
String
merchantNo
;
//终端号,扫呗分配
private
String
terminalId
;
//版本号
private
String
payVer
;
}
share-common/src/main/java/share/common/constant/PayConstants.java
View file @
60fa1790
...
...
@@ -44,4 +44,7 @@ public class PayConstants {
// 公共号退款
public
static
final
String
WX_PAY_REFUND_API_URI
=
"secapi/pay/refund"
;
// 扫呗支付回调地址
public
static
final
String
SAOBEI_PAY_NOTIFY_API_URI
=
"/prod-api/admin/payment/callback/saobei/wechat"
;
}
share-common/src/main/java/share/common/enums/PayTypeEnum.java
View file @
60fa1790
...
...
@@ -9,7 +9,8 @@ import share.common.utils.StringUtils;
public
enum
PayTypeEnum
{
WECHAT
(
1
,
"wechat"
,
"微信支付"
),
ALIPAY
(
2
,
"alipay"
,
"支付宝"
);
ALIPAY
(
2
,
"alipay"
,
"支付宝"
),
SAOBEI
(
3
,
"saobei"
,
"扫呗"
);
private
Integer
code
;
private
String
value
;
...
...
share-common/src/main/java/share/common/enums/SaobeiPayTypeEnum.java
0 → 100644
View file @
60fa1790
package
share
.
common
.
enums
;
import
share.common.utils.StringUtils
;
/**
* @className: share.common.enums.SaobeiPayTypeEnum
* @description: 扫呗支付类型
* @author: lwj
* @create: 2023-12-13 13:24
*/
public
enum
SaobeiPayTypeEnum
{
WECHAT
(
"010"
,
"wechat"
,
"微信"
),
ALIPAY
(
"020"
,
"alipay"
,
"支付宝"
);
private
String
code
;
private
String
value
;
private
String
name
;
SaobeiPayTypeEnum
(
String
code
,
String
value
,
String
name
)
{
this
.
code
=
code
;
this
.
value
=
value
;
this
.
name
=
name
;
}
public
String
getCode
(){
return
code
;
}
public
String
getValue
()
{
return
value
;
}
public
String
getName
()
{
return
name
;
}
}
share-common/src/main/java/share/common/enums/SaobeiServiceIdEnum.java
0 → 100644
View file @
60fa1790
package
share
.
common
.
enums
;
/**
* @className: share.common.enums.SaobeiServiceIdEnum
* @description: 扫呗服务接口类型
* @author: lwj
* @create: 2023-12-13 12:24
*/
public
enum
SaobeiServiceIdEnum
{
SERVICE_ID_12
(
"012"
,
"公众号预支付(统一下单)"
),
SERVICE_ID_15
(
"015"
,
"小程序支付接口"
),
SERVICE_ID_30
(
"030"
,
"退款申请接口"
),
SERVICE_ID_99
(
"099"
,
"扫呗回调接口"
);
private
String
code
;
private
String
name
;
SaobeiServiceIdEnum
(
String
code
,
String
name
)
{
this
.
code
=
code
;
this
.
name
=
name
;
}
public
String
getCode
()
{
return
code
;
}
public
void
setCode
(
String
code
)
{
this
.
code
=
code
;
}
public
String
getName
()
{
return
name
;
}
public
void
setName
(
String
name
)
{
this
.
name
=
name
;
}
}
share-common/src/main/java/share/common/enums/SaobeiStatusEnum.java
0 → 100644
View file @
60fa1790
package
share
.
common
.
enums
;
/**
* @className: share.common.enums.SaobeiStatusEnum
* @description: 扫呗支付返回状态
* @author: lwj
* @create: 2023-12-13 12:53
*/
public
enum
SaobeiStatusEnum
{
SUCCESS
(
"01"
,
"成功"
),
FAIL
(
"02"
,
"失败"
),
EXCEPTION
(
"00"
,
"接口异常"
);
private
String
code
;
private
String
name
;
SaobeiStatusEnum
(
String
code
,
String
name
)
{
this
.
code
=
code
;
this
.
name
=
name
;
}
public
String
getCode
()
{
return
code
;
}
public
void
setCode
(
String
code
)
{
this
.
code
=
code
;
}
public
String
getName
()
{
return
name
;
}
public
void
setName
(
String
name
)
{
this
.
name
=
name
;
}
}
share-front/src/main/resources/application-prod.yml
View file @
60fa1790
...
...
@@ -30,6 +30,14 @@ wx:
token
:
coujio
aesKey
:
zf8vTHbI0ZDPTkkCXHEuwh9EbtVtOn6n4vQjMb9OFrS
msgDataFormat
:
JSON
#扫呗支付配置
saobei
:
key
:
15490267
accessToken
:
a16f205455bb48b899ec38b9929c8962
instNo
:
15490267
merchantNo
:
852107997000216
terminalId
:
15490267
payVer
:
201
# 开发环境配置
server
:
# 服务器的HTTP端口,默认为8080
...
...
share-system/pom.xml
View file @
60fa1790
...
...
@@ -143,5 +143,13 @@
<version>
5.8.16
</version>
<scope>
compile
</scope>
</dependency>
<!--扫呗支付SDK引入加相关依赖结束-->
<dependency>
<groupId>
saobei-open
</groupId>
<artifactId>
saobei-open
</artifactId>
<version>
1.1.8
</version>
<scope>
system
</scope>
<systemPath>
${project.basedir}/src/lib/saobei-open-sdk-1.1.8.jar
</systemPath>
</dependency>
</dependencies>
</project>
\ No newline at end of file
share-system/src/lib/saobei-open-sdk-1.1.8.jar
0 → 100644
View file @
60fa1790
File added
share-system/src/main/java/share/system/domain/SaobeiApiLog.java
0 → 100644
View file @
60fa1790
package
share
.
system
.
domain
;
import
org.apache.commons.lang3.builder.ToStringBuilder
;
import
org.apache.commons.lang3.builder.ToStringStyle
;
import
share.common.annotation.Excel
;
import
share.common.core.domain.BaseEntity
;
import
com.baomidou.mybatisplus.annotation.TableField
;
import
com.baomidou.mybatisplus.annotation.TableLogic
;
import
lombok.Data
;
/**
* 扫呗接口调用日志对象 s_saobei_api_log
*
* @author wuwenlong
* @date 2023-12-14
*/
@Data
public
class
SaobeiApiLog
extends
BaseEntity
{
private
static
final
long
serialVersionUID
=
1L
;
/** 主键id */
private
Long
id
;
/** 版本号 */
@Excel
(
name
=
"版本号"
)
private
String
payVer
;
/** 支付方式,010微信,020支付宝 */
@Excel
(
name
=
"支付方式,010微信,020支付宝"
)
private
String
payType
;
/** 接口类型 */
@Excel
(
name
=
"接口类型"
)
private
String
serviceId
;
/** 商户号 */
@Excel
(
name
=
"商户号"
)
private
String
merchantNo
;
/** 终端号 */
@Excel
(
name
=
"终端号"
)
private
String
terminalId
;
/** 用户手机端IP */
@Excel
(
name
=
"用户手机端IP"
)
private
String
terminalIp
;
/** 终端流水号 */
@Excel
(
name
=
"终端流水号"
)
private
String
terminalTrace
;
/** 终端交易时间 */
@Excel
(
name
=
"终端交易时间"
)
private
String
terminalTime
;
/** 扫呗平台唯一订单号 */
@Excel
(
name
=
"扫呗平台唯一订单号"
)
private
String
outTradeNo
;
/** 请求参数 */
@Excel
(
name
=
"请求参数"
)
private
String
requestParams
;
/** 响应参数 */
@Excel
(
name
=
"响应参数"
)
private
String
responseParams
;
/** 响应结果:01成功,02失败,00异常无响应 */
@Excel
(
name
=
"响应结果:01成功,02失败,00异常无响应"
)
private
String
result
;
/** 响应结果描述 */
@Excel
(
name
=
"响应结果描述"
)
private
String
resultMsg
;
/** 标记 */
@Excel
(
name
=
"标记"
)
private
String
flag
;
@Override
public
String
toString
()
{
return
new
ToStringBuilder
(
this
,
ToStringStyle
.
MULTI_LINE_STYLE
)
.
append
(
"id"
,
getId
())
.
append
(
"payVer"
,
getPayVer
())
.
append
(
"payType"
,
getPayType
())
.
append
(
"serviceId"
,
getServiceId
())
.
append
(
"merchantNo"
,
getMerchantNo
())
.
append
(
"terminalId"
,
getTerminalId
())
.
append
(
"terminalIp"
,
getTerminalIp
())
.
append
(
"terminalTrace"
,
getTerminalTrace
())
.
append
(
"terminalTime"
,
getTerminalTime
())
.
append
(
"outTradeNo"
,
getOutTradeNo
())
.
append
(
"requestParams"
,
getRequestParams
())
.
append
(
"responseParams"
,
getResponseParams
())
.
append
(
"result"
,
getResult
())
.
append
(
"resultMsg"
,
getResultMsg
())
.
append
(
"createTime"
,
getCreateTime
())
.
append
(
"createBy"
,
getCreateBy
())
.
append
(
"updateBy"
,
getUpdateBy
())
.
append
(
"updateTime"
,
getUpdateTime
())
.
append
(
"remark"
,
getRemark
())
.
append
(
"flag"
,
getFlag
())
.
toString
();
}
}
share-system/src/main/java/share/system/domain/vo/SaobeiMiniPayRequestVo.java
0 → 100644
View file @
60fa1790
package
share
.
system
.
domain
.
vo
;
import
lombok.Data
;
import
java.io.Serializable
;
/**
* @className: share.system.domain.vo.SaobeiNotifyVo
* @description: 扫呗退款申请参数
* @author: lwj
* @create: 2023-12-13 16:09
*/
@Data
public
class
SaobeiMiniPayRequestVo
implements
Serializable
{
// 接口内业务版本号,可用值201、202
private
String
pay_ver
;
//支付方式:010微信,020 支付宝,060qq钱包,100翼支付,110云闪付
private
String
pay_type
;
//接口类型,当前类型030
private
String
service_id
;
//商户号
private
String
merchant_no
;
// 终端号
private
String
terminal_id
;
// 商户侧门店或者终端编号,请先与运营同事确认是否在扫呗平台配置过映射,若没有配置映射,请勿传值,否则支付会报错。
private
String
device_no
;
// 用户手机端IP(IPV4格式 ,人行侧风控主要依据,请真实填写)
private
String
terminal_ip
;
//终端流水号,此处传商户发起预支付或公众号支付时所传入的交易流水号
private
String
terminal_trace
;
//终端交易时间,yyyyMMddHHmmss,全局统一时间格式(01时参与拼接)
private
String
terminal_time
;
// 金额,单位分
private
String
total_fee
;
// 传商户自己的小程序appid,微信支付时此参数必传。(即获取open_id所使用的appid)
private
String
sub_appid
;
// 用户标识(微信openid,支付宝userid),pay_type为010及020时必填
private
String
open_id
;
// 订单包含的商品列表信息,Json数组格式。pay_type为010,020时,可选填此字段
private
String
goods_detail
;
//订单优惠标记,代金券或立减优惠功能的参数(字段值:cs和bld)
private
String
goods_tag
;
// 订单描述,显示在订单详情页面,禁止使用+,空格,/,?,%,#,&,=这几类特殊符号
private
String
order_body
;
// 外部系统通知地址
private
String
notify_url
;
//附加数据,原样返回
private
String
attach
;
// 优惠券串码
private
String
coupon_no
;
// 优惠券凭证
private
String
coupon_credential
;
// 微信门店编号和支付宝外部自定义门店编号,透传。微信对应scene_info(场景信息)中的门店id。 支付宝自定义门店编号不能随便传,在确认门店编号存在的情况下传值,否则影响支付
private
String
custom_store_id
;
// 支付宝官方门店编号,透传
private
String
official_store_id
;
// 微信点餐场景类型:
//qr_order(店内扫码点餐)、
//pre_order(预点到店自提)、home_delivery (外送到家)、direct_payment(直接付款)、
//other(其他)
//支付宝点餐场景类型:
//QR_FOOD_ORDER(点餐先付)、
//P_QR_FOOD_ORDER(点餐后付)、
//SELF_PICK(门店自提)、
//TAKE_OUT(餐饮外卖)
private
String
food_order_type
;
//签名串
private
String
key_sign
;
// JSAPI -JSAPI支付(或小程序支付), NATIVE -Native支付, APP -APP支付,MWEB--H5支付
private
String
trade_type
;
}
share-system/src/main/java/share/system/domain/vo/SaobeiNotifyResponseVo.java
0 → 100644
View file @
60fa1790
package
share
.
system
.
domain
.
vo
;
import
lombok.Data
;
import
java.io.Serializable
;
/**
* @className: share.system.domain.vo.SaobeiNotifyVo
* @description: 扫呗回调响应
* @author: lwj
* @create: 2023-12-13 16:09
*/
@Data
public
class
SaobeiNotifyResponseVo
implements
Serializable
{
//响应码:01成功 ,02失败,响应码仅代表通信状态,不代表业务结果
private
String
return_code
;
//返回信息提示,“签名失败”,“参数格式校验错误"等
private
String
return_msg
;
}
share-system/src/main/java/share/system/domain/vo/SaobeiNotifyVo.java
0 → 100644
View file @
60fa1790
package
share
.
system
.
domain
.
vo
;
import
lombok.Data
;
import
java.io.Serializable
;
/**
* @className: share.system.domain.vo.SaobeiNotifyVo
* @description: 扫呗回调参数
* @author: lwj
* @create: 2023-12-13 16:09
*/
@Data
public
class
SaobeiNotifyVo
implements
Serializable
{
// 接口内业务版本号,可用值201、202
private
String
pay_ver
;
//响应码:01成功 ,02失败,响应码仅代表通信状态,不代表业务结果
private
String
return_code
;
//返回信息提示,“签名失败”,“参数格式校验错误"等
private
String
return_msg
;
//业务结果:01成功 ,02失败
private
String
result_code
;
//支付方式:010微信,020 支付宝,060qq钱包,100翼支付,110云闪付
private
String
pay_type
;
//付款方用户id,“微信openid”、“支付宝账户”、“qq号”等
private
String
user_id
;
// 商户名称
private
String
merchant_name
;
//商户号
private
String
merchant_no
;
// 终端号
private
String
terminal_id
;
// 商户侧门店或者终端编号,请先与运营同事确认是否在扫呗平台配置过映射,若没有配置映射,请勿传值,否则支付会报错。
private
String
device_no
;
//终端流水号,此处传商户发起预支付或公众号支付时所传入的交易流水号
private
String
terminal_trace
;
//终端交易时间,yyyyMMddHHmmss,全局统一时间格式(01时参与拼接)
private
String
terminal_time
;
//当前支付终端流水号,与pay_time同时传递
private
String
pay_trace
;
// 当前支付终端交易时间,yyyyMMddHHmmss,全局统一时间格式,与pay_trace同时传递
private
String
pay_time
;
// 金额,单位分
private
String
total_fee
;
// 支付完成时间,yyyyMMddHHmmss,全局统一时间格式
private
String
end_time
;
// 平台唯一订单号
private
String
out_trade_no
;
// 通道订单号,微信订单号、支付宝订单号等
private
String
channel_trade_no
;
// 银行渠道订单号,微信支付时显示在支付成功页面的条码,可用作扫码查询和扫码退款时匹配,pay_ver为202时返回
private
String
channel_order_no
;
//附加数据,原样返回
private
String
attach
;
// 商家应结算金额,单位分
private
String
receipt_fee
;
// 买家实付金额(分)pay_ver为202时返回
private
String
buyer_pay_fee
;
// 平台优惠金额(分)pay_ver为202时返回
private
String
platform_discount_fee
;
// 商家优惠金额(分)pay_ver为202时返回
private
String
merchant_discount_fee
;
// 银行类型,采用字符串类型的银行标识
private
String
bank_type
;
//本交易支付时使用的所有优惠券信息 ,单品优惠功能字段
private
String
promotion_detail
;
//订单标题描述
private
String
order_body
;
//签名串
private
String
key_sign
;
}
share-system/src/main/java/share/system/domain/vo/SaobeiRefundVo.java
0 → 100644
View file @
60fa1790
package
share
.
system
.
domain
.
vo
;
import
lombok.Data
;
import
java.io.Serializable
;
/**
* @className: share.system.domain.vo.SaobeiNotifyVo
* @description: 扫呗退款申请参数
* @author: lwj
* @create: 2023-12-13 16:09
*/
@Data
public
class
SaobeiRefundVo
implements
Serializable
{
// 接口内业务版本号,可用值201、202
private
String
pay_ver
;
//支付方式:010微信,020 支付宝,060qq钱包,100翼支付,110云闪付
private
String
pay_type
;
//接口类型,当前类型030
private
String
service_id
;
//商户号
private
String
merchant_no
;
// 终端号
private
String
terminal_id
;
// 商户侧门店或者终端编号,请先与运营同事确认是否在扫呗平台配置过映射,若没有配置映射,请勿传值,否则支付会报错。
private
String
device_no
;
//终端流水号,此处传商户发起预支付或公众号支付时所传入的交易流水号
private
String
terminal_trace
;
//终端交易时间,yyyyMMddHHmmss,全局统一时间格式(01时参与拼接)
private
String
terminal_time
;
//当前支付终端流水号,与pay_time同时传递
private
String
pay_trace
;
// 当前支付终端交易时间,yyyyMMddHHmmss,全局统一时间格式,与pay_trace同时传递
private
String
pay_time
;
// 退款金额,单位分
private
String
refund_fee
;
// 是否允许订单重复,传1:不允许terminal_trace重复。传2:不允许terminal_trace+terminal_time重复,传0或不传:允许重复
private
String
repeated_trace
;
// 平台唯一订单号
private
String
out_trade_no
;
// 通道订单号,微信订单号、支付宝订单号等
private
String
channel_trade_no
;
// 银行渠道订单号,微信支付时显示在支付成功页面的条码,可用作扫码查询和扫码退款时匹配,pay_ver为202时返回
private
String
channel_order_no
;
//附加数据,原样返回
private
String
attach
;
//签名串
private
String
key_sign
;
}
share-system/src/main/java/share/system/mapper/SaobeiApiLogMapper.java
0 → 100644
View file @
60fa1790
package
share
.
system
.
mapper
;
import
java.util.List
;
import
com.baomidou.mybatisplus.core.mapper.BaseMapper
;
import
share.system.domain.SaobeiApiLog
;
/**
* 扫呗接口调用日志Mapper接口
*
* @author wuwenlong
* @date 2023-12-14
*/
public
interface
SaobeiApiLogMapper
extends
BaseMapper
<
SaobeiApiLog
>
{
/**
* 查询扫呗接口调用日志
*
* @param id 扫呗接口调用日志主键
* @return 扫呗接口调用日志
*/
public
SaobeiApiLog
selectSaobeiApiLogById
(
Long
id
);
/**
* 查询扫呗接口调用日志列表
*
* @param saobeiApiLog 扫呗接口调用日志
* @return 扫呗接口调用日志集合
*/
public
List
<
SaobeiApiLog
>
selectSaobeiApiLogList
(
SaobeiApiLog
saobeiApiLog
);
/**
* 新增扫呗接口调用日志
*
* @param saobeiApiLog 扫呗接口调用日志
* @return 结果
*/
public
int
insertSaobeiApiLog
(
SaobeiApiLog
saobeiApiLog
);
/**
* 修改扫呗接口调用日志
*
* @param saobeiApiLog 扫呗接口调用日志
* @return 结果
*/
public
int
updateSaobeiApiLog
(
SaobeiApiLog
saobeiApiLog
);
/**
* 删除扫呗接口调用日志
*
* @param id 扫呗接口调用日志主键
* @return 结果
*/
public
int
deleteSaobeiApiLogById
(
Long
id
);
/**
* 批量删除扫呗接口调用日志
*
* @param ids 需要删除的数据主键集合
* @return 结果
*/
public
int
deleteSaobeiApiLogByIds
(
Long
[]
ids
);
}
share-system/src/main/java/share/system/service/CallbackService.java
View file @
60fa1790
package
share
.
system
.
service
;
import
share.system.domain.vo.SaobeiNotifyResponseVo
;
import
share.system.domain.vo.SaobeiNotifyVo
;
import
javax.servlet.http.HttpServletRequest
;
/**
...
...
@@ -19,4 +22,12 @@ public interface CallbackService {
* @return String
*/
String
weChatRefund
(
String
request
);
/**
* 扫呗-支付回调
* @param param 回调json
* @return String
*/
SaobeiNotifyResponseVo
saobeiWechat
(
SaobeiNotifyVo
param
);
}
share-system/src/main/java/share/system/service/OrderPayService.java
View file @
60fa1790
...
...
@@ -11,9 +11,16 @@ import share.system.response.OrderPayResultResponse;
public
interface
OrderPayService
{
/**
* 订单支付
* 订单支付
(微信支付)
* @param sOrder 支付参数
* @return OrderPayResultResponse
*/
OrderPayResultResponse
payment
(
SOrder
sOrder
);
/**
* 订单支付(扫呗-微信支付)
* @param sOrder 支付参数
* @return OrderPayResultResponse
*/
OrderPayResultResponse
saobeiPayment
(
SOrder
sOrder
);
}
share-system/src/main/java/share/system/service/SaobeiApiLogService.java
0 → 100644
View file @
60fa1790
package
share
.
system
.
service
;
import
java.util.List
;
import
com.baomidou.mybatisplus.extension.service.IService
;
import
share.system.domain.SaobeiApiLog
;
/**
* 扫呗接口调用日志Service接口
*
* @author wuwenlong
* @date 2023-12-14
*/
public
interface
SaobeiApiLogService
extends
IService
<
SaobeiApiLog
>
{
/**
* 查询扫呗接口调用日志
*
* @param id 扫呗接口调用日志主键
* @return 扫呗接口调用日志
*/
public
SaobeiApiLog
selectSaobeiApiLogById
(
Long
id
);
/**
* 查询扫呗接口调用日志列表
*
* @param saobeiApiLog 扫呗接口调用日志
* @return 扫呗接口调用日志集合
*/
public
List
<
SaobeiApiLog
>
selectSaobeiApiLogList
(
SaobeiApiLog
saobeiApiLog
);
/**
* 新增扫呗接口调用日志
*
* @param saobeiApiLog 扫呗接口调用日志
* @return 结果
*/
public
int
insertSaobeiApiLog
(
SaobeiApiLog
saobeiApiLog
);
/**
* 修改扫呗接口调用日志
*
* @param saobeiApiLog 扫呗接口调用日志
* @return 结果
*/
public
int
updateSaobeiApiLog
(
SaobeiApiLog
saobeiApiLog
);
/**
* 批量删除扫呗接口调用日志
*
* @param ids 需要删除的扫呗接口调用日志主键集合
* @return 结果
*/
public
int
deleteSaobeiApiLogByIds
(
Long
[]
ids
);
/**
* 删除扫呗接口调用日志信息
*
* @param id 扫呗接口调用日志主键
* @return 结果
*/
public
int
deleteSaobeiApiLogById
(
Long
id
);
}
share-system/src/main/java/share/system/service/SaobeiService.java
0 → 100644
View file @
60fa1790
package
share
.
system
.
service
;
import
com.saobei.open.sdk.model.response.trade.SaobeiMiniPayResponse
;
import
com.saobei.open.sdk.model.response.trade.SaobeiTradeRefundResponse
;
import
share.system.domain.vo.CreateOrderRequestVo
;
import
share.system.domain.vo.SaobeiMiniPayRequestVo
;
import
share.system.domain.vo.SaobeiRefundVo
;
/**
* @className: share.system.service.SaobeiService
* @description: 扫呗支付公共接口
* @author: lwj
* @create: 2023-12-13 11:53
*/
public
interface
SaobeiService
{
/**
* 扫呗支付-微信
* @param saobeiMiniPayRequestVo
* @return
*/
SaobeiMiniPayResponse
wechatMinipay
(
SaobeiMiniPayRequestVo
saobeiMiniPayRequestVo
);
/**
* 扫呗退款-微信
* @param vo 退款参数
* @return
*/
SaobeiTradeRefundResponse
refund
(
SaobeiRefundVo
vo
);
}
share-system/src/main/java/share/system/service/impl/CallbackServiceImpl.java
View file @
60fa1790
This diff is collapsed.
Click to expand it.
share-system/src/main/java/share/system/service/impl/OrderPayServiceImpl.java
View file @
60fa1790
...
...
@@ -3,10 +3,12 @@ package share.system.service.impl;
import
cn.hutool.core.util.ObjectUtil
;
import
cn.hutool.core.util.StrUtil
;
import
com.alibaba.fastjson.JSONObject
;
import
com.saobei.open.sdk.model.response.trade.SaobeiMiniPayResponse
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
share.common.config.SaobeiConfig
;
import
share.common.config.WeChatConfig
;
import
share.common.constant.Constants
;
import
share.common.constant.PayConstants
;
...
...
@@ -19,16 +21,10 @@ import share.common.utils.DateUtil;
import
share.common.utils.JsonConvertUtil
;
import
share.system.domain.SConsumerToken
;
import
share.system.domain.SOrder
;
import
share.system.domain.vo.AttachVo
;
import
share.system.domain.vo.CreateOrderRequestVo
;
import
share.system.domain.vo.CreateOrderResponseVo
;
import
share.system.domain.vo.WxPayJsResultVo
;
import
share.system.domain.vo.*
;
import
share.system.request.OrderPayRequest
;
import
share.system.response.OrderPayResultResponse
;
import
share.system.service.ISOrderService
;
import
share.system.service.OrderPayService
;
import
share.system.service.SConsumerTokenService
;
import
share.system.service.WechatNewService
;
import
share.system.service.*
;
import
share.system.util.WxPayUtil
;
import
java.math.BigDecimal
;
...
...
@@ -44,6 +40,8 @@ public class OrderPayServiceImpl implements OrderPayService {
@Autowired
private
WeChatConfig
weChatConfig
;
@Autowired
private
SaobeiConfig
saobeiConfig
;
@Autowired
private
SConsumerTokenService
consumerTokenService
;
...
...
@@ -54,6 +52,9 @@ public class OrderPayServiceImpl implements OrderPayService {
@Autowired
private
ISOrderService
orderService
;
@Autowired
private
SaobeiService
saobeiService
;
@Override
public
OrderPayResultResponse
payment
(
SOrder
sOrder
)
{
OrderPayResultResponse
response
=
new
OrderPayResultResponse
();
...
...
@@ -75,6 +76,28 @@ public class OrderPayServiceImpl implements OrderPayService {
return
response
;
}
@Override
public
OrderPayResultResponse
saobeiPayment
(
SOrder
sOrder
)
{
OrderPayResultResponse
response
=
new
OrderPayResultResponse
();
response
.
setOrderNo
(
sOrder
.
getOrderNo
());
response
.
setPayType
(
PayTypeEnum
.
getEnumByCode
(
sOrder
.
getPayType
()).
getValue
());
response
.
setStatus
(
YesNoEnum
.
no
.
getFlag
());
// 扫呗支付
ConcurrentHashMap
<
String
,
String
>
unifiedorder
=
saobeiUnifiedOrder
(
sOrder
);
WxPayJsResultVo
vo
=
new
WxPayJsResultVo
();
vo
.
setAppId
(
unifiedorder
.
get
(
"appId"
));
vo
.
setNonceStr
(
unifiedorder
.
get
(
"nonceStr"
));
vo
.
setPackages
(
unifiedorder
.
get
(
"package"
));
vo
.
setSignType
(
unifiedorder
.
get
(
"signType"
));
vo
.
setTimeStamp
(
unifiedorder
.
get
(
"timeStamp"
));
vo
.
setPaySign
(
unifiedorder
.
get
(
"paySign"
));
// 更新商户订单号
sOrder
.
setOutTradeNo
(
unifiedorder
.
get
(
"outTradeNo"
));
orderService
.
updateById
(
sOrder
);
response
.
setJsConfig
(
vo
);
return
response
;
}
/**
* 预下单
...
...
@@ -100,7 +123,7 @@ public class OrderPayServiceImpl implements OrderPayService {
// 组装前端预下单参数
ConcurrentHashMap
<
String
,
String
>
map
=
new
ConcurrentHashMap
<>();
map
.
put
(
"appId"
,
unifiedorderVo
.
getAppid
());
map
.
put
(
"nonceStr"
,
unifiedorderVo
.
get
Appid
());
map
.
put
(
"nonceStr"
,
unifiedorderVo
.
get
Nonce_str
());
map
.
put
(
"package"
,
"prepay_id="
.
concat
(
responseVo
.
getPrepayId
()));
map
.
put
(
"signType"
,
unifiedorderVo
.
getSign_type
());
Long
currentTimestamp
=
WxPayUtil
.
getCurrentTimestamp
();
...
...
@@ -141,4 +164,65 @@ public class OrderPayServiceImpl implements OrderPayService {
return
vo
;
}
/**
* 预下单 (扫呗-微信)
* @param sOrder 订单
* @return 预下单返回对象
*/
private
ConcurrentHashMap
<
String
,
String
>
saobeiUnifiedOrder
(
SOrder
sOrder
)
{
// 获取用户openId
SConsumerToken
userToken
=
consumerTokenService
.
getTokenByUserId
(
sOrder
.
getConsumerId
());
if
(
ObjectUtil
.
isNull
(
userToken
))
{
throw
new
BaseException
(
"该用户没有openId"
);
}
// 获取appid、mch_id
// 微信签名key
String
appId
=
weChatConfig
.
getAppId
();
String
mchId
=
weChatConfig
.
getMchId
();
String
signKey
=
weChatConfig
.
getSignKey
();
// 获取扫呗微信预下单对象
SaobeiMiniPayRequestVo
unifiedorderVo
=
getSaobeiUnifiedOrderVo
(
sOrder
,
userToken
.
getToken
(),
appId
,
mchId
,
signKey
);
// 预下单(统一下单)
SaobeiMiniPayResponse
response
=
saobeiService
.
wechatMinipay
(
unifiedorderVo
);
logger
.
info
(
"SaobeiMiniPayResponse :"
,
JsonConvertUtil
.
write2JsonStr
(
response
));
// 组装前端预下单参数
ConcurrentHashMap
<
String
,
String
>
map
=
new
ConcurrentHashMap
<>();
map
.
put
(
"appId"
,
response
.
getAppId
());
map
.
put
(
"nonceStr"
,
response
.
getNonceStr
());
map
.
put
(
"package"
,
response
.
getPackage_str
());
map
.
put
(
"signType"
,
response
.
getSignType
());
map
.
put
(
"timeStamp"
,
response
.
getTimeStamp
());
map
.
put
(
"paySign"
,
response
.
getPaySign
());
map
.
put
(
"prepayTime"
,
DateUtil
.
nowDateTimeStr
());
map
.
put
(
"outTradeNo"
,
unifiedorderVo
.
getTerminal_trace
());
return
map
;
}
/**
* 获取预下单对象 (扫呗-微信)
* @return 预下单对象
*/
private
SaobeiMiniPayRequestVo
getSaobeiUnifiedOrderVo
(
SOrder
sOrder
,
String
openid
,
String
appId
,
String
mchId
,
String
signKey
)
{
// 获取域名
String
apiDomain
=
Constants
.
CONFIG_KEY_API_URL
;
AttachVo
attachVo
=
new
AttachVo
(
OrderTypeEnum
.
getEnumByCode
(
sOrder
.
getOrderType
()).
getValue
(),
sOrder
.
getConsumerId
());
SaobeiMiniPayRequestVo
vo
=
new
SaobeiMiniPayRequestVo
();
vo
.
setSub_appid
(
appId
);
vo
.
setMerchant_no
(
saobeiConfig
.
getMerchantNo
());
vo
.
setTerminal_id
(
saobeiConfig
.
getTerminalId
());
vo
.
setAttach
(
JSONObject
.
toJSONString
(
attachVo
));
vo
.
setTerminal_trace
(
BaseUtil
.
getOrderNo
(
"WXNO"
));
vo
.
setTerminal_time
(
DateUtil
.
nowDate
(
Constants
.
DATE_TIME_FORMAT_NUM
));
vo
.
setOrder_body
(
StrUtil
.
concat
(
true
,
sOrder
.
getTimeLong
(),
"小时麻将房畅玩!"
));
// 订单中使用的是BigDecimal,这里要转为Integer类型
vo
.
setTotal_fee
(
String
.
valueOf
(
sOrder
.
getPayPrice
().
multiply
(
BigDecimal
.
TEN
).
multiply
(
BigDecimal
.
TEN
).
intValue
()));
vo
.
setNotify_url
(
apiDomain
+
PayConstants
.
SAOBEI_PAY_NOTIFY_API_URI
);
vo
.
setTrade_type
(
PayConstants
.
WX_PAY_TRADE_TYPE_JS
);
vo
.
setOpen_id
(
openid
);
vo
.
setDevice_no
(
"WEB"
);
return
vo
;
}
}
share-system/src/main/java/share/system/service/impl/OrderRefundServiceImpl.java
View file @
60fa1790
package
share
.
system
.
service
.
impl
;
import
cn.hutool.core.util.ObjectUtil
;
import
cn.hutool.json.JSONUtil
;
import
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
;
import
com.saobei.open.sdk.model.response.trade.SaobeiTradeRefundResponse
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
share.common.config.WeChatConfig
;
import
share.common.constant.Constants
;
import
share.common.constant.PayConstants
;
import
share.common.enums.YesNoEnum
;
import
share.common.core.redis.RedisUtil
;
import
share.common.enums.*
;
import
share.common.exception.base.BaseException
;
import
share.common.utils.BaseUtil
;
import
share.common.utils.DateUtil
;
import
share.common.utils.http.RestTemplateUtil
;
import
share.system.domain.SConsumptionRecords
;
import
share.system.domain.SOrder
;
import
share.system.domain.WechatPayInfo
;
import
share.system.domain.vo.SaobeiRefundVo
;
import
share.system.domain.vo.WxRefundVo
;
import
share.system.mapper.SOrderMapper
;
import
share.system.mapper.WechatPayInfoMapper
;
import
share.system.request.OrderRefundRequest
;
import
share.system.service.ISysConfigService
;
import
share.system.service.OrderRefundService
;
import
share.system.service.WechatNewService
;
import
share.system.service.*
;
import
share.system.util.WxPayUtil
;
import
java.math.BigDecimal
;
...
...
@@ -26,16 +35,21 @@ import java.math.BigDecimal;
public
class
OrderRefundServiceImpl
extends
ServiceImpl
<
SOrderMapper
,
SOrder
>
implements
OrderRefundService
{
@Autowired
private
ISysConfigService
sysConfig
Service
;
private
SaobeiService
saobei
Service
;
@Autowired
private
RestTemplateUtil
restTemplateUtil
;
private
WechatPayInfoService
wechatPayInfoService
;
@Autowired
private
WechatNewService
wechatNewService
;
@Autowired
private
RedisUtil
redisUtil
;
@Autowired
private
WeChatConfig
weChatConfig
;
@Autowired
private
ISOrderService
sOrderService
;
@Autowired
private
ISConsumptionRecordsService
sConsumptionRecordsService
;
/**
* 退款 需要优化
...
...
@@ -44,7 +58,9 @@ public class OrderRefundServiceImpl extends ServiceImpl<SOrderMapper, SOrder> im
*/
@Override
public
void
refund
(
OrderRefundRequest
request
,
SOrder
sOrder
)
{
refundWx
(
request
,
sOrder
);
// refundWx(request, sOrder);
// 扫呗-微信退款
refundSaobei
(
request
,
sOrder
);
}
/**
...
...
@@ -76,5 +92,54 @@ public class OrderRefundServiceImpl extends ServiceImpl<SOrderMapper, SOrder> im
wxRefundVo
.
setSign
(
sign
);
wechatNewService
.
payRefund
(
wxRefundVo
,
path
);
}
/**
* 扫呗退款-微信
* @param request
* @param sOrder
*/
private
void
refundSaobei
(
OrderRefundRequest
request
,
SOrder
sOrder
)
{
WechatPayInfo
wechatPayInfo
=
wechatPayInfoService
.
getByNo
(
sOrder
.
getOutTradeNo
());
if
(
ObjectUtil
.
isNull
(
wechatPayInfo
))
{
throw
new
BaseException
(
"微信订单不存在!"
);
}
SaobeiRefundVo
vo
=
new
SaobeiRefundVo
();
vo
.
setRefund_fee
(
String
.
valueOf
(
request
.
getAmount
().
multiply
(
BigDecimal
.
TEN
).
multiply
(
BigDecimal
.
TEN
).
intValue
()));
vo
.
setTerminal_trace
(
BaseUtil
.
getOrderNo
(
"WXNO"
));
vo
.
setTerminal_time
(
DateUtil
.
nowDate
(
Constants
.
DATE_TIME_FORMAT_NUM
));
vo
.
setOut_trade_no
(
wechatPayInfo
.
getTransactionId
());
SaobeiTradeRefundResponse
response
=
saobeiService
.
refund
(
vo
);
if
(
ObjectUtil
.
isNotEmpty
(
response
))
{
// 退款成功修改订单状态
SOrder
order
=
sOrderService
.
getByOrderNo
(
sOrder
.
getOrderNo
());
if
(
ObjectUtil
.
isNull
(
order
))
{
throw
new
BaseException
(
"退款订单不存在"
);
}
order
.
setStatus
(
OrderStatusEnum
.
CANCEL
.
getCode
());
order
.
setRefundStatus
(
RefundStatusEnum
.
REFUNDED
.
getCode
());
order
.
setRefundReasonTime
(
cn
.
hutool
.
core
.
date
.
DateUtil
.
date
());
order
.
setRefundPrice
(
request
.
getAmount
());
order
.
setRefundReason
(
request
.
getRefundReason
());
boolean
update
=
sOrderService
.
updateById
(
order
);
SConsumptionRecords
sConsumptionRecords
=
new
SConsumptionRecords
();
sConsumptionRecords
.
setConsumerId
(
order
.
getConsumerId
());
sConsumptionRecords
.
setOrderId
(
order
.
getId
());
sConsumptionRecords
.
setName
(
ConsumeNameEnum
.
REFUND
.
getValue
());
sConsumptionRecords
.
setPrice
(
order
.
getPayPrice
());
sConsumptionRecords
.
setPayType
(
PayTypeEnum
.
WECHAT
.
getName
());
sConsumptionRecords
.
setSign
(
SignEnum
.
STRAINHT
.
getValue
());
sConsumptionRecordsService
.
insertSConsumptionRecords
(
sConsumptionRecords
);
if
(
update
)
{
// 退款task,定时任务退优惠券
redisUtil
.
lPush
(
Constants
.
ORDER_TASK_REDIS_KEY_AFTER_REFUND_BY_USER
,
order
.
getId
());
}
else
{
throw
new
BaseException
(
"退款失败"
);
}
}
else
{
throw
new
BaseException
(
"退款失败"
);
}
}
}
share-system/src/main/java/share/system/service/impl/SOrderServiceImpl.java
View file @
60fa1790
...
...
@@ -313,7 +313,9 @@ public class SOrderServiceImpl extends ServiceImpl<SOrderMapper, SOrder> impleme
sOrder
.
setPayStatus
(
YesNoEnum
.
yes
.
getIndex
());
sOrder
.
setPayTime
(
DateUtils
.
getNowDate
());
}
else
{
response
=
orderPayService
.
payment
(
sOrder
);
// response = orderPayService.payment(sOrder);
// 扫呗聚合支付
response
=
orderPayService
.
saobeiPayment
(
sOrder
);
// 加入自动未支付自动取消队列
redisUtil
.
lPush
(
Constants
.
ORDER_AUTO_CANCEL_KEY
,
sOrder
.
getOrderNo
());
}
...
...
@@ -768,26 +770,28 @@ public class SOrderServiceImpl extends ServiceImpl<SOrderMapper, SOrder> impleme
throw
new
BaseException
(
"微信申请退款失败!"
);
}
}
//修改订单退款状态,为退款中
sOrder
.
setRefundStatus
(
RefundStatusEnum
.
INREFUND
.
getCode
());
sOrder
.
setRefundPrice
(
request
.
getAmount
());
Boolean
execute
=
Boolean
.
FALSE
;
try
{
sOrder
.
setRefundReason
(
request
.
getRefundReason
());
updateById
(
sOrder
);
//微信退款
if
(
sOrder
.
getPayType
().
equals
(
PayTypeEnum
.
WECHAT
.
getCode
())
&&
request
.
getAmount
().
compareTo
(
BigDecimal
.
ZERO
)
==
0
)
{
// 退款task, 定时任务退优惠券
redisUtil
.
lPush
(
Constants
.
ORDER_TASK_REDIS_KEY_AFTER_REFUND_BY_USER
,
sOrder
.
getId
());
}
execute
=
Boolean
.
TRUE
;
}
catch
(
Exception
e
)
{
logger
.
error
(
e
.
toString
());
}
if
(!
execute
)
{
throw
new
BaseException
(
"订单更新失败"
);
}
return
execute
;
//修改订单退款状态,退款成功
// sOrder.setStatus(OrderStatusEnum.CANCEL.getCode());
// sOrder.setRefundStatus(RefundStatusEnum.REFUNDED.getCode());
// sOrder.setRefundReasonTime(cn.hutool.core.date.DateUtil.date());
// sOrder.setRefundPrice(request.getAmount());
// Boolean execute = Boolean.FALSE;
// try {
// sOrder.setRefundReason(request.getRefundReason());
// updateById(sOrder);
// //微信退款
// if (sOrder.getPayType().equals(PayTypeEnum.WECHAT.getCode()) && request.getAmount().compareTo(BigDecimal.ZERO) == 0) {
// // 退款task, 定时任务退优惠券
// redisUtil.lPush(Constants.ORDER_TASK_REDIS_KEY_AFTER_REFUND_BY_USER, sOrder.getId());
// }
// execute = Boolean.TRUE;
// } catch (Exception e) {
// logger.error(e.toString());
// }
// if (!execute) {
// throw new BaseException("订单更新失败");
// }
return
Boolean
.
TRUE
;
}
@Override
...
...
share-system/src/main/java/share/system/service/impl/SaobeiApiLogServiceImpl.java
0 → 100644
View file @
60fa1790
package
share
.
system
.
service
.
impl
;
import
java.util.List
;
import
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
;
import
share.common.utils.DateUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
share.system.mapper.SaobeiApiLogMapper
;
import
share.system.domain.SaobeiApiLog
;
import
share.system.service.SaobeiApiLogService
;
/**
* 扫呗接口调用日志Service业务层处理
*
* @author wuwenlong
* @date 2023-12-14
*/
@Service
public
class
SaobeiApiLogServiceImpl
extends
ServiceImpl
<
SaobeiApiLogMapper
,
SaobeiApiLog
>
implements
SaobeiApiLogService
{
@Autowired
private
SaobeiApiLogMapper
saobeiApiLogMapper
;
/**
* 查询扫呗接口调用日志
*
* @param id 扫呗接口调用日志主键
* @return 扫呗接口调用日志
*/
@Override
public
SaobeiApiLog
selectSaobeiApiLogById
(
Long
id
)
{
return
saobeiApiLogMapper
.
selectSaobeiApiLogById
(
id
);
}
/**
* 查询扫呗接口调用日志列表
*
* @param saobeiApiLog 扫呗接口调用日志
* @return 扫呗接口调用日志
*/
@Override
public
List
<
SaobeiApiLog
>
selectSaobeiApiLogList
(
SaobeiApiLog
saobeiApiLog
)
{
return
saobeiApiLogMapper
.
selectSaobeiApiLogList
(
saobeiApiLog
);
}
/**
* 新增扫呗接口调用日志
*
* @param saobeiApiLog 扫呗接口调用日志
* @return 结果
*/
@Override
public
int
insertSaobeiApiLog
(
SaobeiApiLog
saobeiApiLog
)
{
saobeiApiLog
.
setCreateTime
(
DateUtils
.
getNowDate
());
return
saobeiApiLogMapper
.
insertSaobeiApiLog
(
saobeiApiLog
);
}
/**
* 修改扫呗接口调用日志
*
* @param saobeiApiLog 扫呗接口调用日志
* @return 结果
*/
@Override
public
int
updateSaobeiApiLog
(
SaobeiApiLog
saobeiApiLog
)
{
saobeiApiLog
.
setUpdateTime
(
DateUtils
.
getNowDate
());
return
saobeiApiLogMapper
.
updateSaobeiApiLog
(
saobeiApiLog
);
}
/**
* 批量删除扫呗接口调用日志
*
* @param ids 需要删除的扫呗接口调用日志主键
* @return 结果
*/
@Override
public
int
deleteSaobeiApiLogByIds
(
Long
[]
ids
)
{
return
saobeiApiLogMapper
.
deleteSaobeiApiLogByIds
(
ids
);
}
/**
* 删除扫呗接口调用日志信息
*
* @param id 扫呗接口调用日志主键
* @return 结果
*/
@Override
public
int
deleteSaobeiApiLogById
(
Long
id
)
{
return
saobeiApiLogMapper
.
deleteSaobeiApiLogById
(
id
);
}
}
share-system/src/main/java/share/system/service/impl/SaobeiServiceImpl.java
0 → 100644
View file @
60fa1790
This diff is collapsed.
Click to expand it.
share-system/src/main/java/share/system/util/SaobeiTestMain.java
0 → 100644
View file @
60fa1790
This diff is collapsed.
Click to expand it.
share-system/src/main/resources/mapper/system/SaobeiApiLogMapper.xml
0 → 100644
View file @
60fa1790
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper
namespace=
"share.system.mapper.SaobeiApiLogMapper"
>
<resultMap
type=
"SaobeiApiLog"
id=
"SaobeiApiLogResult"
>
<result
property=
"id"
column=
"id"
/>
<result
property=
"payVer"
column=
"pay_ver"
/>
<result
property=
"payType"
column=
"pay_type"
/>
<result
property=
"serviceId"
column=
"service_id"
/>
<result
property=
"merchantNo"
column=
"merchant_no"
/>
<result
property=
"terminalId"
column=
"terminal_id"
/>
<result
property=
"terminalIp"
column=
"terminal_ip"
/>
<result
property=
"terminalTrace"
column=
"terminal_trace"
/>
<result
property=
"terminalTime"
column=
"terminal_time"
/>
<result
property=
"outTradeNo"
column=
"out_trade_no"
/>
<result
property=
"requestParams"
column=
"request_params"
/>
<result
property=
"responseParams"
column=
"response_params"
/>
<result
property=
"result"
column=
"result"
/>
<result
property=
"resultMsg"
column=
"result_msg"
/>
<result
property=
"createTime"
column=
"create_time"
/>
<result
property=
"createBy"
column=
"create_by"
/>
<result
property=
"updateBy"
column=
"update_by"
/>
<result
property=
"updateTime"
column=
"update_time"
/>
<result
property=
"remark"
column=
"remark"
/>
<result
property=
"flag"
column=
"flag"
/>
</resultMap>
<sql
id=
"selectSaobeiApiLogVo"
>
select id, pay_ver, pay_type, service_id, merchant_no, terminal_id, terminal_ip, terminal_trace, terminal_time, out_trade_no, request_params, response_params, result, result_msg, create_time, create_by, update_by, update_time, remark, flag from s_saobei_api_log
</sql>
<select
id=
"selectSaobeiApiLogList"
parameterType=
"SaobeiApiLog"
resultMap=
"SaobeiApiLogResult"
>
<include
refid=
"selectSaobeiApiLogVo"
/>
<where>
<if
test=
"payVer != null and payVer != ''"
>
and pay_ver = #{payVer}
</if>
<if
test=
"payType != null and payType != ''"
>
and pay_type = #{payType}
</if>
<if
test=
"serviceId != null and serviceId != ''"
>
and service_id = #{serviceId}
</if>
<if
test=
"merchantNo != null and merchantNo != ''"
>
and merchant_no = #{merchantNo}
</if>
<if
test=
"terminalId != null and terminalId != ''"
>
and terminal_id = #{terminalId}
</if>
<if
test=
"terminalIp != null and terminalIp != ''"
>
and terminal_ip = #{terminalIp}
</if>
<if
test=
"terminalTrace != null and terminalTrace != ''"
>
and terminal_trace = #{terminalTrace}
</if>
<if
test=
"terminalTime != null and terminalTime != ''"
>
and terminal_time = #{terminalTime}
</if>
<if
test=
"outTradeNo != null and outTradeNo != ''"
>
and out_trade_no = #{outTradeNo}
</if>
<if
test=
"requestParams != null and requestParams != ''"
>
and request_params = #{requestParams}
</if>
<if
test=
"responseParams != null and responseParams != ''"
>
and response_params = #{responseParams}
</if>
<if
test=
"result != null and result != ''"
>
and result = #{result}
</if>
<if
test=
"resultMsg != null and resultMsg != ''"
>
and result_msg = #{resultMsg}
</if>
<if
test=
"flag != null and flag != ''"
>
and flag = #{flag}
</if>
</where>
</select>
<select
id=
"selectSaobeiApiLogById"
parameterType=
"Long"
resultMap=
"SaobeiApiLogResult"
>
<include
refid=
"selectSaobeiApiLogVo"
/>
where id = #{id}
</select>
<insert
id=
"insertSaobeiApiLog"
parameterType=
"SaobeiApiLog"
useGeneratedKeys=
"true"
keyProperty=
"id"
>
insert into s_saobei_api_log
<trim
prefix=
"("
suffix=
")"
suffixOverrides=
","
>
<if
test=
"payVer != null"
>
pay_ver,
</if>
<if
test=
"payType != null"
>
pay_type,
</if>
<if
test=
"serviceId != null"
>
service_id,
</if>
<if
test=
"merchantNo != null"
>
merchant_no,
</if>
<if
test=
"terminalId != null"
>
terminal_id,
</if>
<if
test=
"terminalIp != null"
>
terminal_ip,
</if>
<if
test=
"terminalTrace != null"
>
terminal_trace,
</if>
<if
test=
"terminalTime != null"
>
terminal_time,
</if>
<if
test=
"outTradeNo != null"
>
out_trade_no,
</if>
<if
test=
"requestParams != null"
>
request_params,
</if>
<if
test=
"responseParams != null"
>
response_params,
</if>
<if
test=
"result != null"
>
result,
</if>
<if
test=
"resultMsg != null"
>
result_msg,
</if>
<if
test=
"createTime != null"
>
create_time,
</if>
<if
test=
"createBy != null"
>
create_by,
</if>
<if
test=
"updateBy != null"
>
update_by,
</if>
<if
test=
"updateTime != null"
>
update_time,
</if>
<if
test=
"remark != null"
>
remark,
</if>
<if
test=
"flag != null"
>
flag,
</if>
</trim>
<trim
prefix=
"values ("
suffix=
")"
suffixOverrides=
","
>
<if
test=
"payVer != null"
>
#{payVer},
</if>
<if
test=
"payType != null"
>
#{payType},
</if>
<if
test=
"serviceId != null"
>
#{serviceId},
</if>
<if
test=
"merchantNo != null"
>
#{merchantNo},
</if>
<if
test=
"terminalId != null"
>
#{terminalId},
</if>
<if
test=
"terminalIp != null"
>
#{terminalIp},
</if>
<if
test=
"terminalTrace != null"
>
#{terminalTrace},
</if>
<if
test=
"terminalTime != null"
>
#{terminalTime},
</if>
<if
test=
"outTradeNo != null"
>
#{outTradeNo},
</if>
<if
test=
"requestParams != null"
>
#{requestParams},
</if>
<if
test=
"responseParams != null"
>
#{responseParams},
</if>
<if
test=
"result != null"
>
#{result},
</if>
<if
test=
"resultMsg != null"
>
#{resultMsg},
</if>
<if
test=
"createTime != null"
>
#{createTime},
</if>
<if
test=
"createBy != null"
>
#{createBy},
</if>
<if
test=
"updateBy != null"
>
#{updateBy},
</if>
<if
test=
"updateTime != null"
>
#{updateTime},
</if>
<if
test=
"remark != null"
>
#{remark},
</if>
<if
test=
"flag != null"
>
#{flag},
</if>
</trim>
</insert>
<update
id=
"updateSaobeiApiLog"
parameterType=
"SaobeiApiLog"
>
update s_saobei_api_log
<trim
prefix=
"SET"
suffixOverrides=
","
>
<if
test=
"payVer != null"
>
pay_ver = #{payVer},
</if>
<if
test=
"payType != null"
>
pay_type = #{payType},
</if>
<if
test=
"serviceId != null"
>
service_id = #{serviceId},
</if>
<if
test=
"merchantNo != null"
>
merchant_no = #{merchantNo},
</if>
<if
test=
"terminalId != null"
>
terminal_id = #{terminalId},
</if>
<if
test=
"terminalIp != null"
>
terminal_ip = #{terminalIp},
</if>
<if
test=
"terminalTrace != null"
>
terminal_trace = #{terminalTrace},
</if>
<if
test=
"terminalTime != null"
>
terminal_time = #{terminalTime},
</if>
<if
test=
"outTradeNo != null"
>
out_trade_no = #{outTradeNo},
</if>
<if
test=
"requestParams != null"
>
request_params = #{requestParams},
</if>
<if
test=
"responseParams != null"
>
response_params = #{responseParams},
</if>
<if
test=
"result != null"
>
result = #{result},
</if>
<if
test=
"resultMsg != null"
>
result_msg = #{resultMsg},
</if>
<if
test=
"createTime != null"
>
create_time = #{createTime},
</if>
<if
test=
"createBy != null"
>
create_by = #{createBy},
</if>
<if
test=
"updateBy != null"
>
update_by = #{updateBy},
</if>
<if
test=
"updateTime != null"
>
update_time = #{updateTime},
</if>
<if
test=
"remark != null"
>
remark = #{remark},
</if>
<if
test=
"flag != null"
>
flag = #{flag},
</if>
</trim>
where id = #{id}
</update>
<delete
id=
"deleteSaobeiApiLogById"
parameterType=
"Long"
>
delete from s_saobei_api_log where id = #{id}
</delete>
<delete
id=
"deleteSaobeiApiLogByIds"
parameterType=
"String"
>
delete from s_saobei_api_log where id in
<foreach
item=
"id"
collection=
"array"
open=
"("
separator=
","
close=
")"
>
#{id}
</foreach>
</delete>
</mapper>
\ 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