由于好运哥官方并不直接提供对接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); } }
字节(Byte)是计量单位,表示数据量多少,是计算机信息技术用于计量存储容量的一种计量单位,通常情况下一字节等于八位。字符(Character)计算机中使用的字母、数字、字和符号,比如'A'、'B'、'$'、'&'等。一般在英文...
public class test { public static void main(String[] args) { &...
public class test { public static void main(String[] args) { &...
java限制1个方法同一时间只能被一个线程访问public synchronized void setOrderPay(){ }加上synchronized 修饰符即可...
(1).final 修饰符通常和 static 修饰符一起使用来创建类常量。(2).父类中的 final 方法可以被子类继承,但是不能被子类重写,声明 final 方法的主要目的是防止该方法的内容被修改。public class Member {  ...
在java中字符串属于对象,刚开始我就疑惑为什么int char等类型都是小写,结果String是大写,java太反人类,后来才知道String是对象。(1).java创建字符串String text = "net"; String tex...