当前位置:首页 > JAVA > 正文内容

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

高老师3周前 (04-23)JAVA39

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

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


扫描二维码推送至手机访问。

版权声明:本文由高久峰个人博客发布,如需转载请注明出处。

本文链接:https://blog.20230611.cn/post/756.html

分享给朋友:

“好运哥电子面单签名工具类” 的相关文章

 java字节与字符的区别,字节与字的区别与联系

java字节与字符的区别,字节与字的区别与联系

字节(Byte)是计量单位,表示数据量多少,是计算机信息技术用于计量存储容量的一种计量单位,通常情况下一字节等于八位。字符(Character)计算机中使用的字母、数字、字和符号,比如'A'、'B'、'$'、'&'等。一般在英文...

Java不用编译直接执行

Java不用编译直接执行

public class test {     public static void main(String[] args) {     &...

java编译编码问题,java编译执行时编码问题

java编译编码问题,java编译执行时编码问题

public class test {     public static void main(String[] args) {     &...

java final 修饰符,java通过final修饰符创建常量,,java通过final修饰符声明方法不可被修改

java final 修饰符,java通过final修饰符创建常量,,java通过final修饰符声明方法不可被修改

(1).final 修饰符通常和 static 修饰符一起使用来创建类常量。(2).父类中的 final 方法可以被子类继承,但是不能被子类重写,声明 final 方法的主要目的是防止该方法的内容被修改。public class Member {   ...

java Character 类,java判断字符是否是一个字母,java判断字符是否是一个数字,java判断字符是否是一个空白,java判断字符是否是小写字母,java判断字符是否是大写字母,java转换字符为大写,java转换字符为小写

java Character 类,java判断字符是否是一个字母,java判断字符是否是一个数字,java判断字符是否是一个空白,java判断字符是否是小写字母,java判断字符是否是大写字母,java转换字符为大写,java转换字符为小写

java判断字符是否是一个字母System.out.println(Character.isLetter('a'));java判断字符是否是一个数字System.out.println(Character.isDigit('0'));java判断字符是否是一个空白Sy...

java日期和时间

java日期和时间

(1).java获取当前日期时间Date date = new Date();  System.out.println(date.toString());输出Fri Jul 02 10:29:55 CST 2021(2).java获取时间戳秒/毫秒D...