美文网首页
字节跳动小程序

字节跳动小程序

作者: saoraozhe3hao | 来源:发表于2021-07-29 16:02 被阅读0次

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();
    }
}

相关文章

网友评论

      本文标题:字节跳动小程序

      本文链接:https://www.haomeiwen.com/subject/qtxfvltx.html