前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >好运哥电子面单签名工具类

好运哥电子面单签名工具类

原创
作者头像
高久峰
发布2024-04-23 12:30:04
930
发布2024-04-23 12:30:04
举报

由于好运哥官方并不直接提供对接sdk,签名文档写的也非常一般,开发人员对接比较麻烦,我根据文档自己编写了签名工具,有需要的可以直接使用,让开发更快一步。当然工具类中有些是不需要的可以自己删除下,我比较懒。下面是具体的类:

代码语言:javascript
复制
package com.x3.plug.waybill.utils;

import com.x3.base.core.exception.BusinessException;
import com.x3.base.core.util.JsonUtil;
import com.x3.plug.waybill.entity.PostAddr;
import com.x3.plug.waybill.request.WayBillCreateRequest;
import org.springframework.util.StringUtils;

import java.security.MessageDigest;
import java.util.*;

/**
 * 好运哥电子面单工具类
 */
public class LuckyGoUtil {

    private final static String[] hexDigits = {"0", "1", "2", "3", "4", "5", "6", "7",
            "8", "9", "a", "b", "c", "d", "e", "f"};

    /**
     * 获取签名信息
     * @param obj
     * @param key
     * @return
     */
    public static String getSign(Object obj, String key)  {
        try {
            String json = JsonUtil.toJSONString(obj);
            Map<String,Object> map = JsonUtil.parseObject(json, Map.class);
            ArrayList<String> list = new ArrayList<>();
            for (Map.Entry<String, Object> entry : map.entrySet()) {
                if (!StringUtils.isEmpty(entry.getValue())) {
                    list.add(entry.getKey() + "=" + entry.getValue() + "&");
                }
            }
            int size = list.size();
            String[] arrayToSort = list.toArray(new String[size]);
            Arrays.sort(arrayToSort, String.CASE_INSENSITIVE_ORDER);
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < size; i++) {
                sb.append(arrayToSort[i]);
            }
            String result = sb.toString();
            result += "key=" + key;
            result = MD5Encode(result).toUpperCase();
            return result;
        }catch (Exception ex){
            ex.printStackTrace();
        }
        return "";
    }

    /**
     * MD5编码
     *
     * @param origin 原始字符串
     * @return 经过MD5加密之后的结果
     */
    public static String MD5Encode(String origin) {
        String resultString = null;
        try {
            resultString = origin;
            MessageDigest md = MessageDigest.getInstance("MD5");
            resultString = byteArrayToHexString(md.digest(resultString.getBytes()));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return resultString;
    }

    /**
     * 转换字节数组为16进制字串
     *
     * @param b 字节数组
     * @return 16进制字串
     */
    public static String byteArrayToHexString(byte[] b) {
        StringBuilder resultSb = new StringBuilder();
        for (byte aB : b) {
            resultSb.append(byteToHexString(aB));
        }
        return resultSb.toString();
    }

    /**
     * 转换byte到16进制
     *
     * @param b 要转换的byte
     * @return 16进制格式
     */
    private static String byteToHexString(byte b) {
        int n = b;
        if (n < 0) {
            n = 256 + n;
        }
        int d1 = n / 16;
        int d2 = n % 16;
        return hexDigits[d1] + hexDigits[d2];
    }

    /**
     * 根据规则生成oaId
     * (适用用抖音、拼多多、快手、小红书、视频号等其它平台解密)
     *
     * @param request
     * @return
     */
    public static String generateOaIdAccordingToRules(WayBillCreateRequest request) {
        /*
         * 规则说明
         * 将接收方密文信息进行拼接(固定格式),顺序为:姓名(receiver_contact),手机号(receiver_mobile),电话(receiver_tel),详细地址(receiver_address) 中间使用逗号风格,如果电话为空,需要用空格代替
         */

        //获取拼接变量(并且将为空的信息替换为空格)
        PostAddr receiver = request.getReceiver();
        String receiverContact = generateOaIdFieldDetail(receiver.getName()); // 姓名
        String receiverMobile = generateOaIdFieldDetail(receiver.getMobile()); // 手机号
        String receiverTel = generateOaIdFieldDetail(receiver.getMobile());  // 电话
        String receiverAddress = generateOaIdFieldDetail(receiver.getAddress()); // 详细地址

        //拼接获得oaId
        return receiverContact + "," + receiverMobile + "," + receiverTel + "," + receiverAddress;
    }

    /**
     * generateOaIdFieldDetail
     *
     * @param text
     * @return
     */
    private static String generateOaIdFieldDetail(String text) {
        if (text == null || text.isEmpty()) {
            return " ";
        }
        return text;
    }

    /**
     * 通过客户编号获取拣货单号
     *
     * @param orderNumber
     * @return
     */
    public static String getErpOrderIdByOrderNumber(String orderNumber) {
        int index = orderNumber.indexOf("T");
        if (index == -1) {
            throw new BusinessException("客户订单号格式不正确,请检查");
        }
        return orderNumber.substring(0, index);
    }
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档