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

Commit a62b91a0 authored by wangyifan's avatar wangyifan

离线支付-斗拱接口回调

parent 8e1176be
...@@ -365,7 +365,9 @@ public class GoblinRedisConst { ...@@ -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_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:");//无用 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; ...@@ -4,6 +4,10 @@ import lombok.Data;
import java.util.List; import java.util.List;
/**
* 调用斗拱业务层参数
*/
@Data @Data
public class DougongJsPayData { 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; ...@@ -3,8 +3,9 @@ package com.liquidnet.service.goblin.service;
import com.liquidnet.service.base.ResponseDto; import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.goblin.dto.vo.GoblinBraceletPayResultVo; import com.liquidnet.service.goblin.dto.vo.GoblinBraceletPayResultVo;
import com.liquidnet.service.goblin.param.GoblinBraceletOrderPayParam; 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 { ...@@ -24,5 +25,5 @@ public interface IGoblinBraceLetOrderService {
* 斗拱支付回调 * 斗拱支付回调
* @return * @return
*/ */
ResponseDto<Boolean> dougongCallBack(); ResponseDto<Boolean> dougongCallBack(DougongSyncCallbackparam callbackparam);
} }
...@@ -11,4 +11,5 @@ public interface IGoblinDougongPayService { ...@@ -11,4 +11,5 @@ public interface IGoblinDougongPayService {
*/ */
Map<String, Object> jsPay(DougongJsPayData data); Map<String, Object> jsPay(DougongJsPayData data);
boolean verifySign(String data, String sign);
} }
...@@ -51,4 +51,6 @@ public class RedisKeyExpireConst { ...@@ -51,4 +51,6 @@ public class RedisKeyExpireConst {
public static final long SWEET_DOUDOU_SCOPE_MOBILE_EXPIRE = 3 * 24 * 60 * 60; public static final long SWEET_DOUDOU_SCOPE_MOBILE_EXPIRE = 3 * 24 * 60 * 60;
// GOBLIN_BRACELET_USER 过期时间3天 // GOBLIN_BRACELET_USER 过期时间3天
public static final long GOBLIN_BRACELET_USER_EXPIRE = 30 * 24 * 60 * 60; 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; ...@@ -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.dto.vo.GoblinBraceletPayResultVo;
import com.liquidnet.service.goblin.param.GoblinBraceletOrderPayParam; import com.liquidnet.service.goblin.param.GoblinBraceletOrderPayParam;
import com.liquidnet.service.goblin.param.dougong.DougongSyncCallbackparam; 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.Api;
import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiImplicitParams;
...@@ -24,7 +24,7 @@ import javax.validation.constraints.NotBlank; ...@@ -24,7 +24,7 @@ import javax.validation.constraints.NotBlank;
public class GoblinBraceletOrderController { public class GoblinBraceletOrderController {
@Autowired @Autowired
private IGoblinBraceLetOrderService braceLetOrderService; private IGoblinBraceletOrderService braceLetOrderService;
@PostMapping("/pre") @PostMapping("/pre")
// @ApiOperation("下单(加密)") // @ApiOperation("下单(加密)")
...@@ -52,7 +52,7 @@ public class GoblinBraceletOrderController { ...@@ -52,7 +52,7 @@ public class GoblinBraceletOrderController {
@PostMapping("/callback") @PostMapping("/callback")
@ApiOperation("斗拱支付回调") @ApiOperation("斗拱支付回调")
public ResponseDto<Boolean> dougongCallBack(@RequestBody DougongSyncCallbackparam dougongSyncCallbackparam) { 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; ...@@ -10,7 +10,8 @@ import com.liquidnet.service.goblin.enums.PayStatus;
import com.liquidnet.service.goblin.param.GoblinBraceletOrderPayParam; import com.liquidnet.service.goblin.param.GoblinBraceletOrderPayParam;
import com.liquidnet.service.goblin.param.dougong.DougongJsPayData; import com.liquidnet.service.goblin.param.dougong.DougongJsPayData;
import com.liquidnet.service.goblin.param.dougong.DougongRequestParam; 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.IGoblinDougongPayService;
import com.liquidnet.service.goblin.service.IGoblinRechargeWristbandService; import com.liquidnet.service.goblin.service.IGoblinRechargeWristbandService;
import com.liquidnet.service.goblin.util.GoblinRedisUtils; import com.liquidnet.service.goblin.util.GoblinRedisUtils;
...@@ -27,7 +28,7 @@ import java.util.stream.Collectors; ...@@ -27,7 +28,7 @@ import java.util.stream.Collectors;
@Slf4j @Slf4j
@Service @Service
public class GoblinBraceLetOrderServiceImpl implements IGoblinBraceLetOrderService { public class GoblinBraceletOrderServiceImpl implements IGoblinBraceletOrderService {
@Autowired @Autowired
GoblinRedisUtils goblinRedisUtils; GoblinRedisUtils goblinRedisUtils;
...@@ -102,14 +103,11 @@ public class GoblinBraceLetOrderServiceImpl implements IGoblinBraceLetOrderServi ...@@ -102,14 +103,11 @@ public class GoblinBraceLetOrderServiceImpl implements IGoblinBraceLetOrderServi
// 根据响应接口填充参数 // 根据响应接口填充参数
orderVo.setHfSeqId((String) dougongResponseMap.get("hf_seq_id")); orderVo.setHfSeqId((String) dougongResponseMap.get("hf_seq_id"));
orderVo.setAtuSubMerId((String) dougongResponseMap.get("atu_sub_mer_id")); orderVo.setAtuSubMerId((String) dougongResponseMap.get("atu_sub_mer_id"));
// orderVo.setOutTransId(dougongResponseMap.get(""));
orderVo.setPartyOrderId((String) dougongResponseMap.get("party_order_id")); orderVo.setPartyOrderId((String) dougongResponseMap.get("party_order_id"));
// orderVo.setEndTime(dougongResponseMap.get(""));
// orderVo.setAcctDate(dougongResponseMap.get(""));
// orderVo.setPriceActual(dougongResponseMap.get(""));
// 5. 根据响应结构写 redis、mysql // 5. 根据响应结构写 redis、mysql
goblinRedisUtils.setBraceletOrderVo(orderVo); goblinRedisUtils.setBraceletOrderVo(orderVo);
goblinRedisUtils.setBraceletRelatedOrderVo(orderVo.getReqSeqId(), orderVo.getOrderId());
LinkedList<String> sqls = CollectionUtil.linkedListString(); LinkedList<String> sqls = CollectionUtil.linkedListString();
sqls.add(SqlMapping.get("goblin_bracelet_order_insert")); sqls.add(SqlMapping.get("goblin_bracelet_order_insert"));
...@@ -246,16 +244,94 @@ public class GoblinBraceLetOrderServiceImpl implements IGoblinBraceLetOrderServi ...@@ -246,16 +244,94 @@ public class GoblinBraceLetOrderServiceImpl implements IGoblinBraceLetOrderServi
@Override @Override
public ResponseDto<Integer> checkOrderResult(String orderId) { public ResponseDto<Integer> checkOrderResult(String orderId) {
final String uid = CurrentUtil.getCurrentUid(); final String uid = CurrentUtil.getCurrentUid();
GoblinBraceletOrderVo braceletOrderVo = goblinRedisUtils.getBraceletOrderVo(uid, orderId); GoblinBraceletOrderVo braceletOrderVo = goblinRedisUtils.getBraceletOrderVo(orderId);
if (braceletOrderVo == null) { if (braceletOrderVo == null) {
log.error("订单不存在"); log.error("订单不存在");
return ResponseDto.failure("订单不存在"); return ResponseDto.failure("订单不存在");
} }
if (!uid.equals(braceletOrderVo.getUserId())) {
log.error("暂无权限");
return ResponseDto.failure("暂无权限");
}
return ResponseDto.success(braceletOrderVo.getPayStatus()); return ResponseDto.success(braceletOrderVo.getPayStatus());
} }
@Override @Override
public ResponseDto<Boolean> dougongCallBack() { public ResponseDto<Boolean> dougongCallBack(DougongSyncCallbackparam callbackparam) {
return null; 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; ...@@ -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.DougongJsPayData;
import com.liquidnet.service.goblin.param.dougong.DougongRequestParam; import com.liquidnet.service.goblin.param.dougong.DougongRequestParam;
import com.liquidnet.service.goblin.service.IGoblinDougongPayService; import com.liquidnet.service.goblin.service.IGoblinDougongPayService;
import com.liquidnet.service.goblin.util.DougongSignUtils;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
...@@ -66,6 +67,12 @@ public class GoblinDougongPayServiceImpl implements IGoblinDougongPayService { ...@@ -66,6 +67,12 @@ public class GoblinDougongPayServiceImpl implements IGoblinDougongPayService {
return null; 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){ private DougongRequestParam buildDougongRequestParam(DougongJsPayData data){
if (data == null) { if (data == null) {
return null; return null;
......
...@@ -2952,13 +2952,34 @@ public class GoblinRedisUtils { ...@@ -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) { 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); redisUtil.set(key, orderVo, RedisKeyExpireConst.GOBLIN_BRACELET_USER_EXPIRE);
} }
public GoblinBraceletOrderVo getBraceletOrderVo(String uid, String orderId) { public GoblinBraceletOrderVo getBraceletOrderVo(String orderId){
String key = GoblinRedisConst.GOBLIN_BRACELET_USER.concat(uid).concat("orderId:").concat(orderId); String key = GoblinRedisConst.GOBLIN_BRACELET_ORDERID.concat(orderId);
Object obj = redisUtil.get(key); Object obj = redisUtil.get(key);
if (obj == null) { if (obj == null) {
// TODO 从数据库查询 // TODO 从数据库查询
......
...@@ -197,4 +197,6 @@ candy_user_coupon.update_apply_refund=UPDATE candy_user_coupon SET state=?,opera ...@@ -197,4 +197,6 @@ candy_user_coupon.update_apply_refund=UPDATE candy_user_coupon SET state=?,opera
#---- #----
# ---- \u624B\u73AF\u8BA2\u5355 ---- # ---- \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_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 (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
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 (?,?,?,?,?,?,?,?,?,?) 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; package com.liquidnet.service.goblin.test;
import com.liquidnet.commons.lang.util.IDGenerator; 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.DougongJsPayData;
import com.liquidnet.service.goblin.param.dougong.DougongRequestParam; import com.liquidnet.service.goblin.param.dougong.DougongRequestParam;
import com.liquidnet.service.goblin.service.IGoblinDougongPayService; import com.liquidnet.service.goblin.service.IGoblinDougongPayService;
...@@ -15,6 +14,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; ...@@ -15,6 +14,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
@Slf4j @Slf4j
...@@ -26,8 +26,7 @@ public class GoblinDougongPayServiceImplTest { ...@@ -26,8 +26,7 @@ public class GoblinDougongPayServiceImplTest {
private IGoblinDougongPayService goblinDougongPayService; private IGoblinDougongPayService goblinDougongPayService;
@Test private List<DougongRequestParam.WxDataGoodsDetail> getWxDataGoodsDetails() {
public void jsPay(){
HashMap<String, Object> goods1 = new HashMap<>(); HashMap<String, Object> goods1 = new HashMap<>();
goods1.put("id", "1"); goods1.put("id", "1");
goods1.put("name", "手环"); goods1.put("name", "手环");
...@@ -40,17 +39,33 @@ public class GoblinDougongPayServiceImplTest { ...@@ -40,17 +39,33 @@ public class GoblinDougongPayServiceImplTest {
goods2.put("price", "50"); goods2.put("price", "50");
goods2.put("number", 1); goods2.put("number", 1);
// 商品列表 // 商品列表
ArrayList<Map<String, Object>> goodsList = new ArrayList<>(); ArrayList<Map<String, Object>> goodsList = new ArrayList<>();
goodsList.add(goods1); goodsList.add(goods1);
goodsList.add(goods2); 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 = "手环充值"; String goodsDesc = "手环充值";
// 商品金额 // 商品金额
BigDecimal totalAmt = new BigDecimal("51.00"); BigDecimal totalAmt = new BigDecimal("51.00");
// 请求日期 // 请求日期
String reqDate = "20250707"; String reqDate = "20250708";
// 交易类型 // 交易类型
String tradeType = "T_MINIAPP"; String tradeType = "T_MINIAPP";
...@@ -59,17 +74,6 @@ public class GoblinDougongPayServiceImplTest { ...@@ -59,17 +74,6 @@ public class GoblinDougongPayServiceImplTest {
requestParam.setTimeExpire("20250718235959"); //TODO 在计算 requestParam.setTimeExpire("20250718235959"); //TODO 在计算
requestParam.setNotifyUrl("http://www.baidu.com");//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 dougongJsPayData = new DougongJsPayData();
dougongJsPayData.setReqDate(reqDate); dougongJsPayData.setReqDate(reqDate);
dougongJsPayData.setReqSeqId(IDGenerator.nextSnowId()); dougongJsPayData.setReqSeqId(IDGenerator.nextSnowId());
...@@ -78,7 +82,7 @@ public class GoblinDougongPayServiceImplTest { ...@@ -78,7 +82,7 @@ public class GoblinDougongPayServiceImplTest {
dougongJsPayData.setTransAmt(totalAmt.toString()); dougongJsPayData.setTransAmt(totalAmt.toString());
dougongJsPayData.setTimeExpire("20250718235959"); //TODO 在计算 dougongJsPayData.setTimeExpire("20250718235959"); //TODO 在计算
dougongJsPayData.setSubOpenid("o8jhotzittQSetZ-N0Yj4Hz91Rqc"); //TODO 前端带过来 dougongJsPayData.setSubOpenid("o8jhotzittQSetZ-N0Yj4Hz91Rqc"); //TODO 前端带过来
dougongJsPayData.setGoodsDetailList(wxDataGoodsDetails); dougongJsPayData.setGoodsDetailList(getWxDataGoodsDetails());
System.out.println(goblinDougongPayService.jsPay(dougongJsPayData)); 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