记得上下班打卡 | git大法好,push需谨慎

Commit 1650f26c authored by wangyifan's avatar wangyifan

离线支付-斗拱接口下单

parent ad80cb1e
......@@ -359,6 +359,9 @@ public class GoblinRedisConst {
public static final String GOBLIN_RECHARGE_WRISTBAND = PREFIX.concat("recharge:wristband");
public static final String GOBLIN_RECHARGE_MAIZHI_TOKEN = PREFIX.concat("recharge:maizhitoken");
// 手环订单
public static final String GOBLIN_BRACELET_USER = PREFIX.concat("bracelet:userId:");
/* ----------------------------------------------------------------- */
public static final String GOBLIN_ORDER_LOG = PREFIX.concat("order:log:");//无用
public static final String GOBLIN_EXPRESS_PRICE = PREFIX.concat("express:price");//快递费
......
package com.liquidnet.service.goblin.dto.vo;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* 手环-子订单VO
*/
@Data
public class GoblinBraceletOrderEntitiesVo {
/**
* 订单详情ID
*/
private String orderEntitiesId;
/**
* 订单详情关联ID
*/
private String orderId;
/**
* 商品类型:1:手环 2:充值面值
*/
private Integer goodsType;
/**
* 商品ID wristband_id:手环ID amount_id:充值金额ID
*/
private String goodsId;
/**
* 商品名称
*/
private String goodsName;
/**
* 商品金额
*/
private BigDecimal goodsPrice;
/**
* 订单状态:
* 0 待付款
* 1 已付款
* 2 已关闭
* 3 正在退款
* 4 已退款
* 5 待关闭
* 6 部分退款
*/
private Integer status;
/**
* 支付状态:
* 0 未支付
* 1 已支付
* 2 支付失败
*/
private Integer payStatus;
/**
* 创建时间
*/
private LocalDateTime createdAt;
/**
* 更新时间
*/
private LocalDateTime updatedAt;
}
package com.liquidnet.service.goblin.dto.vo;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
/**
* 手环-订单VO
*/
@Data
public class GoblinBraceletOrderVo {
/**
* 订单ID
*/
private String orderId;
/**
* 用户ID
*/
private String userId;
/**
* 绑定用户姓名
*/
private String bindName;
/**
* 绑定用户手机号
*/
private String bindMobile;
/**
* 绑定用户身份证号码
*/
private String bindIdcard;
/**
* 请求日期
*/
private String reqDate;
/**
* 商品描述
*/
private String goodsDesc;
/**
* 请求流水号
*/
private String reqSeqId;
/**
* 全局流水号
*/
private String hfSeqId;
/**
* 交易类型:
* T_JSAPI: 微信公众号支付
* T_MINIAPP: 微信小程序支付
* A_JSAPI: 支付宝JS
* A_NATIVE: 支付宝正扫
* U_NATIVE: 银联正扫
* U_JSAPI: 银联 JS
* D_NATIVE: 数字人民币正扫
* T_H5:微信直连H5支付
* T_APP:微信APP支付
* T_NATIVE:微信正扫
*/
private String tradeType;
/**
* ATU真实商户号
*/
private String atuSubMerId;
/**
* 用户账单上的交易订单号
*/
private String outTransId;
/**
* 用户账单上的商户订单号
*/
private String partyOrderId;
/**
* 支付完成时间 格式yyyyMMddHHmmss
*/
private String endTime;
/**
* 入账时间 格式为yyyyMMdd
*/
private String acctDate;
/**
* 单价
*/
private BigDecimal price;
/**
* 应付价格
*/
private BigDecimal priceTotal;
/**
* 实付价格
*/
private BigDecimal priceActual;
/**
* 退款价格
*/
private BigDecimal priceRefund;
/**
* 退款扣除的手续费金额
*/
private BigDecimal refundPriceCharges;
/**
* 退款数
*/
private Integer refundNumber;
/**
* 支付时间
*/
private String timePay;
/**
* 订单状态:
* 0 待付款
* 1 已付款
* 2 已关闭
* 3 正在退款
* 4 已退款
* 5 待关闭
* 6 部分退款
*/
private Integer status;
/**
* 支付状态:
* 0 未支付
* 1 已支付
* 2 支付失败
*/
private Integer payStatus;
/**
* 创建时间
*/
private LocalDateTime createdAt;
/**
* 更新时间
*/
private LocalDateTime updatedAt;
/**
* 订单详细列表VO
*/
private List<GoblinBraceletOrderEntitiesVo> orderEntitiesDetailVoList;
}
package com.liquidnet.service.goblin.dto.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.math.BigDecimal;
@Data
@EqualsAndHashCode(callSuper = false)
@ApiModel(value = "手环下单结果vo")
public class GoblinBraceletPayResultVo implements Serializable, Cloneable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(position = 1, value = "订单ID")
private String orderId;
@ApiModelProperty(position = 3, value = "价格")
private BigDecimal price;
@ApiModelProperty(position = 5, value = "三方支付信息")
private Object payInfo;
private static final GoblinBraceletPayResultVo obj = new GoblinBraceletPayResultVo();
......
package com.liquidnet.service.goblin.enums;
/**
* 订单状态枚举
*/
public enum OrderStatus {
PENDING_PAYMENT(0, "待付款"),
PAID(1, "已付款"),
CLOSED(2, "已关闭"),
REFUNDING(3, "正在退款"),
REFUNDED(4, "已退款"),
PENDING_CLOSE(5, "待关闭"),
PARTIAL_REFUND(6, "部分退款");
private final int code;
private final String description;
OrderStatus(int code, String description) {
this.code = code;
this.description = description;
}
public int getCode() {
return code;
}
public String getDescription() {
return description;
}
// 通过code获取对应的枚举值
public static OrderStatus fromCode(int code) {
for (OrderStatus status : values()) {
if (status.getCode() == code) {
return status;
}
}
throw new IllegalArgumentException("无效的状态码: " + code);
}
}
package com.liquidnet.service.goblin.enums;
/**
* 支付状态枚举
*/
public enum PayStatus {
NOT_PAID(0, "未支付"),
PAID(1, "已支付"),
PAYMENT_FAILED(2, "支付失败");
private final int code;
private final String description;
PayStatus(int code, String description) {
this.code = code;
this.description = description;
}
public int getCode() {
return code;
}
public String getDescription() {
return description;
}
// 根据 code 获取枚举实例
public static PayStatus fromCode(int code) {
for (PayStatus status : values()) {
if (status.getCode() == code) {
return status;
}
}
throw new IllegalArgumentException("无效的支付状态码: " + code);
}
@Override
public String toString() {
return description;
}
}
......@@ -23,15 +23,15 @@ public class GoblinBraceletOrderPayParam implements Serializable {
private String amountId;
@ApiModelProperty(value = "姓名")
@NotBlank(message = "姓名不能为空")
@NotBlank(message = "绑定姓名不能为空")
private String name;
@ApiModelProperty(value = "手机号")
@NotBlank(message = "手机号不能为空")
@NotBlank(message = "绑定手机号不能为空")
private String mobile;
@ApiModelProperty(value = "身份证号码")
@NotBlank(message = "身份证号码不能为空")
@NotBlank(message = "绑定身份证号码不能为空")
private String idCard;
@ApiModelProperty(value = "子商户用户标识")
......
package com.liquidnet.service.goblin.param.dougong;
import lombok.Data;
@Data
public class BaseDougongRequest<T> {
/**
* 系统号
* 渠道商/商户的huifu_id
* (1)当主体为渠道商时,此字段填写渠道商huifu_id;
* (2)当主体为直连商户时,此字段填写商户huifu_id;
*/
private String sysId;
/**
* 产品号
* 汇付分配的产品号,示例值:MCS
*/
private String productId;
/**
* 加签结果
*/
private String sign;
/**
* 数据
*/
private T data;
}
package com.liquidnet.service.goblin.param.dougong;
import lombok.Data;
/**
* 同步返回参数
* @param <T>
*/
@Data
public class BaseDougongResponse<T> {
/**
* 签名
*/
private String sign;
/**
* 响应内容体
*/
private T data;
}
......@@ -5,6 +5,10 @@ import lombok.Data;
import java.util.List;
/**
* 斗拱-请求jspay-参数
*/
@Data
public class DougongRequestParam {
......@@ -46,7 +50,7 @@ public class DougongRequestParam {
@JsonProperty("time_expire")
private String timeExpire;
// 微信参数集合
// 微信参数集合 WxData
@JsonProperty("wx_data")
private String wxData;
......
package com.liquidnet.service.goblin.param.dougong;
import lombok.Data;
/**
* 异步返回参数
* 公共返回
*/
@Data
public class DougongSyncCallbackparam {
private String respCode;
private String respDesc;
private String sign;
private String respData;
}
......@@ -8,10 +8,10 @@ public interface IGoblinBraceLetOrderService {
/**
* 下单
* @param data
* @param payParam
* @return
*/
ResponseDto<GoblinBraceletPayResultVo> checkOrder(GoblinBraceletOrderPayParam data);
ResponseDto<GoblinBraceletPayResultVo> checkOrder(GoblinBraceletOrderPayParam payParam);
/**
* 校验订单状态
......
package com.liquidnet.service.goblin.service;
import com.liquidnet.service.goblin.param.dougong.DougongRequestParam;
import com.liquidnet.service.goblin.param.dougong.DougongJsPayData;
import java.util.Map;
public interface IGoblinDougongPayService {
/**
*
* @return
*/
Object jsPay(DougongRequestParam requestParam);
Map<String, Object> jsPay(DougongJsPayData data);
}
......@@ -49,4 +49,6 @@ public class RedisKeyExpireConst {
// sweet:doudou:scope:mobile 过期时间3天
public static final long SWEET_DOUDOU_SCOPE_MOBILE_EXPIRE = 3 * 24 * 60 * 60;
// GOBLIN_BRACELET_USER 过期时间3天
public static final long GOBLIN_BRACELET_USER_EXPIRE = 30 * 24 * 60 * 60;
}
......@@ -15,4 +15,14 @@ liquidnet:
database-name: dev_ln_scene
mongodb:
sslEnabled: false
database: dev_ln_scene
\ No newline at end of file
database: dev_ln_scene
lxpay:
apps:
dougong:
huifu-id: '6666000109133323'
sys-id: '6666000108840829'
product-id: 'YYZY'
sub-app-id: 'wxdfe9a5d141f96685'
public-key: "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkmP0eyQVeGHVxk/4+Zq9R6tm8vmQZaMAvtvy5D/Ki3lvhfRn8T3R3vP5xTpp2zAtmZzFnc1k4DswYBsv7lsxwseoJ3sIM6of6NYnf+39CK+NhKSsdDNDET2KCxD5Gip3WJVtgP3P4w3P/U2jCi8Xzm9sxy3XZ3TSZuokvX77UnfBZTFMuGjCmZFcuM6VjDOxoaEtnYhAVLOQItb3Jr1vvIg4vrhCWBus9YVgl3Ua5qtTccmpspnFbY3ix0UFrmHczTaPWrxKMrnEIDurgmMPXPiyR67Z/AcvcJ8vgvaVHnINmDb0hlRUkI623P9dO/fPswaNIEj0ZeoZHcdLya07swIDAQAB"
private-key: "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDFOYOjLTndQiYAiFQf4ZZ6UA1T5fg2PH16XboAORgLBz/SjeiIMmIdExP1NFDH6SNqcQk6ginqk+gW0CBojEE5Loj3ROqtBRnBehVavO89xnvezsj1NZDqw416GYPCU0n6198A73c3Kn0OWoiivF5BJDra88z/zcApNzAeiVw6loZEEvzNRpfuKzs6uH6NeFQnY2wtePQwTAW5d89gUyewJSzwPPVU8r/hiPVKSB0AEkGT85UOBzaEKyAEqPfLAS/uY49Qdq+/j6lszNpjWcb6vkIeoHD3wmZdoHR7uLc+VxSk7kvJyLUv6SBtH3/jTy4ghFLQWJHagLB2QCPy9ompAgMBAAECggEAcG4JDMyLYAaFg2g0DLic/70C3AENLl3tagRkNBxYCHFpgK5FEN8n70sg5XedVVkiR1uI10G8g20tsVOUJgVOaTqN+effoCJ4PENMSR3LhHvRwYJALQkMQ8iWrjQ9WFoComzNQ8s/OsON5tDVc2/Oi3QL2SWCh5DTKqu7Uq0bVonYUX2IT8x7zWbE+tgphjI76JRDp4gkjh5ebebNBhqsOjYelNNWF3g7rVAr4zB2TMRM6N/66z/qLRk+mQQEhShojS2c2pyAtNC+7C6VZiX+XxH4ArSbf6AQyaMmPj4d3rMAYG916WNfb9GkqFyZhRNbMwRsAIfErS46PDKpKhInwQKBgQDnu4vV2U7Sqc/ab3hXh8H6d1HvxvTb7634XNyT/qtJ4nMT9CCxZE88iesqJyXNxzEElpLJRlwNPgDaJfs8qEjJ9zF6N/7ip9VPxITd5/6jBuILiugJSa7epvdZAtyVo1xOf2BN7cX/4Ul/SE11YjgyjLr1b3U4SY/Bc8w01Pmb+wKBgQDZ4Nq8u+k4GQh6G9pFSwgDxMnPUGX4vnWew7zsyy6z45tXuzFZrvpuzWTUUtnGalzXYGaUqm5ivmmP9+CCZBWaxZkSTF8ONRm1OXTRCJlF57AzXZVVc4+inhM8WnX6KIN/FDu4nlTf7wN6J42BcqOkz8KS9N7twpYartJnTPG7qwKBgQDhqVUHLtL/erYadSqvslhH3CJCaXDRLJoxndx/kiSjko2WBMpBdPlkbro/FlhOB4fIfAj9UDMcAiE6TnpWG1qmsr3P0u+3MNEdGLZ6kgz6HR3LN722LbbIw7djStIcNjURjCDwQnfqMi0scfBcOwWW1EzL7XotEhWXwXg+ipd4OQKBgQCotysK7UQ6sX/T9s99yw1IxdE0nWBpTysLpy0b/HaMzFqVhBpCBXJd7OUAWavTrrd3/GlTA+r4wdRCrMMIlXH5aLwQ5FzTRqFCqVxhJhRygmf6TqR+CD+YwGnK2Y30Cf1RoZxhaRH2WkJKDGjSbbB0xoE4hTA/0uejf+7kGTwzgwKBgBgcuEy5fxR5O+HkV/Lay/rrHznbJxOEJ/EiV2WDKDi1Acp1QZAKb1aguqx15j7t9exGUr6Y5eCfAFOQfzlePJuLthe5APEsuzv9nslnVusamWKkxoWl6h36OYQjTf1FCgOD7QCjhaiKKQQLsZGigmMKy2D5utIWQdNoLnlhayan"
notify-url: 'https://baidu.com'
......@@ -14,7 +14,7 @@ import java.time.LocalDateTime;
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class GoblinRechargeOrder implements Serializable {
public class GoblinBraceletOrder implements Serializable {
private static final long serialVersionUID = 1L;
......@@ -34,16 +34,6 @@ public class GoblinRechargeOrder implements Serializable {
*/
private String userId;
/**
* 用户昵称
*/
private String userName;
/**
* 用户手机号
*/
private String userMobile;
/**
* 绑定用户姓名
*/
......@@ -99,22 +89,6 @@ public class GoblinRechargeOrder implements Serializable {
*/
private String atuSubMerId;
/**
* 终端类型:
* 01-智能POS
* 02-扫码POS
* 03-云音箱
* 04-台牌
* 05-云打印
* 06-扫脸设备
* 07-收银机
* 08-收银助手
* 09-传统POS
* 10-一体音箱
* 11-虚拟终端
*/
private String deviceType;
/**
* 用户账单上的交易订单号
*/
......@@ -180,7 +154,7 @@ public class GoblinRechargeOrder implements Serializable {
* 5 待关闭
* 6 部分退款
*/
private Byte status;
private Integer status;
/**
* 支付状态:
......@@ -188,7 +162,7 @@ public class GoblinRechargeOrder implements Serializable {
* 1 已支付
* 2 支付失败
*/
private Byte payStatus;
private Integer payStatus;
/**
* 创建时间
......
......@@ -14,7 +14,7 @@ import java.time.LocalDateTime;
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class GoblinRechargeOrderEntities implements Serializable {
public class GoblinBraceletOrderEntities implements Serializable {
/**
* 主键ID
......@@ -37,7 +37,7 @@ public class GoblinRechargeOrderEntities implements Serializable {
/**
* 商品类型:1:手环 2:充值面值
*/
private Byte goodsType;
private Integer goodsType;
/**
* 商品ID wristband_id:手环ID amount_id:充值金额ID
......@@ -64,7 +64,7 @@ public class GoblinRechargeOrderEntities implements Serializable {
* 5 待关闭
* 6 部分退款
*/
private Byte status;
private Integer status;
/**
* 支付状态:
......@@ -72,7 +72,7 @@ public class GoblinRechargeOrderEntities implements Serializable {
* 1 已支付
* 2 支付失败
*/
private Byte payStatus;
private Integer payStatus;
/**
* 创建时间
......
......@@ -24,12 +24,10 @@ CREATE TABLE IF NOT EXISTS goblin_recharge_amount
-- 手环订单表
CREATE TABLE `goblin_recharge_order` (
CREATE TABLE goblin_bracelet_order (
`mid` int(10) unsigned NOT NULL AUTO_INCREMENT,
`order_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT 'order_id',
`user_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '用户id',
`user_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '用户昵称',
`user_mobile` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '用户手机号',
`bind_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '绑定用户姓名',
`bind_mobile` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '绑定用户手机号',
`bind_idcard` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '绑定用户身份证号码',
......@@ -39,7 +37,6 @@ CREATE TABLE `goblin_recharge_order` (
`hf_seq_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '全局流水号',
`trade_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '交易类型 T_JSAPI: 微信公众号支付 T_MINIAPP: 微信小程序支付 A_JSAPI: 支付宝JS A_NATIVE: 支付宝正扫 U_NATIVE: 银联正扫 U_JSAPI: 银联 JS D_NATIVE: 数字人民币正扫 T_H5:微信直连H5支付 T_APP:微信APP支付 T_NATIVE:微信正扫',
`atu_sub_mer_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT 'ATU真实商户号',
`device_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '终端类型 01-智能POS 02-扫码POS 03-云音箱 04-台牌 05-云打印 06-扫脸设备 07-收银机 08-收银助手 09-传统POS 10-一体音箱 11-虚拟终端',
`out_trans_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '用户账单上的交易订单号',
`party_order_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '用户账单上的商户订单号',
`end_time` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '支付完成时间 格式yyyyMMddHHmmss',
......@@ -60,7 +57,7 @@ CREATE TABLE `goblin_recharge_order` (
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='手环订单表';
-- 手环订单详情表
CREATE TABLE `goblin_recharge_order_entities` (
CREATE TABLE `goblin_bracelet_order_entities` (
`mid` int(10) unsigned NOT NULL AUTO_INCREMENT,
`order_entities_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT 'order_entities_id',
`order_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '订单详情关联id',
......
package com.liquidnet.service.goblin.config.properties;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.Map;
@ConfigurationProperties(prefix = "liquidnet.lxpay")
@Component
@Setter
@Getter
public class AppProperties {
private Map<String, AppInfo> apps;
@Data
public static class AppInfo {
private String productId;
private String sysId;
private String huifuId;
private String subAppId;
private String publicKey;
private String privateKey;
private String notifyUrl;
}
}
......@@ -4,6 +4,7 @@ import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.base.codec.vo.EncryptedReq;
import com.liquidnet.service.goblin.dto.vo.GoblinBraceletPayResultVo;
import com.liquidnet.service.goblin.param.GoblinBraceletOrderPayParam;
import com.liquidnet.service.goblin.param.dougong.DougongSyncCallbackparam;
import com.liquidnet.service.goblin.service.IGoblinBraceLetOrderService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
......@@ -19,7 +20,7 @@ import javax.validation.constraints.NotBlank;
@Slf4j
@Api(tags = "商城-手环相关")
@RestController
@RequestMapping("/goblin/bracelet")
@RequestMapping("/bracelet")
public class GoblinBraceletOrderController {
@Autowired
......@@ -50,7 +51,7 @@ public class GoblinBraceletOrderController {
@PostMapping("/callback")
@ApiOperation("斗拱支付回调")
public ResponseDto<Boolean> dougongCallBack() {
public ResponseDto<Boolean> dougongCallBack(@RequestBody DougongSyncCallbackparam dougongSyncCallbackparam) {
return braceLetOrderService.dougongCallBack();
}
......
......@@ -4,53 +4,98 @@ import com.huifu.bspay.sdk.opps.core.BasePay;
import com.huifu.bspay.sdk.opps.core.config.MerConfig;
import com.huifu.bspay.sdk.opps.core.net.BasePayRequest;
import com.liquidnet.commons.lang.util.JsonUtils;
import com.liquidnet.service.goblin.config.properties.AppProperties;
import com.liquidnet.service.goblin.param.dougong.DougongJsPayData;
import com.liquidnet.service.goblin.param.dougong.DougongRequestParam;
import com.liquidnet.service.goblin.service.IGoblinDougongPayService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import java.util.Map;
@Slf4j
@Service
public class GoblinDougongPayServiceImpl implements IGoblinDougongPayService {
// 汇付分配的产品号
public static final String DEMO_PRODUCT_ID = "YYZY";
private final AppProperties.AppInfo appInfo;
// 汇付分配的系统号
public static final String DEMO_SYS_ID = "6666000108840829";
// 服务商私钥,用于调用接口时进行签名
public static final String DEMO_RSA_PRIVATE_KEY = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDFOYOjLTndQiYAiFQf4ZZ6UA1T5fg2PH16XboAORgLBz/SjeiIMmIdExP1NFDH6SNqcQk6ginqk+gW0CBojEE5Loj3ROqtBRnBehVavO89xnvezsj1NZDqw416GYPCU0n6198A73c3Kn0OWoiivF5BJDra88z/zcApNzAeiVw6loZEEvzNRpfuKzs6uH6NeFQnY2wtePQwTAW5d89gUyewJSzwPPVU8r/hiPVKSB0AEkGT85UOBzaEKyAEqPfLAS/uY49Qdq+/j6lszNpjWcb6vkIeoHD3wmZdoHR7uLc+VxSk7kvJyLUv6SBtH3/jTy4ghFLQWJHagLB2QCPy9ompAgMBAAECggEAcG4JDMyLYAaFg2g0DLic/70C3AENLl3tagRkNBxYCHFpgK5FEN8n70sg5XedVVkiR1uI10G8g20tsVOUJgVOaTqN+effoCJ4PENMSR3LhHvRwYJALQkMQ8iWrjQ9WFoComzNQ8s/OsON5tDVc2/Oi3QL2SWCh5DTKqu7Uq0bVonYUX2IT8x7zWbE+tgphjI76JRDp4gkjh5ebebNBhqsOjYelNNWF3g7rVAr4zB2TMRM6N/66z/qLRk+mQQEhShojS2c2pyAtNC+7C6VZiX+XxH4ArSbf6AQyaMmPj4d3rMAYG916WNfb9GkqFyZhRNbMwRsAIfErS46PDKpKhInwQKBgQDnu4vV2U7Sqc/ab3hXh8H6d1HvxvTb7634XNyT/qtJ4nMT9CCxZE88iesqJyXNxzEElpLJRlwNPgDaJfs8qEjJ9zF6N/7ip9VPxITd5/6jBuILiugJSa7epvdZAtyVo1xOf2BN7cX/4Ul/SE11YjgyjLr1b3U4SY/Bc8w01Pmb+wKBgQDZ4Nq8u+k4GQh6G9pFSwgDxMnPUGX4vnWew7zsyy6z45tXuzFZrvpuzWTUUtnGalzXYGaUqm5ivmmP9+CCZBWaxZkSTF8ONRm1OXTRCJlF57AzXZVVc4+inhM8WnX6KIN/FDu4nlTf7wN6J42BcqOkz8KS9N7twpYartJnTPG7qwKBgQDhqVUHLtL/erYadSqvslhH3CJCaXDRLJoxndx/kiSjko2WBMpBdPlkbro/FlhOB4fIfAj9UDMcAiE6TnpWG1qmsr3P0u+3MNEdGLZ6kgz6HR3LN722LbbIw7djStIcNjURjCDwQnfqMi0scfBcOwWW1EzL7XotEhWXwXg+ipd4OQKBgQCotysK7UQ6sX/T9s99yw1IxdE0nWBpTysLpy0b/HaMzFqVhBpCBXJd7OUAWavTrrd3/GlTA+r4wdRCrMMIlXH5aLwQ5FzTRqFCqVxhJhRygmf6TqR+CD+YwGnK2Y30Cf1RoZxhaRH2WkJKDGjSbbB0xoE4hTA/0uejf+7kGTwzgwKBgBgcuEy5fxR5O+HkV/Lay/rrHznbJxOEJ/EiV2WDKDi1Acp1QZAKb1aguqx15j7t9exGUr6Y5eCfAFOQfzlePJuLthe5APEsuzv9nslnVusamWKkxoWl6h36OYQjTf1FCgOD7QCjhaiKKQQLsZGigmMKy2D5utIWQdNoLnlhayan";
public GoblinDougongPayServiceImpl(AppProperties appProperties) {
this.appInfo = appProperties.getApps().get("dougong");
if (this.appInfo == null) {
throw new IllegalArgumentException("找不到应用配置");
}
}
// 汇付公钥,用于对汇付返回报文进行签名验证
public static final String DEMO_RSA_PUBLIC_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkmP0eyQVeGHVxk/4+Zq9R6tm8vmQZaMAvtvy5D/Ki3lvhfRn8T3R3vP5xTpp2zAtmZzFnc1k4DswYBsv7lsxwseoJ3sIM6of6NYnf+39CK+NhKSsdDNDET2KCxD5Gip3WJVtgP3P4w3P/U2jCi8Xzm9sxy3XZ3TSZuokvX77UnfBZTFMuGjCmZFcuM6VjDOxoaEtnYhAVLOQItb3Jr1vvIg4vrhCWBus9YVgl3Ua5qtTccmpspnFbY3ix0UFrmHczTaPWrxKMrnEIDurgmMPXPiyR67Z/AcvcJ8vgvaVHnINmDb0hlRUkI623P9dO/fPswaNIEj0ZeoZHcdLya07swIDAQAB";
static {
@PostConstruct
public void init() {
MerConfig merConfig = new MerConfig();
merConfig.setProcutId(DEMO_PRODUCT_ID);
merConfig.setSysId(DEMO_SYS_ID);
merConfig.setRsaPrivateKey(DEMO_RSA_PRIVATE_KEY);
merConfig.setRsaPublicKey(DEMO_RSA_PUBLIC_KEY);
merConfig.setProcutId(appInfo.getProductId());
merConfig.setSysId(appInfo.getSysId());
merConfig.setRsaPrivateKey(appInfo.getPrivateKey());
merConfig.setRsaPublicKey(appInfo.getPublicKey());
try {
BasePay.initWithMerConfig(merConfig);
} catch (Exception e) {
throw new RuntimeException(e);
log.error("初始化支付配置失败", e);
throw new RuntimeException("初始化支付配置失败", e);
}
}
@Override
public Object jsPay(DougongRequestParam requestParam) {
public Map<String, Object> jsPay(DougongJsPayData data) {
DougongRequestParam requestParam = buildDougongRequestParam(data);
log.info("request param: {}.", JsonUtils.toJson(requestParam));
if (requestParam == null) {
log.error("构建下单参数失败");
return null;
}
try {
Map<String, Object> map = JsonUtils.fromJson(JsonUtils.toJson(requestParam), Map.class);
//3. 发起API调用
Map<String, Object> response = BasePayRequest.requestBasePay("v3/trade/payment/jspay", map, null, false);
return response;
log.info("response: {}.", JsonUtils.toJson(response));
if (response != null && "00000100".equals(response.get("resp_code"))
&& "P".equals(response.get("trans_stat"))){
return response;
}
} catch (Exception e) {
log.error("error", e);
}
return new Object();
return null;
}
private DougongRequestParam buildDougongRequestParam(DougongJsPayData data){
if (data == null) {
return null;
}
DougongRequestParam requestParam = new DougongRequestParam();
requestParam.setReqDate(data.getReqDate());
requestParam.setReqSeqId(data.getReqSeqId());
requestParam.setHuifuId(appInfo.getHuifuId());
requestParam.setGoodsDesc(data.getGoodsDesc());
requestParam.setTradeType(data.getTradeType());
requestParam.setTransAmt(data.getTransAmt());
requestParam.setTimeExpire(data.getTimeExpire());
requestParam.setWxData(buildWxData(data));
requestParam.setNotifyUrl(appInfo.getNotifyUrl());
return requestParam;
}
private String buildWxData(DougongJsPayData data) {
DougongRequestParam.WxData wxData = new DougongRequestParam.WxData();
wxData.setSubAppid(appInfo.getSubAppId());
wxData.setSubOpenid(data.getSubOpenid());
wxData.setBody(data.getGoodsDesc());
wxData.setDetail(buildWxDataDetail(data));
return JsonUtils.toJson(wxData);
}
private DougongRequestParam.WxDataDetail buildWxDataDetail(DougongJsPayData data) {
DougongRequestParam.WxDataDetail wxDataDetail = new DougongRequestParam.WxDataDetail();
wxDataDetail.setCostPrice(data.getTransAmt());
wxDataDetail.setGoodsDetail(data.getGoodsDetailList());
return wxDataDetail;
}
}
......@@ -8,6 +8,7 @@ import com.liquidnet.commons.lang.util.JsonUtils;
import com.liquidnet.commons.lang.util.RandomUtil;
import com.liquidnet.service.base.ErrorMapping;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.base.constant.RedisKeyExpireConst;
import com.liquidnet.service.galaxy.constant.GalaxyEnum;
import com.liquidnet.service.goblin.constant.GoblinRedisConst;
import com.liquidnet.service.goblin.constant.GoblinStatusConst;
......@@ -2951,6 +2952,23 @@ public class GoblinRedisUtils {
}
}
public void setBraceletOrderVo(GoblinBraceletOrderVo orderVo) {
String key = GoblinRedisConst.GOBLIN_BRACELET_USER.concat(orderVo.getUserId()).concat("orderId:").concat(orderVo.getOrderId());
redisUtil.set(key, orderVo, RedisKeyExpireConst.GOBLIN_BRACELET_USER_EXPIRE);
}
public GoblinBraceletOrderVo getBraceletOrderVo(String uid, String orderId){
String key = GoblinRedisConst.GOBLIN_BRACELET_USER.concat(uid).concat("orderId:").concat(orderId);
Object obj = redisUtil.get(key);
if (obj == null) {
// TODO 从数据库查询
return null;
}else {
return (GoblinBraceletOrderVo)obj;
}
}
/* ---------------------------------------- ---------------------------------------- */
/* ---------------------------------------- ---------------------------------------- */
/* ---------------------------------------- ---------------------------------------- */
......
......@@ -194,4 +194,7 @@ goblin_sku.stock=UPDATE goblin_goods_sku SET sku_stock = ? , stock = ?, updated_
#----
candy_user_coupon.update_apply_refund=UPDATE candy_user_coupon SET state=?,operator=?,updated_at=? WHERE ucoupon_id=?
#----
#----
\ No newline at end of file
#----
# ---- \u624B\u73AF\u8BA2\u5355 ----
goblin_bracelet_order_insert = INSERT INTO `goblin_bracelet_order`(`order_id`, `user_id`, `bind_name`, `bind_mobile`, `bind_idcard`, `req_date`, `goods_desc`, `req_seq_id`, `hf_seq_id`, `trade_type`, `atu_sub_mer_id`, `party_order_id`, `price`, `price_total`, `price_refund`, `refund_price_charges`, `refund_number`, `status`, `pay_status`, `created_at`, `updated_at`) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
goblin_bracelet_order_entities_insert = INSERT INTO `goblin_bracelet_order_entities`(`order_entities_id`, `order_id`, `goods_type`, `goods_id`, `goods_name`, `goods_price`, `status`, `pay_status`, `created_at`, `updated_at`) VALUES (?,?,?,?,?,?,?,?,?,?)
\ No newline at end of file
package com.liquidnet.service.goblin.test;
import com.liquidnet.commons.lang.util.IDGenerator;
import com.liquidnet.commons.lang.util.JsonUtils;
import com.liquidnet.service.goblin.param.dougong.DougongJsPayData;
import com.liquidnet.service.goblin.param.dougong.DougongRequestParam;
import com.liquidnet.service.goblin.service.IGoblinDougongPayService;
import lombok.extern.slf4j.Slf4j;
......@@ -47,20 +49,13 @@ public class GoblinDougongPayServiceImplTest {
String goodsDesc = "手环充值";
// 商品金额
BigDecimal totalAmt = new BigDecimal("51.00");
// 商品请求流水号
String setReqSeqId = "rQ20250704120340912341";
// 请求日期
String reqDate = "20250704";
String reqDate = "20250707";
// 交易类型
String tradeType = "T_MINIAPP";
DougongRequestParam requestParam = new DougongRequestParam();
requestParam.setReqDate(reqDate);
requestParam.setReqSeqId(setReqSeqId);
requestParam.setHuifuId("6666000109133323");//TODO 配置
requestParam.setGoodsDesc(goodsDesc);
requestParam.setTradeType(tradeType);
requestParam.setTransAmt(totalAmt.toString());
requestParam.setTimeExpire("20250718235959"); //TODO 在计算
requestParam.setNotifyUrl("http://www.baidu.com");//TODO 配置
......@@ -75,19 +70,17 @@ public class GoblinDougongPayServiceImplTest {
wxDataGoodsDetails.add(wxDataGoodsDetail);
}
DougongRequestParam.WxDataDetail wxDataDetail = new DougongRequestParam.WxDataDetail();
wxDataDetail.setCostPrice(totalAmt.toString());
wxDataDetail.setGoodsDetail(wxDataGoodsDetails);
DougongRequestParam.WxData wxData = new DougongRequestParam.WxData();
wxData.setSubAppid("wxdfe9a5d141f96685");//TODO 配置
wxData.setSubOpenid("o8jhotzittQSetZ-N0Yj4Hz91Rqc"); //TODO 前端带过来
wxData.setBody(goodsDesc);
wxData.setDetail(wxDataDetail);
requestParam.setWxData(JsonUtils.toJson(wxData));
System.out.println(goblinDougongPayService.jsPay(requestParam));
DougongJsPayData dougongJsPayData = new DougongJsPayData();
dougongJsPayData.setReqDate(reqDate);
dougongJsPayData.setReqSeqId(IDGenerator.nextSnowId());
dougongJsPayData.setGoodsDesc(goodsDesc);
dougongJsPayData.setTradeType(tradeType);
dougongJsPayData.setTransAmt(totalAmt.toString());
dougongJsPayData.setTimeExpire("20250718235959"); //TODO 在计算
dougongJsPayData.setSubOpenid("o8jhotzittQSetZ-N0Yj4Hz91Rqc"); //TODO 前端带过来
dougongJsPayData.setGoodsDetailList(wxDataGoodsDetails);
System.out.println(goblinDougongPayService.jsPay(dougongJsPayData));
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment