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

Commit ad80cb1e authored by wangyifan's avatar wangyifan

离线支付-斗拱接口

parent 61bbe216
......@@ -34,4 +34,7 @@ public class GoblinBraceletOrderPayParam implements Serializable {
@NotBlank(message = "身份证号码不能为空")
private String idCard;
@ApiModelProperty(value = "子商户用户标识")
@NotBlank(message = "openId不能为空")
private String subOpenId;
}
package com.liquidnet.service.goblin.param.dougong;
import lombok.Data;
import java.util.List;
@Data
public class DougongPayParam {
// 请求日期
private String reqDate;
// 请求流水号
private String reqSeqId;
// 交易类型
private String tradeType;
// 商品描述
private String goodsDesc;
// 交易总金额
private String transAmt;
// 交易有效期
private String timeExpire;
// 商品列表
private List<DougongRequestParam.WxDataGoodsDetail> goodsDetailList;
// 子商户用户标识
private String subOpenid;
}
package com.liquidnet.service.goblin.param.dougong;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.util.List;
@Data
public class DougongRequestParam {
// 请求日期
@JsonProperty("req_date")
private String reqDate;
// 请求流水号
@JsonProperty("req_seq_id")
private String reqSeqId;
// 商户号
@JsonProperty("huifu_id")
private String huifuId;
// 商品描述
@JsonProperty("goods_desc")
private String goodsDesc;
//交易类型
//T_JSAPI: 微信公众号
//T_MINIAPP: 微信小程序
//A_JSAPI: 支付宝JS
//A_NATIVE: 支付宝正扫
//U_NATIVE: 银联正扫
//U_JSAPI: 银联JS
//D_NATIVE: 数字人民币正扫
//T_H5:微信直连H5支付
//T_APP:微信APP支付
//T_NATIVE:微信正扫
@JsonProperty("trade_type")
private String tradeType;
// 交易金额
@JsonProperty("trans_amt")
private String transAmt;
// 交易有效期
@JsonProperty("time_expire")
private String timeExpire;
// 微信参数集合
@JsonProperty("wx_data")
private String wxData;
// 是否延迟交易
@JsonProperty("delay_acct_flag")
private String delayAcctFlag = "N";
// 异步通知地址
@JsonProperty("notify_url")
private String notifyUrl;
@Data
public static class WxData {
//子商户应用ID
@JsonProperty("sub_appid")
private String subAppid;
// 子商户用户标识
@JsonProperty("sub_openid")
private String subOpenid;
//商品描述
@JsonProperty("body")
private String body;
// 商品详情
@JsonProperty("detail")
private WxDataDetail detail;
}
@Data
public static class WxDataDetail {
@JsonProperty("cost_price")
private String costPrice;
@JsonProperty("goods_detail")
private List<WxDataGoodsDetail> goodsDetail;
}
@Data
public static class WxDataGoodsDetail {
// 商品编码
@JsonProperty("goods_id")
private String goodsId;
// 商品名称
@JsonProperty("goods_name")
private String goodsName;
// 商品单价(元)
@JsonProperty("price")
private String price;
// 商品数量
@JsonProperty("quantity")
private Integer quantity;
}
}
package com.liquidnet.service.goblin.service;
import com.liquidnet.service.goblin.param.dougong.DougongRequestParam;
public interface IGoblinDougongPayService {
/**
*
* @return
*/
Object jsPay();
Object jsPay(DougongRequestParam requestParam);
}
......@@ -3,11 +3,12 @@ package com.liquidnet.service.goblin.service.impl;
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.param.dougong.DougongRequestParam;
import com.liquidnet.service.goblin.service.IGoblinDougongPayService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.Map;
@Slf4j
......@@ -26,57 +27,27 @@ public class GoblinDougongPayServiceImpl implements IGoblinDougongPayService {
// 汇付公钥,用于对汇付返回报文进行签名验证
public static final String DEMO_RSA_PUBLIC_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkmP0eyQVeGHVxk/4+Zq9R6tm8vmQZaMAvtvy5D/Ki3lvhfRn8T3R3vP5xTpp2zAtmZzFnc1k4DswYBsv7lsxwseoJ3sIM6of6NYnf+39CK+NhKSsdDNDET2KCxD5Gip3WJVtgP3P4w3P/U2jCi8Xzm9sxy3XZ3TSZuokvX77UnfBZTFMuGjCmZFcuM6VjDOxoaEtnYhAVLOQItb3Jr1vvIg4vrhCWBus9YVgl3Ua5qtTccmpspnFbY3ix0UFrmHczTaPWrxKMrnEIDurgmMPXPiyR67Z/AcvcJ8vgvaVHnINmDb0hlRUkI623P9dO/fPswaNIEj0ZeoZHcdLya07swIDAQAB";
static {
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);
try {
BasePay.initWithMerConfig(merConfig);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
public Object jsPay() {
public Object jsPay(DougongRequestParam requestParam) {
try {
// 1. 数据初始化,填入对应的商户配置
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);
BasePay.initWithMerConfig(merConfig);
// 2.组装请求参数
Map<String, Object> paramsInfo = new HashMap<>();
// 请求日期
paramsInfo.put("req_date", "20250704");
// 请求流水号
paramsInfo.put("req_seq_id", "rQ20250704120340955666");
// 商户号
paramsInfo.put("huifu_id", "6666000109133323");
// 商品描述
paramsInfo.put("goods_desc", "hibs自动化-通用版验证");
// 交易类型
paramsInfo.put("trade_type", "T_MINIAPP");
// 交易金额
paramsInfo.put("trans_amt", "0.10");
// 交易有效期
paramsInfo.put("time_expire", "20250718235959");
// 微信参数集合
paramsInfo.put("wx_data", "{\"sub_appid\":\"wxdfe9a5d141f96685\",\"sub_openid\":\"o8jhotzittQSetZ-N0Yj4Hz91Rqc\",\"detail\":{\"cost_price\":\"43.00\",\"receipt_id\":\"20220628132043853798\",\"goods_detail\":[{\"goods_id\":\"6934572310301\",\"goods_name\":\"太龙双黄连口服液\",\"price\":\"43.00\",\"quantity\":\"1\",\"wxpay_goods_id\":\"12235413214070356458058\"}]}}");
// 是否延迟交易
paramsInfo.put("delay_acct_flag", "N");
// 分账对象
paramsInfo.put("acct_split_bunch", "{\"acct_infos\":[{\"div_amt\":\"0.10\",\"huifu_id\":\"6666000109133323\"}]}");
// 传入分账遇到优惠的处理规则
paramsInfo.put("term_div_coupon_type", "0");
// 禁用信用卡标记
paramsInfo.put("limit_pay_type", "NO_CREDIT");
// 场景类型
paramsInfo.put("pay_scene", "02");
// 备注
paramsInfo.put("remark", "string");
// 安全信息
paramsInfo.put("risk_check_data", "{\"ip_addr\":\"180.167.105.130\",\"base_station\":\"192.168.1.1\",\"latitude\":\"33.3\",\"longitude\":\"33.3\"}");
// 设备信息
paramsInfo.put("terminal_device_data", "{\"device_type\":\"1\",\"device_ip\":\"10.10.0.1\",\"device_gps\":\"192.168.0.0\",\"devs_id\":\"SPINTP357338300264411\"}");
// 异步通知地址
paramsInfo.put("notify_url", "http://www.baidu.com");
// 3. 发起API调用
Map<String, Object> response = BasePayRequest.requestBasePay("v3/trade/payment/jspay", paramsInfo, null, false);
;
System.out.println(response);
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;
} catch (Exception e) {
log.error("error", e);
}
......
package com.liquidnet.service.goblin.test;
import com.liquidnet.commons.lang.util.JsonUtils;
import com.liquidnet.service.goblin.param.dougong.DougongRequestParam;
import com.liquidnet.service.goblin.service.IGoblinDougongPayService;
import lombok.extern.slf4j.Slf4j;
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.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
@Slf4j
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class GoblinDougongPayServiceImplTest {
@Autowired
private IGoblinDougongPayService goblinDougongPayService;
@Test
public void jsPay(){
HashMap<String, Object> goods1 = new HashMap<>();
goods1.put("id", "1");
goods1.put("name", "手环");
goods1.put("price", "1");
goods1.put("number", 1);
HashMap<String, Object> goods2 = new HashMap<>();
goods2.put("id", "2");
goods2.put("name", "面额充值50元");
goods2.put("price", "50");
goods2.put("number", 1);
// 商品列表
ArrayList<Map<String, Object>> goodsList = new ArrayList<>();
goodsList.add(goods1);
goodsList.add(goods2);
// 商品描述
String goodsDesc = "手环充值";
// 商品金额
BigDecimal totalAmt = new BigDecimal("51.00");
// 商品请求流水号
String setReqSeqId = "rQ20250704120340912341";
// 请求日期
String reqDate = "20250704";
// 交易类型
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 配置
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);
}
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));
}
}
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