Compare commits

..

28 Commits

Author SHA1 Message Date
dingzhiwei 04e4a3f407 升级版本v2.2.2 2023-11-22 18:08:36 +08:00
terrfly 7400a45a4d 支付宝绑定分账用户去掉微信文字描述; 2023-10-07 09:07:43 +08:00
dingzhiwei a0f1f2ad94 升级版本v2.1.0 2023-04-27 14:58:35 +08:00
terrfly c0a90482c0 前端添加 分账已受理状态; 2023-03-29 14:08:13 +08:00
zhuxiao 24b70acb75 优化转账结果提示信息 2023-03-23 10:38:57 +08:00
dingzhiwei a5eab29e4a 升级版本v2.0.0 2023-03-19 16:01:21 +08:00
dingzhiwei 61dd91dbc2 修改页面内容显示 2023-03-19 14:48:38 +08:00
dingzhiwei 1c96e5e8f7 修改页面内容显示 2023-03-10 00:52:06 +08:00
dingzhiwei 25b6f2d3f1 修改页面内容显示 2023-02-19 22:02:13 +08:00
xiaoyu 6c511ac26c 支付接口页面样式调整 2023-02-16 09:23:37 +08:00
dingzhiwei 2e2a78dcb7 升级版本v1.15.0 2022-09-15 20:21:43 +08:00
dingzhiwei a4a5ef9bd0 升级版本v1.14.0 2022-07-08 18:42:36 +08:00
xiaoyu b6c9b5646a 退款订单列表搜索框描述修改;支付订单退款操作后默认刷新当前页 2022-07-05 09:56:41 +08:00
terrfly f9882824f9 生产打包改为相对路径; 2022-06-10 09:47:29 +08:00
大森林 af82979538
!2 添加 Docker 支持
Merge pull request !2 from 青木/dev
2022-03-30 15:08:33 +00:00
陈泉 eee7122e77 修复编译时候 Python 缺失问题 2022-03-30 17:31:19 +08:00
陈泉 6efb7c7893 添加 Docker 支持 2022-03-30 16:56:58 +08:00
dingzhiwei e20d7f8dda 升级版本v1.13.0 2022-03-29 18:47:53 +08:00
zhuxiao 148dd4f368 优化微信支付配置证书文件apiclient_cert.pem 2022-03-02 09:51:00 +08:00
dingzhiwei 817bbdf896 升级版本v1.12.0 2022-01-26 15:24:03 +08:00
terrfly 9faf41d174 维度 2022-01-25 18:00:32 +08:00
terrfly ebe38dabf9 重新分账; 2022-01-25 16:54:50 +08:00
zhuxiao 40c62219fc 优化支付宝支付参数必填项判断条件 2022-01-04 12:39:22 +08:00
dingzhiwei f48c063667 升级版本v1.11.0 2021-12-23 17:03:30 +08:00
dingzhiwei 6cb3dbf176 增加paypal支付方式 2021-12-17 18:06:38 +08:00
xiaoyu 2e23da7c66 商户端订单列表显示问题修复 2021-11-20 08:38:28 +08:00
xiaoyu 4cbd8a6f1c 转账订单列表显示问题优化(暂时) 2021-11-19 19:14:06 +08:00
xiaoyu 9111ce544e 转账订单列表显示问题优化 2021-11-19 18:48:27 +08:00
34 changed files with 48748 additions and 959 deletions

1
.gitignore vendored
View File

@ -53,3 +53,4 @@ unpackage/
# [package-lock.json。 已放开,请添加到假定未更改文件 ]
# package-lock.json
/.history/

47
Dockerfile Normal file
View File

@ -0,0 +1,47 @@
# syntax = docker/dockerfile:experimental
# 使用了 Docker 特性 Buildx 请开启相关特性
FROM node:16-alpine AS builder
ARG PLATFORM=$PLATFORM
WORKDIR /workspace
COPY . /workspace
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories
RUN apk update
RUN apk add --no-cache --virtual .build-deps alpine-sdk python3
RUN npm config set registry https://registry.npmmirror.com
RUN cd /workspace/jeepay-ui-${PLATFORM} && npm install && npm run build
FROM nginx:alpine
ARG PLATFORM=$PLATFORM
ENV BACKEND_HOST $BACKEND_HOST
WORKDIR /workspace
COPY --from=builder /workspace/jeepay-ui-${PLATFORM}/dist /workspace
RUN chmod a+r /workspace
RUN rm -rf /etc/nginx/conf.d/default.conf
COPY --from=builder /workspace/default.conf.template /etc/nginx/templates/default.conf.template
# 编译命令
# docker buildx build . --build-arg PLATFORM=cashier -t jeepay-payment:latest
# docker buildx build . --build-arg PLATFORM=manager -t jeepay-manager:latest
# docker buildx build . --build-arg PLATFORM=merchant -t jeepay-merchant:latest
#
# 如果你需要多平台镜像,你可以使用 --platform linux/amd64,linux/arm64
# 比如 docker buildx build . --build-arg PLATFORM=cashier -t jeepay-ui-cashier:latest --platform linux/amd64,linux/arm64
#
# 启动命令
# docker run -d -p 9226:80 -e BACKEND_HOST=172.20.0.9216 jeepay-ui-cashier:latest
# docker run -d -p 9227:80 -e BACKEND_HOST=172.20.0.9217 jeepay-ui-manager:latest
# docker run -d -p 9228:80 -e BACKEND_HOST=172.20.0.9218 jeepay-ui-merchant:latest

156
README.md
View File

