最近公司有集成配送业务,分享一下 ^ _ ^
/*
@describe 蜂鸟配置类
@params
@return
@author 何章怀晓
@date 2020/7/10 10:55
@other
*/
public class ElemeOpenConfig {
/**
*i<br> 联调环境地址 https://exam-anubis.ele.me/anubis-webapi <br> 线上环境地址
* https://open-anubis.ele.me/anubis-webapi
*/
public static final String API_URL = "https://exam-anubis.ele.me/anubis-webapi";
/**
* 第三方平台 app_id
*/
public static final String APP_ID = "***";
/**
* 第三方平台 secret_key
*/
public static final String SECRET_KEY = "***";
//回调函数
public static final String PUSH_ORDER_NOTIFY_URL="***";
private ElemeOpenConfig() {
}
}
每次访问要带上身份标识,我们先生成token
/*
@describe 生成token
@params []
@return java.lang.String
@author 何章怀晓
@date 2020/7/10 11:57
@other
*/
public String getToken() throws IOException {
String url = ElemeOpenConfig.API_URL + RequestConstant.OBTAIN_TOKEN;
String salt = String.valueOf(RandomUtils.getInstance().generateValue(1000, 10000));
String sig = OpenSignHelper
.generateSign(ElemeOpenConfig.APP_ID, salt, ElemeOpenConfig.SECRET_KEY);
// 请求token
List<BasicNameValuePair> paramsToken = new ArrayList<>();
paramsToken.add(new BasicNameValuePair("app_id", ElemeOpenConfig.APP_ID));
paramsToken.add(new BasicNameValuePair("salt", salt));
paramsToken.add(new BasicNameValuePair("signature", sig));
String tokenRes = "";
try {
tokenRes = HttpClient.get(url, paramsToken);
} catch (Exception e) {
throw new HttpClientRuntimeException("请求token出现异常", e);
}
logger.info(String.format("Response is %s", tokenRes));
//生成
String token = JsonUtils.getInstance().readValue(tokenRes, TokenResponse.class).getData()
.getAccess_token();
logger.info(String.format("Generate token is: %s", token));
List<PmsFntoken> pmsFntokens = pmsFntokenMapper.selectByExample(new PmsFntokenExample());
PmsFntoken p = new PmsFntoken();
if (pmsFntokens != null && pmsFntokens.size() > 0) {
//保存token到本地
p.setId(1);
p.setFnToken(token);
pmsFntokenMapper.updateByPrimaryKey(p);
} else {
p.setId(1);
p.setFnToken(token);
pmsFntokenMapper.insert(p);
}
return token;
}
推送订单
``
/*
@describe 推送订单
@params 店铺信息 收货地址信息 购物车信息 订单信息
@return
@author 何章怀晓
@date 2020/7/10 14:11
@other
*/
public void createOrder(YdShop ydShop, OmsOrder order, UmsMemberReceiveAddress address,
List<OmsCartItem> omsCartItems) throws Exception {
ElemeCreateOrderRequest.ElemeCreateRequestData data = new ElemeCreateOrderRequest.ElemeCreateRequestData();
data.setUuid(UUID.randomUUID().toString());
//门店信息
ElemeCreateOrderRequest.TransportInfo transportInfo = new ElemeCreateOrderRequest.TransportInfo();
transportInfo.setTransport_name(ydShop.getShopName());
transportInfo.setTransport_address(ydShop.getAddressDetail());
transportInfo.setTransport_tel(ydShop.getPhone());
data.setChain_store_code(ydShop.getId().toString());
transportInfo.setTransport_longitude(ydShop.getLng());
transportInfo.setTransport_latitude(ydShop.getLat());
transportInfo.setPosition_source(2);
//客户信息
ElemeCreateOrderRequest.ReceiverInfo receiverInfo = new ElemeCreateOrderRequest.ReceiverInfo();
receiverInfo.setReceiver_address(address.getDetailAddress());
receiverInfo.setReceiver_name(address.getName());
receiverInfo.setReceiver_primary_phone(address.getPhoneNumber());
receiverInfo.setReceiver_longitude(address.getLng());
receiverInfo.setReceiver_latitude(address.getLat());
receiverInfo.setPosition_source(2);
//商品信息
ElemeCreateOrderRequest.ItemsJson[] itemsJsons = new ElemeCreateOrderRequest.ItemsJson[omsCartItems
.size()];
for (int i = 0; i < omsCartItems.size(); i++) {
//遍历每件商品
ElemeCreateOrderRequest.ItemsJson item = new ElemeCreateOrderRequest.ItemsJson();
item.setItem_name(omsCartItems.get(i).getProductName());
item.setItem_quantity(omsCartItems.get(i).getQuantity());
//实际支付价格
item.setItem_actual_price(omsCartItems.get(i).getPrice());
//原价
item.setItem_price(omsCartItems.get(i).getPrice());
//是否代购 0否
item.setIs_agent_purchase(0);
//需要打包
item.setIs_need_package(1);
itemsJsons[i] = item;
}
//门店信息
data.setTransport_info(transportInfo);
//收货人信息
data.setReceiver_info(receiverInfo);
//商品信息
data.setItems_json(itemsJsons);
//订单编号
data.setPartner_order_code(order.getOrderSn());
//回调函数
data.setNotify_url(ElemeOpenConfig.PUSH_ORDER_NOTIFY_URL);
// 1、普通商户即时送
data.setOrder_type(1);
//总金额
data.setOrder_total_amount(order.getTotalAmount());
//实付金额
data.setOrder_actual_amount(order.getPayAmount());
//订单备注
data.setOrder_remark(order.getNote());
//发票类型
Integer billType = order.getBillType();
// 是否需要发票0:不需要;1:需要
if (billType == 0) {
data.setIs_invoiced(0);
} else if (billType == 1) {
data.setIs_invoiced(1);
//发票抬头
data.setInvoice(order.getBillHeader());
}
//订单支付状态 0:未支付 1:已支付
data.setOrder_payment_status(0);
//在线支付
data.setOrder_payment_method(1);
// 是否需要承运商代收货款 0:否
data.setIs_agent_payment(0);
//商品件数
data.setGoods_count(omsCartItems.size());
ElemeCreateOrderRequest request = new ElemeCreateOrderRequest();
request.setData(data);
logger.info(String.format("urlencode string is %s", request.getData()));
int salt = RandomUtils.getInstance().generateValue(1000, 10000);
request.setApp_id(ElemeOpenConfig.APP_ID);
request.setSalt(salt);
// 注意添加的顺序,
Map<String, Object> sigStr = new LinkedHashMap<>();
// 需要使用前面请求生成的token
sigStr.put("app_id", ElemeOpenConfig.APP_ID);
PmsFntoken pmsFntoken = null;
List<PmsFntoken> pmsFntokens = pmsFntokenMapper.selectByExample(new PmsFntokenExample());
if (pmsFntokens != null && pmsFntokens.size() > 0) {
pmsFntoken = pmsFntokens.get(0);
}
if (pmsFntoken != null) {
sigStr.put("access_token", pmsFntoken.getFnToken());
} else {
getToken();
pmsFntoken = pmsFntokenMapper.selectByPrimaryKey(1);
sigStr.put("access_token", pmsFntoken.getFnToken());
}
sigStr.put("data", request.getData());
sigStr.put("salt", salt);
// 生成签名
String sig = OpenSignHelper.generateBusinessSign(sigStr);
request.setSignature(sig);
String requestJson = JsonUtils.getInstance().objectToJson(request);
logger.info(String.format("request json is %s", requestJson));
String url = ElemeOpenConfig.API_URL + RequestConstant.ORDER_CREATE;
try {
HttpClient.postBody(url, requestJson);
} catch (Exception e) {
logger.error("creating order request occurs an exception!");
throw new HttpClientRuntimeException("推送订单出现异常", e);
}
}
``
取消订单
```bash
```bash
/*
@describe 取消订单
@params
@return
@author 何章怀晓
@date 2020/7/13 14:31
@other
*/
public void cancelOrder(OmsOrder order) throws IOException {
String url = ElemeOpenConfig.API_URL;
CancelOrderRequest.CancelOrderRequestData data = new CancelOrderRequest.CancelOrderRequestData();
data.setOrder_cancel_description("");
//订单取消原因代码(1:用户取消,2:商家取消)
data.setOrder_cancel_reason_code(1);
//订单编号
data.setPartner_order_code(order.getOrderSn());
//取消时间
data.setOrder_cancel_time(new Date().getTime());
CancelOrderRequest cancelOrderRequest = new CancelOrderRequest();
cancelOrderRequest.setData(data);
int salt = RandomUtils.getInstance().generateValue(1000, 10000);
Map<String, Object> sigStr = new LinkedHashMap<>(); // 注意添加的顺序, 应该如下面一样各个key值顺序一致
sigStr.put("app_id", ElemeOpenConfig.APP_ID);
PmsFntoken pmsFntoken = null;
List<PmsFntoken> pmsFntokens = pmsFntokenMapper.selectByExample(new PmsFntokenExample());
if (pmsFntokens != null && pmsFntokens.size() > 0) {
pmsFntoken = pmsFntokens.get(0);
}
if (pmsFntoken != null) {
sigStr.put("access_token", pmsFntoken.getFnToken());
} else {
getToken();
pmsFntoken = pmsFntokenMapper.selectByPrimaryKey(1);
sigStr.put("access_token", pmsFntoken.getFnToken());
}
sigStr.put("data", cancelOrderRequest.getData());
sigStr.put("salt", salt);
// 生成签名
String sig = OpenSignHelper.generateBusinessSign(sigStr);
cancelOrderRequest.setSignature(sig);
cancelOrderRequest.setApp_id(ElemeOpenConfig.APP_ID);
cancelOrderRequest.setSalt(salt);
String requestJson = JsonUtils.getInstance().objectToJson(cancelOrderRequest);
url = url + RequestConstant.ORDER_CANCEL;
try {
String res = HttpClient.postBody(url, requestJson);
logger.info(String.format("^_^, reponse data: %s", res));
} catch (Exception e) {
throw new HttpClientRuntimeException("取消订单出现异常", e);
}
}
回调==》此链接为外网访问才可以
@ApiOperation("蜂鸟订单状态回调")
@RequestMapping(value = "/pushOrderUrl", method = RequestMethod.POST)
@ResponseBody
public void pushOrderUrl(@RequestBody String json) {
System.out.println("-------蜂鸟订单状态回调成功--------"+json);
try{
JSONObject jsonObject = JSONObject.parseObject(json);
fnService.fnStatus(jsonObject);
}catch (Exception e){
e.printStackTrace();
}
}
然后就可以申请线上啦~~