基于顺丰同城接⼝编写sdk,java三⽅sdk编写思路
由于公司外卖业务需要⽤到顺丰的配送体系,技术上需要对接顺丰 个⼈⽐较感兴趣,但是顺丰没有提供sdk,所以研究下⾃⼰写了⼀个完整代码已上传github ?:
技术选型
三⽅sdk编写有两种实现⽅式
1. 不依赖框架,更通⽤,但是集成成本较⾼
2. 依赖框架,⽐如spring boot,这样使⽤起来效率更⾼
为了提⾼使⽤效率,这⾥选择基于spring boot框架进⾏编写
前期准备
有很多基于spring boot的sdk了,⾻架就不需要⾃⾏搭建了,了下⾯⼏个进⾏参考
1.
2.
研究api⽂档
顺丰同城api⽂档地址:
⽬前顺丰同城的开发者api个⼈可以注册,注册后可以设置回调地址
出⽂档中的关键点
在后续设计sdk上,考虑下这些点,可以让sdk更好⽤
顺丰状态回调可能会失败,通过定时调⽤查询订单状态接⼝可以补齐状态
可以实时获取配送员的坐标,这个可⽤在app上实时显⽰配送员位置功能
创建项⽬
虽然项⽬是作为和spring boot⼀起使⽤的,但是我们并不需要依赖完整的spring boot框架,所以创建⼀个maven项⽬就是ok的
指定groupId, ArtifactId
为了享受spring boot的⾃动配置,需要l⾥⾯加上spring-boot-autoconfigure库依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
复制代码
加上常⽤的http,lombok等库,最终pom⽂件内容如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="/POM/4.0.0"
xmlns:xsi="/2001/XMLSchema-instance"
xsi:schemaLocation="/POM/4.0.0 /xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>atlife</groupId>
<artifactId>sfcity</artifactId>
<version>1.0-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build>
sdk
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.8</version>
</dependency>
<dependency>
<groupId>com.</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
<dependency>
<groupId>com.</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.8</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<!-- Import dependency management from Spring Boot -->                <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.0.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
复制代码
⾃动配置api的密钥
把从顺丰api后台获取的配置信息写⼊配置⽂件:src/main/resources/application.properties 所有配置如下
sfcity.developer-id= xxx
sfcity.developer-key= xxx
sfcity.shop-id= xxx
sfcity.api-url= commit-openic.sf-express
复制代码
使⽤spring boot的⾃动配置机制,能够很⽅便的从配置⽂件中读取配置 核⼼代码如下
@ConfigurationProperties(prefix = "sfcity")
@Data
public class Properties {
private Integer developerId;
private String developerKey;
private String shopId;
private String apiUrl;
}
复制代码
参考:
1. src/main/java/com/github/neatlife/AutoConfiguration.java
2. src/main/java/com/github/neatlife/Properties.java
映射请求参数和响应参数
因为要做⼀个通⽤的sdk库,那么所有的请求参数和响应参数都需要映射,⽅便使⽤
这⾥为了演⽰就拿创建订单接⼝举例了
创建订单请求实体
响应实体
还有⼀些关联的实体⼀并创建,最终实体效果如下:
http处理⼯具类
使⽤resetTemplate进⾏请求,参考: 核⼼代码如下:
public static Response post(Integer appId, String appSecret, String url, Request request) {
String content = JsonString(request);
String sign = SignUtil.String(), appSecret, content);
url = url + "?sign=" + sign;
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
HttpEntity<String> httpEntity = new HttpEntity<>(content, headers);
ResponseEntity<String> httpResponse = restTemplate.postForEntity(url, httpEntity, String.class);    Response response = Body(), Response.class);
if (ErrorCode() != 0) {
<("errorData: {}", ErrorData());
throw new ErrorMsg());
}
return response;
}
复制代码
json处理⼯具类
json处理⼯具类直接从⾃⼰编写的框架⾥拿,参考:
签名⼯具类
顺丰提供了java的签名⽰例代码
在其基础上修改即可,核⼼代码如下
public static String sign(String appId, String appSecret, String content) {
// 假设原始内容JSON为 {"hello":"kitty"}
// content : "{\"hello\":\"kitty\"}"
String toSign = content + "&" + appId + "&" + appSecret;
// toSign : "{\"hello\":\"kitty\"}&1234567890&0123456789abcdef0123456789abcdef";
String md5Result = Bytes(StandardCharsets.UTF_8));
// md5Result : "ef3435b1480e553480e19e3e162fb0be"
// signResult : "ZWYzNDM1YjE0ODBlNTUzNDgwZTE5ZTNlMTYyZmIwYmU="
return Bytes(StandardCharsets.UTF_8));
}
复制代码
完整代码参考:src/main/java/com/github/neatlife/util/SignUtil.java
定义接⼝常量
把需要调⽤的接⼝地址放到统⼀的常量⽂件中,⽅便管理 核⼼代码如下:
public class ApiUrlConstant {
private static final String CREATE_ORDER_URL = "/open/api/external/createorder";
private static String sfCityHost;
public static String getCreateOrderUrl() {
return sfCityHost + CREATE_ORDER_URL;
}
public static void setSfCityHost(String sfCityHost) {
ApiUrlConstant.sfCityHost = sfCityHost;
}
}
复制代码
调⽤顺丰创建订单接⼝
上⾯步骤都准备完成后,进⾏到最重要的调⽤环节了,有了上⾯的准备,这⼀步也⽐较容易了 核⼼代码如下
public CreateOrderResponse createOrder(CreateOrderRequest createOrderRequest) {
createOrderRequest.setDevId(developerId);
createOrderRequest.setShopId(shopId);
Response response = HttpUtil.post(
developerId,
developerKey,
createOrderRequest
);
Result(), CreateOrderResponse.class);
}
复制代码
编写⾃动测试
创建测试⽂件:src/test/java/com/github/neatlife/SfClientTest.java 填充测试数据 调⽤创建订单⽅法

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。