access_token管理、图片审核
@Service
public class ToutiaoService {
@Value("${tt.getTokenUrl}")
private String getTokenUrl;
@Value("${tt.appId}")
private String appId;
@Value("${tt.appSecret}")
private String appSecret;
@Value("${tt.imgCensorUrl}")
private String imgCensorUrl;
private String accessToken;
private Date tokenExpire;
@Autowired
private RestTemplate restTemplate;
public String fetchToken() {
String urlStr = String.format(getTokenUrl, appId, appSecret);
TtAccess ttAccess = restTemplate.getForObject(urlStr, TtAccess.class);
if(ttAccess.getError() > 0){
throw new RestfulException(ttAccess.getErrmsg());
}
accessToken = ttAccess.getAccess_token();
long duration = ttAccess.getExpires_in() - 300;
tokenExpire = new Date(System.currentTimeMillis() + duration * 1000);
return accessToken;
}
public String getAccessToken() {
if (accessToken == null || tokenExpire == null || tokenExpire.before(new Date())) {
fetchToken();
}
return accessToken;
}
public boolean censor(MultipartFile file) throws IOException {
String base64Img = new BASE64Encoder().encode(file.getBytes()); // 图片base64编码,不用加文件名或格式信息
base64Img = base64Img.replaceAll("[\\s*\t\n\r]", ""); // 去掉Base64里的换行符
String token = this.getAccessToken();
TtRequest request = new TtRequest(appId, token);
request.setImage_data(base64Img);
TtResponse ttResponse = restTemplate.postForObject(imgCensorUrl, request, TtResponse.class);
if(ttResponse.getError() == 0){
List<TtResponse.Predict> predicts = ttResponse.getPredicts();
for (TtResponse.Predict predict : predicts){
if(predict.isHit()){
return true;
}
}
}
if(ttResponse.getError() == 2){
this.fetchToken();
}
return false;
}
}
支付相关
@Service
public class TtPayService {
@Value("${tt.appId}")
private String appId;
@Value("${tt.salt}")
private String salt;
@Value("${tt.placeOrderUrl}")
private String placeOrderUrl;
@Value("${tt.callbackToken}")
private String ttCallbackToken;
@Value("${tt.orderQueryUrl}")
private String orderQueryUrl;
@Autowired
private RestTemplate restTemplate;
/* 统一下单 */
public JSONObject unifiedOrder(TtPay ttPay) throws DocumentException {
ttPay.setValid_time(7200);
List<String> values = new ArrayList<>();
values.add(ttPay.getOut_order_no());
values.add(String.valueOf(ttPay.getTotal_amount()));
values.add(ttPay.getSubject());
values.add(ttPay.getBody());
values.add(String.valueOf(ttPay.getValid_time()));
String sign = this.sign(values); // 签名
ttPay.setSign(sign);
ttPay.setApp_id(appId);
String jsonStr = restTemplate.postForObject(placeOrderUrl, ttPay, String.class);
JSONObject response = JSON.parseObject(jsonStr);
response = this.preTreatResponse(response); // 处理响应
return response;
}
/* 支付通知处理 */
public String ttPayNotify(String request) {
JSONObject jsonObject = JSONObject.parseObject(request);
if (!jsonObject.getString("type").equals("payment")) {
return ttPayService.notifySuccess();
}
ttPayService.notifyValidate(jsonObject);
jsonObject = JSONObject.parseObject(jsonObject.getString("msg"));
long tradeNum = jsonObject.getLongValue("cp_orderno");
/* 从数据库里查询订单,并处理订单 */
return ttPayService.notifySuccess();
}
/* 查询订单 */
public JSONObject queryOrder(String out_order_no) throws DocumentException {
List<String> values = new ArrayList<>();
values.add(out_order_no);
String sign = this.sign(values); // 签名
JSONObject request = new JSONObject();
request.put("out_order_no", out_order_no);
request.put("sign", sign);
request.put("app_id", appId);
String jsonStr = restTemplate.postForObject(orderQueryUrl, request.toJSONString(), String.class);
JSONObject response = JSON.parseObject(jsonStr);
response = this.preTreatResponse(response); // 处理响应
return response;
}
/* 校验 支付通知 */
public void notifyValidate(JSONObject jsonObject) {
List<String> keys = new ArrayList(jsonObject.keySet());
List<String> values = new ArrayList<>();
for (String key : keys) {
if (key.equals("msg_signature") || key.equals("type")) {
continue;
}
values.add(jsonObject.getString(key));
}
values.add(ttCallbackToken);
Collections.sort(values); // 字典排序
String ttSign = jsonObject.getString("msg_signature");
String mySign = DigestUtils.sha1Hex(String.join("", values));
if (!ttSign.equals(mySign)) { // 校验签名
throw new RestfulException("签名不正确");
}
}
/* 签名 */
public String sign(List<String> values) {
values.add(salt);
Collections.sort(values); // 字典排序
String sign = StringUtils.join(values, "&");
return DigestUtils.md5Hex(sign); // MD5 摘要
}
/* 预处理响应 */
public JSONObject preTreatResponse(JSONObject jsonObject) throws DocumentException {
int err_no = jsonObject.getIntValue("err_no");
if (err_no != 0) {
throw new RestfulException(err_no, jsonObject.getString("err_tips"));
}
return jsonObject;
}
public String notifySuccess() {
JSONObject jsonObject = new JSONObject();
jsonObject.put("err_no", 0);
jsonObject.put("err_tips", "success");
return jsonObject.toJSONString();
}
}