1
0
mirror of synced 2026-02-18 19:37:54 +08:00

🆕 #3404 【小程序】增加同城配送相关接口,同时为WxMaService增加了API签名支持

This commit is contained in:
GeXiangDong
2024-11-01 00:14:29 +08:00
committed by GitHub
parent f6e300b10a
commit cff5616463
35 changed files with 3632 additions and 580 deletions

View File

@@ -0,0 +1,234 @@
package cn.binarywang.wx.miniapp.api.impl;
import static org.testng.AssertJUnit.*;
import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.bean.intractiy.*;
import cn.binarywang.wx.miniapp.bean.openapi.WxMiniGetApiQuotaResult;
import cn.binarywang.wx.miniapp.constant.WxMaApiUrlConstants;
import cn.binarywang.wx.miniapp.test.ApiTestModule;
import cn.binarywang.wx.miniapp.test.TestConfig;
import com.google.inject.Inject;
import java.util.ArrayList;
import java.util.List;
import me.chanjar.weixin.common.error.WxErrorException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testng.annotations.Guice;
import org.testng.annotations.Test;
@Test
@Guice(modules = ApiTestModule.class)
public class WxMaIntracityServiceImpleTest {
private static final Logger logger = LoggerFactory.getLogger(WxMaIntracityServiceImpleTest.class);
@Inject private WxMaService wxService;
@Test
public void testApiSignature() throws Exception {
WxMiniGetApiQuotaResult result =
wxService
.getWxMaOpenApiService()
.getApiQuota(
WxMaApiUrlConstants.Intracity.APPLY_URL.substring(
"https://api.weixin.qq.com".length()));
logger.info("apply 额度剩余 :{}", result.getQuota());
}
@Test
public void testApply() throws Exception {
logger.debug("testApply");
try {
wxService.getIntracityService().apply();
} catch (WxErrorException wxEx) {
if (wxEx.getError().getErrorCode() == 45009) {
// 调用分钟频率受限
} else {
throw wxEx;
}
}
}
@Test
public void testStoreRelatedApis() throws Exception {
WxMaStore store = new WxMaStore();
store.setStoreName("南京东路店");
store.setOutStoreId("njdl-001");
WxMaStore.AddressInfo addr = new WxMaStore.AddressInfo();
addr.setProvince("上海市");
addr.setCity("上海市");
addr.setArea("黄浦区");
addr.setStreet("");
addr.setHouse("南京东路690号");
addr.setLat(31.235318);
addr.setLng(121.477284);
addr.setPhone("021-23456789");
store.setAddressInfo(addr);
String wxStoreId;
List<WxMaStore> result =
wxService.getIntracityService().queryStoreByOutStoreId(store.getOutStoreId());
if (result.isEmpty()) {
wxStoreId = wxService.getIntracityService().createStore(store);
logger.debug("create store result:{}", wxStoreId);
} else {
wxStoreId = result.get(0).getWxStoreId();
}
store.setWxStoreId(wxStoreId);
addr.setPhone("021-23450000");
store.setStoreName(null);
wxService.getIntracityService().updateStore(store);
List<WxMaStore> stores = wxService.getIntracityService().listAllStores();
logger.info("listAllStores 查询到 {} 个门店 {}", stores.size(), stores);
if (stores.size() > 0) {
WxMaStore s =
wxService.getIntracityService().queryStoreByWxStoreId(stores.get(0).getWxStoreId());
assertNotNull(s);
List<WxMaStore> list =
wxService.getIntracityService().queryStoreByOutStoreId(stores.get(0).getOutStoreId());
logger.info("queryStoreByOutStoreId 查询到 {} 个门店 {}", list.size(), list);
}
}
@Test
public void testStoreChargeRelated() throws Exception {
List<WxMaStore> stores = wxService.getIntracityService().listAllStores();
if (stores.isEmpty()) {
logger.warn("没有门店,无法测试");
return;
}
WxMaStore store = stores.get(0);
WxMaGetPayModeResponse resp = wxService.getIntracityService().getPayMode();
logger.debug("查询付费主体 {}", resp);
PayMode currentPayMode = resp.getPayMode();
// 只能用当前付费模式充值;否则微信接口会返回 错误代码934025, 错误信息pay_mode not match
WxMaStoreChargeRequest request = new WxMaStoreChargeRequest();
request.setPayMode(currentPayMode);
request.setWxStoreId(store.getWxStoreId());
request.setServiceTransId("DADA");
request.setAmount(5000);
String payUrl = wxService.getIntracityService().storeCharge(request);
logger.debug("充值URL:{}", payUrl);
// 查询余额
WxMaStoreBalance balance =
wxService.getIntracityService().balanceQuery(store.getWxStoreId(), null, PayMode.STORE);
logger.debug("余额 {}", balance);
// 退款
WxMaStoreRefundRequest rr = new WxMaStoreRefundRequest();
rr.setPayMode(PayMode.STORE);
rr.setWxStoreId(store.getWxStoreId());
rr.setServiceTransId("DADA");
int refundAmount = wxService.getIntracityService().storeRefund(rr);
logger.debug("退款:{}", refundAmount);
// 查询流水
WxMaQueryFlowRequest qfr = new WxMaQueryFlowRequest();
qfr.setWxStoreId(store.getWxStoreId());
WxMaStoreFlowResponse flowResponse = wxService.getIntracityService().queryFlow(qfr);
logger.debug("查询流水 {}", flowResponse);
}
@Test
public void testPayMode() throws Exception {
WxMaGetPayModeResponse resp = wxService.getIntracityService().getPayMode();
logger.debug("查询付费主体 {}", resp);
PayMode newMode = resp.getPayMode() == PayMode.APP ? PayMode.STORE : PayMode.APP;
logger.debug("set pay mode to {}", newMode);
wxService.getIntracityService().setPayMode(newMode);
WxMaGetPayModeResponse resp2 = wxService.getIntracityService().getPayMode();
logger.debug("查询付费主体 {}", resp2);
}
@Test
public void testGetCity() throws Exception {
List<WxMaTransCity> list = wxService.getIntracityService().getCity(null);
logger.debug("支持的城市 {}", list);
List<WxMaTransCity> list2 = wxService.getIntracityService().getCity("SFTC");
logger.debug("SFTC支持的城市有{}个", list2.get(0).getCityList().size());
}
@Test
public void testOrderRelatived() throws Exception {
List<WxMaStore> stores = wxService.getIntracityService().listAllStores();
if (stores.isEmpty()) {
logger.warn("没有门店,无法测试");
return;
}
String wxStoreId = stores.get(0).getWxStoreId();
{
WxMaPreAddOrderRequest request = new WxMaPreAddOrderRequest();
request.setWxStoreId(wxStoreId);
request.setUseSandbox(1);
request.setUserName("顺丰同城");
request.setUserPhone("13800000138");
request.setUserAddress("北京市海淀区学清嘉创大厦A座15层");
request.setUserLat(40.01496);
request.setUserLng(116.353093);
WxMaPreAddOrderRequest.Cargo cargo = new WxMaPreAddOrderRequest.Cargo();
cargo.setCargoName("蛋糕");
cargo.setCargoType(13);
cargo.setCargoNum(1);
cargo.setCargoPrice(10000);
cargo.setCargoWeight(1000);
request.setCargo(cargo);
WxMaAddOrderResponse response = wxService.getIntracityService().preAddOrder(request);
logger.debug("查询运费返回 {} 预估运费{}元", response, response.getFee() / 100.0);
}
String wxOrderId = null;
{
TestConfig config = (TestConfig) this.wxService.getWxMaConfig();
WxMaAddOrderRequest request = new WxMaAddOrderRequest();
request.setWxStoreId(wxStoreId);
request.setStoreOrderId("store-order-" + System.currentTimeMillis());
request.setOrderSeq("0001");
request.setUserOpenid(config.getOpenid());
request.setUseSandbox(1);
request.setUserName("顺丰同城");
request.setUserPhone("13800000138");
request.setUserAddress("北京市海淀区学清嘉创大厦A座15层");
request.setUserLat(40.01496);
request.setUserLng(116.353093);
request.setOrderDetailPath("/pages/user-center/order/detail/detail?id=xxx");
WxMaAddOrderRequest.Cargo cargo = new WxMaAddOrderRequest.Cargo();
cargo.setCargoName("蛋糕");
cargo.setCargoType(13);
cargo.setCargoNum(1);
cargo.setCargoPrice(10000);
cargo.setCargoWeight(1000);
WxMaAddOrderRequest.ItemDetail detail = new WxMaAddOrderRequest.ItemDetail();
detail.setItemName("蛋糕A");
detail.setItemPicUrl("https://www.somehost.com/aaa.jpg");
detail.setCount(1);
List<WxMaAddOrderRequest.ItemDetail> itemList = new ArrayList<>();
itemList.add(detail);
cargo.setItemList(itemList);
request.setCargo(cargo);
WxMaAddOrderResponse response = wxService.getIntracityService().addOrder(request);
wxOrderId = response.getWxOrderId();
logger.debug("创建订单返回 {} wxOrderId:{}", response, wxOrderId);
}
WxMaOrder order = wxService.getIntracityService().queryOrderByWxOrderId(wxOrderId);
logger.debug("查询订单返回 {} storeOrderId:{} ", order, order.getStoreOrderId());
WxMaOrder order2 =
wxService
.getIntracityService()
.queryOrderByStoreOrderId(wxStoreId, order.getStoreOrderId());
logger.debug("查询订单返回 {} ", order);
assertEquals(order2.getWxOrderId(), wxOrderId);
WxMaCancelOrderResponse cancelOrderResp =
wxService.getIntracityService().cancelOrderByWxOrderId(wxOrderId, 1, "不再需要");
logger.debug("取消订单返回 {} 扣费:{} ", cancelOrderResp, cancelOrderResp.getDeductfee());
try {
wxService
.getIntracityService()
.cancelOrderByStoreOrderId(wxStoreId, order.getStoreOrderId(), 1, "不再需要");
fail("重复取消未抛异常,疑似第一次取消未成功");
} catch (WxErrorException wxErrorException) {
// 订单已经被取消了,重复取消会报错,这里才正常
}
}
}

View File

@@ -9,4 +9,9 @@
<expiresTime>可以不填写</expiresTime>
<openid>某个用户的openId</openid>
<templateId>模版消息的模版ID</templateId>
<componentApiSignatureAesKey>API签名AES密钥【没有开启API签名不要这条】</componentApiSignatureAesKey>
<componentApiSignatureAesKeySn>API签名AES密钥的序号【没有开启API签名不要这条】</componentApiSignatureAesKeySn>
<componentApiSignatureRsaPrivateKey>API签名RSA私钥的【没有开启API签名不要这条】</componentApiSignatureRsaPrivateKey>
<componentApiSignatureRsaPrivateKeySn>API签名RSA私钥的序【没有开启API签名不要这条】
</componentApiSignatureRsaPrivateKeySn>
</xml>