HygSDK.java 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. package common.utils.hyg;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.jfinal.kit.HttpKit;
  5. import com.jfinal.kit.StrKit;
  6. import java.nio.charset.StandardCharsets;
  7. import java.util.ArrayList;
  8. import java.util.HashMap;
  9. import java.util.List;
  10. import java.util.Map;
  11. public class HygSDK {
  12. private final static String DOMAIN = System.getenv("HYG_DOMAIN");
  13. private final static String RSA_PRIVATE_KEY = System.getenv("HYG_RSA_PRIVATE_KEY");
  14. private final static String AES_KEY = System.getenv("HYG_AES_KEY");
  15. private final static String COOPERATOR_ID = System.getenv("HYG_COOPERATOR_ID");
  16. /**
  17. * 自由职业者信息详情查询接口
  18. * 接口地址: https://${domain}/api/v2/hire/worker/findDetails
  19. *
  20. * @param workerId 自由职业者ID
  21. * @return JSONObject 包含statusCode, statusText, data 等信息的响应
  22. * @throws Exception 如果请求或签名发生错误
  23. */
  24. public static JSONObject findWorkerDetails(String workerId) throws Exception {
  25. Map<String, Object> bizParams = new HashMap<>();
  26. bizParams.put("workerId", workerId);
  27. return HygSDK.invokeApi("/api/v2/hire/worker/findDetails", bizParams);
  28. }
  29. public static JSONObject findDepositAccount() throws Exception {
  30. Map<String, Object> bizParams = new HashMap<>();
  31. List<String> cooperatorIdList = new ArrayList<>();
  32. cooperatorIdList.add(COOPERATOR_ID);
  33. bizParams.put("cooperatorIdList", cooperatorIdList);
  34. return HygSDK.invokeApi("/batch/query/cooperator/account", bizParams);
  35. }
  36. /**
  37. * 自由职业者放款接口
  38. *
  39. * @param workerId 自由职业者id
  40. * @param amount 放款金额(单位:分)
  41. * @param requestNo 放款订单号
  42. * @param positionId 任务ID,需要在慧用工后台申请
  43. * @return 放款结果
  44. * @throws Exception 放款异常捕获
  45. */
  46. public static JSONObject singleDistribute(String workerId, String amount, String requestNo, String positionId) throws Exception {
  47. // 先获取worker details
  48. JSONObject workerDetails = findWorkerDetails(workerId);
  49. // 先获取个体账户信息
  50. if (!workerDetails.getString("statusCode").equals("000000")) {
  51. workerDetails.put("statusText", "个体账户信息获取失败:" + workerDetails.getString("statusText") + ", workerId=" + workerId);
  52. return workerDetails;
  53. }
  54. // AppConfig.LOGGER.info("工人信息获取:{}", workerDetails.getString("statusText"));
  55. // 封装打款信息
  56. JSONObject workerData = workerDetails.getJSONObject("data");
  57. Map<String, Object> bizParams = new HashMap<>();
  58. bizParams.put("workerName", workerData.getString("workerName"));
  59. bizParams.put("receiptChannel", 10);
  60. bizParams.put("workerAccount", workerData.getString("bankCardNo"));
  61. bizParams.put("workerType", 1);
  62. bizParams.put("idNumber", workerData.getString("identNo"));
  63. bizParams.put("workerMobile", workerData.getString("workerMobile"));
  64. bizParams.put("distributeAmount", amount);
  65. bizParams.put("requestNo", requestNo);
  66. bizParams.put("positionId", positionId);
  67. return HygSDK.invokeApi("/api/distribute/singleDistribute", bizParams);
  68. }
  69. /**
  70. * 放款状态查询
  71. *
  72. * @param requestNo 放款订单号,由平台自己生成
  73. * @return 放款结果
  74. * @throws Exception 放款查询异常捕获
  75. */
  76. public static JSONObject signalQuery(String requestNo) throws Exception {
  77. Map<String, Object> bizParams = new HashMap<>();
  78. bizParams.put("requestNo", requestNo);
  79. return HygSDK.invokeApi("/api/query/singleQuery", bizParams);
  80. }
  81. /**
  82. * 可以添加一个公共的请求方法,处理签名、加密、响应解析等通用逻辑
  83. * @param apiPath 例如 FIND_DETAILS_API
  84. * @param bizParams 业务参数,不包含cooperatorId, timestamp, sign
  85. * @return
  86. * @throws Exception
  87. */
  88. public static JSONObject invokeApi(String apiPath, Map<String, Object> bizParams) throws Exception {
  89. // 加载固定参数
  90. Map<String, Object> fullParams = new HashMap<>();
  91. fullParams.put("cooperatorId", COOPERATOR_ID);
  92. fullParams.putAll(bizParams); // 添加传入的业务参数
  93. // 生成时间戳
  94. String timestamp = String.valueOf(System.currentTimeMillis());
  95. fullParams.put("timestamp", timestamp);
  96. // 签名
  97. String sortedParamString = RSAUtils.sortParam(fullParams);
  98. String sign = RSAUtils.sign(sortedParamString.getBytes(StandardCharsets.UTF_8), RSA_PRIVATE_KEY);
  99. fullParams.put("sign", sign);
  100. // 构建请求 URL
  101. String requestUrl = DOMAIN + apiPath;
  102. // 构造最终请求
  103. Map<String, Object> finalParams = new HashMap<>();
  104. finalParams.put("cooperatorId", COOPERATOR_ID);
  105. String jsonStr = JSONObject.toJSONString(fullParams);
  106. finalParams.put("businessBody", AESUtils.encrypt2Hex(jsonStr, AES_KEY));
  107. // 请求头
  108. Map<String, String> headers = new HashMap<>();
  109. headers.put("Content-Type", "application/json");
  110. // 发送请求
  111. String postParams = JSON.toJSONString(finalParams);
  112. String responseBody = HttpKit.post(requestUrl, null, postParams, headers);
  113. if (StrKit.isBlank(responseBody)) {
  114. throw new RuntimeException("API响应为空");
  115. }
  116. // 解密返回值
  117. JSONObject responseJson = JSON.parseObject(responseBody);
  118. if (responseJson.getString("statusCode").equals("000000")) {
  119. String decodeRest = AESUtils.decryptByHex(responseJson.getString("data"));
  120. responseJson.put("data", JSONObject.parse(decodeRest));
  121. }
  122. return responseJson;
  123. }
  124. public static void main(String[] args) {
  125. try {
  126. // {"data":{"workerId":"W141720xxxx8","identNo":"51xxxx1xxxxx9012","signTime":"2025-09-15 17:36:50","bankCardNo":"6217003xxxxx1392931","workerCfcaSignFlag":true,"signDesc":"签约成功","remark":"","updateTime":"2025-09-16 03:15:00","signState":2,"receiptChannel":10,"createTime":"2025-09-15 17:36:50","workerMobile":"17781855864","verifiedStatus":2,"verifiedDesc":"认证成功","workerName":"龚成明","verifiedTime":"2025-09-15 17:36:17","certificateType":1},"statusText":"success","statusCode":"000000"}
  127. // {"statusText":"用户记录不存在","statusCode":"200406"}
  128. // AppConfig.LOGGER.info(HygSDK.findWorkerDetails("W1420857775537291264").toString());
  129. // {"data":[{"receiverAccountName":"九江慧用工科技有限公司","receiverBankBranchNo":"308100005192","cooperatorId":"C1415369626593792000","receiverBankBranchName":"招商银行股份有限公司北京东方广场支行","bankType":"商业银行","receiverAccountNo":"755915711210409","shortBankName":"招商银行","cooperatorName":"特别火(嵌入板)O"}],"statusText":"success","statusCode":"000000"}
  130. // AppConfig.LOGGER.info(HygSDK.findDepositAccount().toString());
  131. // 放款100分测试
  132. /*
  133. * 2025-09-26 14:39:50.604 [main] INFO common.jfinal.AppConfig - order_sn = 17588690942918042
  134. * 2025-09-26 14:39:51.306 [main] INFO common.jfinal.AppConfig - {"data":{"distributeId":"BL1421144242402639872","distributeAmount":"100"},"statusText":"success","statusCode":"000000"}
  135. */
  136. // String orderSn = OrderService.generateOrderSn();
  137. // AppConfig.LOGGER.info("order_sn = {}", orderSn);
  138. // AppConfig.LOGGER.info(HygSDK.singleDistribute("W1420857775537291264", "925", "DLTBH_WD_17588741472336835", "P1421138295391289344").toString());
  139. // 一次至少提现1000分
  140. // {"data":{"valueAddedTax":"0","distributeStatus":75,"incomeActualAmount":0,"constructionTax":"0","localEducationSupplementaryTax":"0","educationSurchargeTax":"0","remark":"计费标准超出范围","requestNo":"17588687904896652","individualIncomeTax":"0","incomeTaxAmount":0,"serviceCharge":"0","distributeId":"BL1421144242402639872","createTime":"2025-09-26 14:39:51","useCouponAmount":0,"distributeAmount":"100"},"statusText":"success","statusCode":"000000"}
  141. // {"data":{"valueAddedTax":"0","distributeStatus":60,"incomeActualAmount":1000,"constructionTax":"0","localEducationSupplementaryTax":"0","payTime":"2025-09-26 14:44:55","educationSurchargeTax":"0","remark":"","requestNo":"17588690942918042","individualIncomeTax":"0","incomeTaxAmount":0,"serviceCharge":"75","distributeId":"BL1421145516409892864","createTime":"2025-09-26 14:44:55","useCouponAmount":0,"bankSerialNo":"2011000420250926143698976426","distributeAmount":"1000"},"statusText":"success","statusCode":"000000"}
  142. // AppConfig.LOGGER.info(HygSDK.signalQuery("DLTBH_WD_17588746359625898").toString());
  143. } catch (Exception e) {
  144. e.printStackTrace();
  145. }
  146. }
  147. }