TJoinpayMchServiceImpl.java 56 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346
  1. package com.szwl.service.impl;
  2. import cn.hutool.core.date.DateUtil;
  3. import cn.hutool.core.util.RandomUtil;
  4. import com.alibaba.fastjson.JSONArray;
  5. import com.alibaba.fastjson.JSONObject;
  6. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  7. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  8. import com.szwl.constant.JoinpayConstant;
  9. import com.szwl.feign.bean.PayFeign;
  10. import com.szwl.mapper.TJoinpayMchMapper;
  11. import com.szwl.model.bo.BalanceBo;
  12. import com.szwl.model.bo.SettlementRecordBo;
  13. import com.szwl.model.entity.TAdmin;
  14. import com.szwl.model.entity.THuifuMch;
  15. import com.szwl.model.entity.TJoinpayMch;
  16. import com.szwl.model.entity.WithdrawalRecord;
  17. import com.szwl.model.utils.AESUtil;
  18. import com.szwl.model.utils.Constant;
  19. import com.szwl.model.utils.HttpClientUtils;
  20. import com.szwl.model.utils.RSAUtil;
  21. import com.szwl.service.TJoinpayMchService;
  22. import com.szwl.service.WithdrawalRecordService;
  23. import lombok.extern.slf4j.Slf4j;
  24. import org.apache.commons.codec.digest.DigestUtils;
  25. import org.apache.commons.lang.StringUtils;
  26. import org.apache.http.message.BasicNameValuePair;
  27. import org.springframework.beans.factory.annotation.Autowired;
  28. import org.springframework.stereotype.Service;
  29. import java.io.IOException;
  30. import java.io.UnsupportedEncodingException;
  31. import java.math.BigDecimal;
  32. import java.math.RoundingMode;
  33. import java.net.URLDecoder;
  34. import java.net.URLEncoder;
  35. import java.text.SimpleDateFormat;
  36. import java.util.*;
  37. /**
  38. * <p>
  39. * 汇聚支付用户收款信息表 服务实现类
  40. * </p>
  41. *
  42. * @author wuhs
  43. * @since 2022-04-29
  44. */
  45. @Slf4j
  46. @Service
  47. public class TJoinpayMchServiceImpl extends ServiceImpl<TJoinpayMchMapper, TJoinpayMch> implements TJoinpayMchService {
  48. @Autowired
  49. WithdrawalRecordService withdrawalRecordService;
  50. @Autowired
  51. PayFeign payFeign;
  52. @Override
  53. public String createMch(TJoinpayMch mch) {
  54. Long adminId = mch.getAdminId();
  55. if (null == adminId) {
  56. return "找不到对应的管理员";
  57. }
  58. Integer alt_merchant_type = mch.getAltMerchantType();
  59. String url = "https://www.joinpay.com/allocFunds";
  60. JSONObject requestData = new JSONObject(new LinkedHashMap());
  61. String login_name = "test1_" + adminId + "@mianhuatang.com";
  62. mch.setLoginName(login_name);
  63. String alt_mch_name = mch.getBankAccountName();
  64. mch.setAltMchName(alt_mch_name);
  65. mch.setAltMchShortName("");
  66. // 格式为16 位随机字符串:16 位随机字符串
  67. String aes_key1 = getRandomString(16);
  68. String aes_key2 = getRandomString(16);
  69. requestData.put("login_name", login_name);
  70. requestData.put("alt_mch_name", alt_mch_name);
  71. requestData.put("alt_mch_short_name", "");
  72. requestData.put("alt_merchant_type", mch.getAltMerchantType());
  73. requestData.put("busi_contact_name", mch.getBusiContactName());
  74. requestData.put("busi_contact_mobile_no", mch.getBusiContactMobileNo());
  75. requestData.put("phone_no", mch.getPhoneNo());
  76. requestData.put("manage_scope", mch.getManageScope());
  77. requestData.put("manage_addr", mch.getManageAddr());
  78. requestData.put("legal_person", AESUtil.encrypt(mch.getLegalPerson(), aes_key1, aes_key2));
  79. requestData.put("id_card_no", AESUtil.encrypt(mch.getIdCardNo(), aes_key1, aes_key2));
  80. requestData.put("id_card_expiry", mch.getIdCardExpiry());
  81. // 个体工商户和企业必填:营业执照编号 / 营业执照有效期
  82. if (JoinpayConstant.alt_merchant_type2 == alt_merchant_type || JoinpayConstant.alt_merchant_type3 == alt_merchant_type) {
  83. requestData.put("license_no", mch.getLicenseNo());
  84. requestData.put("license_expiry", mch.getLicenseExpiry());
  85. }
  86. if (mch.getSettMode() != null) {
  87. requestData.put("sett_mode", mch.getSettMode());
  88. } else {
  89. // 由汇聚自动结算
  90. requestData.put("sett_mode", JoinpayConstant.sett_mode1);
  91. }
  92. // 结算周期类型:自然日
  93. requestData.put("sett_date_type", JoinpayConstant.sett_date_type2);
  94. if (mch.getRiskDay() != null) {
  95. requestData.put("risk_day", mch.getRiskDay());
  96. } else {
  97. // 结算周期:1
  98. requestData.put("risk_day", 1);
  99. }
  100. if (JoinpayConstant.alt_merchant_type2 == alt_merchant_type || JoinpayConstant.alt_merchant_type3 == alt_merchant_type) {
  101. // 企业用对公账户
  102. requestData.put("bank_account_type", JoinpayConstant.bank_account_type4);
  103. } else if (JoinpayConstant.alt_merchant_type1 == alt_merchant_type) {
  104. // 个人用借记卡
  105. requestData.put("bank_account_type", JoinpayConstant.bank_account_type1);
  106. }
  107. requestData.put("bank_account_name", AESUtil.encrypt(mch.getBankAccountName(), aes_key1, aes_key2));
  108. requestData.put("bank_account_no", AESUtil.encrypt(mch.getBankAccountNo(), aes_key1, aes_key2));
  109. requestData.put("bank_channel_no", mch.getBankChannelNo());
  110. JSONObject requestJson = new JSONObject(new TreeMap<String, Object>());
  111. requestJson.put("method", "altmch.add");
  112. requestJson.put("version", "2.0");
  113. requestJson.put("data", requestData);
  114. // 32位随机字符串
  115. String uuid = UUID.randomUUID().toString().trim().replaceAll("-", "");
  116. requestJson.put("rand_str", uuid);
  117. requestJson.put("sign_type", JoinpayConstant.sign_type_MD5);
  118. requestJson.put("mch_no", JoinpayConstant.mch_no);
  119. String sign = createMD5Sign(requestJson, JoinpayConstant.key);
  120. requestJson.put("sign", sign.toUpperCase());
  121. requestJson.put("aes_key", RSAUtil.encrypt(aes_key1 + ":" + aes_key2, JoinpayConstant.publickey));
  122. org.json.JSONObject jsonObject;
  123. try {
  124. jsonObject = HttpClientUtils.postJson(url, requestJson.toString());
  125. if (jsonObject.has("resp_code")) {
  126. mch.setRespCode(jsonObject.getString("resp_code"));
  127. }
  128. if (jsonObject.has("data")) {
  129. org.json.JSONObject data = jsonObject.getJSONObject("data");
  130. if (data.has("biz_code")) {
  131. mch.setBizCode(data.getString("biz_code"));
  132. }
  133. if (data.has("alt_mch_no")) {
  134. mch.setAltMchNo(data.getString("alt_mch_no"));
  135. }
  136. if (data.has("order_status")) {
  137. mch.setOrderStatus(data.getString("order_status"));
  138. }
  139. }
  140. /**
  141. * 更新一下分销商户的 各种响应码 & login_name
  142. */
  143. mch.setCreateDate(new Date());
  144. mch.setModifyDate(new Date());
  145. mch.setType("1");
  146. if (StringUtils.isNotEmpty(mch.getAltMchNo())) {
  147. save(mch);
  148. }
  149. if (jsonObject.has("resp_code")) {
  150. String resp_code = jsonObject.getString("resp_code");
  151. mch.setRespCode(resp_code);
  152. if (JoinpayConstant.resp_code2.equals(resp_code)) {
  153. org.json.JSONObject data = jsonObject.getJSONObject("data");
  154. if (data.has("biz_msg")) {
  155. return data.getString("biz_msg");
  156. }
  157. }
  158. }
  159. } catch (IOException e) {
  160. e.printStackTrace();
  161. }
  162. if (StringUtils.isNotEmpty(mch.getAltMchNo())) {
  163. return Constant.correct_code;
  164. } else {
  165. return "注册失败";
  166. }
  167. }
  168. @Override
  169. public String updateMch(TJoinpayMch mch) {
  170. Long adminId = mch.getAdminId();
  171. if (null == adminId) {
  172. return "找不到对应的管理员";
  173. }
  174. if (JoinpayConstant.alt_merchant_type1 != mch.getAltMerchantType()
  175. && JoinpayConstant.alt_merchant_type2 != mch.getAltMerchantType()
  176. && JoinpayConstant.alt_merchant_type3 != mch.getAltMerchantType()) {
  177. return "商家类型不正确";
  178. }
  179. String url = "https://www.joinpay.com/allocFunds";
  180. JSONObject requestData = new JSONObject(new LinkedHashMap());
  181. // 格式为16 位随机字符串:16 位随机字符串
  182. String aes_key1 = getRandomString(16);
  183. String aes_key2 = getRandomString(16);
  184. requestData.put("alt_mch_no", mch.getAltMchNo());
  185. if (StringUtils.isNotEmpty(mch.getApproveStatus())) {
  186. if (!mch.getApproveStatus().equals("审核通过")) {
  187. requestData.put("legal_person", mch.getLegalPerson());
  188. requestData.put("id_card_no", mch.getIdCardNo());
  189. }
  190. }
  191. if (JoinpayConstant.alt_merchant_type2 == mch.getAltMerchantType() || JoinpayConstant.alt_merchant_type3 == mch.getAltMerchantType()) {
  192. // 企业用对公账户
  193. requestData.put("bank_account_type", JoinpayConstant.bank_account_type4);
  194. mch.setBankAccountType(JoinpayConstant.bank_account_type4);
  195. String alt_mch_name = mch.getBankAccountName();
  196. if (StringUtils.isNotEmpty(mch.getApproveStatus()) && !mch.getApproveStatus().equals("审核通过")) {
  197. requestData.put("alt_mch_name", alt_mch_name);
  198. requestData.put("license_no", mch.getLicenseNo());
  199. }
  200. // requestData.put("alt_mch_name", AESUtil.encrypt(alt_mch_name, aes_key1 , aes_key2 ));/**/
  201. } else if (JoinpayConstant.alt_merchant_type1 == mch.getAltMerchantType()) {
  202. // 个人用借记卡
  203. requestData.put("bank_account_type", JoinpayConstant.bank_account_type1);
  204. mch.setBankAccountType(JoinpayConstant.bank_account_type1);
  205. }
  206. requestData.put("bank_account_name", mch.getBankAccountName());
  207. requestData.put("bank_account_no", mch.getBankAccountNo());
  208. requestData.put("bank_channel_no", mch.getBankChannelNo());
  209. if (mch.getSettMode() != null) {
  210. requestData.put("sett_mode", mch.getSettMode());
  211. } else {
  212. // 由汇聚自动结算
  213. requestData.put("sett_mode", JoinpayConstant.sett_mode1);
  214. }
  215. // 结算周期类型:自然日
  216. requestData.put("sett_date_type", JoinpayConstant.sett_date_type2);
  217. if (mch.getRiskDay() != null) {
  218. requestData.put("risk_day", mch.getRiskDay());
  219. } else {
  220. // 结算周期:1
  221. requestData.put("risk_day", 1);
  222. }
  223. if (mch.getAltMerchantType() == 12) {
  224. String alt_mch_name = mch.getBankAccountName();
  225. }
  226. JSONObject requestJson = new JSONObject(new TreeMap<String, Object>());
  227. requestJson.put("method", "altmch.modify");
  228. requestJson.put("version", "1.1");
  229. requestJson.put("data", requestData);
  230. // 32位随机字符串
  231. String uuid = UUID.randomUUID().toString().trim().replaceAll("-", "");
  232. requestJson.put("rand_str", uuid);
  233. requestJson.put("sign_type", JoinpayConstant.sign_type_MD5);
  234. requestJson.put("mch_no", JoinpayConstant.mch_no);
  235. String sign = createMD5Sign(requestJson, JoinpayConstant.key);
  236. requestJson.put("sign", sign.toUpperCase());
  237. requestJson.put("aes_key", RSAUtil.encrypt(aes_key1 + ":" + aes_key2, JoinpayConstant.publickey));
  238. org.json.JSONObject jsonObject;
  239. try {
  240. jsonObject = HttpClientUtils.postJson(url, requestJson.toString());
  241. if (jsonObject.has("resp_code")) {
  242. mch.setRespCode(jsonObject.getString("resp_code"));
  243. }
  244. if (jsonObject.has("data")) {
  245. org.json.JSONObject data = jsonObject.getJSONObject("data");
  246. if (data.has("biz_code")) {
  247. mch.setBizCode(data.getString("biz_code"));
  248. }
  249. if (data.has("alt_mch_no")) {
  250. mch.setAltMchNo(data.getString("alt_mch_no"));
  251. }
  252. if (data.has("order_status")) {
  253. mch.setOrderStatus(data.getString("order_status"));
  254. }
  255. }
  256. if (jsonObject.has("resp_code")) {
  257. String resp_code = jsonObject.getString("resp_code");
  258. mch.setRespCode(resp_code);
  259. if (JoinpayConstant.resp_code2.equals(resp_code)) {
  260. org.json.JSONObject data = jsonObject.getJSONObject("data");
  261. if (data.has("biz_msg")) {
  262. return data.getString("biz_msg");
  263. }
  264. }
  265. }
  266. } catch (IOException e) {
  267. e.printStackTrace();
  268. }
  269. return Constant.correct_code;
  270. }
  271. // 协议内容签约接口
  272. @Override
  273. public String altMchSign(TJoinpayMch mch) {
  274. String url = "https://www.joinpay.com/allocFunds";
  275. if (StringUtils.isEmpty(mch.getAltMchNo())) {
  276. return "找不到商家编号";
  277. }
  278. Date currentTime = new Date();
  279. SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  280. String dateString = formatter.format(currentTime);
  281. JSONObject requestData = new JSONObject(new LinkedHashMap());
  282. requestData.put("alt_mch_no", mch.getAltMchNo());
  283. requestData.put("sign_status", "P1000");
  284. requestData.put("sign_time", dateString);
  285. JSONObject requestJson = new JSONObject(new TreeMap<String, Object>());
  286. requestJson.put("method", "altMchSign.sign");
  287. requestJson.put("version", "1.0");
  288. requestJson.put("data", requestData);
  289. // 32位随机字符串
  290. String uuid = UUID.randomUUID().toString().trim().replaceAll("-", "");
  291. requestJson.put("rand_str", uuid);
  292. requestJson.put("sign_type", JoinpayConstant.sign_type_MD5);
  293. requestJson.put("mch_no", JoinpayConstant.mch_no);
  294. String sign = createMD5Sign(requestJson, JoinpayConstant.key);
  295. requestJson.put("sign", sign.toUpperCase());
  296. String back = null;
  297. org.json.JSONObject jsonObject;
  298. try {
  299. jsonObject = HttpClientUtils.postJson(url, requestJson.toString());
  300. // 判断请求是否正确,受理成功
  301. if (jsonObject.has("resp_code")) {
  302. String resp_code = jsonObject.getString("resp_code");
  303. mch.setRespCode(resp_code);
  304. if (JoinpayConstant.resp_code2.equals(resp_code)) {
  305. org.json.JSONObject data = jsonObject.getJSONObject("data");
  306. if (data.has("biz_msg")) {
  307. return data.getString("biz_msg");
  308. } else {
  309. return JoinpayConstant.resp_code.get(resp_code);
  310. }
  311. }
  312. } else {
  313. return "请求失败";
  314. }
  315. // 处理data
  316. if (jsonObject.has("data")) {
  317. org.json.JSONObject data = jsonObject.getJSONObject("data");
  318. String biz_code = data.getString("biz_code");
  319. if (biz_code.equals("B100000")) {
  320. String sign_trx_no = data.getString("sign_trx_no");
  321. String sign_status = data.getString("sign_status");
  322. if (sign_status.equals("P1000")) {
  323. sign_status = "签约成功";
  324. } else {
  325. sign_status = "签约失败";
  326. }
  327. mch.setSignStatus(sign_status);
  328. mch.setSignTrxNo(sign_trx_no);
  329. back = sign_status;
  330. }
  331. updateById(mch);
  332. }
  333. } catch (IOException e) {
  334. e.printStackTrace();
  335. }
  336. return back;
  337. }
  338. /**
  339. * 传送身份证图片
  340. *
  341. * @param
  342. * @return
  343. */
  344. @Override
  345. public String sendCard(TJoinpayMch mch, String cardPositive, String cardNegative, String staus) {
  346. // String url = "https://www.joinpay.com/allocFunds";
  347. String url = "https://upload.joinpay.com/allocFunds";
  348. if (StringUtils.isEmpty(mch.getAltMchNo())) {
  349. return "找不到商家编号";
  350. }
  351. // String card_positive = ImageToBase64ByLocal(cardPositive);
  352. String card_positive = cardPositive;
  353. // String card_negative = ImageToBase64ByLocal(cardNegative);
  354. String card_negative = cardNegative;
  355. JSONObject requestData = new JSONObject(new LinkedHashMap());
  356. requestData.put("alt_mch_no", mch.getAltMchNo());
  357. requestData.put("card_positive", card_positive);
  358. requestData.put("card_negative", card_negative);
  359. JSONObject requestJson = new JSONObject(new TreeMap<String, Object>());
  360. if (staus.equals("0")) {
  361. requestJson.put("method", "altMchPics.uploadPic");
  362. } else {
  363. requestJson.put("method", "altMchPics.modifyPic");
  364. }
  365. requestJson.put("version", "1.0");
  366. requestJson.put("data", requestData);
  367. // 32位随机字符串
  368. String uuid = UUID.randomUUID().toString().trim().replaceAll("-", "");
  369. requestJson.put("rand_str", uuid);
  370. requestJson.put("sign_type", JoinpayConstant.sign_type_MD5);
  371. requestJson.put("mch_no", JoinpayConstant.mch_no);
  372. String sign = createMD5Sign(requestJson, JoinpayConstant.key);
  373. requestJson.put("sign", sign.toUpperCase());
  374. // logger.info("请求参数:" + requestJson);
  375. String back = null;
  376. org.json.JSONObject jsonObject;
  377. try {
  378. jsonObject = HttpClientUtils.postJson(url, requestJson.toString());
  379. // logger.info("响应参数:" + jsonObject);
  380. // 判断请求是否正确,受理成功
  381. if (jsonObject.has("resp_code")) {
  382. String resp_code = jsonObject.getString("resp_code");
  383. mch.setRespCode(resp_code);
  384. } else {
  385. return "请求失败";
  386. }
  387. // 处理data
  388. if (jsonObject.has("data")) {
  389. org.json.JSONObject data = jsonObject.getJSONObject("data");
  390. String biz_code = data.getString("biz_code");
  391. if (biz_code.equals("B100000")) {
  392. String approve_status = "审核中";
  393. mch.setApproveStatus(approve_status);
  394. mch.setApproveNote("");
  395. mch.setStep("1");
  396. back = approve_status;
  397. }
  398. if (biz_code.equals("B100002")) {
  399. String approve_status = "上传失败";
  400. String approve_note = data.getString("biz_msg");
  401. mch.setApproveNote(approve_note);
  402. mch.setApproveStatus(approve_status);
  403. back = approve_status;
  404. }
  405. if (biz_code.equals("B101017")) {
  406. String approve_status = "上传失败";
  407. String approve_note = data.getString("biz_msg");
  408. mch.setApproveNote(approve_note);
  409. mch.setApproveStatus(approve_status);
  410. back = approve_status;
  411. }
  412. String approve_note = data.getString("biz_msg");
  413. mch.setApproveNote(approve_note);
  414. if (StringUtils.isEmpty(back)) {
  415. back = approve_note;
  416. }
  417. updateById(mch);
  418. }
  419. } catch (IOException e) {
  420. e.printStackTrace();
  421. }
  422. return back;
  423. }
  424. /**
  425. * 传送身份证图片
  426. *
  427. * @param
  428. * @return
  429. */
  430. @Override
  431. public String sendCardBusiness(TJoinpayMch mch, String cardPositive, String cardNegative, String tradeLicence, String openAccountLicence, String staus) {
  432. // String url = "https://www.joinpay.com/allocFunds";
  433. String url = "https://upload.joinpay.com/allocFunds";
  434. if (StringUtils.isEmpty(mch.getAltMchNo())) {
  435. return "找不到商家编号";
  436. }
  437. // String card_positive = ImageToBase64ByLocal(cardPositive);
  438. String card_positive = cardPositive;
  439. // String card_negative = ImageToBase64ByLocal(cardNegative);
  440. String card_negative = cardNegative;
  441. String trade_licence = tradeLicence;
  442. String open_account_licence = openAccountLicence;
  443. JSONObject requestData = new JSONObject(new LinkedHashMap());
  444. requestData.put("alt_mch_no", mch.getAltMchNo());
  445. requestData.put("card_positive", card_positive);
  446. requestData.put("card_negative", card_negative);
  447. requestData.put("trade_licence", trade_licence);
  448. requestData.put("open_account_licence", open_account_licence);
  449. JSONObject requestJson = new JSONObject(new TreeMap<String, Object>());
  450. if (staus.equals("0")) {
  451. requestJson.put("method", "altMchPics.uploadPic");
  452. } else {
  453. requestJson.put("method", "altMchPics.modifyPic");
  454. }
  455. requestJson.put("version", "1.0");
  456. requestJson.put("data", requestData);
  457. // 32位随机字符串
  458. String uuid = UUID.randomUUID().toString().trim().replaceAll("-", "");
  459. requestJson.put("rand_str", uuid);
  460. requestJson.put("sign_type", JoinpayConstant.sign_type_MD5);
  461. requestJson.put("mch_no", JoinpayConstant.mch_no);
  462. String sign = createMD5Sign(requestJson, JoinpayConstant.key);
  463. requestJson.put("sign", sign.toUpperCase());
  464. String s = requestJson.toString();
  465. String back = null;
  466. org.json.JSONObject jsonObject;
  467. try {
  468. jsonObject = HttpClientUtils.postJson(url, requestJson.toString());
  469. // 判断请求是否正确,受理成功
  470. if (jsonObject.has("resp_code")) {
  471. String resp_code = jsonObject.getString("resp_code");
  472. mch.setRespCode(resp_code);
  473. } else {
  474. return "请求失败";
  475. }
  476. // 处理data
  477. if (jsonObject.has("data")) {
  478. org.json.JSONObject data = jsonObject.getJSONObject("data");
  479. String biz_code = data.getString("biz_code");
  480. if (biz_code.equals("B100000")) {
  481. String approve_status = "审核中";
  482. mch.setApproveStatus(approve_status);
  483. mch.setApproveNote("");
  484. back = approve_status;
  485. mch.setStep("1");
  486. }
  487. if (biz_code.equals("B100002")) {
  488. String approve_status = "上传失败";
  489. String approve_note = data.getString("biz_msg");
  490. mch.setApproveNote(approve_note);
  491. mch.setApproveStatus(approve_status);
  492. back = approve_status;
  493. }
  494. if (biz_code.equals("B101017")) {
  495. String approve_status = "上传失败";
  496. String approve_note = data.getString("biz_msg");
  497. mch.setApproveNote(approve_note);
  498. mch.setApproveStatus(approve_status);
  499. back = approve_status;
  500. }
  501. updateById(mch);
  502. }
  503. } catch (IOException e) {
  504. e.printStackTrace();
  505. }
  506. return back;
  507. }
  508. @Override
  509. public String updateApproveStatus(TJoinpayMch mch) {
  510. String url = "https://www.joinpay.com/allocFunds";
  511. if (StringUtils.isEmpty(mch.getAltMchNo())) {
  512. return "找不到商家编号";
  513. }
  514. JSONObject requestData = new JSONObject(new LinkedHashMap());
  515. requestData.put("alt_mch_no", mch.getAltMchNo());
  516. JSONObject requestJson = new JSONObject(new TreeMap<String, Object>());
  517. requestJson.put("method", "altMchPics.queryPicsInfo");
  518. requestJson.put("version", "1.0");
  519. requestJson.put("data", requestData);
  520. // 32位随机字符串
  521. String uuid = UUID.randomUUID().toString().trim().replaceAll("-", "");
  522. requestJson.put("rand_str", uuid);
  523. requestJson.put("sign_type", JoinpayConstant.sign_type_MD5);
  524. requestJson.put("mch_no", JoinpayConstant.mch_no);
  525. String sign = createMD5Sign(requestJson, JoinpayConstant.key);
  526. requestJson.put("sign", sign.toUpperCase());
  527. // logger.info("请求参数:" + requestJson);
  528. String back = null;
  529. org.json.JSONObject jsonObject;
  530. try {
  531. jsonObject = HttpClientUtils.postJson(url, requestJson.toString());
  532. System.out.println(jsonObject.getJSONObject("data"));
  533. // 判断请求是否正确,受理成功
  534. if (jsonObject.has("resp_code")) {
  535. String resp_code = jsonObject.getString("resp_code");
  536. mch.setRespCode(resp_code);
  537. } else {
  538. return "请求失败";
  539. }
  540. // 处理data
  541. if (jsonObject.has("data")) {
  542. org.json.JSONObject data = jsonObject.getJSONObject("data");
  543. String biz_code = data.getString("biz_code");
  544. String approve_status = data.getString("approve_status");
  545. String approve_note = data.getString("approve_note");
  546. if (biz_code.equals("B100000")) {
  547. if (approve_status.equals("P1000")) {
  548. mch.setApproveStatus("审核通过");
  549. mch.setApproveNote("");
  550. back = approve_status;
  551. } else if (approve_status.equals("P2000")) {
  552. mch.setApproveStatus("审核不通过");
  553. mch.setApproveNote(approve_note);
  554. back = approve_status;
  555. }
  556. }
  557. updateById(mch);
  558. }
  559. } catch (IOException e) {
  560. e.printStackTrace();
  561. }
  562. return back;
  563. }
  564. @Override
  565. public BalanceBo getBalance(TJoinpayMch mch) {
  566. String url = "https://www.joinpay.com/allocFunds";
  567. BalanceBo balanceBo = new BalanceBo();
  568. JSONObject requestData = new JSONObject(new LinkedHashMap());
  569. requestData.put("alt_mch_no", mch.getAltMchNo());
  570. JSONObject requestJson = new JSONObject(new TreeMap<String, Object>());
  571. requestJson.put("method", "altAccount.get");
  572. requestJson.put("version", "1.0");
  573. requestJson.put("data", requestData);
  574. // 32位随机字符串
  575. String uuid = UUID.randomUUID().toString().trim().replaceAll("-", "");
  576. requestJson.put("rand_str", uuid);
  577. requestJson.put("sign_type", JoinpayConstant.sign_type_MD5);
  578. requestJson.put("mch_no", JoinpayConstant.mch_no);
  579. String sign = createMD5Sign(requestJson, JoinpayConstant.key);
  580. requestJson.put("sign", sign.toUpperCase());
  581. org.json.JSONObject jsonObject;
  582. try {
  583. jsonObject = HttpClientUtils.postJson(url, requestJson.toString());
  584. log.info("查询余额返回数据:{}", jsonObject);
  585. // 判断请求是否正确,受理成功
  586. if (jsonObject.has("resp_code")) {
  587. String resp_code = jsonObject.getString("resp_code");
  588. if (JoinpayConstant.resp_code1.equals(resp_code)) {
  589. // 处理data
  590. if (jsonObject.has("data")) {
  591. org.json.JSONObject data = jsonObject.getJSONObject("data");
  592. // 更新账户的金额
  593. if (data.has("alt_avil_balance")) {
  594. // 可提现金额
  595. BigDecimal altAvilBalance = new BigDecimal(data.getString("alt_avil_balance")).divide(new BigDecimal(100));
  596. balanceBo.setWithdrawableBalance(altAvilBalance);
  597. if (data.has("alt_main_balance")) {
  598. BigDecimal altMainBalance = new BigDecimal(data.getString("alt_main_balance")).divide(new BigDecimal(100));
  599. balanceBo.setReceivableBalance(altMainBalance.subtract(altAvilBalance));
  600. }
  601. }
  602. }
  603. }
  604. }
  605. } catch (IOException e) {
  606. e.printStackTrace();
  607. }
  608. return balanceBo;
  609. }
  610. @Override
  611. public String withdraw(TJoinpayMch mch, WithdrawalRecord withdrawalRecord) {
  612. String url = "https://www.joinpay.com/allocFunds";
  613. JSONObject requestData = new JSONObject(new LinkedHashMap());
  614. //分账方编号
  615. requestData.put("alt_mch_no", mch.getAltMchNo());
  616. //结算金额
  617. requestData.put("settle_amount", String.valueOf(withdrawalRecord.getAmount()));
  618. //结算请求号
  619. String mch_order_no = RandomUtil.randomNumbers(18);
  620. requestData.put("mch_order_no", mch_order_no);
  621. requestData.put("product_code", "2");
  622. //通知地址
  623. requestData.put("callback_url",JoinpayConstant.Jiesuan_Url);
  624. JSONObject requestJson = new JSONObject(new TreeMap<String, Object>());
  625. requestJson.put("method", "altSettle.launch");
  626. requestJson.put("version", "1.1");
  627. requestJson.put("data", requestData);
  628. // 32位随机字符串
  629. String uuid = UUID.randomUUID().toString().trim().replaceAll("-", "");
  630. requestJson.put("rand_str", uuid);
  631. requestJson.put("sign_type", JoinpayConstant.sign_type_MD5);
  632. requestJson.put("mch_no", JoinpayConstant.mch_no);
  633. String sign = createMD5Sign(requestJson, JoinpayConstant.key);
  634. requestJson.put("sign", sign.toUpperCase());
  635. log.info("提现参数:{}", requestJson);
  636. org.json.JSONObject jsonObject;
  637. try {
  638. jsonObject = HttpClientUtils.postJson(url, requestJson.toString());
  639. log.info("提现结果:{}", jsonObject);
  640. // 判断请求是否正确,受理成功
  641. if(jsonObject.has("resp_code")){
  642. String respCode = jsonObject.getString("resp_code");
  643. if(JoinpayConstant.resp_code1.equals(respCode)){
  644. org.json.JSONObject data = jsonObject.getJSONObject("data");
  645. String bizCode = data.getString("biz_code");
  646. if(JoinpayConstant.biz_code1.equals(bizCode)){
  647. // 申请提现成功,保存记录
  648. withdrawalRecord.setCreateDate(new Date());
  649. withdrawalRecord.setOrderNo(mch_order_no);
  650. withdrawalRecord.setStatus(0);
  651. withdrawalRecordService.save(withdrawalRecord);
  652. return bizCode;
  653. }else{
  654. // 提现失败
  655. String bizMsg = data.getString("biz_msg");
  656. return bizMsg;
  657. }
  658. } else {
  659. // 受理失败
  660. String respMsg = jsonObject.getString("resp_msg");
  661. return respMsg;
  662. }
  663. }
  664. } catch (IOException e) {
  665. e.printStackTrace();
  666. }
  667. return "提现失败";
  668. }
  669. @Override
  670. public List<SettlementRecordBo> getAutoSettlement(TJoinpayMch joinpayMch, String date) {
  671. String url = "https://www.joinpay.com/allocFunds";
  672. JSONObject requestData = new JSONObject(new LinkedHashMap());
  673. //分账方编号
  674. requestData.put("alt_mch_no", joinpayMch.getAltMchNo());
  675. //结算日期
  676. requestData.put("settle_date", date);
  677. JSONObject requestJson = new JSONObject(new TreeMap<String, Object>());
  678. requestJson.put("method", "altSettle.getAutoSettle");
  679. requestJson.put("version", "1.1");
  680. requestJson.put("data", requestData);
  681. // 32位随机字符串
  682. String uuid = UUID.randomUUID().toString().trim().replaceAll("-", "");
  683. requestJson.put("rand_str", uuid);
  684. requestJson.put("sign_type", JoinpayConstant.sign_type_MD5);
  685. requestJson.put("mch_no", JoinpayConstant.mch_no);
  686. String sign = createMD5Sign(requestJson, JoinpayConstant.key);
  687. requestJson.put("sign", sign.toUpperCase());
  688. List<SettlementRecordBo> recordBos = new ArrayList<>();
  689. org.json.JSONObject jsonObject;
  690. try {
  691. jsonObject = HttpClientUtils.postJson(url, requestJson.toString());
  692. // 判断请求是否正确,受理成功
  693. if(jsonObject.has("resp_code")){
  694. String respCode = jsonObject.getString("resp_code");
  695. if(JoinpayConstant.resp_code1.equals(respCode)){
  696. org.json.JSONObject data = jsonObject.getJSONObject("data");
  697. String bizCode = data.getString("biz_code");
  698. if(JoinpayConstant.biz_code1.equals(bizCode)){
  699. org.json.JSONArray recordList = data.getJSONArray("record_list");
  700. for (int i = 0; i < recordList.length(); i++) {
  701. org.json.JSONObject record = recordList.getJSONObject(i);
  702. if(record.has("order_status")) {
  703. // 结算状态
  704. String orderStatus = record.getString("order_status");
  705. // 结算时间
  706. String settleDate = record.getString("settle_date");
  707. // 结算流水号
  708. String serialNo = record.getString("settle_trx_no");
  709. // 银行账户
  710. String altMchName = record.getString("alt_mch_name");
  711. // 银行账号
  712. String bankAccountNo = record.getString("bank_account_no");
  713. // 结算金额
  714. String settleAmount = record.getString("settle_amount");
  715. // 结算描述
  716. String bizMsg = record.getString("biz_msg");
  717. SettlementRecordBo recordBo = new SettlementRecordBo();
  718. if(JoinpayConstant.order_status2.equals(orderStatus)){
  719. // 结算成功
  720. recordBo.setAdminId(joinpayMch.getAdminId());
  721. recordBo.setSerialNo(serialNo);
  722. recordBo.setBankAccountNo(bankAccountNo);
  723. recordBo.setBankAccountName(altMchName);
  724. recordBo.setAmount(new BigDecimal(settleAmount));
  725. recordBo.setDate(settleDate);
  726. recordBo.setStatus(1);
  727. } else if(JoinpayConstant.order_status3.equals(orderStatus)){
  728. // 结算失败
  729. recordBo.setAdminId(joinpayMch.getAdminId());
  730. recordBo.setSerialNo(serialNo);
  731. recordBo.setBankAccountNo(bankAccountNo);
  732. recordBo.setBankAccountName(altMchName);
  733. recordBo.setAmount(new BigDecimal(settleAmount));
  734. recordBo.setDate(settleDate);
  735. recordBo.setStatus(2);
  736. recordBo.setFailReason(bizMsg);
  737. } else if(JoinpayConstant.order_status4.equals(orderStatus)){
  738. // 结算中
  739. recordBo.setAdminId(joinpayMch.getAdminId());
  740. recordBo.setSerialNo(serialNo);
  741. recordBo.setBankAccountNo(bankAccountNo);
  742. recordBo.setBankAccountName(altMchName);
  743. recordBo.setAmount(new BigDecimal(settleAmount));
  744. recordBo.setDate(settleDate);
  745. recordBo.setStatus(0);
  746. }
  747. recordBos.add(recordBo);
  748. }
  749. }
  750. }
  751. }
  752. }
  753. } catch (IOException e) {
  754. e.printStackTrace();
  755. }
  756. return recordBos;
  757. }
  758. @Override
  759. public void withdrawStatus(TAdmin admin, WithdrawalRecord withdrawalRecord) {
  760. String url = "https://www.joinpay.com/allocFunds";
  761. JSONObject requestData = new JSONObject(new LinkedHashMap());
  762. // 结算订单号
  763. requestData.put("mch_order_no", withdrawalRecord.getOrderNo());
  764. JSONObject requestJson = new JSONObject(new TreeMap<String, Object>());
  765. requestJson.put("method", "altSettle.get");
  766. requestJson.put("version", "1.1");
  767. requestJson.put("data", requestData);
  768. // 32位随机字符串
  769. String uuid = UUID.randomUUID().toString().trim().replaceAll("-", "");
  770. requestJson.put("rand_str", uuid);
  771. requestJson.put("sign_type", JoinpayConstant.sign_type_MD5);
  772. requestJson.put("mch_no", JoinpayConstant.mch_no);
  773. String sign = createMD5Sign(requestJson, JoinpayConstant.key);
  774. requestJson.put("sign", sign.toUpperCase());
  775. log.info("提现参数:{}", requestJson);
  776. org.json.JSONObject jsonObject;
  777. try {
  778. jsonObject = HttpClientUtils.postJson(url, requestJson.toString());
  779. log.info("提现结果:{}", jsonObject);
  780. // 判断请求是否正确,受理成功
  781. if(jsonObject.has("resp_code")){
  782. String respCode = jsonObject.getString("resp_code");
  783. if(JoinpayConstant.resp_code1.equals(respCode)){
  784. org.json.JSONObject data = jsonObject.getJSONObject("data");
  785. String bizCode = data.getString("biz_code");
  786. if(JoinpayConstant.biz_code1.equals(bizCode)){
  787. // 申请提现成功,保存记录
  788. String orderStatus = data.getString("order_status");
  789. if (JoinpayConstant.order_status2.equals(orderStatus)) {
  790. withdrawalRecord.setStatus(1);
  791. withdrawalRecord.setArrivalDate(new Date());
  792. } else if (JoinpayConstant.order_status3.equals(orderStatus)) {
  793. withdrawalRecord.setStatus(2);
  794. withdrawalRecord.setResultMsg(data.getString("biz_msg"));
  795. }
  796. withdrawalRecordService.updateById(withdrawalRecord);
  797. }
  798. }
  799. }
  800. } catch (IOException e) {
  801. e.printStackTrace();
  802. }
  803. }
  804. @Override
  805. public String newCreateMch(TJoinpayMch joinpayMch) {
  806. Integer altMerchantType = joinpayMch.getAltMerchantType();
  807. String url = "https://www.joinpay.com/allocFunds";
  808. JSONObject requestData = new JSONObject(new LinkedHashMap());
  809. String loginName = "sunzee" + RandomUtil.randomNumbers(10) + "@mianhuatang.com";
  810. joinpayMch.setLoginName(loginName);
  811. String altMchName = joinpayMch.getBankAccountName();
  812. joinpayMch.setAltMchName(altMchName);
  813. // 格式为16 位随机字符串:16 位随机字符串
  814. // String aeskey1 = getRandomString(16);
  815. // String aeskey2 = getRandomString(16);
  816. requestData.put("login_name", loginName);
  817. requestData.put("alt_mch_name", altMchName);
  818. requestData.put("alt_merchant_type", altMerchantType);
  819. requestData.put("busi_contact_name", joinpayMch.getBusiContactName());
  820. requestData.put("busi_contact_mobile_no", joinpayMch.getBusiContactMobileNo());
  821. requestData.put("phone_no", joinpayMch.getPhoneNo());
  822. // requestData.put("legal_person", AESUtil.encrypt(joinpayMch.getLegalPerson(), aeskey1, aeskey2));
  823. // requestData.put("id_card_no", AESUtil.encrypt(joinpayMch.getIdCardNo(), aeskey1, aeskey2));
  824. requestData.put("legal_person", joinpayMch.getLegalPerson());
  825. requestData.put("id_card_no", joinpayMch.getIdCardNo());
  826. requestData.put("id_card_expiry", joinpayMch.getIdCardExpiry());
  827. // 企业必填:营业执照编号 / 营业执照有效期
  828. if (JoinpayConstant.ALT_MERCHANT_TYPE_ENTERPRISE == altMerchantType) {
  829. requestData.put("license_no", joinpayMch.getLicenseNo());
  830. requestData.put("license_expiry", joinpayMch.getLicenseExpiry());
  831. }
  832. if (joinpayMch.getSettMode() != null) {
  833. requestData.put("sett_mode", joinpayMch.getSettMode());
  834. } else {
  835. // 由汇聚自动结算
  836. requestData.put("sett_mode", JoinpayConstant.SETT_MODE_ONE);
  837. }
  838. // 结算周期类型:自然日
  839. requestData.put("sett_date_type", JoinpayConstant.SETT_DATE_DAY);
  840. if (joinpayMch.getRiskDay() != null) {
  841. requestData.put("risk_day", joinpayMch.getRiskDay());
  842. } else {
  843. // 结算周期:1
  844. requestData.put("risk_day", 1);
  845. }
  846. if (JoinpayConstant.ALT_MERCHANT_TYPE_ENTERPRISE == altMerchantType) {
  847. // 企业用对公账户
  848. requestData.put("bank_account_type", JoinpayConstant.BANK_ACCOUNT_TYPE_FOUR);
  849. requestData.put("bank_channel_no", joinpayMch.getBankChannelNo());
  850. } else if (JoinpayConstant.ALT_MERCHANT_TYPE_PERSON == altMerchantType) {
  851. // 个人用借记卡
  852. requestData.put("bank_account_type", JoinpayConstant.BANK_ACCOUNT_TYPE_ONE);
  853. }
  854. // requestData.put("bank_account_name", AESUtil.encrypt(joinpayMch.getBankAccountName(), aeskey1, aeskey2));
  855. // requestData.put("bank_account_no", AESUtil.encrypt(joinpayMch.getBankAccountNo(), aeskey1, aeskey2));
  856. requestData.put("bank_account_name", joinpayMch.getBankAccountName());
  857. requestData.put("bank_account_no", joinpayMch.getBankAccountNo());
  858. requestData.put("notify_url", JoinpayConstant.MERCHANT_URL);
  859. JSONObject requestJson = new JSONObject(new TreeMap<String, Object>());
  860. requestJson.put("method", "altmch.create");
  861. requestJson.put("version", "1.1");
  862. requestJson.put("data", requestData);
  863. // 32位随机字符串
  864. String uuid = UUID.randomUUID().toString().trim().replaceAll("-", "");
  865. requestJson.put("rand_str", uuid);
  866. requestJson.put("sign_type", JoinpayConstant.sign_type_MD5);
  867. requestJson.put("mch_no", JoinpayConstant.mch_no);
  868. String sign = createMD5Sign(requestJson, JoinpayConstant.key);
  869. requestJson.put("sign", sign.toUpperCase());
  870. String result = "";
  871. try {
  872. org.json.JSONObject jsonObject = HttpClientUtils.postJson(url, requestJson.toString());
  873. String respCode = jsonObject.getString("resp_code");
  874. String respMsg = jsonObject.getString("resp_msg");
  875. joinpayMch.setRespCode(respCode);
  876. if (JoinpayConstant.resp_code1.equals(respCode)) {
  877. // 受理成功
  878. if (jsonObject.has("data")) {
  879. org.json.JSONObject data = jsonObject.getJSONObject("data");
  880. if (data.has("biz_code")) {
  881. joinpayMch.setBizCode(data.getString("biz_code"));
  882. }
  883. if (data.has("alt_mch_no")) {
  884. joinpayMch.setAltMchNo(data.getString("alt_mch_no"));
  885. }
  886. if (data.has("order_status")) {
  887. joinpayMch.setOrderStatus(data.getString("order_status"));
  888. }
  889. }
  890. }
  891. return respMsg;
  892. /**
  893. * 更新一下分销商户的 各种响应码 & login_name
  894. */
  895. // joinpayMch.setCreateDate(new Date());
  896. // joinpayMch.setModifyDate(new Date());
  897. // joinpayMch.setType("1");
  898. // if (StringUtils.isNotEmpty(joinpayMch.getAltMchNo())) {
  899. // save(joinpayMch);
  900. // }
  901. //
  902. // if (jsonObject.has("resp_code")) {
  903. // String resp_code = jsonObject.getString("resp_code");
  904. // mch.setRespCode(resp_code);
  905. // if (JoinpayConstant.resp_code2.equals(resp_code)) {
  906. // org.json.JSONObject data = jsonObject.getJSONObject("data");
  907. // if (data.has("biz_msg")) {
  908. // return data.getString("biz_msg");
  909. // }
  910. // }
  911. // }
  912. //
  913. } catch (IOException e) {
  914. e.printStackTrace();
  915. }
  916. // if (StringUtils.isNotEmpty(mch.getAltMchNo())) {
  917. // return Constant.correct_code;
  918. // } else {
  919. // return "注册失败";
  920. // }
  921. return "";
  922. }
  923. /**
  924. * 获取随机字符串
  925. *
  926. * @return
  927. */
  928. public static String getRandomString(int length) {
  929. String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
  930. Random random = new Random();
  931. StringBuffer sb = new StringBuffer();
  932. for (int i = 0; i < length; i++) {
  933. int number = random.nextInt(62);
  934. sb.append(str.charAt(number));
  935. }
  936. return sb.toString();
  937. }
  938. /**
  939. * 签名算法sign , MD5 签名
  940. *
  941. * @param requestJson
  942. * @return
  943. */
  944. public static String createMD5Sign(JSONObject requestJson, String key) {
  945. StringBuffer sb = new StringBuffer();
  946. Set es = requestJson.entrySet();
  947. Iterator it = es.iterator();
  948. while (it.hasNext()) {
  949. Map.Entry entry = (Map.Entry) it.next();
  950. String k = (String) entry.getKey();
  951. Object v = entry.getValue();
  952. if (null != v && !"".equals(v) && !"sign".equals(k) && !"key".equals(k)) {
  953. sb.append(k + "=" + v + "&");
  954. }
  955. }
  956. sb.append("key=" + key);
  957. // logger.info("签名字符串:"+sb.toString());
  958. String sign = DigestUtils.md5Hex(sb.toString());
  959. return sign;
  960. }
  961. @Override
  962. public String uniPay(String sn, BigDecimal amount, String productName, String productDesc, String commonParameter,
  963. String returnUrl, String notifyUrl, String frpCode, String isShowPic, String openId, String authCode,
  964. String appid, String transactionModel, String tradeMerchantNo, String buyerId, String isAlt, String altType,
  965. JSONArray altInfo, String altUrl, BigDecimal marketingAmount) throws UnsupportedEncodingException {
  966. String url = "https://www.joinpay.com/trade/uniPayApi.action";
  967. List<BasicNameValuePair> data = new ArrayList<BasicNameValuePair>();
  968. data.add(new BasicNameValuePair("p0_Version", JoinpayConstant.pay_version));
  969. data.add(new BasicNameValuePair("p1_MerchantNo", JoinpayConstant.mch_no));
  970. data.add(new BasicNameValuePair("p2_OrderNo", sn));
  971. data.add(new BasicNameValuePair("p3_Amount", amount.setScale(2, RoundingMode.HALF_DOWN).toString()));
  972. data.add(new BasicNameValuePair("p4_Cur", JoinpayConstant.Cur_RMB));
  973. data.add(new BasicNameValuePair("p5_ProductName", URLEncoder.encode(productName, "utf-8")));
  974. data.add(new BasicNameValuePair("p6_ProductDesc", URLEncoder.encode(productDesc, "utf-8")));
  975. data.add(new BasicNameValuePair("p7_Mp", URLEncoder.encode(commonParameter, "utf-8")));
  976. data.add(new BasicNameValuePair("p8_ReturnUrl", returnUrl));
  977. data.add(new BasicNameValuePair("p9_NotifyUrl", notifyUrl));
  978. data.add(new BasicNameValuePair("q1_FrpCode", frpCode));
  979. data.add(new BasicNameValuePair("q2_MerchantBankCode", ""));
  980. data.add(new BasicNameValuePair("q4_IsShowPic", isShowPic));
  981. data.add(new BasicNameValuePair("q5_OpenId", openId));
  982. data.add(new BasicNameValuePair("q6_AuthCode", authCode));
  983. data.add(new BasicNameValuePair("q7_AppId", appid));
  984. data.add(new BasicNameValuePair("q8_TerminalNo", ""));
  985. data.add(new BasicNameValuePair("q9_TransactionModel", transactionModel));
  986. if (!StringUtils.isEmpty(tradeMerchantNo)) {
  987. data.add(new BasicNameValuePair("qa_TradeMerchantNo", tradeMerchantNo));
  988. }
  989. // data.add(new BasicNameValuePair("qa_TradeMerchantNo", tradeMerchantNo));
  990. data.add(new BasicNameValuePair("qb_buyerId", buyerId));
  991. data.add(new BasicNameValuePair("qc_IsAlt", isAlt));
  992. data.add(new BasicNameValuePair("qd_AltType", altType));
  993. data.add(new BasicNameValuePair("qe_AltInfo", altInfo == null ? null : altInfo.toString()));
  994. data.add(new BasicNameValuePair("qf_AltUrl", altUrl));
  995. data.add(new BasicNameValuePair("qg_MarketingAmount", marketingAmount == null ? null : marketingAmount.setScale(2, RoundingMode.HALF_DOWN).toString()));
  996. // TODO: 2019-04-01 空值不参与签名!!!!!!!!!!!!!!!!!!
  997. String hmac = createHmacSign(data, JoinpayConstant.key);
  998. data.add(new BasicNameValuePair("hmac", hmac));
  999. // logger.info("请求参数:" + data);
  1000. String result = HttpClientUtils.postKeyValue(url, data);
  1001. // logger.info("响应参数:" + result);
  1002. return result;
  1003. }
  1004. @Override
  1005. public String refreshMch(TJoinpayMch mch) {
  1006. String login_name = mch.getLoginName();
  1007. if (StringUtils.isEmpty(login_name)) {
  1008. return "账户不存在";
  1009. }
  1010. String url = "https://www.joinpay.com/allocFunds";
  1011. JSONObject requestData = new JSONObject(new LinkedHashMap());
  1012. // requestData.put("alt_login_name", "test1_" + mch.getAdminId() + "@mianhuatang.com");
  1013. requestData.put("alt_login_name", mch.getLoginName());
  1014. JSONObject requestJson = new JSONObject(new TreeMap<String, Object>());
  1015. requestJson.put("method", "altmch.query");
  1016. requestJson.put("version", "1.0");
  1017. requestJson.put("data", requestData);
  1018. // 32位随机字符串
  1019. String uuid = UUID.randomUUID().toString().trim().replaceAll("-", "");
  1020. requestJson.put("rand_str", uuid);
  1021. requestJson.put("sign_type", JoinpayConstant.sign_type_MD5);
  1022. requestJson.put("mch_no", JoinpayConstant.mch_no);
  1023. String sign = createMD5Sign(requestJson, JoinpayConstant.key);
  1024. requestJson.put("sign", sign.toUpperCase());
  1025. // logger.info("请求参数:" + requestJson);
  1026. org.json.JSONObject jsonObject;
  1027. try {
  1028. jsonObject = HttpClientUtils.postJson(url, requestJson.toString());
  1029. // logger.info("响应参数:" + jsonObject);
  1030. if (jsonObject.has("resp_code")) {
  1031. mch.setRespCode(jsonObject.getString("resp_code"));
  1032. }
  1033. if (jsonObject.has("data")) {
  1034. org.json.JSONObject data = jsonObject.getJSONObject("data");
  1035. if (data.has("biz_code")) {
  1036. mch.setBizCode(data.getString("biz_code"));
  1037. }
  1038. if (data.has("alt_mch_no")) {
  1039. mch.setAltMchNo(data.getString("alt_mch_no"));
  1040. }
  1041. if (data.has("order_status")) {
  1042. mch.setOrderStatus(data.getString("order_status"));
  1043. }
  1044. if (data.has("alt_main_balance")) {
  1045. mch.setAltMainBalance(new BigDecimal(data.getString("alt_main_balance")));
  1046. }
  1047. }
  1048. // 判断请求是否正确,受理成功
  1049. if (jsonObject.has("resp_code")) {
  1050. String resp_code = jsonObject.getString("resp_code");
  1051. mch.setRespCode(resp_code);
  1052. if (JoinpayConstant.resp_code2.equals(resp_code)) {
  1053. org.json.JSONObject data = jsonObject.getJSONObject("data");
  1054. if (data.has("biz_msg")) {
  1055. return data.getString("biz_msg");
  1056. } else {
  1057. return JoinpayConstant.resp_code.get(resp_code);
  1058. }
  1059. }
  1060. } else {
  1061. return "请求失败";
  1062. }
  1063. } catch (IOException e) {
  1064. e.printStackTrace();
  1065. }
  1066. updateById(mch);
  1067. return Constant.correct_code;
  1068. }
  1069. @Override
  1070. public String refreshMyAccount(TJoinpayMch mch) {
  1071. String url = "https://www.joinpay.com/allocFunds";
  1072. if (StringUtils.isEmpty(mch.getAltMchNo())) {
  1073. return "找不到商家编号";
  1074. }
  1075. JSONObject requestData = new JSONObject(new LinkedHashMap());
  1076. requestData.put("alt_mch_no", mch.getAltMchNo());
  1077. JSONObject requestJson = new JSONObject(new TreeMap<String, Object>());
  1078. requestJson.put("method", "altAccount.get");
  1079. requestJson.put("version", "1.0");
  1080. requestJson.put("data", requestData);
  1081. // 32位随机字符串
  1082. String uuid = UUID.randomUUID().toString().trim().replaceAll("-", "");
  1083. requestJson.put("rand_str", uuid);
  1084. requestJson.put("sign_type", JoinpayConstant.sign_type_MD5);
  1085. requestJson.put("mch_no", JoinpayConstant.mch_no);
  1086. String sign = createMD5Sign(requestJson, JoinpayConstant.key);
  1087. requestJson.put("sign", sign.toUpperCase());
  1088. // logger.info("请求参数:" + requestJson);
  1089. org.json.JSONObject jsonObject;
  1090. try {
  1091. jsonObject = HttpClientUtils.postJson(url, requestJson.toString());
  1092. // logger.info("响应参数:" + jsonObject);
  1093. // 判断请求是否正确,受理成功
  1094. if (jsonObject.has("resp_code")) {
  1095. String resp_code = jsonObject.getString("resp_code");
  1096. mch.setRespCode(resp_code);
  1097. if (JoinpayConstant.resp_code2.equals(resp_code)) {
  1098. org.json.JSONObject data = jsonObject.getJSONObject("data");
  1099. if (data.has("biz_msg")) {
  1100. return data.getString("biz_msg");
  1101. } else {
  1102. return JoinpayConstant.resp_code.get(resp_code);
  1103. }
  1104. }
  1105. } else {
  1106. return "请求失败";
  1107. }
  1108. // 处理data
  1109. if (jsonObject.has("data")) {
  1110. org.json.JSONObject data = jsonObject.getJSONObject("data");
  1111. // 更新账户的金额
  1112. if (data.has("alt_main_balance")) {
  1113. mch.setAltMainBalance(new BigDecimal(data.getString("alt_main_balance")).divide(new BigDecimal(100)));
  1114. }
  1115. if (data.has("alt_guar_balance")) {
  1116. mch.setAltGuarBalance(new BigDecimal(data.getString("alt_guar_balance")).divide(new BigDecimal(100)));
  1117. }
  1118. if (data.has("alt_avil_balance")) {
  1119. mch.setAltAvilBalance(new BigDecimal(data.getString("alt_avil_balance")).divide(new BigDecimal(100)));
  1120. }
  1121. updateById(mch);
  1122. }
  1123. } catch (IOException e) {
  1124. e.printStackTrace();
  1125. }
  1126. return Constant.correct_code;
  1127. }
  1128. /**
  1129. * 签名算法sign , hmac 签名
  1130. *
  1131. * @param data
  1132. * @return
  1133. */
  1134. public static String createHmacSign(List<BasicNameValuePair> data, String key) throws UnsupportedEncodingException {
  1135. StringBuffer sb = new StringBuffer();
  1136. Iterator<BasicNameValuePair> es = data.iterator();
  1137. while (es.hasNext()) {
  1138. BasicNameValuePair entry = (BasicNameValuePair) es.next();
  1139. String k = (String) entry.getName();
  1140. String v = (String) entry.getValue();
  1141. if (null != v && !"".equals(v) && !"sign".equals(k) && !"key".equals(k)) {
  1142. sb.append(URLDecoder.decode(String.valueOf(v), "utf-8"));
  1143. }
  1144. }
  1145. sb.append(key);
  1146. // logger.info("签名字符串:" + sb.toString());
  1147. String sign = DigestUtils.md5Hex(sb.toString());
  1148. return sign;
  1149. }
  1150. }