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

Commit a62b91a0 authored by wangyifan's avatar wangyifan

离线支付-斗拱接口回调

parent 8e1176be
......@@ -365,7 +365,9 @@ public class GoblinRedisConst {
public static final String GOBLIN_RECHARGE_DEVICE_NUMBER_ENDTIME = PREFIX.concat("recharge:deviceNumber:endtime:operationNo:");
// 手环订单
public static final String GOBLIN_BRACELET_USER = PREFIX.concat("bracelet:userId:");
public static final String GOBLIN_BRACELET_ORDERID = PREFIX.concat("bracelet:orderId:");
public static final String GOBLIN_BRACELET_RELATED_ORDER = PREFIX.concat("bracelet:reqSeqId:");
/* ----------------------------------------------------------------- */
public static final String GOBLIN_ORDER_LOG = PREFIX.concat("order:log:");//无用
......
package com.liquidnet.service.goblin.dto.vo;
import lombok.Data;
/**
*
*/
@Data
public class GoblinBraceletRelatedOrderVo {
// 用户ID
private String uid;
// 手环订单ID
private String orderId;
// 调用斗拱请求ID
private String reqSeqId;
}
......@@ -4,6 +4,10 @@ import lombok.Data;
import java.util.List;
/**
* 调用斗拱业务层参数
*/
@Data
public class DougongJsPayData {
......
package com.liquidnet.service.goblin.param.dougong;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
@Data
public class DougongSyncCallbackRespData {
// 业务响应码
@JsonProperty("resp_code")
private String respCode;
//业务响应信息
@JsonProperty("resp_code")
private String respDesc;
//商户号
@JsonProperty("huifu_id")
private String huifuId;
//请求流水号
@JsonProperty("req_seq_id")
private String reqSeqId;
//请求日期
@JsonProperty("req_date")
private String reqDate;
//交易类型
@JsonProperty("trans_type")
private String transType;
//全局流水号
@JsonProperty("hf_seq_id")
private String hfSeqId;
//交易金额
@JsonProperty("trans_amt")
private String transAmt;
//消费者实付金额
@JsonProperty("pay_amt")
private String payAmt;
// 支付完成时间 格式yyyyMMddHHmmss
@JsonProperty("end_time")
private String endTime;
//入账时间 格式为yyyyMMdd
@JsonProperty("acct_date")
private String acctDate;
// 交易状态 S:成功、F:失败,交易状态以此字段为准
@JsonProperty("trans_stat")
private String transStat;
//通知类型 1:通道通知,2:账务通知
@JsonProperty("notify_type")
private Integer notifyType;
@JsonProperty("out_trans_id")
private String outTransId;
}
......@@ -3,8 +3,9 @@ package com.liquidnet.service.goblin.service;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.goblin.dto.vo.GoblinBraceletPayResultVo;
import com.liquidnet.service.goblin.param.GoblinBraceletOrderPayParam;
import com.liquidnet.service.goblin.param.dougong.DougongSyncCallbackparam;
public interface IGoblinBraceLetOrderService {
public interface IGoblinBraceletOrderService {
/**
* 下单
......@@ -24,5 +25,5 @@ public interface IGoblinBraceLetOrderService {
* 斗拱支付回调
* @return
*/
ResponseDto<Boolean> dougongCallBack();
ResponseDto<Boolean> dougongCallBack(DougongSyncCallbackparam callbackparam);
}
......@@ -11,4 +11,5 @@ public interface IGoblinDougongPayService {
*/
Map<String, Object> jsPay(DougongJsPayData data);
boolean verifySign(String data, String sign);
}
......@@ -51,4 +51,6 @@ public class RedisKeyExpireConst {
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;
// GOBLIN_BRACELET_RELATED_ORDER 过期30天
public static final long GOBLIN_BRACELET_RELATED_ORDER_EXPIRE = 30 * 24 * 60 * 60;
}
......@@ -5,7 +5,7 @@ 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 com.liquidnet.service.goblin.service.IGoblinBraceletOrderService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
......@@ -24,7 +24,7 @@ import javax.validation.constraints.NotBlank;
public class GoblinBraceletOrderController {
@Autowired
private IGoblinBraceLetOrderService braceLetOrderService;
private IGoblinBraceletOrderService braceLetOrderService;
@PostMapping("/pre")
// @ApiOperation("下单(加密)")
......@@ -52,7 +52,7 @@ public class GoblinBraceletOrderController {
@PostMapping("/callback")
@ApiOperation("斗拱支付回调")
public ResponseDto<Boolean> dougongCallBack(@RequestBody DougongSyncCallbackparam dougongSyncCallbackparam) {
return braceLetOrderService.dougongCallBack();
return braceLetOrderService.dougongCallBack(dougongSyncCallbackparam);
}
}
......@@ -10,7 +10,8 @@ import com.liquidnet.service.goblin.enums.PayStatus;
import com.liquidnet.service.goblin.param.GoblinBraceletOrderPayParam;
import com.liquidnet.service.goblin.param.dougong.DougongJsPayData;
import com.liquidnet.service.goblin.param.dougong.DougongRequestParam;
import com.liquidnet.service.goblin.service.IGoblinBraceLetOrderService;
import com.liquidnet.service.goblin.param.dougong.DougongSyncCallbackparam;
import com.liquidnet.service.goblin.service.IGoblinBraceletOrderService;
import com.liquidnet.service.goblin.service.IGoblinDougongPayService;
import com.liquidnet.service.goblin.service.IGoblinRechargeWristbandService;
import com.liquidnet.service.goblin.util.GoblinRedisUtils;
......@@ -27,7 +28,7 @@ import java.util.stream.Collectors;
@Slf4j
@Service
public class GoblinBraceLetOrderServiceImpl implements IGoblinBraceLetOrderService {
public class GoblinBraceletOrderServiceImpl implements IGoblinBraceletOrderService {
@Autowired
GoblinRedisUtils goblinRedisUtils;
......@@ -102,14 +103,11 @@ public class GoblinBraceLetOrderServiceImpl implements IGoblinBraceLetOrderServi
// 根据响应接口填充参数
orderVo.setHfSeqId((String) dougongResponseMap.get("hf_seq_id"));
orderVo.setAtuSubMerId((String) dougongResponseMap.get("atu_sub_mer_id"));
// orderVo.setOutTransId(dougongResponseMap.get(""));
orderVo.setPartyOrderId((String) dougongResponseMap.get("party_order_id"));
// orderVo.setEndTime(dougongResponseMap.get(""));
// orderVo.setAcctDate(dougongResponseMap.get(""));
// orderVo.setPriceActual(dougongResponseMap.get(""));
// 5. 根据响应结构写 redis、mysql
goblinRedisUtils.setBraceletOrderVo(orderVo);
goblinRedisUtils.setBraceletRelatedOrderVo(orderVo.getReqSeqId(), orderVo.getOrderId());
LinkedList<String> sqls = CollectionUtil.linkedListString();
sqls.add(SqlMapping.get("goblin_bracelet_order_insert"));
......@@ -246,16 +244,94 @@ public class GoblinBraceLetOrderServiceImpl implements IGoblinBraceLetOrderServi
@Override
public ResponseDto<Integer> checkOrderResult(String orderId) {
final String uid = CurrentUtil.getCurrentUid();
GoblinBraceletOrderVo braceletOrderVo = goblinRedisUtils.getBraceletOrderVo(uid, orderId);
GoblinBraceletOrderVo braceletOrderVo = goblinRedisUtils.getBraceletOrderVo(orderId);
if (braceletOrderVo == null) {
log.error("订单不存在");
return ResponseDto.failure("订单不存在");
}
if (!uid.equals(braceletOrderVo.getUserId())) {
log.error("暂无权限");
return ResponseDto.failure("暂无权限");
}
return ResponseDto.success(braceletOrderVo.getPayStatus());
}
@Override
public ResponseDto<Boolean> dougongCallBack() {
return null;
public ResponseDto<Boolean> dougongCallBack(DougongSyncCallbackparam callbackparam) {
log.info("斗拱回调参数: {}.", JsonUtils.toJson(callbackparam));
// 验签
boolean verifySign = dougongPayService.verifySign(callbackparam.getRespData(), callbackparam.getSign());
// 2. 判断验签结果
if (!verifySign) {
log.error("斗拱回调验签失败");
return ResponseDto.failure();
}
try {
Map<String, Object> callbackRespDataMap = JsonUtils.fromJson(callbackparam.getRespData(), Map.class);
if (callbackRespDataMap == null || !"00000000".equals(callbackRespDataMap.get("resp_code"))) {
log.error("斗拱回调数据为空");
return ResponseDto.failure();
}
final String reqSeqId = (String) callbackRespDataMap.get("req_seq_id");
final String orderId = goblinRedisUtils.getBraceletRelatedOrderVo(reqSeqId);
if (StringUtil.isBlank(orderId)) {
log.error("未找到对应的订单, reqSeqId: {}.", reqSeqId);
return ResponseDto.failure();
}
GoblinBraceletOrderVo orderVo = goblinRedisUtils.getBraceletOrderVo(orderId);
if (orderVo == null) {
log.error("未找到对应的订单, reqSeqId: {}.", reqSeqId);
return ResponseDto.failure();
}
orderVo.setOutTransId((String) callbackRespDataMap.get("out_trans_id"));
orderVo.setEndTime((String) callbackRespDataMap.get("end_time"));
orderVo.setAcctDate((String) callbackRespDataMap.get("acct_date"));
orderVo.setPriceActual(new BigDecimal((String) callbackRespDataMap.get("pay_amt")));
orderVo.setTimePay((String) callbackRespDataMap.get("end_time"));
orderVo.setUpdatedAt(LocalDateTime.now());
if ("S".equalsIgnoreCase((String) callbackRespDataMap.get("trans_stat"))) {
// 斗拱返回成功
updateOrderStatus(OrderStatus.PAID.getCode(), PayStatus.PAID.getCode(), orderVo);
}else {
// 斗拱返回失败
updateOrderStatus(OrderStatus.PENDING_PAYMENT.getCode(), PayStatus.PAYMENT_FAILED.getCode(), orderVo);
}
// 更新redis
goblinRedisUtils.setBraceletOrderVo(orderVo);
// 更新MySQL
queueUtils.sendMsgByRedis(MQConst.GoblinQueue.SQL_GOODS.getKey(),
SqlMapping.get("gpblin_bracelet_order_update", orderVo.getOutTransId(), orderVo.getEndTime(),
orderVo.getAcctDate(), orderVo.getPriceActual(), orderVo.getTimePay(), orderVo.getUpdatedAt(), orderVo.getOrderId())
);
for (GoblinBraceletOrderEntitiesVo entitiesVo : orderVo.getOrderEntitiesDetailVoList()) {
queueUtils.sendMsgByRedis(MQConst.GoblinQueue.SQL_GOODS.getKey(),
SqlMapping.get("goblie_bracelet_order_entities_update", entitiesVo.getStatus(),
entitiesVo.getPayStatus(), entitiesVo.getUpdatedAt(), entitiesVo.getOrderEntitiesId())
);
}
return ResponseDto.success(Boolean.TRUE);
} catch (Exception e) {
log.error("error", e);
return ResponseDto.failure();
}
}
private void updateOrderStatus(int statusCode, int payStatusCode, GoblinBraceletOrderVo orderVo) {
orderVo.setStatus(statusCode);
orderVo.setPayStatus(payStatusCode);
List<GoblinBraceletOrderEntitiesVo> orderEntitiesDetailVoList = orderVo.getOrderEntitiesDetailVoList();
for (GoblinBraceletOrderEntitiesVo entitiesVo : orderEntitiesDetailVoList) {
entitiesVo.setStatus(statusCode);
entitiesVo.setPayStatus(payStatusCode);
entitiesVo.setUpdatedAt(LocalDateTime.now());
}
}
}
......@@ -8,6 +8,7 @@ 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 com.liquidnet.service.goblin.util.DougongSignUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
......@@ -66,6 +67,12 @@ public class GoblinDougongPayServiceImpl implements IGoblinDougongPayService {
return null;
}
@Override
public boolean verifySign(String data, String sign) {
boolean verify = DougongSignUtils.verify(data, appInfo.getPublicKey(), sign);
return verify;
}
private DougongRequestParam buildDougongRequestParam(DougongJsPayData data){
if (data == null) {
return null;
......
......@@ -2952,13 +2952,34 @@ public class GoblinRedisUtils {
}
}
public void setBraceletRelatedOrderVo(String reqSeqId, String orderId){
String key = GoblinRedisConst.GOBLIN_BRACELET_RELATED_ORDER.concat(reqSeqId);
redisUtil.set(key, orderId, RedisKeyExpireConst.GOBLIN_BRACELET_RELATED_ORDER_EXPIRE);
}
/**
*
* @param reqSeqId 调用斗拱-请求流水号
* @return
*/
public String getBraceletRelatedOrderVo(String reqSeqId){
String key = GoblinRedisConst.GOBLIN_BRACELET_RELATED_ORDER.concat(reqSeqId);
Object obj = redisUtil.get(key);
if (obj == null) {
// TODO 从数据库查询
return null;
}else {
return (String) obj;
}
}
public void setBraceletOrderVo(GoblinBraceletOrderVo orderVo) {
String key = GoblinRedisConst.GOBLIN_BRACELET_USER.concat(orderVo.getUserId()).concat("orderId:").concat(orderVo.getOrderId());
String key = GoblinRedisConst.GOBLIN_BRACELET_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);
public GoblinBraceletOrderVo getBraceletOrderVo(String orderId){
String key = GoblinRedisConst.GOBLIN_BRACELET_ORDERID.concat(orderId);
Object obj = redisUtil.get(key);
if (obj == null) {
// TODO 从数据库查询
......
......@@ -197,4 +197,6 @@ candy_user_coupon.update_apply_refund=UPDATE candy_user_coupon SET state=?,opera
#----
# ---- \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
gpblin_bracelet_order_update= update goblin_bracelet_order set out_trans_id=?, end_time=?, acct_date=?, price_actual=?, time_pay=?, updated_at=? where order_id=?
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 (?,?,?,?,?,?,?,?,?,?)
goblie_bracelet_order_entities_update = update goblin_bracelet_order_entities set status=?, pay_status=?, updated_at=? where order_entities_id=?
\ No newline at end of file
package com.liquidnet.service.goblin.test;
import com.liquidnet.commons.lang.util.JsonUtils;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.goblin.param.dougong.DougongSyncCallbackparam;
import com.liquidnet.service.goblin.service.IGoblinBraceletOrderService;
import lombok.extern.slf4j.Slf4j;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.Map;
@Slf4j
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class GoblinBraceletOrderServiceTest {
@Autowired
private IGoblinBraceletOrderService goblinBraceletorderservice;
@Test
public void dougongCallBackTest(){
DougongSyncCallbackparam callbackparam = new DougongSyncCallbackparam();
callbackparam.setRespCode("00000000");
callbackparam.setSign("gsbW6XtkMbtpM9kI2sZ+aAMB2/QHH7YFN7ecBcfUmPe93LdC+BwKPxhT587zr7LlDzwfhmv+xVcbWTKrol5THa7dK8+RqYNbijKxZFba+oNi2dVWeRmSXVgL5yZ8+DsrXdTms9uv5WP19vuLMVh+UCh1n7zDBhJPMsW6w9LPEaCWXJcLJ8xgzBm/JtAQNZO7WWxFdHJShYmUssRfQvq8a/TXwBxlAB07hjQmI9rhTDL0UY39sfh1a9NVUrwmRPunDtq9WvV+/8I3VL4yZNWO9w4V56VrZj24SmmHBb2EDeHzx4qfky6DK9Djk/ZJBqFeOi/N0YKkzR6X2CsL7ab72A==");
callbackparam.setRespDesc("交易成功[000]");
callbackparam.setRespData("{\"acct_id\":\"F00300982\",\"acct_split_bunch\":{\"acct_infos\":[{\"acct_id\":\"F00300982\",\"div_amt\":\"0.02\",\"huifu_id\":\"6666000109133323\"}],\"fee_acct_id\":\"F00380563\",\"fee_amt\":\"0.01\",\"fee_huifu_id\":\"6666000109133323\"},\"acct_stat\":\"I\",\"atu_sub_mer_id\":\"460360228\",\"avoid_sms_flag\":\"\",\"bagent_id\":\"6666000108840829\",\"bank_code\":\"SUCCESS\",\"bank_desc\":\"交易成功\",\"bank_message\":\"交易成功\",\"bank_order_no\":\"4200002303202406139053495866\",\"bank_seq_id\":\"800448\",\"bank_type\":\"OTHERS\",\"base_acct_id\":\"F00300982\",\"batch_id\":\"240613\",\"channel_type\":\"U\",\"charge_flags\":\"758_0\",\"combinedpay_data\":[],\"combinedpay_fee_amt\":\"0.00\",\"debit_type\":\"0\",\"delay_acct_flag\":\"N\",\"div_flag\":\"0\",\"end_time\":\"20240613105518\",\"fee_amount\":\"0.01\",\"fee_amt\":\"0.01\",\"fee_flag\":1,\"fee_formula_infos\":[{\"fee_formula\":\"MAX(0.01,AMT*0.01)\",\"fee_type\":\"TRANS_FEE\"}],\"fee_rec_type\":\"1\",\"fee_type\":\"OUTSIDE\",\"gate_id\":\"VN\",\"hf_seq_id\":\"002900TOP2B240613105504P831ac139c2000000\",\"huifu_id\":\"6666000109133323\",\"is_delay_acct\":\"0\",\"is_div\":\"0\",\"maze_resp_code\":\"\",\"mer_name\":\"上海汇涵信息科技服务有限公司\",\"mer_ord_id\":\"20240613105441800448\",\"mypaytsf_discount\":\"0.00\",\"need_big_object\":true,\"notify_type\":1,\"org_auth_no\":\"\",\"org_huifu_seq_id\":\"\",\"org_trans_date\":\"\",\"out_ord_id\":\"4200002303202406139053495866\",\"out_trans_id\":\"4200002303202406139053495866\",\"party_order_id\":\"03242406133930500803797\",\"pay_amt\":\"0.02\",\"pay_scene\":\"02\",\"posp_seq_id\":\"03242406133930500803797\",\"product_id\":\"YYZY\",\"ref_no\":\"105504800448\",\"req_date\":\"20240613\",\"req_seq_id\":\"20240613105441800448\",\"resp_code\":\"00000000\",\"resp_desc\":\"交易成功\",\"risk_check_data\":{\"ip_addr\":\"192.1.1.1\"},\"risk_check_info\":{\"client_ip\":\"192.1.1.1\"},\"settlement_amt\":\"0.02\",\"sub_resp_code\":\"00000000\",\"sub_resp_desc\":\"交易成功\",\"subsidy_stat\":\"I\",\"sys_id\":\"6666000108840829\",\"trade_type\":\"T_JSAPI\",\"trans_amt\":\"0.02\",\"trans_date\":\"20240613\",\"trans_fee_allowance_info\":{\"actual_fee_amt\":\"0.01\",\"allowance_fee_amt\":\"0.00\",\"allowance_type\":\"0\",\"cur_allowance_config_infos\":{\"activity_id\":\"AYYZY202403281643407965739\",\"activity_name\":\"\",\"allowance_sys\":\"1\",\"allowance_sys_id\":\"1234567891011\",\"create_by\":\"yunlong.zhang\",\"create_time\":1711615421000,\"end_time\":\"20241201\",\"human_flag\":\"N\",\"is_delay_allowance\":\"2\",\"is_share\":\"Y\",\"merchant_group\":\"6666000109133323\",\"pos_credit_limit_amt\":\"1000.00\",\"pos_debit_limit_amt\":\"1000.00\",\"pos_limit_amt\":\"2000.00\",\"qr_limit_amt\":\"1.00\",\"start_time\":\"20240101\",\"status\":\"1\",\"total_limit_amt\":\"1900.00\",\"update_time\":1711615421000},\"no_allowance_desc\":\"8\",\"receivable_fee_amt\":\"0.01\"},\"trans_order_info\":{\"acct_id\":\"F00300982\",\"acct_stat\":\"I\",\"agent_id\":\"6666000108840829\",\"atu_sub_mer_id\":\"460360228\",\"bagent_id\":\"6666000108840829\",\"bank_mer_id\":\"W1035134718836156463\",\"bank_mer_name\":\"上海汇涵信息科技服务有限公司\",\"bank_resp_code\":\"SUCCESS\",\"bank_resp_desc\":\"交易成功\",\"bank_seq_id\":\"800448\",\"bank_type\":\"OTHERS\",\"batch_id\":\"240613\",\"card_channel_type\":\"\",\"card_sign\":\"\",\"cash_req_date\":\"20240613105504\",\"cash_resp_code\":\"000\",\"cash_resp_desc\":\"成功\",\"cash_trans_id\":\"20240613241pkafk\",\"cashier_version\":\"V2\",\"channel_code\":\"00\",\"channel_finish_time\":1718247318000,\"channel_message\":\"交易成功\",\"channel_stat\":\"S\",\"channel_type\":\"U\",\"check_cash_flag\":\"I\",\"close_trans_stat\":\"\",\"create_time\":1718247304000,\"creator\":\"\",\"credit_fee_amt\":0.00,\"credit_type\":\"\",\"db_unit\":\"2\",\"debit_fee_amt\":0.00,\"double_limit_amt\":0.00,\"fee_acct_id\":\"F00380563\",\"fee_allowance_flag\":0,\"fee_amt\":0.01,\"fee_flag\":1,\"fee_formula\":\"\",\"fee_huifu_id\":\"6666000109133323\",\"fee_real_acct_id\":\"F00380563\",\"fee_real_cust_id\":\"6666000109133323\",\"fee_rec_type\":1,\"fee_source\":\"'SERVER'\",\"fee_split_type\":\"\",\"gate_id\":\"SPIN002\",\"goods_desc\":\"微信测试商品-无线鼠标\",\"hf_seq_id\":\"002900TOP2B240613105504P831ac139c2000000\",\"huifu_id\":\"6666000109133323\",\"icc_data\":\"\",\"id\":4175314075,\"is_acct_div\":0,\"is_acct_div_param\":0,\"is_delay_acct\":0,\"is_deleted\":0,\"is_route\":\"\",\"iss_inst_id\":\"\",\"maze_bg_date\":\"\",\"maze_bg_seq_id\":\"\",\"maze_pnr_dev_id\":\"\",\"maze_resp_code\":\"\",\"maze_resp_desc\":\"\",\"mcc\":\"\",\"mer_name\":\"上海汇涵信息科技服务有限公司\",\"mer_ord_id\":\"20240613105441800448\",\"modifier\":\"\",\"modify_time\":1718247318000,\"mypaytsf_discount\":0.00,\"ord_amt\":0.02,\"ord_id\":\"202406131055040TOP2_BL2684095952\",\"org_acct_id\":\"F00300982\",\"org_auth_no\":\"\",\"org_huifu_seq_id\":\"\",\"org_trans_date\":\"\",\"out_trans_id\":\"4200002303202406139053495866\",\"pa_mer_id\":\"SSP001\",\"party_order_id\":\"03242406133930500803797\",\"pay_amt\":0.02,\"pay_channel\":\"T\",\"pay_channel_id\":\"10000001\",\"pay_scene\":\"02\",\"pay_type\":\"JSAPI\",\"product_id\":\"YYZY\",\"real_acct_id\":\"F00300982\",\"real_cust_id\":\"6666000109133323\",\"real_gate_id\":\"VN\",\"ref_amt\":0.02,\"ref_cnt\":0,\"ref_fee_amt\":0.01,\"ref_num\":\"105504800448\",\"region_id\":\"TOP2_B\",\"req_date\":\"20240613\",\"req_seq_id\":\"20240613105441800448\",\"route_region_id\":\"C24_A\",\"settle_amt\":0.02,\"settle_trans_stat\":\"\",\"sn_code\":\"\",\"source_region_id\":\"TOP2_B\",\"subsidy_amt\":0.00,\"subsidy_ref_amt\":0.00,\"subsidy_stat\":\"I\",\"sys_id\":\"6666000108840829\",\"sys_trace_audit_num\":\"\",\"term_div_coupon_type\":3,\"time_expire\":\"20240613110004\",\"trans_date\":\"20240613\",\"trans_finish_time\":1718247319000,\"trans_notify_url\":\"VIRGO://https://iotpush.cloudpnr.com/ws-mgnt-ser/callback/jspay\",\"trans_stat\":\"S\",\"trans_type\":\"1000\",\"un_scene_info\":\"\",\"unconfirm_amt\":0.02,\"unconfirm_fee_amt\":0.01,\"version\":3},\"trans_stat\":\"S\",\"trans_time\":\"105504\",\"trans_type\":\"T_JSAPI\",\"wx_response\":{\"bank_type\":\"OTHERS\",\"coupon_fee\":\"0.00\",\"openid\":\"o8jhot5QnK-AmVoARPMJjMT-SsX0\",\"sub_appid\":\"wxdfe9a5d141f96685\",\"sub_openid\":\"oozDJ52_y7RMnxObV04Q4bpuNZEM\"}}");
Map map = JsonUtils.fromJson(callbackparam.getRespData(), Map.class);
ResponseDto<Boolean> responseDto = goblinBraceletorderservice.dougongCallBack(callbackparam);
Assert.assertTrue(responseDto.isSuccess());
}
}
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;
......@@ -15,6 +14,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Slf4j
......@@ -26,8 +26,7 @@ public class GoblinDougongPayServiceImplTest {
private IGoblinDougongPayService goblinDougongPayService;
@Test
public void jsPay(){
private List<DougongRequestParam.WxDataGoodsDetail> getWxDataGoodsDetails() {
HashMap<String, Object> goods1 = new HashMap<>();
goods1.put("id", "1");
goods1.put("name", "手环");
......@@ -40,17 +39,33 @@ public class GoblinDougongPayServiceImplTest {
goods2.put("price", "50");
goods2.put("number", 1);
// 商品列表
ArrayList<Map<String, Object>> goodsList = new ArrayList<>();
goodsList.add(goods1);
goodsList.add(goods2);
ArrayList<DougongRequestParam.WxDataGoodsDetail> wxDataGoodsDetails = new ArrayList<>();
for (Map<String, Object> stringObjectMap : goodsList) {
DougongRequestParam.WxDataGoodsDetail wxDataGoodsDetail = new DougongRequestParam.WxDataGoodsDetail();
wxDataGoodsDetail.setGoodsId(String.valueOf(stringObjectMap.get("id")));
wxDataGoodsDetail.setGoodsName(String.valueOf(stringObjectMap.get("name")));
wxDataGoodsDetail.setPrice(String.valueOf(stringObjectMap.get("price")));
wxDataGoodsDetail.setQuantity((Integer) stringObjectMap.get("number"));
wxDataGoodsDetails.add(wxDataGoodsDetail);
}
return wxDataGoodsDetails;
}
@Test
public void jsPay() {
// 商品描述
String goodsDesc = "手环充值";
// 商品金额
BigDecimal totalAmt = new BigDecimal("51.00");
// 请求日期
String reqDate = "20250707";
String reqDate = "20250708";
// 交易类型
String tradeType = "T_MINIAPP";
......@@ -59,17 +74,6 @@ public class GoblinDougongPayServiceImplTest {
requestParam.setTimeExpire("20250718235959"); //TODO 在计算
requestParam.setNotifyUrl("http://www.baidu.com");//TODO 配置
ArrayList<DougongRequestParam.WxDataGoodsDetail> wxDataGoodsDetails = new ArrayList<>();
for (Map<String, Object> stringObjectMap : goodsList) {
DougongRequestParam.WxDataGoodsDetail wxDataGoodsDetail = new DougongRequestParam.WxDataGoodsDetail();
wxDataGoodsDetail.setGoodsId(String.valueOf(stringObjectMap.get("id")));
wxDataGoodsDetail.setGoodsName(String.valueOf(stringObjectMap.get("name")));
wxDataGoodsDetail.setPrice(String.valueOf(stringObjectMap.get("price")));
wxDataGoodsDetail.setQuantity((Integer)stringObjectMap.get("number"));
wxDataGoodsDetails.add(wxDataGoodsDetail);
}
DougongJsPayData dougongJsPayData = new DougongJsPayData();
dougongJsPayData.setReqDate(reqDate);
dougongJsPayData.setReqSeqId(IDGenerator.nextSnowId());
......@@ -78,7 +82,7 @@ public class GoblinDougongPayServiceImplTest {
dougongJsPayData.setTransAmt(totalAmt.toString());
dougongJsPayData.setTimeExpire("20250718235959"); //TODO 在计算
dougongJsPayData.setSubOpenid("o8jhotzittQSetZ-N0Yj4Hz91Rqc"); //TODO 前端带过来
dougongJsPayData.setGoodsDetailList(wxDataGoodsDetails);
dougongJsPayData.setGoodsDetailList(getWxDataGoodsDetails());
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