Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
2404462
test: add starpos channel test harness
Jul 26, 2026
9f65107
feat: implement starpos signing contract
Jul 26, 2026
7bcc197
wip: capture starpos rsa protocol direction
Jul 26, 2026
221b897
fix: align starpos rsa direction
Jul 26, 2026
eeac480
feat: 增加星驿付通道配置
Jul 26, 2026
8fad1a7
feat: 增加严格星驿付 HTTP 客户端
Jul 26, 2026
9ef4d68
fix: 收紧星驿付 HTTP 客户端 TLS 约束
Jul 26, 2026
c190a45
feat: 增加 STARPOS_QR 请求响应类型
Jul 26, 2026
c799bd7
fix: 收紧 STARPOS_QR 请求参数校验
Jul 26, 2026
6ad63f7
feat: 创建星驿付二维码支付订单
Jul 26, 2026
47941e8
fix: 处理星驿付下单配置异常
Jul 26, 2026
f902f22
feat: 查询星驿付支付订单
Jul 26, 2026
43a9482
feat: process starpos payment notifications
Jul 26, 2026
f9ce5a5
feat: register starpos interface and payway
Jul 26, 2026
0719dec
fix: harden starpos sql idempotency
Jul 26, 2026
4ca0ea9
feat: add epay canonical signing
Jul 27, 2026
5fe7169
test: generate epay rsa keys at runtime
Jul 27, 2026
37ebb34
feat: normalize epay requests and metadata
Jul 27, 2026
2aee975
feat(payment): 新增EPAY兼容下单端点
Jul 27, 2026
4dc8a7d
fix(payment): harden epay compat order lifecycle
Jul 27, 2026
9ef6f87
fix(payment): harden epay request normalization
Jul 27, 2026
ebbb1f3
fix(payment): harden epay compat review findings
Jul 27, 2026
3958046
fix(payment): bind epay duplicate orders to identity
Jul 27, 2026
5c80b03
fix(payment): close epay callback persistence gaps
Jul 27, 2026
7358a39
feat: add epay notification compatibility
Jul 27, 2026
0e58052
fix: harden epay callback processing
Jul 27, 2026
287382d
test: lock epay compatibility contracts
Jul 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 37 additions & 3 deletions docs/sql/init.sql
Original file line number Diff line number Diff line change
Expand Up @@ -267,7 +267,7 @@ CREATE TABLE `t_pay_order` (
`client_ip` VARCHAR(32) DEFAULT NULL COMMENT '客户端IP',
`subject` VARCHAR(64) NOT NULL COMMENT '商品标题',
`body` VARCHAR(256) NOT NULL COMMENT '商品描述信息',
`channel_extra` VARCHAR(512) DEFAULT NULL COMMENT '特定渠道发起额外参数',
`channel_extra` TEXT COMMENT '特定渠道发起额外参数',
`channel_user` VARCHAR(64) DEFAULT NULL COMMENT '渠道用户标识,如微信openId,支付宝账号',
`channel_order_no` VARCHAR(64) DEFAULT NULL COMMENT '渠道订单号',
`refund_state` TINYINT(6) NOT NULL DEFAULT '0' COMMENT '退款状态: 0-未发生实际退款, 1-部分退款, 2-全额退款',
Expand All @@ -279,8 +279,8 @@ CREATE TABLE `t_pay_order` (
`err_code` VARCHAR(128) DEFAULT NULL COMMENT '渠道支付错误码',
`err_msg` VARCHAR(256) DEFAULT NULL COMMENT '渠道支付错误描述',
`ext_param` VARCHAR(128) DEFAULT NULL COMMENT '商户扩展参数',
`notify_url` VARCHAR(128) NOT NULL default '' COMMENT '异步通知地址',
`return_url` VARCHAR(128) DEFAULT '' COMMENT '页面跳转地址',
`notify_url` TEXT NOT NULL COMMENT '异步通知地址',
`return_url` TEXT COMMENT '页面跳转地址',
`expired_time` DATETIME DEFAULT NULL COMMENT '订单失效时间',
`success_time` DATETIME DEFAULT NULL COMMENT '订单支付成功时间',
`created_at` TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
Expand Down Expand Up @@ -732,6 +732,14 @@ INSERT INTO t_pay_way (way_code, way_name) VALUES ('UP_BAR', '银联二维码(
INSERT INTO t_pay_way (way_code, way_name) VALUES ('UP_B2B', '银联企业网银支付');
INSERT INTO t_pay_way (way_code, way_name) VALUES ('UP_PC', '银联网关支付');
INSERT INTO t_pay_way (way_code, way_name) VALUES ('UP_JSAPI', '银联Js支付');
INSERT INTO t_pay_way (way_code, way_name, created_at, updated_at)
SELECT 'STARPOS_QR', '星驿付聚合收银台',
'2026-07-26 00:00:00.000',
'2026-07-26 00:00:00.000'
WHERE NOT EXISTS (
SELECT 1 FROM t_pay_way WHERE way_code = 'STARPOS_QR'
)
ON DUPLICATE KEY UPDATE way_code = VALUES(way_code);


-- 初始化支付接口定义
Expand Down Expand Up @@ -776,3 +784,29 @@ VALUES ('plspay', '计全付', 1, 0, 1,
'[{"wayCode": "ALI_APP"}, {"wayCode": "ALI_BAR"}, {"wayCode": "ALI_JSAPI"}, {"wayCode": "ALI_LITE"}, {"wayCode": "ALI_PC"}, {"wayCode": "ALI_QR"}, {"wayCode": "ALI_WAP"}, {"wayCode": "WX_APP"}, {"wayCode": "WX_BAR"}, {"wayCode": "WX_H5"}, {"wayCode": "WX_JSAPI"}, {"wayCode": "WX_LITE"}, {"wayCode": "WX_NATIVE"}]',
'http://jeequan.oss-cn-beijing.aliyuncs.com/jeepay/img/plspay.svg', '#0CACFF', 1, '计全付');

-- 星驿付普通商户通道
INSERT INTO t_pay_interface_define (
if_code, if_name, is_mch_mode, is_isv_mode, config_page_type,
isv_params, isvsub_mch_params, normal_mch_params, way_codes,
icon, bg_color, state, remark, created_at, updated_at
)
SELECT
'starpos',
'星驿付',
1,
0,
1,
NULL,
NULL,
'[{"name":"environment","desc":"环境配置","type":"radio","verify":"required","values":"test,uat,prod","titles":"测试环境,UAT环境,生产环境"},{"name":"agetId","desc":"代理商编号","type":"text","verify":"required"},{"name":"custId","desc":"商户编号","type":"text","verify":"required"},{"name":"publicKey","desc":"星驿付公钥","type":"textarea","verify":"required","star":"1"},{"name":"version","desc":"接口版本","type":"text","verify":"required"}]',
'[{"wayCode":"STARPOS_QR"}]',
NULL,
'#3B82F6',
1,
'星驿付官方通道',
'2026-07-26 00:00:00.000',
'2026-07-26 00:00:00.000'
WHERE NOT EXISTS (
SELECT 1 FROM t_pay_interface_define WHERE if_code = 'starpos'
)
ON DUPLICATE KEY UPDATE if_code = VALUES(if_code);
46 changes: 46 additions & 0 deletions docs/sql/patch.sql
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
##### 增量发布SQL #####

## -- EPAY 兼容下单:支付订单渠道元数据与回调地址改为 TEXT,避免长参数被截断
ALTER TABLE `t_pay_order`
MODIFY COLUMN `channel_extra` TEXT COMMENT '特定渠道发起额外参数',
MODIFY COLUMN `notify_url` TEXT NOT NULL COMMENT '异步通知地址',
MODIFY COLUMN `return_url` TEXT COMMENT '页面跳转地址';

## -- ++++ [v1.1.0] ===> [v1.1.1] ++++
## -- 新增: 支付测试, 重发通知, 通知最大次数保存到数据库
insert into t_sys_entitlement values('ENT_MCH_PAY_TEST', '支付测试', 'transaction', '/paytest', 'PayTestPage', 'ML', 0, 1, 'ENT_MCH_CENTER', '20', 'MCH', now(), now());
Expand Down Expand Up @@ -303,3 +309,43 @@ alter table t_transfer_order add column `channel_res_data` TEXT DEFAULT NULL COM


## -- ++++ [v3.1.0] ===> NEXT


## -- ++++ [20260726] ===> STARPOS

-- 星驿付聚合收银台支付方式
INSERT INTO t_pay_way (way_code, way_name, created_at, updated_at)
SELECT 'STARPOS_QR', '星驿付聚合收银台',
'2026-07-26 00:00:00.000',
'2026-07-26 00:00:00.000'
WHERE NOT EXISTS (
SELECT 1 FROM t_pay_way WHERE way_code = 'STARPOS_QR'
)
ON DUPLICATE KEY UPDATE way_code = VALUES(way_code);

-- 星驿付普通商户通道
INSERT INTO t_pay_interface_define (
if_code, if_name, is_mch_mode, is_isv_mode, config_page_type,
isv_params, isvsub_mch_params, normal_mch_params, way_codes,
icon, bg_color, state, remark, created_at, updated_at
)
SELECT
'starpos',
'星驿付',
1,
0,
1,
NULL,
NULL,
'[{"name":"environment","desc":"环境配置","type":"radio","verify":"required","values":"test,uat,prod","titles":"测试环境,UAT环境,生产环境"},{"name":"agetId","desc":"代理商编号","type":"text","verify":"required"},{"name":"custId","desc":"商户编号","type":"text","verify":"required"},{"name":"publicKey","desc":"星驿付公钥","type":"textarea","verify":"required","star":"1"},{"name":"version","desc":"接口版本","type":"text","verify":"required"}]',
'[{"wayCode":"STARPOS_QR"}]',
NULL,
'#3B82F6',
1,
'星驿付官方通道',
'2026-07-26 00:00:00.000',
'2026-07-26 00:00:00.000'
WHERE NOT EXISTS (
SELECT 1 FROM t_pay_interface_define WHERE if_code = 'starpos'
)
ON DUPLICATE KEY UPDATE if_code = VALUES(if_code);
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,7 @@ public interface IF_CODE{
String XXPAY = "xxpay"; // 小新支付
String PPPAY = "pppay"; // Paypal 支付
String PLSPAY = "plspay"; // 计全支付plus
String STARPOS = "starpos"; // 星驿付
}


Expand All @@ -157,6 +158,7 @@ public interface PAY_WAY_CODE{
// 特殊支付方式
String QR_CASHIER = "QR_CASHIER"; // ( 通过二维码跳转到收银台完成支付, 已集成获取用户ID的实现。 )
String AUTO_BAR = "AUTO_BAR"; // 条码聚合支付(自动分类条码类型)
String STARPOS_QR = "STARPOS_QR"; // 星驿付二维码支付

String ALI_BAR = "ALI_BAR"; //支付宝条码支付
String ALI_JSAPI = "ALI_JSAPI"; //支付宝服务窗支付
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.jeequan.jeepay.core.model.params.starpos;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.jeequan.jeepay.core.model.params.NormalMchParams;
import com.jeequan.jeepay.core.utils.StringKit;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;

/**
* 星驿付普通商户参数。
*/
@Data
public class StarposNormalMchParams extends NormalMchParams {

/** 环境:test、uat 或 prod。 */
private String environment;

/** 代理商编号。 */
private String agetId;

/** 商户编号。 */
private String custId;

/** 星驿付公钥。 */
private String publicKey;

/** 接口版本。 */
private String version = "1.0.0";

@Override
public String deSenData() {
StarposNormalMchParams mchParams = this;
if (StringUtils.isNotBlank(this.publicKey)) {
mchParams.setPublicKey(StringKit.str2Star(this.publicKey, 4, 4, 6));
}
return ((JSONObject) JSON.toJSON(mchParams)).toJSONString();
}
}
6 changes: 6 additions & 0 deletions jeepay-payment/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,12 @@
<artifactId>jeepay-sdk-java</artifactId>
<version>pls-1.3.0</version>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>


Expand Down
Loading