MchServiceImpl.java 38 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015
  1. /*
  2. *
  3. * MchServiceImpl
  4. *
  5. */
  6. package com.hboxs.service.impl;
  7. import com.alibaba.fastjson.JSONObject;
  8. import com.hboxs.common.Constant;
  9. import com.hboxs.common.JoinpayConstant;
  10. import com.hboxs.common.utils.HttpClientUtils;
  11. import com.hboxs.common.utils.joinpay.utils.AESUtil;
  12. import com.hboxs.common.utils.joinpay.utils.RSAUtil;
  13. import com.hboxs.dao.MchDao;
  14. import com.hboxs.joinpay.entity.Mch;
  15. import com.hboxs.service.MchService;
  16. import org.apache.commons.codec.digest.DigestUtils;
  17. import org.apache.commons.lang.StringUtils;
  18. import org.apache.log4j.Logger;
  19. import org.springframework.stereotype.Service;
  20. import org.springframework.util.Base64Utils;
  21. import sun.misc.BASE64Encoder;
  22. import sun.net.www.content.image.png;
  23. import javax.annotation.Resource;
  24. import java.io.FileInputStream;
  25. import java.io.IOException;
  26. import java.io.InputStream;
  27. import java.math.BigDecimal;
  28. import java.text.SimpleDateFormat;
  29. import java.util.*;
  30. /**
  31. * Service - 汇聚支付 - 分销商
  32. * @author dinfeng jimo
  33. * @version 1.0
  34. *
  35. */
  36. @Service("mchServiceImpl")
  37. public class MchServiceImpl extends BaseServiceImpl<Mch, Long> implements MchService {
  38. @Resource(name = "mchDaoImpl")
  39. private MchDao mchDao;
  40. @Resource(name = "mchDaoImpl")
  41. public void setBaseDao(MchDao mchDao) {
  42. super.setBaseDao(mchDao);
  43. }
  44. protected static Logger logger = Logger.getLogger(MchServiceImpl.class);
  45. @Override
  46. public Mch getUniqueness(Long adminId) {
  47. return mchDao.getUniqueness(adminId);
  48. }
  49. @Override
  50. public String createMch(Mch mch) {
  51. Long adminId = mch.getAdminId();
  52. if(null == adminId){
  53. return "找不到对应的管理员";
  54. }
  55. Integer alt_merchant_type = mch.getAlt_merchant_type();
  56. if(JoinpayConstant.alt_merchant_type1!=alt_merchant_type
  57. && JoinpayConstant.alt_merchant_type2!= alt_merchant_type
  58. && JoinpayConstant.alt_merchant_type3!= alt_merchant_type){
  59. return "商家类型不正确";
  60. }
  61. String url = "https://www.joinpay.com/allocFunds";
  62. JSONObject requestData = new JSONObject(new LinkedHashMap());
  63. String login_name = "test1_" + adminId + "@mianhuatang.com";
  64. // String login_name = mch.getLegal_person();
  65. mch.setLogin_name(login_name);
  66. // String alt_mch_name = "test1_" + adminId + "@mianhuatang.com";
  67. // String alt_mch_name = mch.getLegal_person();
  68. String alt_mch_name = mch.getBank_account_name();
  69. mch.setAlt_mch_name(alt_mch_name);
  70. mch.setAlt_mch_short_name("");
  71. // 格式为16 位随机字符串:16 位随机字符串
  72. String aes_key1 = getRandomString(16);
  73. String aes_key2 = getRandomString(16);
  74. requestData.put("login_name", login_name);
  75. requestData.put("alt_mch_name", alt_mch_name);
  76. requestData.put("alt_mch_short_name", "");
  77. requestData.put("alt_merchant_type", mch.getAlt_merchant_type());
  78. requestData.put("busi_contact_name", mch.getBusi_contact_name());
  79. requestData.put("busi_contact_mobile_no", mch.getBusi_contact_mobile_no());
  80. requestData.put("phone_no", mch.getPhone_no());
  81. requestData.put("manage_scope", mch.getManage_scope());
  82. requestData.put("manage_addr", mch.getManage_addr());
  83. requestData.put("legal_person", AESUtil.encrypt(mch.getLegal_person() , aes_key1 , aes_key2 ));
  84. requestData.put("id_card_no", AESUtil.encrypt(mch.getId_card_no(), aes_key1 , aes_key2 ));
  85. requestData.put("id_card_expiry", mch.getId_card_expiry());
  86. // 个体工商户和企业必填:营业执照编号 / 营业执照有效期
  87. if(JoinpayConstant.alt_merchant_type2== alt_merchant_type || JoinpayConstant.alt_merchant_type3== alt_merchant_type){
  88. requestData.put("license_no", mch.getLicense_no());
  89. requestData.put("license_expiry", mch.getLicense_expiry());
  90. }
  91. // 由汇聚自动结算
  92. requestData.put("sett_mode", JoinpayConstant.sett_mode1);
  93. // 结算周期类型:自然日
  94. requestData.put("sett_date_type", JoinpayConstant.sett_date_type2);
  95. // 结算周期:1
  96. requestData.put("risk_day", 1);
  97. if(JoinpayConstant.alt_merchant_type2== alt_merchant_type || JoinpayConstant.alt_merchant_type3== alt_merchant_type){
  98. // 企业用对公账户
  99. requestData.put("bank_account_type", JoinpayConstant.bank_account_type4);
  100. }else if(JoinpayConstant.alt_merchant_type1== alt_merchant_type){
  101. // 个人用借记卡
  102. requestData.put("bank_account_type", JoinpayConstant.bank_account_type1);
  103. }
  104. requestData.put("bank_account_name", AESUtil.encrypt(mch.getBank_account_name(), aes_key1 , aes_key2 ));
  105. requestData.put("bank_account_no", AESUtil.encrypt(mch.getBank_account_no(), aes_key1 , aes_key2 ));
  106. requestData.put("bank_channel_no", mch.getBank_channel_no());
  107. JSONObject requestJson = new JSONObject(new TreeMap<String, Object>());
  108. requestJson.put("method", "altmch.add");
  109. requestJson.put("version", "2.0");
  110. requestJson.put("data", requestData);
  111. // 32位随机字符串
  112. String uuid = UUID.randomUUID().toString().trim().replaceAll("-", "");
  113. requestJson.put("rand_str", uuid);
  114. requestJson.put("sign_type", JoinpayConstant.sign_type_MD5);
  115. requestJson.put("mch_no", JoinpayConstant.mch_no);
  116. String sign = createMD5Sign(requestJson , JoinpayConstant.key);
  117. requestJson.put("sign", sign.toUpperCase());
  118. requestJson.put("aes_key", RSAUtil.encrypt(aes_key1+":"+aes_key2 , JoinpayConstant.publickey ));
  119. logger.info("请求参数:" + requestJson);
  120. org.json.JSONObject jsonObject;
  121. try {
  122. jsonObject = HttpClientUtils.postJson(url, requestJson.toString());
  123. logger.info("响应参数:" + jsonObject);
  124. if(jsonObject.has("resp_code")){
  125. mch.setResp_code(jsonObject.getString("resp_code"));
  126. }
  127. if(jsonObject.has("data")){
  128. org.json.JSONObject data = jsonObject.getJSONObject("data");
  129. if(data.has("biz_code")){
  130. mch.setBiz_code(data.getString("biz_code"));
  131. }
  132. if (data.has("alt_mch_no")){
  133. mch.setAlt_mch_no(data.getString("alt_mch_no"));
  134. }
  135. if(data.has("order_status")){
  136. mch.setOrder_status(data.getString("order_status"));
  137. }
  138. }
  139. /**
  140. * 更新一下分销商户的 各种响应码 & login_name
  141. */
  142. update(mch);
  143. if(jsonObject.has("resp_code")){
  144. String resp_code = jsonObject.getString("resp_code");
  145. mch.setResp_code(resp_code);
  146. if(JoinpayConstant.resp_code2.equals(resp_code)){
  147. org.json.JSONObject data = jsonObject.getJSONObject("data");
  148. if(data.has("biz_msg")){
  149. return data.getString("biz_msg");
  150. }
  151. }
  152. }
  153. } catch (IOException e) {
  154. e.printStackTrace();
  155. }
  156. return Constant.correct_code;
  157. }
  158. @Override
  159. public String updateMch(Mch mch , String legal_person , String id_card_no ,
  160. Integer alt_merchant_type , String bank_account_name , String bank_account_no , String bank_channel_no) {
  161. Long adminId = mch.getAdminId();
  162. if(null == adminId){
  163. return "找不到对应的管理员";
  164. }
  165. if(JoinpayConstant.alt_merchant_type1!=alt_merchant_type
  166. && JoinpayConstant.alt_merchant_type2!= alt_merchant_type
  167. && JoinpayConstant.alt_merchant_type3!= alt_merchant_type){
  168. return "商家类型不正确";
  169. }
  170. String url = "https://www.joinpay.com/allocFunds";
  171. JSONObject requestData = new JSONObject(new LinkedHashMap());
  172. // 格式为16 位随机字符串:16 位随机字符串
  173. String aes_key1 = getRandomString(16);
  174. String aes_key2 = getRandomString(16);
  175. requestData.put("alt_mch_no", mch.getAlt_mch_no());
  176. requestData.put("legal_person", AESUtil.encrypt(legal_person, aes_key1 , aes_key2 ));
  177. requestData.put("id_card_no", AESUtil.encrypt(id_card_no, aes_key1 , aes_key2 ));
  178. if(JoinpayConstant.alt_merchant_type2== alt_merchant_type || JoinpayConstant.alt_merchant_type3== alt_merchant_type){
  179. // 企业用对公账户
  180. requestData.put("bank_account_type", JoinpayConstant.bank_account_type4);
  181. mch.setBank_account_type(JoinpayConstant.bank_account_type4);
  182. String alt_mch_name = bank_account_name;
  183. requestData.put("alt_mch_name", alt_mch_name);
  184. // requestData.put("alt_mch_name", AESUtil.encrypt(alt_mch_name, aes_key1 , aes_key2 ));
  185. }else if(JoinpayConstant.alt_merchant_type1== alt_merchant_type){
  186. // 个人用借记卡
  187. requestData.put("bank_account_type", JoinpayConstant.bank_account_type1);
  188. mch.setBank_account_type(JoinpayConstant.bank_account_type1);
  189. }
  190. requestData.put("bank_account_name", AESUtil.encrypt(bank_account_name, aes_key1 , aes_key2 ));
  191. requestData.put("bank_account_no", AESUtil.encrypt(bank_account_no, aes_key1 , aes_key2 ));
  192. requestData.put("bank_channel_no", bank_channel_no);
  193. mch.setLegal_person(legal_person);
  194. mch.setId_card_no(id_card_no);
  195. mch.setAlt_merchant_type(alt_merchant_type);
  196. mch.setBank_account_name(bank_account_name);
  197. mch.setBank_account_no(bank_account_no);
  198. mch.setBank_channel_no(bank_channel_no);
  199. if(alt_merchant_type==12){
  200. String alt_mch_name = bank_account_name;
  201. mch.setAlt_mch_name(alt_mch_name);
  202. }
  203. JSONObject requestJson = new JSONObject(new TreeMap<String, Object>());
  204. requestJson.put("method", "altmch.modify");
  205. requestJson.put("version", "1.0");
  206. requestJson.put("data", requestData);
  207. // 32位随机字符串
  208. String uuid = UUID.randomUUID().toString().trim().replaceAll("-", "");
  209. requestJson.put("rand_str", uuid);
  210. requestJson.put("sign_type", JoinpayConstant.sign_type_MD5);
  211. requestJson.put("mch_no", JoinpayConstant.mch_no);
  212. String sign = createMD5Sign(requestJson , JoinpayConstant.key);
  213. requestJson.put("sign", sign.toUpperCase());
  214. requestJson.put("aes_key", RSAUtil.encrypt(aes_key1+":"+aes_key2 , JoinpayConstant.publickey ));
  215. logger.info("请求参数:" + requestJson);
  216. org.json.JSONObject jsonObject;
  217. try {
  218. jsonObject = HttpClientUtils.postJson(url, requestJson.toString());
  219. logger.info("响应参数:" + jsonObject);
  220. if(jsonObject.has("resp_code")){
  221. mch.setResp_code(jsonObject.getString("resp_code"));
  222. }
  223. if(jsonObject.has("data")){
  224. org.json.JSONObject data = jsonObject.getJSONObject("data");
  225. if(data.has("biz_code")){
  226. mch.setBiz_code(data.getString("biz_code"));
  227. }
  228. if (data.has("alt_mch_no")){
  229. mch.setAlt_mch_no(data.getString("alt_mch_no"));
  230. }
  231. if(data.has("order_status")){
  232. mch.setOrder_status(data.getString("order_status"));
  233. }
  234. }
  235. if(jsonObject.has("resp_code")){
  236. String resp_code = jsonObject.getString("resp_code");
  237. mch.setResp_code(resp_code);
  238. if(JoinpayConstant.resp_code2.equals(resp_code)){
  239. org.json.JSONObject data = jsonObject.getJSONObject("data");
  240. if(data.has("biz_msg")){
  241. return data.getString("biz_msg");
  242. }
  243. }
  244. }
  245. } catch (IOException e) {
  246. e.printStackTrace();
  247. }
  248. return Constant.correct_code;
  249. }
  250. @Override
  251. public String refreshMch(Mch mch) {
  252. String login_name = mch.getLogin_name();
  253. if(StringUtils.isEmpty(login_name)){
  254. return "账户不存在";
  255. }
  256. String url = "https://www.joinpay.com/allocFunds";
  257. JSONObject requestData = new JSONObject(new LinkedHashMap());
  258. requestData.put("alt_login_name", "test1_" + mch.getAdminId() + "@mianhuatang.com");
  259. JSONObject requestJson = new JSONObject(new TreeMap<String, Object>());
  260. requestJson.put("method", "altmch.query");
  261. requestJson.put("version", "1.0");
  262. requestJson.put("data", requestData);
  263. // 32位随机字符串
  264. String uuid = UUID.randomUUID().toString().trim().replaceAll("-", "");
  265. requestJson.put("rand_str", uuid);
  266. requestJson.put("sign_type", JoinpayConstant.sign_type_MD5);
  267. requestJson.put("mch_no", JoinpayConstant.mch_no);
  268. String sign = createMD5Sign(requestJson , JoinpayConstant.key);
  269. requestJson.put("sign", sign.toUpperCase());
  270. logger.info("请求参数:" + requestJson);
  271. org.json.JSONObject jsonObject;
  272. try {
  273. jsonObject = HttpClientUtils.postJson(url, requestJson.toString());
  274. logger.info("响应参数:" + jsonObject);
  275. if(jsonObject.has("resp_code")){
  276. mch.setResp_code(jsonObject.getString("resp_code"));
  277. }
  278. if(jsonObject.has("data")){
  279. org.json.JSONObject data = jsonObject.getJSONObject("data");
  280. if(data.has("biz_code")){
  281. mch.setBiz_code(data.getString("biz_code"));
  282. }
  283. if (data.has("alt_mch_no")){
  284. mch.setAlt_mch_no(data.getString("alt_mch_no"));
  285. }
  286. if(data.has("order_status")){
  287. mch.setOrder_status(data.getString("order_status"));
  288. }
  289. }
  290. // 判断请求是否正确,受理成功
  291. if(jsonObject.has("resp_code")){
  292. String resp_code = jsonObject.getString("resp_code");
  293. mch.setResp_code(resp_code);
  294. if(JoinpayConstant.resp_code2.equals(resp_code)){
  295. org.json.JSONObject data = jsonObject.getJSONObject("data");
  296. if(data.has("biz_msg")){
  297. return data.getString("biz_msg");
  298. }else{
  299. return JoinpayConstant.resp_code.get(resp_code);
  300. }
  301. }
  302. }else{
  303. return "请求失败";
  304. }
  305. } catch (IOException e) {
  306. e.printStackTrace();
  307. }
  308. update(mch);
  309. return Constant.correct_code;
  310. }
  311. @Override
  312. public String refreshMyAccount(Mch mch) {
  313. String url = "https://www.joinpay.com/allocFunds";
  314. if(StringUtils.isEmpty(mch.getAlt_mch_no())){
  315. return "找不到商家编号";
  316. }
  317. JSONObject requestData = new JSONObject(new LinkedHashMap());
  318. requestData.put("alt_mch_no" , mch.getAlt_mch_no());
  319. JSONObject requestJson = new JSONObject(new TreeMap<String, Object>());
  320. requestJson.put("method", "altAccount.get");
  321. requestJson.put("version", "1.0");
  322. requestJson.put("data", requestData);
  323. // 32位随机字符串
  324. String uuid = UUID.randomUUID().toString().trim().replaceAll("-", "");
  325. requestJson.put("rand_str", uuid);
  326. requestJson.put("sign_type", JoinpayConstant.sign_type_MD5);
  327. requestJson.put("mch_no", JoinpayConstant.mch_no);
  328. String sign = createMD5Sign(requestJson , JoinpayConstant.key);
  329. requestJson.put("sign", sign.toUpperCase());
  330. logger.info("请求参数:" + requestJson);
  331. org.json.JSONObject jsonObject;
  332. try {
  333. jsonObject = HttpClientUtils.postJson(url, requestJson.toString());
  334. logger.info("响应参数:" + jsonObject);
  335. // 判断请求是否正确,受理成功
  336. if(jsonObject.has("resp_code")){
  337. String resp_code = jsonObject.getString("resp_code");
  338. mch.setResp_code(resp_code);
  339. if(JoinpayConstant.resp_code2.equals(resp_code)){
  340. org.json.JSONObject data = jsonObject.getJSONObject("data");
  341. if(data.has("biz_msg")){
  342. return data.getString("biz_msg");
  343. }else{
  344. return JoinpayConstant.resp_code.get(resp_code);
  345. }
  346. }
  347. }else{
  348. return "请求失败";
  349. }
  350. // 处理data
  351. if(jsonObject.has("data")){
  352. org.json.JSONObject data = jsonObject.getJSONObject("data");
  353. // 更新账户的金额
  354. if(data.has("alt_main_balance")){
  355. mch.setAlt_main_balance(new BigDecimal(data.getString("alt_main_balance")).divide(new BigDecimal(100)));
  356. }
  357. if(data.has("alt_guar_balance")){
  358. mch.setAlt_guar_balance(new BigDecimal(data.getString("alt_guar_balance")).divide(new BigDecimal(100)));
  359. }
  360. if(data.has("alt_avil_balance")){
  361. mch.setAlt_avil_balance(new BigDecimal(data.getString("alt_avil_balance")).divide(new BigDecimal(100)));
  362. }
  363. update(mch);
  364. }
  365. } catch (IOException e) {
  366. e.printStackTrace();
  367. }
  368. return Constant.correct_code;
  369. }
  370. // 协议内容获取接口
  371. @Override
  372. public String getQuerySignContent(Mch mch) {
  373. String url = "https://www.joinpay.com/allocFunds";
  374. if(StringUtils.isEmpty(mch.getAlt_mch_no())){
  375. return "找不到商家编号";
  376. }
  377. JSONObject requestData = new JSONObject(new LinkedHashMap());
  378. requestData.put("alt_mch_no" , mch.getAlt_mch_no());
  379. JSONObject requestJson = new JSONObject(new TreeMap<String, Object>());
  380. requestJson.put("method", "altMchSign.querySignContent");
  381. requestJson.put("version", "1.0");
  382. requestJson.put("data", requestData);
  383. // 32位随机字符串
  384. String uuid = UUID.randomUUID().toString().trim().replaceAll("-", "");
  385. requestJson.put("rand_str", uuid);
  386. requestJson.put("sign_type", JoinpayConstant.sign_type_MD5);
  387. requestJson.put("mch_no", JoinpayConstant.mch_no);
  388. String sign = createMD5Sign(requestJson , JoinpayConstant.key);
  389. requestJson.put("sign", sign.toUpperCase());
  390. logger.info("请求参数:" + requestJson);
  391. org.json.JSONObject jsonObject;
  392. try {
  393. jsonObject = HttpClientUtils.postJson(url, requestJson.toString());
  394. logger.info("响应参数:" + jsonObject);
  395. // 判断请求是否正确,受理成功
  396. if(jsonObject.has("resp_code")){
  397. String resp_code = jsonObject.getString("resp_code");
  398. mch.setResp_code(resp_code);
  399. if(JoinpayConstant.resp_code2.equals(resp_code)){
  400. org.json.JSONObject data = jsonObject.getJSONObject("data");
  401. if(data.has("biz_msg")){
  402. return data.getString("biz_msg");
  403. }else{
  404. return JoinpayConstant.resp_code.get(resp_code);
  405. }
  406. }
  407. }else{
  408. return "请求失败";
  409. }
  410. // 处理data
  411. if(jsonObject.has("data")){
  412. org.json.JSONObject data = jsonObject.getJSONObject("data");
  413. //update(mch);
  414. }
  415. } catch (IOException e) {
  416. e.printStackTrace();
  417. }
  418. return Constant.correct_code;
  419. }
  420. // 协议内容签约接口
  421. @Override
  422. public String altMchSign(Mch mch) {
  423. String url = "https://www.joinpay.com/allocFunds";
  424. if(StringUtils.isEmpty(mch.getAlt_mch_no())){
  425. return "找不到商家编号";
  426. }
  427. Date currentTime = new Date();
  428. SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  429. String dateString = formatter.format(currentTime);
  430. JSONObject requestData = new JSONObject(new LinkedHashMap());
  431. requestData.put("alt_mch_no" , mch.getAlt_mch_no());
  432. requestData.put("sign_status" , "P1000");
  433. requestData.put("sign_time" , dateString);
  434. JSONObject requestJson = new JSONObject(new TreeMap<String, Object>());
  435. requestJson.put("method", "altMchSign.sign");
  436. requestJson.put("version", "1.0");
  437. requestJson.put("data", requestData);
  438. // 32位随机字符串
  439. String uuid = UUID.randomUUID().toString().trim().replaceAll("-", "");
  440. requestJson.put("rand_str", uuid);
  441. requestJson.put("sign_type", JoinpayConstant.sign_type_MD5);
  442. requestJson.put("mch_no", JoinpayConstant.mch_no);
  443. String sign = createMD5Sign(requestJson , JoinpayConstant.key);
  444. requestJson.put("sign", sign.toUpperCase());
  445. logger.info("请求参数:" + requestJson);
  446. String back=null;
  447. org.json.JSONObject jsonObject;
  448. try {
  449. jsonObject = HttpClientUtils.postJson(url, requestJson.toString());
  450. logger.info("响应参数:" + jsonObject);
  451. // 判断请求是否正确,受理成功
  452. if(jsonObject.has("resp_code")){
  453. String resp_code = jsonObject.getString("resp_code");
  454. mch.setResp_code(resp_code);
  455. if(JoinpayConstant.resp_code2.equals(resp_code)){
  456. org.json.JSONObject data = jsonObject.getJSONObject("data");
  457. if(data.has("biz_msg")){
  458. return data.getString("biz_msg");
  459. }else{
  460. return JoinpayConstant.resp_code.get(resp_code);
  461. }
  462. }
  463. }else{
  464. return "请求失败";
  465. }
  466. // 处理data
  467. if(jsonObject.has("data")){
  468. org.json.JSONObject data = jsonObject.getJSONObject("data");
  469. String biz_code = data.getString("biz_code");
  470. if(biz_code.equals("B100000")){
  471. String sign_trx_no = data.getString("sign_trx_no");
  472. String sign_status = data.getString("sign_status");
  473. if(sign_status.equals("P1000")){
  474. sign_status="签约成功";
  475. }else {
  476. sign_status="签约失败";
  477. }
  478. mch.setSign_status(sign_status);
  479. mch.setSign_trx_no(sign_trx_no);
  480. back = sign_status;
  481. }
  482. update(mch);
  483. }
  484. } catch (IOException e) {
  485. e.printStackTrace();
  486. }
  487. return back;
  488. }
  489. // 协议签约查询接口
  490. @Override
  491. public String querySignRecord(Mch mch) {
  492. String url = "https://www.joinpay.com/allocFunds";
  493. if(StringUtils.isEmpty(mch.getAlt_mch_no())){
  494. return "找不到商家编号";
  495. }
  496. JSONObject requestData = new JSONObject(new LinkedHashMap());
  497. requestData.put("alt_mch_no" , mch.getAlt_mch_no());
  498. JSONObject requestJson = new JSONObject(new TreeMap<String, Object>());
  499. requestJson.put("method", "altMchSign.querySignRecord");
  500. requestJson.put("version", "1.0");
  501. requestJson.put("data", requestData);
  502. // 32位随机字符串
  503. String uuid = UUID.randomUUID().toString().trim().replaceAll("-", "");
  504. requestJson.put("rand_str", uuid);
  505. requestJson.put("sign_type", JoinpayConstant.sign_type_MD5);
  506. requestJson.put("mch_no", JoinpayConstant.mch_no);
  507. String sign = createMD5Sign(requestJson , JoinpayConstant.key);
  508. requestJson.put("sign", sign.toUpperCase());
  509. logger.info("请求参数:" + requestJson);
  510. org.json.JSONObject jsonObject;
  511. try {
  512. jsonObject = HttpClientUtils.postJson(url, requestJson.toString());
  513. logger.info("响应参数:" + jsonObject);
  514. // 判断请求是否正确,受理成功
  515. if(jsonObject.has("resp_code")){
  516. String resp_code = jsonObject.getString("resp_code");
  517. mch.setResp_code(resp_code);
  518. if(JoinpayConstant.resp_code2.equals(resp_code)){
  519. org.json.JSONObject data = jsonObject.getJSONObject("data");
  520. if(data.has("biz_msg")){
  521. return data.getString("biz_msg");
  522. }else{
  523. return JoinpayConstant.resp_code.get(resp_code);
  524. }
  525. }
  526. }else{
  527. return "请求失败";
  528. }
  529. // 处理data
  530. if(jsonObject.has("data")){
  531. org.json.JSONObject data = jsonObject.getJSONObject("data");
  532. String biz_code = data.getString("biz_code");
  533. if(biz_code.equals("B100000")){
  534. String sign_trx_no = data.getString("sign_trx_no");
  535. String sign_status = data.getString("sign_status");
  536. if(sign_status.equals("P1000")){
  537. sign_status="签约成功";
  538. }else {
  539. sign_status="签约失败";
  540. }
  541. mch.setSign_status(sign_status);
  542. mch.setSign_trx_no(sign_trx_no);
  543. update(mch);
  544. }
  545. }
  546. } catch (IOException e) {
  547. e.printStackTrace();
  548. }
  549. return Constant.correct_code;
  550. }
  551. /**
  552. * 传送身份证图片
  553. * @param
  554. * @return
  555. */
  556. @Override
  557. public String sendCard(Mch mch,String cardPositive,String cardNegative) {
  558. // String url = "https://www.joinpay.com/allocFunds";
  559. String url = "https://upload.joinpay.com/allocFunds";
  560. if(StringUtils.isEmpty(mch.getAlt_mch_no())){
  561. return "找不到商家编号";
  562. }
  563. // String card_positive = ImageToBase64ByLocal(cardPositive);
  564. String card_positive = cardPositive;
  565. // String card_negative = ImageToBase64ByLocal(cardNegative);
  566. String card_negative = cardNegative;
  567. JSONObject requestData = new JSONObject(new LinkedHashMap());
  568. requestData.put("alt_mch_no" , mch.getAlt_mch_no());
  569. requestData.put("card_positive" , card_positive);
  570. requestData.put("card_negative" , card_negative);
  571. JSONObject requestJson = new JSONObject(new TreeMap<String, Object>());
  572. requestJson.put("method", "altMchPics.uploadPic");
  573. requestJson.put("version", "1.0");
  574. requestJson.put("data", requestData);
  575. // 32位随机字符串
  576. String uuid = UUID.randomUUID().toString().trim().replaceAll("-", "");
  577. requestJson.put("rand_str", uuid);
  578. requestJson.put("sign_type", JoinpayConstant.sign_type_MD5);
  579. requestJson.put("mch_no", JoinpayConstant.mch_no);
  580. String sign = createMD5Sign(requestJson , JoinpayConstant.key);
  581. requestJson.put("sign", sign.toUpperCase());
  582. logger.info("请求参数:" + requestJson);
  583. String back=null;
  584. org.json.JSONObject jsonObject;
  585. try {
  586. jsonObject = HttpClientUtils.postJson(url, requestJson.toString());
  587. logger.info("响应参数:" + jsonObject);
  588. // 判断请求是否正确,受理成功
  589. if(jsonObject.has("resp_code")){
  590. String resp_code = jsonObject.getString("resp_code");
  591. mch.setResp_code(resp_code);
  592. }else{
  593. return "请求失败";
  594. }
  595. // 处理data
  596. if(jsonObject.has("data")){
  597. org.json.JSONObject data = jsonObject.getJSONObject("data");
  598. String biz_code = data.getString("biz_code");
  599. if(biz_code.equals("B100000")){
  600. String approve_status = "审核中";
  601. mch.setApprove_status(approve_status);
  602. mch.setApprove_note("");
  603. back = approve_status;
  604. }
  605. if(biz_code.equals("B100002")){
  606. String approve_status = "上传失败";
  607. String approve_note = data.getString("biz_msg");
  608. mch.setApprove_note(approve_note);
  609. mch.setApprove_status(approve_status);
  610. back = approve_status;
  611. }
  612. if(biz_code.equals("B101017")){
  613. String approve_status = "上传失败";
  614. String approve_note = data.getString("biz_msg");
  615. mch.setApprove_note(approve_note);
  616. mch.setApprove_status(approve_status);
  617. back = approve_status;
  618. }
  619. update(mch);
  620. }
  621. } catch (IOException e) {
  622. e.printStackTrace();
  623. }
  624. return back;
  625. }
  626. /**
  627. * 传送身份证图片
  628. * @param
  629. * @return
  630. */
  631. @Override
  632. public String sendCardBusiness(Mch mch, String cardPositive, String cardNegative, String tradeLicence, String openAccountLicence) {
  633. // String url = "https://www.joinpay.com/allocFunds";
  634. String url = "https://upload.joinpay.com/allocFunds";
  635. if(StringUtils.isEmpty(mch.getAlt_mch_no())){
  636. return "找不到商家编号";
  637. }
  638. // String card_positive = ImageToBase64ByLocal(cardPositive);
  639. String card_positive = cardPositive;
  640. // String card_negative = ImageToBase64ByLocal(cardNegative);
  641. String card_negative = cardNegative;
  642. String trade_licence = tradeLicence;
  643. String open_account_licence = openAccountLicence;
  644. JSONObject requestData = new JSONObject(new LinkedHashMap());
  645. requestData.put("alt_mch_no" , mch.getAlt_mch_no());
  646. requestData.put("card_positive" , card_positive);
  647. requestData.put("card_negative" , card_negative);
  648. requestData.put("trade_licence" , trade_licence);
  649. requestData.put("open_account_licence" , open_account_licence);
  650. JSONObject requestJson = new JSONObject(new TreeMap<String, Object>());
  651. requestJson.put("method", "altMchPics.uploadPic");
  652. requestJson.put("version", "1.0");
  653. requestJson.put("data", requestData);
  654. // 32位随机字符串
  655. String uuid = UUID.randomUUID().toString().trim().replaceAll("-", "");
  656. requestJson.put("rand_str", uuid);
  657. requestJson.put("sign_type", JoinpayConstant.sign_type_MD5);
  658. requestJson.put("mch_no", JoinpayConstant.mch_no);
  659. String sign = createMD5Sign(requestJson , JoinpayConstant.key);
  660. requestJson.put("sign", sign.toUpperCase());
  661. logger.info("请求参数:" + requestJson);
  662. String back=null;
  663. org.json.JSONObject jsonObject;
  664. try {
  665. jsonObject = HttpClientUtils.postJson(url, requestJson.toString());
  666. logger.info("响应参数:" + jsonObject);
  667. // 判断请求是否正确,受理成功
  668. if(jsonObject.has("resp_code")){
  669. String resp_code = jsonObject.getString("resp_code");
  670. mch.setResp_code(resp_code);
  671. }else{
  672. return "请求失败";
  673. }
  674. // 处理data
  675. if(jsonObject.has("data")){
  676. org.json.JSONObject data = jsonObject.getJSONObject("data");
  677. String biz_code = data.getString("biz_code");
  678. if(biz_code.equals("B100000")){
  679. String approve_status = "审核中";
  680. mch.setApprove_status(approve_status);
  681. mch.setApprove_note("");
  682. back = approve_status;
  683. }
  684. if(biz_code.equals("B100002")){
  685. String approve_status = "上传失败";
  686. String approve_note = data.getString("biz_msg");
  687. mch.setApprove_note(approve_note);
  688. mch.setApprove_status(approve_status);
  689. back = approve_status;
  690. }
  691. if(biz_code.equals("B101017")){
  692. String approve_status = "上传失败";
  693. String approve_note = data.getString("biz_msg");
  694. mch.setApprove_note(approve_note);
  695. mch.setApprove_status(approve_status);
  696. back = approve_status;
  697. }
  698. update(mch);
  699. }
  700. } catch (IOException e) {
  701. e.printStackTrace();
  702. }
  703. return back;
  704. }
  705. /**
  706. * 查询身份证照片审核状态
  707. * @param
  708. * @return
  709. */
  710. @Override
  711. public String searchApprove(Mch mch) {
  712. String url = "https://www.joinpay.com/allocFunds";
  713. if(StringUtils.isEmpty(mch.getAlt_mch_no())){
  714. return "找不到商家编号";
  715. }
  716. JSONObject requestData = new JSONObject(new LinkedHashMap());
  717. requestData.put("alt_mch_no" , mch.getAlt_mch_no());
  718. JSONObject requestJson = new JSONObject(new TreeMap<String, Object>());
  719. requestJson.put("method", "altMchPics.queryPicsInfo");
  720. requestJson.put("version", "1.0");
  721. requestJson.put("data", requestData);
  722. // 32位随机字符串
  723. String uuid = UUID.randomUUID().toString().trim().replaceAll("-", "");
  724. requestJson.put("rand_str", uuid);
  725. requestJson.put("sign_type", JoinpayConstant.sign_type_MD5);
  726. requestJson.put("mch_no", JoinpayConstant.mch_no);
  727. String sign = createMD5Sign(requestJson , JoinpayConstant.key);
  728. requestJson.put("sign", sign.toUpperCase());
  729. logger.info("请求参数:" + requestJson);
  730. String back=null;
  731. org.json.JSONObject jsonObject;
  732. try {
  733. jsonObject = HttpClientUtils.postJson(url, requestJson.toString());
  734. logger.info("响应参数:" + jsonObject);
  735. // 判断请求是否正确,受理成功
  736. if(jsonObject.has("resp_code")){
  737. String resp_code = jsonObject.getString("resp_code");
  738. mch.setResp_code(resp_code);
  739. }else{
  740. return "请求失败";
  741. }
  742. // 处理data
  743. if(jsonObject.has("data")){
  744. org.json.JSONObject data = jsonObject.getJSONObject("data");
  745. String biz_code = data.getString("biz_code");
  746. if(biz_code.equals("B100000")){
  747. String approve_status = "审核通过";
  748. String approve_note = data.getString("approve_note");
  749. mch.setApprove_note(approve_note);
  750. mch.setApprove_status(approve_status);
  751. back = approve_status;
  752. }
  753. if(biz_code.equals("B110008")){
  754. String approve_status = "审核未通过";
  755. String approve_note = data.getString("biz_msg");
  756. mch.setApprove_note(approve_note);
  757. mch.setApprove_status(approve_status);
  758. back = approve_status;
  759. }
  760. if(biz_code.equals("B101018")){
  761. String approve_status = "审核未通过";
  762. String approve_note = data.getString("biz_msg");
  763. mch.setApprove_note(approve_note);
  764. mch.setApprove_status(approve_status);
  765. back = approve_status;
  766. }
  767. update(mch);
  768. }
  769. } catch (IOException e) {
  770. e.printStackTrace();
  771. }
  772. return back;
  773. }
  774. /**
  775. * 本地图片转换成base64字符串
  776. *
  777. * @param imgFile 图片本地路径
  778. * @return
  779. */
  780. public static String ImageToBase64ByLocal(String imgFile) {// 将图片文件转化为字节数组字符串,并对其进行Base64编码处理
  781. InputStream in = null;
  782. byte[] data = null;
  783. // 读取图片字节数组
  784. try {
  785. in = new FileInputStream(imgFile);
  786. data = new byte[in.available()];
  787. in.read(data);
  788. in.close();
  789. } catch (IOException e) {
  790. e.printStackTrace();
  791. }
  792. // 对字节数组Base64编码
  793. BASE64Encoder encoder = new BASE64Encoder();
  794. String[] strings = imgFile.split("\\.");
  795. if(strings.length>1){
  796. String str = strings[strings.length-1];
  797. String title = "data:image/"+str+";base64,";
  798. return title+encoder.encode(data);// 返回Base64编码过的字节数组字符串
  799. }else {
  800. return null;
  801. }
  802. }
  803. /**
  804. * 签名算法sign , MD5 签名
  805. * @param requestJson
  806. * @return
  807. */
  808. public static String createMD5Sign(JSONObject requestJson , String key){
  809. StringBuffer sb = new StringBuffer();
  810. Set es = requestJson.entrySet();
  811. Iterator it = es.iterator();
  812. while(it.hasNext()) {
  813. Map.Entry entry = (Map.Entry)it.next();
  814. String k = (String)entry.getKey();
  815. Object v = entry.getValue();
  816. if(null != v && !"".equals(v) && !"sign".equals(k) && !"key".equals(k)) {
  817. sb.append(k + "=" + v + "&");
  818. }
  819. }
  820. sb.append("key=" + key);
  821. logger.info("签名字符串:"+sb.toString());
  822. String sign = DigestUtils.md5Hex(sb.toString());
  823. return sign;
  824. }
  825. /**
  826. * 获取随机字符串
  827. * @return
  828. */
  829. public static String getRandomString(int length){
  830. String str="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
  831. Random random=new Random();
  832. StringBuffer sb=new StringBuffer();
  833. for(int i=0;i<length;i++){
  834. int number=random.nextInt(62);
  835. sb.append(str.charAt(number));
  836. }
  837. return sb.toString();
  838. }
  839. }