@ -1,152 +1,42 @@
<p align="center">
<a href="https://www.jeepay.vip"><img src="https://jeequan.oss-cn-beijing.aliyuncs.com/jeepay/img/jeepay_logo.svg"></a>
</p>
<p align="center">
<strong>适合互联网企业使用的开源支付系统</strong>
</p>
<p align="center">
👉 <a href="https://www.jeepay.vip">https://www.jeepay.vip</a> 👈
</p>
# Jeepay UI
为Jeepay对应的前端项目包括运营平台、商户系统、聚合码收银台。前端技术以vue为主框架使用Ant Design Vue开发。
<p align="center">
<a target="_blank" href="https://spring.io/projects/spring-boot">
<img src="https://img.shields.io/badge/spring%20boot-2.4.5-yellowgreen" />
</a>
<a target="_blank" href="https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html">
<img src="https://img.shields.io/badge/JDK-8+-green.svg" />
</a>
<a target="_blank" href="http://www.gnu.org/licenses/lgpl.html">
<img src="https://img.shields.io/badge/license-LGPL--3.0-blue" />
</a>
<a href='https://gitee.com/jeequan/jeepay/stargazers' target="_blank">
<img src='https://gitee.com/jeequan/jeepay/badge/star.svg?theme=gvp' alt='star'></img>
</a>
<a target="_blank" href='https://github.com/jeequan/jeepay'>
<img src="https://img.shields.io/github/stars/jeequan/jeepay.svg?style=social" alt="github star"/>
</a>
</p>
Java服务端项目https://gitee.com/jeequan/jeepay
<br/>
<p align="center">
<a href="https://jq.qq.com/?_wv=1027&k=94WnXmdL">
<img src="https://img.shields.io/badge/qq%E7%BE%A4%E2%91%A0-635647058-critical"/>
</a>
</p>
-------------------------------------------------------------------------------
## 📚 项目介绍
Jeepay是一套适合互联网企业使用的开源支付系统支持多渠道服务商和普通商户模式。已对接`微信支付``支付宝``云闪付`官方接口,支持聚合码支付。
Jeepay使用`Spring Boot`和`Ant Design Vue`开发,集成`Spring Security`实现权限管理功能是一套非常实用的web开发框架。
### 🎁 名称的由来
Jeepay = Jee + pay是由原XxPay支付系统作者带领团队开发“Jee”是公司计全科技名称的表示pay表示支付。中文名称为计全支付释为计出万全、支付安全让支付更加方便安全。
### 🍟 项目体验
- Jeepay支付流程体验[https://www.jeequan.com/demo/jeepay_cashier.html](https://www.jeequan.com/demo/jeepay_cashier.html "Jeepay支付体验")
- Jeepay运营平台和商户系统演体验[https://www.jeequan.com/doc/detail_84.html](https://www.jeequan.com/doc/detail_84.html "Jeepay支付系统体验")
- Jeepay项目文档[https://www.jeepay.vip](https://www.jeepay.vip "Jeepay项目文档")
### 🍎 项目特点
* 支持多渠道对接,支付网关自动路由
* 已对接`微信`服务商和普通商户接口,支持`V2`和`V3`接口
* 已对接`支付宝`服务商和普通商户接口支持RSA和RSA2签名
* 已对接`云闪付`服务商接口,可选择多家支付机构
* 提供http形式接口提供各语言的`sdk`实现,方便对接
* 接口请求和响应数据采用签名机制,保证交易安全可靠
* 系统安全,支持`分布式`部署,`高并发`
* 管理端包括`运营平台`和`商户系统`
* 管理平台操作界面简洁、易用
* 支付平台到商户系统的订单通知使用MQ实现保证了高可用消息可达
* 支付渠道的接口参数配置界面自动化生成
* 使用`spring security`实现权限管理
* 前后端分离架构,方便二次开发
* 由原`XxPay`团队开发,有着多年支付系统开发经验
## 🥞 系统架构
> Jeepay计全支付系统架构图
![Jeepay系统架构图](https://jeequan.oss-cn-beijing.aliyuncs.com/jeepay/img/jeepay_framework.png "Jeepay系统架构图")
> 核心技术栈
| 软件名称 | 描述 | 版本
|---|---|---
|Jdk | Java环境 | 1.8
|Spring Boot | 开发框架 | 2.4.5
|Redis | 分布式缓存 | 3.2.8 或 高版本
|MySQL | 数据库 | 5.7.X
|ActiveMQ | 消息中间件 | 5.15.8 或 高版本
|[Ant Design Vue](https://www.antdv.com/docs/vue/introduce-cn/) | Ant Design的Vue实现前端开发使用 | 2.1.2
|[MyBatis-Plus](https://mp.baomidou.com/) | MyBatis增强工具 | 3.4.2
|[WxJava](https://gitee.com/binary/weixin-java-tools) | 微新开发Java SDK | 4.0.0
|[Hutool](https://www.hutool.cn/) | Java工具类库 | 5.6.6
> 项目结构
> 目录结构
```lua
jeepay -- https://gitee.com/jeequan/jeepay
jeepay-ui
├── jeepay-ui-manager -- 运营平台前端vue代码
├── jeepay-ui-merchant -- 商户系统前端vue代码
└── jeepay-ui-cashier -- 支付收银台vue代码
├── jeepay-ui-cashier -- 聚合收银台项目
├── jeepay-ui-manager -- 运营平台web管理端
└── jeepay-ui-merchant -- 商户系统web管理端
```
> 参考命令
> 开发部署
node版本要求`<= 16 `
- 系统开发:[https://www.jeepay.vip/#/develop/dev_serv](https://www.jeepay.vip/#/develop/dev_serv)
- 通道对接:[https://www.jeepay.vip/#/develop/dev_channel](https://www.jeepay.vip/#/develop/dev_channel)
- 线上部署:[https://www.jeepay.vip/#/develop/deploy](https://www.jeepay.vip/#/develop/deploy)
- 接口文档:[https://www.jeepay.vip/#/interface/payment_api](https://www.jeepay.vip/#/interface/payment_api)
#### 参考命令
## 🍿 功能模块
``` bash
# 拉取源码完毕后请先安装依赖, 进入项目根目录命令行执行:
> Jeepay运营平台功能
> npm install
![Jeepay运营平台功能](https://jeequan.oss-cn-beijing.aliyuncs.com/jeepay/img/jeepay_mgr.png "Jeepay运营平台功能")
# 本地启动项目(开发环境):
> Jeepay商户系统功能
1. 打开根目录下文件".env.development", 修改请求服务器地址"VUE_APP_API_BASE_URL"
![Jeepay商户系统功能](https://jeequan.oss-cn-beijing.aliyuncs.com/jeepay/img/jeepay_mch.png "Jeepay商户系统功能")
2. 在项目根目录命令行执行:
## 🍯 系统截图
> npm run serve
`以下截图是从实际已完成功能界面截取,截图时间为2021-05-29 02:05`
# 打包(生产环境):
![Jeepay演示界面](http://jeequan.oss-cn-beijing.aliyuncs.com/jeepay/img/yanshi/001.png "Jeepay演示界面")
1. 打开根目录下文件".env", 修改请求服务器地址"VUE_APP_API_BASE_URL"
![Jeepay演示界面](http://jeequan.oss-cn-beijing.aliyuncs.com/jeepay/img/yanshi/002.png "Jeepay演示界面")
2. 在项目根目录命令行执行:
![Jeepay演示界面](http://jeequan.oss-cn-beijing.aliyuncs.com/jeepay/img/yanshi/005.png "Jeepay演示界面")
> npm run build
![Jeepay演示界面](http://jeequan.oss-cn-beijing.aliyuncs.com/jeepay/img/yanshi/006.png "Jeepay演示界面")
![Jeepay演示界面](http://jeequan.oss-cn-beijing.aliyuncs.com/jeepay/img/yanshi/009.png "Jeepay演示界面")
![Jeepay演示界面](http://jeequan.oss-cn-beijing.aliyuncs.com/jeepay/img/yanshi/010.png "Jeepay演示界面")
![Jeepay演示界面](http://jeequan.oss-cn-beijing.aliyuncs.com/jeepay/img/yanshi/011.png "Jeepay演示界面")
![Jeepay演示界面](http://jeequan.oss-cn-beijing.aliyuncs.com/jeepay/img/yanshi/012.png "Jeepay演示界面")
![Jeepay演示界面](http://jeequan.oss-cn-beijing.aliyuncs.com/jeepay/img/yanshi/013.png "Jeepay演示界面")
![Jeepay演示界面](http://jeequan.oss-cn-beijing.aliyuncs.com/jeepay/img/yanshi/014.png "Jeepay演示界面")
![Jeepay演示界面](http://jeequan.oss-cn-beijing.aliyuncs.com/jeepay/img/yanshi/015.png "Jeepay演示界面")
![Jeepay演示界面](http://jeequan.oss-cn-beijing.aliyuncs.com/jeepay/img/yanshi/022.png "Jeepay演示界面")
## 🥪 关于我们
***
微信扫描下面二维码,关注官方公众号:计全科技,获取更多精彩内容。
![计全科技公众号](http://jeequan.oss-cn-beijing.aliyuncs.com/jeepay/img/jee-qrcode.jpg "计全科技公众号")
3. 文件将输出到 [/dist]目录, 拷贝到web服务器即可。
```

52
default.conf.template Normal file
View File

@ -0,0 +1,52 @@
server {
listen 80;
listen [::]:80;
server_name localhost;
root /workspace/;
try_files $uri $uri/ /index.html;
location /api/ {
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_pass http://$BACKEND_HOST;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
# favicon.ico
location = /favicon.ico {
log_not_found off;
access_log off;
}
# robots.txt
location = /robots.txt {
log_not_found off;
access_log off;
}
# assets, media
location ~* \.(?:css(\.map)?|js(\.map)?|jpe?g|png|gif|ico|cur|heic|webp|tiff?|mp3|m4a|aac|ogg|midi?|wav|mp4|mov|webm|mpe?g|avi|ogv|flv|wmv)$ {
expires 7d;
access_log off;
}
# svg, fonts
location ~* \.(?:svgz?|ttf|ttc|otf|eot|woff2?)$ {
add_header Access-Control-Allow-Origin "*";
expires 7d;
access_log off;
}
# gzip
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types text/plain text/css text/xml application/json application/javascript application/rss+xml application/atom+xml image/svg+xml;
}

View File

@ -1,3 +1,3 @@
NODE_ENV=production
VUE_APP_BASE_URL=/
VUE_APP_BASE_URL=
VUE_APP_API_BASE_URL=

View File

@ -1,6 +1,6 @@
{
"name": "jeepay-ui-cashier",
"version": "0.1.0",
"version": "1.10.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
@ -1949,6 +1949,44 @@
"integrity": "sha1-/q7SVZc9LndVW4PbwIhRpsY1IPo=",
"dev": true
},
"ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.nlark.com/ansi-styles/download/ansi-styles-4.3.0.tgz?cache=0&sync_timestamp=1618995547052&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fansi-styles%2Fdownload%2Fansi-styles-4.3.0.tgz",
"integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=",
"dev": true,
"optional": true,
"requires": {
"color-convert": "^2.0.1"
}
},
"chalk": {
"version": "4.1.2",
"resolved": "https://registry.nlark.com/chalk/download/chalk-4.1.2.tgz?cache=0&sync_timestamp=1627646734234&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fchalk%2Fdownload%2Fchalk-4.1.2.tgz",
"integrity": "sha1-qsTit3NKdAhnrrFr8CqtVWoeegE=",
"dev": true,
"optional": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
}
},
"color-convert": {
"version": "2.0.1",
"resolved": "https://registry.nlark.com/color-convert/download/color-convert-2.0.1.tgz",
"integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=",
"dev": true,
"optional": true,
"requires": {
"color-name": "~1.1.4"
}
},
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.nlark.com/color-name/download/color-name-1.1.4.tgz",
"integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=",
"dev": true,
"optional": true
},
"debug": {
"version": "4.3.1",
"resolved": "https://registry.npm.taobao.org/debug/download/debug-4.3.1.tgz?cache=0&sync_timestamp=1607566551397&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-4.3.1.tgz",
@ -1975,6 +2013,23 @@
"integrity": "sha1-/wQLKwhTsjw9MQJ1I3BvGIXXa+4=",
"dev": true
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.nlark.com/has-flag/download/has-flag-4.0.0.tgz",
"integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=",
"dev": true,
"optional": true
},
"json5": {
"version": "2.2.0",
"resolved": "https://registry.nlark.com/json5/download/json5-2.2.0.tgz",
"integrity": "sha1-Lf7+cgxrpSXZ69kJlQ8FFTFsiaM=",
"dev": true,
"optional": true,
"requires": {
"minimist": "^1.2.5"
}
},
"jsonfile": {
"version": "4.0.0",
"resolved": "https://registry.npm.taobao.org/jsonfile/download/jsonfile-4.0.0.tgz?cache=0&sync_timestamp=1604161937969&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjsonfile%2Fdownload%2Fjsonfile-4.0.0.tgz",
@ -1984,6 +2039,18 @@
"graceful-fs": "^4.1.6"
}
},
"loader-utils": {
"version": "2.0.0",
"resolved": "https://registry.npm.taobao.org/loader-utils/download/loader-utils-2.0.0.tgz",
"integrity": "sha1-5MrOW4FtQloWa18JfhDNErNgZLA=",
"dev": true,
"optional": true,
"requires": {
"big.js": "^5.2.2",
"emojis-list": "^3.0.0",
"json5": "^2.1.2"
}
},
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz?cache=0&sync_timestamp=1607433856030&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fms%2Fdownload%2Fms-2.1.2.tgz",
@ -1998,6 +2065,28 @@
"requires": {
"minipass": "^3.1.1"
}
},
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.nlark.com/supports-color/download/supports-color-7.2.0.tgz?cache=0&sync_timestamp=1626703414084&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsupports-color%2Fdownload%2Fsupports-color-7.2.0.tgz",
"integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=",
"dev": true,
"optional": true,
"requires": {
"has-flag": "^4.0.0"
}
},
"vue-loader-v16": {
"version": "npm:vue-loader@16.6.0",
"resolved": "https://registry.nlark.com/vue-loader/download/vue-loader-16.6.0.tgz?cache=0&sync_timestamp=1632217703123&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fvue-loader%2Fdownload%2Fvue-loader-16.6.0.tgz",
"integrity": "sha1-B03Rs97jCTfQpawi3GP+86nPoV8=",
"dev": true,
"optional": true,
"requires": {
"chalk": "^4.1.0",
"hash-sum": "^2.0.0",
"loader-utils": "^2.0.0"
}
}
}
},
@ -14254,97 +14343,6 @@
}
}
},
"vue-loader-v16": {
"version": "npm:vue-loader@16.2.0",
"resolved": "https://registry.nlark.com/vue-loader/download/vue-loader-16.2.0.tgz?cache=0&sync_timestamp=1620717743226&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fvue-loader%2Fdownload%2Fvue-loader-16.2.0.tgz",
"integrity": "sha1-BGpTMI3Ufljv4g3ewe3sAnzjtG4=",
"dev": true,
"optional": true,
"requires": {
"chalk": "^4.1.0",
"hash-sum": "^2.0.0",
"loader-utils": "^2.0.0"
},
"dependencies": {
"ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.nlark.com/ansi-styles/download/ansi-styles-4.3.0.tgz?cache=0&sync_timestamp=1618995547052&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fansi-styles%2Fdownload%2Fansi-styles-4.3.0.tgz",
"integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=",
"dev": true,
"optional": true,
"requires": {
"color-convert": "^2.0.1"
}
},
"chalk": {
"version": "4.1.1",
"resolved": "https://registry.nlark.com/chalk/download/chalk-4.1.1.tgz?cache=0&sync_timestamp=1618995354302&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fchalk%2Fdownload%2Fchalk-4.1.1.tgz",
"integrity": "sha1-yAs/qyi/Y3HmhjMl7uZ+YYt35q0=",
"dev": true,
"optional": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
}
},
"color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz",
"integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=",
"dev": true,
"optional": true,
"requires": {
"color-name": "~1.1.4"
}
},
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz",
"integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=",
"dev": true,
"optional": true
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-4.0.0.tgz?cache=0&sync_timestamp=1618559744568&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhas-flag%2Fdownload%2Fhas-flag-4.0.0.tgz",
"integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=",
"dev": true,
"optional": true
},
"json5": {
"version": "2.2.0",
"resolved": "https://registry.npm.taobao.org/json5/download/json5-2.2.0.tgz",
"integrity": "sha1-Lf7+cgxrpSXZ69kJlQ8FFTFsiaM=",
"dev": true,
"optional": true,
"requires": {
"minimist": "^1.2.5"
}
},
"loader-utils": {
"version": "2.0.0",
"resolved": "https://registry.npm.taobao.org/loader-utils/download/loader-utils-2.0.0.tgz",
"integrity": "sha1-5MrOW4FtQloWa18JfhDNErNgZLA=",
"dev": true,
"optional": true,
"requires": {
"big.js": "^5.2.2",
"emojis-list": "^3.0.0",
"json5": "^2.1.2"
}
},
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.nlark.com/supports-color/download/supports-color-7.2.0.tgz?cache=0&sync_timestamp=1622293630895&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsupports-color%2Fdownload%2Fsupports-color-7.2.0.tgz",
"integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=",
"dev": true,
"optional": true,
"requires": {
"has-flag": "^4.0.0"
}
}
}
},
"vue-router": {
"version": "3.5.1",
"resolved": "https://registry.nlark.com/vue-router/download/vue-router-3.5.1.tgz",

File diff suppressed because it is too large Load Diff

View File

@ -3,7 +3,7 @@
<template v-slot:links>
</template>
<template v-slot:copyright>
<a href="http://www.jeequan.com" target="_blank">@计全科技</a>
Copyright © 2023 <a href="http://www.jeequan.com" target="_blank">jeequan.com</a>. All rights reserved.
</template>
</global-footer>
</template>

View File

@ -117,7 +117,7 @@ export default {
}
.jeepay-card-add-text {
padding-top: 5px;
font-size: 16px;
font-size: 13px;
color: rgba(0, 0, 0, 0.35);
}
</style>

View File

@ -35,6 +35,8 @@
<template v-slot:rightContentRender>
<right-content :top-menu="settings.layout === 'topmenu'" :is-mobile="isMobile" :theme="settings.theme" />
<a style="color: red; float: right; padding-right: 10px;" href="https://www.jeequan.com/product/jeepay4plus.html" target="_blank">Plus商业版</a>
<a style="color: red; float: right; padding-right: 10px;" href="https://www.jeequan.com/ifstore/list.html" target="_blank">接口市场</a>
</template>
<!-- custom footer / 自定义Footer -->
<template v-slot:footerRender>

View File

@ -7,8 +7,8 @@ export const printANSI = () => {
/ /_/ // __/ __/ /_/ / /_/ / /_/ /
\\____/ \\___/\\___/ .___/\\__,_/\\__, /
/_/ /____/
:: Jeepay :: (v1.7.0.RELEASE)
适合互联网企业使用的开源支付系统 : https://www.jeequan.com
:: Jeepay :: (v2.2.2.RELEASE)
让支付接入更简单 : https://www.jeequan.com
`
console.log(`%c${text}`, 'color: #fc4d50')

View File

@ -244,7 +244,9 @@ export default {
if (item.star === '1') {
that.ifParams[item.name + '_ph'] = that.ifParams[item.name] ? that.ifParams[item.name] : '请输入'
that.ifParams[item.name] = ''
if (that.ifParams[item.name]) {
that.ifParams[item.name] = ''
}
}
newItems.push({

View File

@ -61,11 +61,6 @@
<a-input v-model="ifParams.oauth2Url" placeholder="请输入" />
</a-form-model-item>
</a-col>
<a-col span="24">
<a-form-model-item label="API密钥" prop="key">
<a-input v-model="ifParams.key" :placeholder="ifParams.key_ph" type="textarea" />
</a-form-model-item>
</a-col>
<a-col span="12">
<a-form-model-item label="微信支付API版本" prop="apiVersion">
<a-radio-group v-model="ifParams.apiVersion" defaultValue="V2">
@ -75,7 +70,12 @@
</a-form-model-item>
</a-col>
<a-col span="24">
<a-form-model-item label="API V3秘钥" prop="apiV3Key">
<a-form-model-item label="APIv2密钥" prop="key">
<a-input v-model="ifParams.key" :placeholder="ifParams.key_ph" type="textarea" />
</a-form-model-item>
</a-col>
<a-col span="24">
<a-form-model-item label="APIv3密钥" prop="apiV3Key">
<a-input v-model="ifParams.apiV3Key" :placeholder="ifParams.apiV3Key_ph" type="textarea" />
</a-form-model-item>
</a-col>
@ -85,7 +85,7 @@
</a-form-model-item>
</a-col>
<a-col span="24">
<a-form-model-item label="API证书(.p12格式)" prop="cert">
<a-form-model-item label="API证书(apiclient_cert.p12)" prop="cert">
<a-input v-model="ifParams.cert" disabled="disabled" />
<JeepayUpload
:action="action"
@ -99,7 +99,21 @@
</a-form-model-item>
</a-col>
<a-col span="24">
<a-form-model-item label="私钥文件(.pem格式)" prop="apiClientKey">
<a-form-model-item label="证书文件(apiclient_cert.pem)" prop="apiClientCert">
<a-input v-model="ifParams.apiClientCert" disabled="disabled" />
<JeepayUpload
:action="action"
:fileUrl="ifParams.apiClientCert"
@uploadSuccess="uploadSuccess($event, 'apiClientCert')"
>
<template slot="uploadSlot" slot-scope="{loading}">
<a-button style="marginTop:5px;"> <a-icon :type="loading ? 'loading' : 'upload'" /> {{ loading ? '正在上传' : '点击上传' }} </a-button>
</template>
</JeepayUpload>
</a-form-model-item>
</a-col>
<a-col span="24">
<a-form-model-item label="私钥文件(apiclient_key.pem)" prop="apiClientKey">
<a-input v-model="ifParams.apiClientKey" disabled="disabled" />
<JeepayUpload
:action="action"
@ -177,10 +191,24 @@ export default {
}
callback()
} }],
cert: [{ trigger: 'blur',
validator: (rule, value, callback) => {
if (this.ifParams.apiVersion === 'V3' && this.isAdd && !value) {
callback(new Error('请上传API证书(apiclient_cert.p12)'))
}
callback()
} }],
apiClientCert: [{ trigger: 'blur',
validator: (rule, value, callback) => {
if (this.ifParams.apiVersion === 'V3' && this.isAdd && !value) {
callback(new Error('请上传证书文件(apiclient_cert.pem)'))
}
callback()
} }],
apiClientKey: [{ trigger: 'blur',
validator: (rule, value, callback) => {
if (this.ifParams.apiVersion === 'V3' && !this.ifParams.apiClientKey) {
callback(new Error('请上传私钥文件'))
if (this.ifParams.apiVersion === 'V3' && !value) {
callback(new Error('请上传私钥文件(apiclient_key.pem)'))
}
callback()
} }]

View File

@ -38,8 +38,7 @@
<a-row :gutter="16">
<a-col v-for="(item, key) in mchParams" :key="key" :span="item.type === 'text' ? 12 : 24">
<a-form-model-item :label="item.desc" :prop="item.name" v-if="item.type === 'text' || item.type === 'textarea'">
<a-input v-if="item.star === '1'" v-model="ifParams[item.name]" :placeholder="ifParams[item.name + '_ph']" :type="item.type" />
<a-input v-else v-model="ifParams[item.name]" placeholder="请输入" :type="item.type" />
<a-input v-model="ifParams[item.name]" :placeholder="item.star === '1' ? ifParams[item.name + '_ph'] : '请输入'" :type="item.type" />
</a-form-model-item>
<a-form-model-item :label="item.desc" :prop="item.name" v-else-if="item.type === 'radio'">
<a-radio-group v-model="ifParams[item.name]">
@ -156,7 +155,9 @@ export default {
if (item.star === '1') {
that.ifParams[item.name + '_ph'] = that.ifParams[item.name] ? that.ifParams[item.name] : '请输入'
that.ifParams[item.name] = ''
if (that.ifParams[item.name]) {
that.ifParams[item.name] = ''
}
}
newItems.push({

View File

@ -56,11 +56,6 @@
<a-input v-model="ifParams.oauth2Url" placeholder="请输入" />
</a-form-model-item>
</a-col>
<a-col span="24">
<a-form-model-item label="API密钥" prop="key">
<a-input v-model="ifParams.key" :placeholder="ifParams.key_ph" type="textarea" />
</a-form-model-item>
</a-col>
<a-col span="12">
<a-form-model-item label="微信支付API版本" prop="apiVersion">
<a-radio-group v-model="ifParams.apiVersion" defaultValue="V2">
@ -70,7 +65,12 @@
</a-form-model-item>
</a-col>
<a-col span="24">
<a-form-model-item label="API V3秘钥" prop="apiV3Key">
<a-form-model-item label="APIv2密钥" prop="key">
<a-input v-model="ifParams.key" :placeholder="ifParams.key_ph" type="textarea" />
</a-form-model-item>
</a-col>
<a-col span="24">
<a-form-model-item label="APIv3秘钥" prop="apiV3Key">
<a-input v-model="ifParams.apiV3Key" :placeholder="ifParams.apiV3Key_ph" type="textarea" />
</a-form-model-item>
</a-col>
@ -80,7 +80,7 @@
</a-form-model-item>
</a-col>
<a-col span="24">
<a-form-model-item label="API证书(.p12格式)" prop="cert">
<a-form-model-item label="API证书(apiclient_cert.p12)" prop="cert">
<a-input v-model="ifParams.cert" disabled="disabled" />
<JeepayUpload
:action="action"
@ -94,7 +94,21 @@
</a-form-model-item>
</a-col>
<a-col span="24">
<a-form-model-item label="私钥文件(.pem格式)" prop="apiClientKey">
<a-form-model-item label="证书文件(apiclient_cert.pem)" prop="apiClientCert">
<a-input v-model="ifParams.apiClientCert" disabled="disabled" />
<JeepayUpload
:action="action"
:fileUrl="ifParams.apiClientCert"
@uploadSuccess="uploadSuccess($event, 'apiClientCert')"
>
<template slot="uploadSlot" slot-scope="{loading}">
<a-button style="marginTop:5px;"> <a-icon :type="loading ? 'loading' : 'upload'" /> {{ loading ? '正在上传' : '点击上传' }} </a-button>
</template>
</JeepayUpload>
</a-form-model-item>
</a-col>
<a-col span="24">
<a-form-model-item label="私钥文件(apiclient_key.pem)" prop="apiClientKey">
<a-input v-model="ifParams.apiClientKey" disabled="disabled" />
<JeepayUpload
:action="action"
@ -197,10 +211,24 @@ export default {
}
callback()
} }],
cert: [{ trigger: 'blur',
validator: (rule, value, callback) => {
if (this.ifParams.apiVersion === 'V3' && this.isAdd && !value) {
callback(new Error('请上传API证书(apiclient_cert.p12)'))
}
callback()
} }],
apiClientCert: [{ trigger: 'blur',
validator: (rule, value, callback) => {
if (this.ifParams.apiVersion === 'V3' && this.isAdd && !value) {
callback(new Error('请上传证书文件(apiclient_cert.pem)'))
}
callback()
} }],
apiClientKey: [{ trigger: 'blur',
validator: (rule, value, callback) => {
if (this.ifParams.apiVersion === 'V3' && this.mchType === 1 && !this.ifParams.apiClientKey) {
callback(new Error('请上传私钥文件'))
callback(new Error('请上传私钥文件(apiclient_key.pem)'))
}
callback()
} }],

View File

@ -15,8 +15,8 @@
</a-range-picker>
</a-form-item>
<jeepay-text-up :placeholder="'支付/商户/渠道订单号'" :msg="searchData.unionOrderId" v-model="searchData.unionOrderId" />
<!-- <jeepay-text-up :placeholder="'支付订单号'" :msg="searchData.payOrderId" v-model="searchData.payOrderId" />-->
<!-- <jeepay-text-up :placeholder="'商户订单号'" :msg="searchData.mchOrderNo" v-model="searchData.mchOrderNo" />-->
<!-- <jeepay-text-up :placeholder="'支付订单号'" :msg="searchData.payOrderId" v-model="searchData.payOrderId" />-->
<!-- <jeepay-text-up :placeholder="'商户订单号'" :msg="searchData.mchOrderNo" v-model="searchData.mchOrderNo" />-->
<jeepay-text-up :placeholder="'商户号'" :msg="searchData.mchNo" v-model="searchData.mchNo" />
<jeepay-text-up :placeholder="'服务商号'" :msg="searchData.isvNo" v-model="searchData.isvNo" />
<jeepay-text-up :placeholder="'应用AppId'" :msg="searchData.appId" v-model="searchData.appId"/>
@ -459,7 +459,7 @@ export default {
return req.list(API_URL_PAY_ORDER_LIST, params)
},
searchFunc: function () { //
this.$refs.infoTable.refTable(true)
this.$refs.infoTable.refTable(false)
},
// 退

View File

@ -14,10 +14,10 @@
<a-icon slot="suffixIcon" type="sync" />
</a-range-picker>
</a-form-item>
<jeepay-text-up :placeholder="'退款/支付/渠道/商户退款订单号'" :msg="searchData.unionOrderId" v-model="searchData.unionOrderId" />
<!-- <jeepay-text-up :placeholder="'退款订单号'" :msg="searchData.refundOrderId" v-model="searchData.refundOrderId" />-->
<!-- <jeepay-text-up :placeholder="'支付订单号'" :msg="searchData.payOrderId" v-model="searchData.payOrderId" />-->
<!-- <jeepay-text-up :placeholder="'渠道支付订单号'" :msg="searchData.channelPayOrderNo" v-model="searchData.channelPayOrderNo" />-->
<jeepay-text-up :placeholder="'支付/退款订单号'" :msg="searchData.unionOrderId" v-model="searchData.unionOrderId" />
<!-- <jeepay-text-up :placeholder="'退款订单号'" :msg="searchData.refundOrderId" v-model="searchData.refundOrderId" />-->
<!-- <jeepay-text-up :placeholder="'支付订单号'" :msg="searchData.payOrderId" v-model="searchData.payOrderId" />-->
<!-- <jeepay-text-up :placeholder="'渠道支付订单号'" :msg="searchData.channelPayOrderNo" v-model="searchData.channelPayOrderNo" />-->
<jeepay-text-up :placeholder="'商户号'" :msg="searchData.mchNo" v-model="searchData.mchNo" />
<jeepay-text-up :placeholder="'服务商号'" :msg="searchData.isvNo" v-model="searchData.isvNo" />
<jeepay-text-up :placeholder="'应用AppId'" :msg="searchData.appId" v-model="searchData.appId"/>

View File

@ -107,9 +107,9 @@
const tableColumns = [
{ title: '转账金额', scopedSlots: { customRender: 'transferAmountSlot' }, width: 108 },
{ title: '商户名称', dataIndex: 'mchName' },
{ key: 'orderNo', title: '订单号', scopedSlots: { customRender: 'orderSlot' }, width: 210 },
{ key: 'orderNo', title: '订单号', scopedSlots: { customRender: 'orderSlot' }, width: 260 },
// { title: '', dataIndex: 'channelOrderNo' },
{ title: '收款账号', dataIndex: 'accountNo' },
{ title: '收款账号', dataIndex: 'accountNo', width: 200 },
{ title: '收款人姓名', dataIndex: 'accountName' },
{ title: '转账备注', dataIndex: 'transferDesc' },
{ title: '状态', scopedSlots: { customRender: 'stateSlot' }, width: 100 },

View File

@ -1,5 +1,17 @@
<template>
<page-header-wrapper>
<template>
<a-card style="width: calc(100% - 24px);margin-bottom: 20px;">
<a-alert message="" type="info">
<template #description>
<p style="display: flex; justify-content: space-between; margin: 0 0 4px;">
计全科技已开放支付接口购买渠道官方团队开发源码提供下载后直接使用<a href="https://docs.jeequan.com/docs/jeepay/jeepay-1ejdnsuhveb16" target="_blank">接口下载安装说明</a>
<a href="https://www.jeequan.com/ifstore/list.html" target="_blank">前往接口市场 ></a>
</p>
</template>
</a-alert>
</a-card>
</template>
<JeepayCard
ref="infoCard"
:reqCardListFunc="reqCardListFunc"
@ -53,8 +65,8 @@ export default {
return {
jeepayCard: {
name: '支付接口',
height: 300,
span: { xxl: 6, xl: 4, lg: 4, md: 3, sm: 2, xs: 1 },
height: 200,
span: { xxl: 8, xl: 4, lg: 4, md: 3, sm: 2, xs: 1 },
addAuthority: this.$access('ENT_PC_IF_DEFINE_ADD')
}
}
@ -118,7 +130,7 @@ export default {
align-items: center;
}
.title {
font-size: 16px;
font-size: 13px;
font-family: PingFang SC, PingFang SC-Bold;
font-weight: 700;
color: #1a1a1a;

File diff suppressed because it is too large Load Diff

View File

@ -297,3 +297,11 @@ export function payOrderRefund (payOrderId, refundAmount, refundReason) {
data: { refundAmount, refundReason }
})
}
/** 分账重试 */
export function resendDivision (recordId) {
return request.request({
url: '/api/division/records/resend/' + recordId,
method: 'POST'
})
}

View File

@ -0,0 +1,19 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="40" height="40" viewBox="0 0 40 40">
<defs>
<clipPath id="clip-path">
<rect id="矩形_3796" data-name="矩形 3796" width="17" height="20" transform="translate(7694 5293)" fill="#fff" stroke="#707070" stroke-width="1"/>
</clipPath>
</defs>
<g id="PayPal" transform="translate(-7454 -5095)">
<path id="路径_4159" data-name="路径 4159" d="M190.218,137.3l-.02-.02-.02-.02c-1.442-1.442-3.6-2.176-6.511-2.561a91.682,91.682,0,0,0-10.426-.453,91.64,91.64,0,0,0-10.426.453c-2.929.387-5.089,1.126-6.531,2.582s-2.2,3.6-2.581,6.531a91.665,91.665,0,0,0-.453,10.426,91.651,91.651,0,0,0,.453,10.426c.385,2.916,1.12,5.069,2.562,6.511l.02.02.02.02c1.442,1.442,3.6,2.176,6.511,2.561a91.679,91.679,0,0,0,10.426.453,91.64,91.64,0,0,0,10.426-.453c2.929-.387,5.089-1.126,6.531-2.582s2.2-3.6,2.581-6.531a91.69,91.69,0,0,0,.453-10.426,91.64,91.64,0,0,0-.453-10.426c-.385-2.916-1.12-5.069-2.562-6.511Z" transform="translate(7300.76 4960.764)" fill="#c3cbe6"/>
<path id="矩形_2559" data-name="矩形 2559" d="M1,0H11a1,1,0,0,1,1,1V4H0V1A1,1,0,0,1,1,0Z" transform="translate(7468.001 5109.007)" fill="#e60012"/>
<g id="蒙版组_330" data-name="蒙版组 330" transform="translate(-228.5 -188)" clip-path="url(#clip-path)">
<g id="组_1372" data-name="组 1372" transform="translate(7694 5293)">
<path id="路径_11885" data-name="路径 11885" d="M302.719,129.325l.345-2.136H298.75l2.416-15.7c0-.058,0-.058.057-.173a.252.252,0,0,1,.173-.058h5.983c2.013,0,3.337.462,4.084,1.27a4.157,4.157,0,0,1,.69,1.212,8.721,8.721,0,0,1,0,1.732v.519l.345.173a3.1,3.1,0,0,1,.69.519,2.356,2.356,0,0,1,.575,1.27,6.219,6.219,0,0,1-.058,1.789,6.092,6.092,0,0,1-.748,2.02,3.2,3.2,0,0,1-1.208,1.27,7.716,7.716,0,0,1-1.553.75,7.418,7.418,0,0,1-1.9.231h-.69a1.419,1.419,0,0,0-1.381,1.212v.231l-.575,3.694v.173a.056.056,0,0,1-.057.058h-.058a22.977,22.977,0,0,0-2.819-.058Z" transform="translate(-298.051 -110.452)" fill="#253b80"/>
<path id="路径_11886" data-name="路径 11886" d="M420.32,248.293c0,.173-.058.231-.058.4-.863,4.329-3.624,5.714-7.191,5.714H411.23a.865.865,0,0,0-.863.75l-.92,6-.23,1.732c-.058.231.173.462.4.519h3.337a.752.752,0,0,0,.748-.693v-.173l.633-3.925.058-.231a.8.8,0,0,1,.748-.693h.46c3.164,0,5.523-1.328,6.328-5.021.288-1.558.173-2.886-.633-3.752a5.7,5.7,0,0,0-.978-.635Z" transform="translate(-405.066 -243.214)" fill="#179bd7"/>
<path id="路径_11887" data-name="路径 11887" d="M459.074,228.212c-.173,0-.23-.058-.4-.058s-.288-.058-.4-.058a15.249,15.249,0,0,0-1.611-.173h-4.832a.752.752,0,0,0-.748.693l-.978,6.637v.173a.865.865,0,0,1,.863-.75H452.8c3.567,0,6.386-1.443,7.191-5.714,0-.173.057-.231.057-.4-.23-.058-.46-.231-.69-.289l-.288-.058Z" transform="translate(-444.684 -223.479)" fill="#222d65"/>
<path id="路径_11888" data-name="路径 11888" d="M282.712,90.528a.8.8,0,0,1,.748-.693h4.832a5.112,5.112,0,0,1,1.611.173c.173,0,.288.058.4.058.173,0,.23.058.4.058l.173.058a3.516,3.516,0,0,1,.69.289,3.938,3.938,0,0,0-.863-3.578c-.92-1.1-2.646-1.558-4.775-1.558h-6.213a.866.866,0,0,0-.863.75l-2.531,16.507c-.057.289.173.52.46.635H280.7l.978-6.118c.058,0,1.035-6.58,1.035-6.58Z" transform="translate(-276.318 -85.333)" fill="#253b80"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

@ -3,7 +3,7 @@
<template v-slot:links>
</template>
<template v-slot:copyright>
<a href="http://www.jeequan.com" target="_blank">@计全科技</a>
Copyright © 2023 <a href="http://www.jeequan.com" target="_blank">jeequan.com</a>. All rights reserved.
</template>
</global-footer>
</template>

View File

@ -35,6 +35,8 @@
<template v-slot:rightContentRender>
<right-content :top-menu="settings.layout === 'topmenu'" :is-mobile="isMobile" :theme="settings.theme" />
<a style="color: red; float: right; padding-right: 10px;" href="https://www.jeequan.com/product/jeepay4plus.html" target="_blank">Plus商业版</a>
<a style="color: red; float: right; padding-right: 10px;" href="https://www.jeequan.com/ifstore/list.html" target="_blank">接口市场</a>
</template>
<!-- custom footer / 自定义Footer -->
<template v-slot:footerRender>

View File

@ -7,8 +7,8 @@ export const printANSI = () => {
/ /_/ // __/ __/ /_/ / /_/ / /_/ /
\\____/ \\___/\\___/ .___/\\__,_/\\__, /
/_/ /____/
:: Jeepay :: (v1.7.0.RELEASE)
适合互联网企业使用的开源支付系统 : https://www.jeequan.com
:: Jeepay :: (v2.2.2.RELEASE)
让支付接入更简单 : https://www.jeequan.com
`
console.log(`%c${text}`, 'color: #fc4d50')

View File

@ -129,7 +129,7 @@
<template slot="accTypeSlot" slot-scope="record">
<a-select style="width: 110px" v-model="record.accType" placeholder="账号类型" default-value="0">
<a-select-option value="0">个人</a-select-option>
<a-select-option value="1">微信商户</a-select-option>
<a-select-option value="1">商户</a-select-option>
</a-select>
</template>

View File

@ -14,14 +14,17 @@
<a-col :sm="12"><a-descriptions><a-descriptions-item label="支付接口代码">{{ detailData.ifCode }}</a-descriptions-item></a-descriptions></a-col>
<a-col :sm="12"><a-descriptions><a-descriptions-item label="系统支付订单号">{{ detailData.payOrderId }}</a-descriptions-item></a-descriptions></a-col>
<a-col :sm="12"><a-descriptions><a-descriptions-item label="支付订单渠道支付订单号">{{ detailData.payOrderChannelOrderNo }}</a-descriptions-item></a-descriptions></a-col>
<a-col :sm="12"><a-descriptions><a-descriptions-item label="订单金额">{{ detailData.payOrderAmount / 100}}</a-descriptions-item></a-descriptions></a-col>
<a-col :sm="12"><a-descriptions><a-descriptions-item label="订单金额">{{ detailData.payOrderAmount / 100 }}</a-descriptions-item></a-descriptions></a-col>
<a-col :sm="12"><a-descriptions><a-descriptions-item label="分账基数">{{ detailData.payOrderDivisionAmount / 100 }} 订单金额-手续费-退款金额</a-descriptions-item></a-descriptions></a-col>
<a-col :sm="12"><a-descriptions><a-descriptions-item label="系统分账批次号">{{ detailData.batchOrderId }}</a-descriptions-item></a-descriptions></a-col>
<a-col :sm="12"><a-descriptions><a-descriptions-item label="上游分账批次号">{{ detailData.channelBatchOrderId }}</a-descriptions-item></a-descriptions></a-col>
<a-col :sm="12"><a-descriptions><a-descriptions-item label="状态">
<a-tag :key="detailData.state" :color="detailData.state === 0?'orange':detailData.state === 1?'blue':detailData.state === 2?'volcano':'volcano'">
{{ detailData.state === 0?'分账中':detailData.state === 1?'分账成功':detailData.state === 2?'分账失败' : '未知' }}
</a-tag>
<a-tag v-if="detailData.state === 0" :key="detailData.state" color="orange">分账中</a-tag>
<a-tag v-if="detailData.state === 1" :key="detailData.state" color="blue">分账成功</a-tag>
<a-tag v-if="detailData.state === 2" :key="detailData.state" color="volcano">分账失败</a-tag>
<a-tag v-if="detailData.state === 3" :key="detailData.state" color="purple">已受理</a-tag>
</a-descriptions-item></a-descriptions></a-col>
<a-col :sm="12"><a-descriptions><a-descriptions-item label="分账接收者ID">{{ detailData.receiverId }}</a-descriptions-item></a-descriptions></a-col>
<a-col :sm="12"><a-descriptions><a-descriptions-item label="收款账号组ID">{{ detailData.receiverGroupId }}</a-descriptions-item></a-descriptions></a-col>

View File

@ -26,6 +26,7 @@
<a-select-option value="0">待分账</a-select-option>
<a-select-option value="1">分账成功</a-select-option>
<a-select-option value="2">分账失败</a-select-option>
<a-select-option value="3">已受理</a-select-option>
</a-select>
</a-form-item>
@ -49,16 +50,17 @@
>
<template slot="amountSlot" slot-scope="{record}"><b>{{ record.calDivisionAmount/100 }}</b></template> <!-- 自定义插槽 -->
<template slot="stateSlot" slot-scope="{record}">
<a-tag
:key="record.state"
:color="record.state === 0?'orange':record.state === 1?'blue':record.state === 2?'volcano':'volcano'"
>
{{ record.state === 0?'分账中':record.state === 1?'分账成功':record.state === 2?'分账失败' : '未知' }}
</a-tag>
<a-tag v-if="record.state === 0" :key="record.state" color="orange">分账中</a-tag>
<a-tag v-if="record.state === 1" :key="record.state" color="blue">分账成功</a-tag>
<a-tag v-if="record.state === 2" :key="record.state" color="volcano">分账失败</a-tag>
<a-tag v-if="record.state === 3" :key="record.state" color="purple">已受理</a-tag>
</template>
<template slot="opSlot" slot-scope="{record}"> <!-- 操作列插槽 -->
<JeepayTableColumns>
<a-button type="link" v-if="$access('ENT_DIVISION_RECORD_VIEW')" @click="detailFunc(record.recordId)">详情</a-button>
<a-button type="link" v-if="record.state == 2 && $access('ENT_DIVISION_RECORD_RESEND')" @click="redivFunc(record.recordId)">重试</a-button>
</JeepayTableColumns>
</template>
</JeepayTable>
@ -72,7 +74,7 @@
import JeepayTextUp from '@/components/JeepayTextUp/JeepayTextUp' //
import JeepayTable from '@/components/JeepayTable/JeepayTable'
import JeepayTableColumns from '@/components/JeepayTable/JeepayTableColumns'
import { API_URL_PAY_ORDER_DIVISION_RECORD_LIST, req } from '@/api/manage'
import { API_URL_PAY_ORDER_DIVISION_RECORD_LIST, req, resendDivision } from '@/api/manage'
import moment from 'moment'
import Detail from './Detail'
@ -124,6 +126,16 @@ export default {
detailFunc: function (recordId) {
this.$refs.recordDetail.show(recordId)
},
//
redivFunc: function (recordId) {
const that = this
this.$infoBox.confirmPrimary('确认重新分账?', '重新分账将按照订单维度重新发起(仅限分账失败订单)。', () => {
resendDivision(recordId).then(res => {
that.$refs.infoTable.refTable(false)
that.$message.warning('请等待接口最新状态')
})
})
},
moment,
onChange (date, dateString) {
this.searchData.createdStart = dateString[0] //

View File

@ -56,11 +56,6 @@
<a-input v-model="ifParams.oauth2Url" placeholder="请输入" />
</a-form-model-item>
</a-col>
<a-col span="24">
<a-form-model-item label="API密钥" prop="key">
<a-input v-model="ifParams.key" :placeholder="ifParams.key_ph" type="textarea" />
</a-form-model-item>
</a-col>
<a-col span="12">
<a-form-model-item label="微信支付API版本" prop="apiVersion">
<a-radio-group v-model="ifParams.apiVersion" defaultValue="V2">
@ -70,7 +65,12 @@
</a-form-model-item>
</a-col>
<a-col span="24">
<a-form-model-item label="API V3秘钥" prop="apiV3Key">
<a-form-model-item label="APIv2密钥" prop="key">
<a-input v-model="ifParams.key" :placeholder="ifParams.key_ph" type="textarea" />
</a-form-model-item>
</a-col>
<a-col span="24">
<a-form-model-item label="APIv3秘钥" prop="apiV3Key">
<a-input v-model="ifParams.apiV3Key" :placeholder="ifParams.apiV3Key_ph" type="textarea" />
</a-form-model-item>
</a-col>
@ -80,7 +80,7 @@
</a-form-model-item>
</a-col>
<a-col span="24">
<a-form-model-item label="API证书(.p12格式)" prop="cert">
<a-form-model-item label="API证书(apiclient_cert.p12)" prop="cert">
<a-input v-model="ifParams.cert" disabled="disabled" />
<JeepayUpload
:action="action"
@ -94,7 +94,21 @@
</a-form-model-item>
</a-col>
<a-col span="24">
<a-form-model-item label="私钥文件(.pem格式)" prop="apiClientKey">
<a-form-model-item label="证书文件(apiclient_cert.pem)" prop="apiClientCert">
<a-input v-model="ifParams.apiClientCert" disabled="disabled" />
<JeepayUpload
:action="action"
:fileUrl="ifParams.apiClientCert"
@uploadSuccess="uploadSuccess($event, 'apiClientCert')"
>
<template slot="uploadSlot" slot-scope="{loading}">
<a-button style="marginTop:5px;"> <a-icon :type="loading ? 'loading' : 'upload'" /> {{ loading ? '正在上传' : '点击上传' }} </a-button>
</template>
</JeepayUpload>
</a-form-model-item>
</a-col>
<a-col span="24">
<a-form-model-item label="私钥文件(apiclient_key.pem)" prop="apiClientKey">
<a-input v-model="ifParams.apiClientKey" disabled="disabled" />
<JeepayUpload
:action="action"
@ -197,10 +211,24 @@ export default {
}
callback()
} }],
cert: [{ trigger: 'blur',
validator: (rule, value, callback) => {
if (this.ifParams.apiVersion === 'V3' && this.isAdd && !value) {
callback(new Error('请上传API证书(apiclient_cert.p12)'))
}
callback()
} }],
apiClientCert: [{ trigger: 'blur',
validator: (rule, value, callback) => {
if (this.ifParams.apiVersion === 'V3' && this.isAdd && !value) {
callback(new Error('请上传证书文件(apiclient_cert.pem)'))
}
callback()
} }],
apiClientKey: [{ trigger: 'blur',
validator: (rule, value, callback) => {
if (this.ifParams.apiVersion === 'V3' && this.mchType === 1 && !this.ifParams.apiClientKey) {
callback(new Error('请上传私钥文件'))
callback(new Error('请上传私钥文件(apiclient_key.pem)'))
}
callback()
} }],

View File

@ -15,8 +15,8 @@
</a-range-picker>
</a-form-item>
<jeepay-text-up :placeholder="'支付/商户/渠道订单号'" :msg="searchData.unionOrderId" v-model="searchData.unionOrderId" />
<!-- <jeepay-text-up :placeholder="'支付订单号'" :msg="searchData.payOrderId" v-model="searchData.payOrderId" />-->
<!-- <jeepay-text-up :placeholder="'商户订单号'" :msg="searchData.mchOrderNo" v-model="searchData.mchOrderNo" />-->
<!-- <jeepay-text-up :placeholder="'支付订单号'" :msg="searchData.payOrderId" v-model="searchData.payOrderId" />-->
<!-- <jeepay-text-up :placeholder="'商户订单号'" :msg="searchData.mchOrderNo" v-model="searchData.mchOrderNo" />-->
<jeepay-text-up :placeholder="'应用AppId'" :msg="searchData.appId" v-model="searchData.appId"/>
<a-form-item v-if="$access('ENT_PAY_ORDER_SEARCH_PAY_WAY')" label="" class="table-head-layout">
<a-select v-model="searchData.wayCode" placeholder="支付方式" default-value="">
@ -113,14 +113,6 @@
</div>
</template>
<template slot="orderSlot" slot-scope="{record}">
<div class="order-list">
<p><span style="color:#729ED5;background:#e7f5f7">支付</span>{{ record.payOrderId }}</p>
<p><span style="color:#56cf56;background:#d8eadf">商户</span>{{ record.mchOrderNo }}</p>
<p v-if="record.channelOrderNo"><span style="color:#fff;background:#E09C4D">渠道</span>{{ record.channelOrderNo }}</p>
</div>
</template>
<template slot="opSlot" slot-scope="{record}"> <!-- 操作列插槽 -->
<JeepayTableColumns>
<a-button type="link" v-if="$access('ENT_PAY_ORDER_VIEW')" @click="detailFunc(record.payOrderId)">详情</a-button>
@ -434,7 +426,7 @@ export default {
return req.list(API_URL_PAY_ORDER_LIST, params)
},
searchFunc: function () { //
this.$refs.infoTable.refTable(true)
this.$refs.infoTable.refTable(false)
},
// 退
openFunc (record, recordId) {

View File

@ -14,11 +14,11 @@
<a-icon slot="suffixIcon" type="sync" />
</a-range-picker>
</a-form-item>
<jeepay-text-up :placeholder="'退款/支付/渠道/商户退款订单号'" :msg="searchData.unionOrderId" v-model="searchData.unionOrderId" />
<!-- <jeepay-text-up :placeholder="'退款订单号'" :msg="searchData.refundOrderId" v-model="searchData.refundOrderId" />-->
<!-- <jeepay-text-up :placeholder="'商户退款单号'" :msg="searchData.mchRefundNo" v-model="searchData.mchRefundNo" />-->
<!-- <jeepay-text-up :placeholder="'支付订单号'" :msg="searchData.payOrderId" v-model="searchData.payOrderId" />-->
<!-- <jeepay-text-up :placeholder="'渠道订单号'" :msg="searchData.channelPayOrderNo" v-model="searchData.channelPayOrderNo" />-->
<jeepay-text-up :placeholder="'支付/退款订单号'" :msg="searchData.unionOrderId" v-model="searchData.unionOrderId" />
<!-- <jeepay-text-up :placeholder="'退款订单号'" :msg="searchData.refundOrderId" v-model="searchData.refundOrderId" />-->
<!-- <jeepay-text-up :placeholder="'商户退款单号'" :msg="searchData.mchRefundNo" v-model="searchData.mchRefundNo" />-->
<!-- <jeepay-text-up :placeholder="'支付订单号'" :msg="searchData.payOrderId" v-model="searchData.payOrderId" />-->
<!-- <jeepay-text-up :placeholder="'渠道订单号'" :msg="searchData.channelPayOrderNo" v-model="searchData.channelPayOrderNo" />-->
<jeepay-text-up :placeholder="'应用AppId'" :msg="searchData.appId" v-model="searchData.appId"/>
<a-form-item label="" class="table-head-layout">
<a-select v-model="searchData.state" placeholder="退款状态" default-value="">

View File

@ -105,11 +105,11 @@
// eslint-disable-next-line no-unused-vars
const tableColumns = [
{ title: '转账金额', scopedSlots: { customRender: 'transferAmountSlot' } },
{ key: 'orderNo', title: '订单号', scopedSlots: { customRender: 'orderSlot' }, width: '260px' },
{ key: 'orderNo', title: '订单号', scopedSlots: { customRender: 'orderSlot' }, width: 260 },
// { title: '', dataIndex: 'transferId' },
// { title: '', dataIndex: 'mchOrderNo' },
// { title: '', dataIndex: 'channelOrderNo' },
{ title: '收款账号', dataIndex: 'accountNo' },
{ title: '收款账号', dataIndex: 'accountNo', width: 200 },
{ title: '收款人姓名', dataIndex: 'accountName' },
{ title: '转账备注', dataIndex: 'transferDesc' },
{ title: '状态', scopedSlots: { customRender: 'stateSlot' }, width: 100 },

View File

@ -69,14 +69,18 @@
</div>
</div>
<div class="paydemo-type-name article-title" v-show="showJhTitle()">聚合支付</div>
<div class="paydemo-type-name article-title" v-show="showQtTitle()">其它支付</div>
<div class="paydemo-type-body">
<div class="paydemo-type color-change" v-show="appPaywayList.indexOf('WX_JSAPI') >= 0 || appPaywayList.indexOf('ALI_JSAPI') >= 0" @click="changeCurrentWayCode('QR_CASHIER', 'codeImgUrl')" :class="{this:(currentWayCode === 'QR_CASHIER')}">
<img src="@/assets/payTestImg/qr_cashier.svg" class="paydemo-type-img"><span class="color-change">聚合(用户扫商家)</span>
<img src="@/assets/payTestImg/qr_cashier.svg" class="paydemo-type-img"><span class="color-change">聚合</span>
</div>
<div class="paydemo-type color-change" v-show="appPaywayList.indexOf('WX_BAR') >= 0 || appPaywayList.indexOf('ALI_BAR') >= 0" @click="changeCurrentWayCode('AUTO_BAR', 'codeImgUrl')" :class="{this:(currentWayCode === 'AUTO_BAR')}">
<img src="@/assets/payTestImg/auto_bar.svg" class="paydemo-type-img"><span class="color-change">聚合条码(商家扫用户)</span>
<img src="@/assets/payTestImg/auto_bar.svg" class="paydemo-type-img"><span class="color-change">聚合被扫</span>
</div>
<div class="paydemo-type color-change" v-show="appPaywayList.indexOf('PP_PC') >= 0" @click="changeCurrentWayCode('PP_PC', 'payurl')" :class="{this:(currentWayCode === 'PP_PC')}">
<img src="@/assets/payTestImg/pp_pc.svg" class="paydemo-type-img"><span class="color-change">PayPal支付</span>
</div>
</div>
@ -298,8 +302,8 @@ export default {
}
},
//
showJhTitle () {
if (this.appPaywayList.toString().indexOf('WX') !== -1 || this.appPaywayList.toString().indexOf('ALI') !== -1) {
showQtTitle () {
if (this.appPaywayList.toString().indexOf('WX') !== -1 || this.appPaywayList.toString().indexOf('ALI') !== -1 || this.appPaywayList.toString().indexOf('PP_PC') !== -1) {
return true
} else {
return false

View File

@ -187,9 +187,13 @@ export default {
if (apiRes.state === 2) {
const succModal = that.$infoBox.modalSuccess('转账成功', <div>2s后自动关闭...</div>)
setTimeout(() => { succModal.destroy() }, 2000)
} else {
that.$infoBox.modalError('支付失败', <div><div>错误码{ apiRes.errCode}</div>
} else if (apiRes.state === 1) {
that.$infoBox.modalWarning('转账处理中', <div>请前往转账订单列表查看最终状态</div>)
} else if (apiRes.state === 3) {
that.$infoBox.modalError('转账处理失败', <div><div>错误码{ apiRes.errCode}</div>
<div>错误信息{ apiRes.errMsg}</div></div>)
} else {
return this.$message.error('转账异常')
}
}).catch(() => {
that.randomOrderNo() //