TJoinpayMchServiceImpl.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348
  1. package com.szwl.service.impl;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.szwl.model.bo.JoinpayConstant;
  4. import com.szwl.model.entity.TJoinpayMch;
  5. import com.szwl.mapper.TJoinpayMchMapper;
  6. import com.szwl.model.entity.TJoinpayMchCheck;
  7. import com.szwl.model.utils.AESUtil;
  8. import com.szwl.model.utils.Constant;
  9. import com.szwl.model.utils.HttpClientUtils;
  10. import com.szwl.model.utils.RSAUtil;
  11. import com.szwl.service.TJoinpayMchService;
  12. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  13. import org.apache.commons.codec.digest.DigestUtils;
  14. import org.springframework.stereotype.Service;
  15. import java.io.IOException;
  16. import java.util.*;
  17. /**
  18. * <p>
  19. * 汇聚支付用户收款信息表 服务实现类
  20. * </p>
  21. *
  22. * @author wuhs
  23. * @since 2022-04-29
  24. */
  25. @Service
  26. public class TJoinpayMchServiceImpl extends ServiceImpl<TJoinpayMchMapper, TJoinpayMch> implements TJoinpayMchService {
  27. @Override
  28. public String createMch(TJoinpayMch mch) {
  29. Long adminId = mch.getAdminId();
  30. if(null == adminId){
  31. return "找不到对应的管理员";
  32. }
  33. Integer alt_merchant_type = mch.getAltMerchantType();
  34. String url = "https://www.joinpay.com/allocFunds";
  35. JSONObject requestData = new JSONObject(new LinkedHashMap());
  36. String login_name = "test1_" + adminId + "@mianhuatang.com";
  37. // String login_name = mch.getLegal_person();
  38. mch.setLoginName(login_name);
  39. // String alt_mch_name = "test1_" + adminId + "@mianhuatang.com";
  40. // String alt_mch_name = mch.getLegal_person();
  41. String alt_mch_name = mch.getBankAccountName();
  42. mch.setAltMchName(alt_mch_name);
  43. mch.setAltMchShortName("");
  44. // mch.setAlt_mch_short_name("");
  45. // 格式为16 位随机字符串:16 位随机字符串
  46. String aes_key1 = getRandomString(16);
  47. String aes_key2 = getRandomString(16);
  48. requestData.put("login_name", login_name);
  49. requestData.put("alt_mch_name", alt_mch_name);
  50. requestData.put("alt_mch_short_name", "");
  51. requestData.put("alt_merchant_type", mch.getAltMerchantType());
  52. requestData.put("busi_contact_name", mch.getBusiContactName());
  53. requestData.put("busi_contact_mobile_no", mch.getBusiContactMobileNo());
  54. requestData.put("phone_no", mch.getPhoneNo());
  55. requestData.put("manage_scope", mch.getManageScope());
  56. requestData.put("manage_addr", mch.getManageAddr());
  57. requestData.put("legal_person", AESUtil.encrypt(mch.getLegalPerson() , aes_key1 , aes_key2 ));
  58. requestData.put("id_card_no", AESUtil.encrypt(mch.getIdCardNo(), aes_key1 , aes_key2 ));
  59. requestData.put("id_card_expiry", mch.getIdCardExpiry());
  60. // 个体工商户和企业必填:营业执照编号 / 营业执照有效期
  61. if(JoinpayConstant.alt_merchant_type2== alt_merchant_type || JoinpayConstant.alt_merchant_type3== alt_merchant_type){
  62. requestData.put("license_no", mch.getLicenseNo());
  63. requestData.put("license_expiry", mch.getLicenseExpiry());
  64. }
  65. if(mch.getSettMode()!=null){
  66. requestData.put("sett_mode", mch.getSettMode());
  67. }else {
  68. // 由汇聚自动结算
  69. requestData.put("sett_mode", JoinpayConstant.sett_mode1);
  70. }
  71. // 结算周期类型:自然日
  72. requestData.put("sett_date_type", JoinpayConstant.sett_date_type2);
  73. if(mch.getRiskDay()!=null){
  74. requestData.put("risk_day", mch.getRiskDay());
  75. }else{
  76. // 结算周期:1
  77. requestData.put("risk_day", 1);
  78. }
  79. if(JoinpayConstant.alt_merchant_type2== alt_merchant_type || JoinpayConstant.alt_merchant_type3== alt_merchant_type){
  80. // 企业用对公账户
  81. requestData.put("bank_account_type", JoinpayConstant.bank_account_type4);
  82. }else if(JoinpayConstant.alt_merchant_type1== alt_merchant_type){
  83. // 个人用借记卡
  84. requestData.put("bank_account_type", JoinpayConstant.bank_account_type1);
  85. }
  86. requestData.put("bank_account_name", AESUtil.encrypt(mch.getBankAccountName(), aes_key1 , aes_key2 ));
  87. requestData.put("bank_account_no", AESUtil.encrypt(mch.getBankAccountNo(), aes_key1 , aes_key2 ));
  88. requestData.put("bank_channel_no", mch.getBankChannelNo());
  89. JSONObject requestJson = new JSONObject(new TreeMap<String, Object>());
  90. requestJson.put("method", "altmch.add");
  91. requestJson.put("version", "2.0");
  92. requestJson.put("data", requestData);
  93. // 32位随机字符串
  94. String uuid = UUID.randomUUID().toString().trim().replaceAll("-", "");
  95. requestJson.put("rand_str", uuid);
  96. requestJson.put("sign_type", JoinpayConstant.sign_type_MD5);
  97. requestJson.put("mch_no", JoinpayConstant.mch_no);
  98. String sign = createMD5Sign(requestJson , JoinpayConstant.key);
  99. requestJson.put("sign", sign.toUpperCase());
  100. requestJson.put("aes_key", RSAUtil.encrypt(aes_key1+":"+aes_key2 , JoinpayConstant.publickey ));
  101. // logger.info("请求参数:" + requestJson);
  102. org.json.JSONObject jsonObject;
  103. try {
  104. jsonObject = HttpClientUtils.postJson(url, requestJson.toString());
  105. // logger.info("响应参数:" + jsonObject);
  106. if(jsonObject.has("resp_code")){
  107. mch.setRespCode(jsonObject.getString("resp_code"));
  108. }
  109. if(jsonObject.has("data")){
  110. org.json.JSONObject data = jsonObject.getJSONObject("data");
  111. if(data.has("biz_code")){
  112. mch.setBizCode(data.getString("biz_code"));
  113. }
  114. if (data.has("alt_mch_no")){
  115. mch.setAltMchName(data.getString("alt_mch_no"));
  116. }
  117. if(data.has("order_status")){
  118. mch.setOrderStatus(data.getString("order_status"));
  119. }
  120. }
  121. /**
  122. * 更新一下分销商户的 各种响应码 & login_name
  123. */
  124. mch.setCreateDate(new Date());
  125. mch.setModifyDate(new Date());
  126. save(mch);
  127. if(jsonObject.has("resp_code")){
  128. String resp_code = jsonObject.getString("resp_code");
  129. mch.setRespCode(resp_code);
  130. if(JoinpayConstant.resp_code2.equals(resp_code)){
  131. org.json.JSONObject data = jsonObject.getJSONObject("data");
  132. if(data.has("biz_msg")){
  133. return data.getString("biz_msg");
  134. }
  135. }
  136. }
  137. } catch (IOException e) {
  138. e.printStackTrace();
  139. }
  140. return Constant.correct_code;
  141. }
  142. @Override
  143. public String updateMch(TJoinpayMch mch) {
  144. Long adminId = mch.getAdminId();
  145. if(null == adminId){
  146. return "找不到对应的管理员";
  147. }
  148. if(JoinpayConstant.alt_merchant_type1!=mch.getAltMerchantType()
  149. && JoinpayConstant.alt_merchant_type2!= mch.getAltMerchantType()
  150. && JoinpayConstant.alt_merchant_type3!= mch.getAltMerchantType()){
  151. return "商家类型不正确";
  152. }
  153. String url = "https://www.joinpay.com/allocFunds";
  154. JSONObject requestData = new JSONObject(new LinkedHashMap());
  155. // 格式为16 位随机字符串:16 位随机字符串
  156. String aes_key1 = getRandomString(16);
  157. String aes_key2 = getRandomString(16);
  158. requestData.put("alt_mch_no", mch.getAltMchNo());
  159. // requestData.put("legal_person", AESUtil.encrypt(legal_person, aes_key1 , aes_key2 ));
  160. requestData.put("legal_person", mch.getLegalPerson());
  161. // requestData.put("id_card_no", AESUtil.encrypt(id_card_no, aes_key1 , aes_key2 ));
  162. requestData.put("id_card_no", mch.getIdCardNo());
  163. if(JoinpayConstant.alt_merchant_type2== mch.getAltMerchantType() || JoinpayConstant.alt_merchant_type3== mch.getAltMerchantType()){
  164. // 企业用对公账户
  165. requestData.put("bank_account_type", JoinpayConstant.bank_account_type4);
  166. mch.setBankAccountType(JoinpayConstant.bank_account_type4);
  167. String alt_mch_name = mch.getBankAccountName();
  168. requestData.put("alt_mch_name", alt_mch_name);
  169. requestData.put("license_no", mch.getLicenseNo());
  170. // requestData.put("alt_mch_name", AESUtil.encrypt(alt_mch_name, aes_key1 , aes_key2 ));/**/
  171. }else if(JoinpayConstant.alt_merchant_type1== mch.getAltMerchantType()){
  172. // 个人用借记卡
  173. requestData.put("bank_account_type", JoinpayConstant.bank_account_type1);
  174. mch.setBankAccountType(JoinpayConstant.bank_account_type1);
  175. }
  176. requestData.put("bank_account_name", mch.getBankAccountName());
  177. // requestData.put("bank_account_name", AESUtil.encrypt(bank_account_name, aes_key1 , aes_key2 ));
  178. requestData.put("bank_account_no", mch.getBankAccountNo());
  179. // requestData.put("bank_account_no", AESUtil.encrypt(bank_account_no, aes_key1 , aes_key2 ));
  180. // requestData.put("bank_channel_no", AESUtil.encrypt(bank_channel_no, aes_key1 , aes_key2 ));
  181. requestData.put("bank_channel_no", mch.getBankChannelNo());
  182. if(mch.getSettMode()!=null){
  183. requestData.put("sett_mode", mch.getSettMode());
  184. }else {
  185. // 由汇聚自动结算
  186. requestData.put("sett_mode", JoinpayConstant.sett_mode1);
  187. }
  188. // 结算周期类型:自然日
  189. requestData.put("sett_date_type", JoinpayConstant.sett_date_type2);
  190. if(mch.getRiskDay()!=null){
  191. requestData.put("risk_day", mch.getRiskDay());
  192. }else{
  193. // 结算周期:1
  194. requestData.put("risk_day", 1);
  195. }
  196. // mch.setLegal_person(legal_person);
  197. // mch.setId_card_no(id_card_no);
  198. // mch.setAlt_merchant_type(alt_merchant_type);
  199. // mch.setBank_account_name(bank_account_name);
  200. // mch.setBank_account_no(bank_account_no);
  201. // mch.setBank_channel_no(bank_channel_no);
  202. if(mch.getAltMerchantType()==12){
  203. String alt_mch_name = mch.getBankAccountName();
  204. // mch.setAlt_mch_name(alt_mch_name);
  205. }
  206. JSONObject requestJson = new JSONObject(new TreeMap<String, Object>());
  207. requestJson.put("method", "altmch.modify");
  208. requestJson.put("version", "1.1");
  209. requestJson.put("data", requestData);
  210. // 32位随机字符串
  211. String uuid = UUID.randomUUID().toString().trim().replaceAll("-", "");
  212. requestJson.put("rand_str", uuid);
  213. requestJson.put("sign_type", JoinpayConstant.sign_type_MD5);
  214. requestJson.put("mch_no", JoinpayConstant.mch_no);
  215. String sign = createMD5Sign(requestJson , JoinpayConstant.key);
  216. requestJson.put("sign", sign.toUpperCase());
  217. requestJson.put("aes_key", RSAUtil.encrypt(aes_key1+":"+aes_key2 , JoinpayConstant.publickey ));
  218. // logger.info("请求参数:" + requestJson);
  219. org.json.JSONObject jsonObject;
  220. try {
  221. jsonObject = HttpClientUtils.postJson(url, requestJson.toString());
  222. // logger.info("响应参数:" + jsonObject);
  223. if(jsonObject.has("resp_code")){
  224. mch.setRespCode(jsonObject.getString("resp_code"));
  225. }
  226. if(jsonObject.has("data")){
  227. org.json.JSONObject data = jsonObject.getJSONObject("data");
  228. if(data.has("biz_code")){
  229. mch.setBizCode(data.getString("biz_code"));
  230. }
  231. if (data.has("alt_mch_no")){
  232. mch.setAltMchNo(data.getString("alt_mch_no"));
  233. }
  234. if(data.has("order_status")){
  235. mch.setOrderStatus(data.getString("order_status"));
  236. }
  237. }
  238. if(jsonObject.has("resp_code")){
  239. String resp_code = jsonObject.getString("resp_code");
  240. mch.setRespCode(resp_code);
  241. if(JoinpayConstant.resp_code2.equals(resp_code)){
  242. org.json.JSONObject data = jsonObject.getJSONObject("data");
  243. if(data.has("biz_msg")){
  244. return data.getString("biz_msg");
  245. }
  246. }
  247. }
  248. } catch (IOException e) {
  249. e.printStackTrace();
  250. }
  251. return Constant.correct_code;
  252. }
  253. /**
  254. * 获取随机字符串
  255. * @return
  256. */
  257. public static String getRandomString(int length){
  258. String str="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
  259. Random random=new Random();
  260. StringBuffer sb=new StringBuffer();
  261. for(int i=0;i<length;i++){
  262. int number=random.nextInt(62);
  263. sb.append(str.charAt(number));
  264. }
  265. return sb.toString();
  266. }
  267. /**
  268. * 签名算法sign , MD5 签名
  269. * @param requestJson
  270. * @return
  271. */
  272. public static String createMD5Sign(JSONObject requestJson , String key){
  273. StringBuffer sb = new StringBuffer();
  274. Set es = requestJson.entrySet();
  275. Iterator it = es.iterator();
  276. while(it.hasNext()) {
  277. Map.Entry entry = (Map.Entry)it.next();
  278. String k = (String)entry.getKey();
  279. Object v = entry.getValue();
  280. if(null != v && !"".equals(v) && !"sign".equals(k) && !"key".equals(k)) {
  281. sb.append(k + "=" + v + "&");
  282. }
  283. }
  284. sb.append("key=" + key);
  285. // logger.info("签名字符串:"+sb.toString());
  286. String sign = DigestUtils.md5Hex(sb.toString());
  287. return sign;
  288. }
  289. }