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

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

高老师5个月前 (04-23)JAVA185

由于好运哥官方并不直接提供对接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.5b1.cn/post/756.html

分享给朋友:

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

java一个类可以有多个构造方法

java一个类可以有多个构造方法

java一个类可以有多个构造方法,根据传参类型和个数来匹配执行哪个构造方法。public class Member {     public Member(){      ...

java限制1个方法同一时间只能被一个线程访问

java限制1个方法同一时间只能被一个线程访问

java限制1个方法同一时间只能被一个线程访问public synchronized void setOrderPay(){ }加上synchronized 修饰符即可...

java数组,java创建数组,java创建数组并赋值,java数组元素个数,java foreach 循环数组,java数组排序

java数组,java创建数组,java创建数组并赋值,java数组元素个数,java foreach 循环数组,java数组排序

(1).创建数组double[] myList = new double[size];  //推荐创建方式 double myList[] = new double[size];  ...

java日期和时间

java日期和时间

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

java获取时间戳,java时间戳获取

java获取时间戳,java时间戳获取

System.out.println("当前时间戳(秒): " + System.currentTimeMillis()/1000); System.out.println("当前时间戳(毫秒): " +&nb...

java正则表达式捕获组

java正则表达式捕获组

java正则表达式的捕获组捕获组可以将匹配到的结果根据正则中的括号进行分组,这里变量我加了$符,php转java的坏习惯,懒得改了,能跑就行// 匹配字符串 String $line = "gaojiufeng 1994! ok?...