TJoinpayMchServiceImpl.java 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724
  1. package com.szwl.service.impl;
  2. import com.alibaba.fastjson.JSONArray;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.szwl.feign.bean.PayFeign;
  5. import com.szwl.mapper.TShandeMchMapper;
  6. import com.szwl.model.bo.JoinpayConstant;
  7. import com.szwl.model.bo.R;
  8. import com.szwl.model.entity.TJoinpayMch;
  9. import com.szwl.mapper.TJoinpayMchMapper;
  10. import com.szwl.model.entity.TJoinpayMchCheck;
  11. import com.szwl.model.entity.TOrder;
  12. import com.szwl.model.entity.TShandeMch;
  13. import com.szwl.model.utils.AESUtil;
  14. import com.szwl.model.utils.Constant;
  15. import com.szwl.model.utils.HttpClientUtils;
  16. import com.szwl.model.utils.RSAUtil;
  17. import com.szwl.service.TJoinpayMchService;
  18. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  19. import org.apache.commons.codec.digest.DigestUtils;
  20. import org.apache.commons.lang.StringUtils;
  21. import org.apache.http.message.BasicNameValuePair;
  22. import org.springframework.beans.factory.annotation.Autowired;
  23. import org.springframework.stereotype.Service;
  24. import java.io.IOException;
  25. import java.io.UnsupportedEncodingException;
  26. import java.math.BigDecimal;
  27. import java.math.RoundingMode;
  28. import java.net.URLDecoder;
  29. import java.net.URLEncoder;
  30. import java.text.SimpleDateFormat;
  31. import java.util.*;
  32. /**
  33. * <p>
  34. * 汇聚支付用户收款信息表 服务实现类
  35. * </p>
  36. *
  37. * @author wuhs
  38. * @since 2022-04-29
  39. */
  40. @Service
  41. public class TJoinpayMchServiceImpl extends ServiceImpl<TJoinpayMchMapper, TJoinpayMch> implements TJoinpayMchService {
  42. @Autowired
  43. PayFeign payFeign;
  44. @Autowired
  45. TShandeMchMapper shandeMchMapper;
  46. @Override
  47. public String createMch(TJoinpayMch mch) {
  48. Long adminId = mch.getAdminId();
  49. if(null == adminId){
  50. return "找不到对应的管理员";
  51. }
  52. Integer alt_merchant_type = mch.getAltMerchantType();
  53. String url = "https://www.joinpay.com/allocFunds";
  54. JSONObject requestData = new JSONObject(new LinkedHashMap());
  55. String login_name = "test1_" + adminId + "@mianhuatang.com";
  56. // String login_name = mch.getLegal_person();
  57. mch.setLoginName(login_name);
  58. // String alt_mch_name = "test1_" + adminId + "@mianhuatang.com";
  59. // String alt_mch_name = mch.getLegal_person();
  60. String alt_mch_name = mch.getBankAccountName();
  61. mch.setAltMchName(alt_mch_name);
  62. mch.setAltMchShortName("");
  63. // mch.setAlt_mch_short_name("");
  64. // 格式为16 位随机字符串:16 位随机字符串
  65. String aes_key1 = getRandomString(16);
  66. String aes_key2 = getRandomString(16);
  67. requestData.put("login_name", login_name);
  68. requestData.put("alt_mch_name", alt_mch_name);
  69. requestData.put("alt_mch_short_name", "");
  70. requestData.put("alt_merchant_type", mch.getAltMerchantType());
  71. requestData.put("busi_contact_name", mch.getBusiContactName());
  72. requestData.put("busi_contact_mobile_no", mch.getBusiContactMobileNo());
  73. requestData.put("phone_no", mch.getPhoneNo());
  74. requestData.put("manage_scope", mch.getManageScope());
  75. requestData.put("manage_addr", mch.getManageAddr());
  76. requestData.put("legal_person", AESUtil.encrypt(mch.getLegalPerson() , aes_key1 , aes_key2 ));
  77. requestData.put("id_card_no", AESUtil.encrypt(mch.getIdCardNo(), aes_key1 , aes_key2 ));
  78. requestData.put("id_card_expiry", mch.getIdCardExpiry());
  79. // 个体工商户和企业必填:营业执照编号 / 营业执照有效期
  80. if(JoinpayConstant.alt_merchant_type2== alt_merchant_type || JoinpayConstant.alt_merchant_type3== alt_merchant_type){
  81. requestData.put("license_no", mch.getLicenseNo());
  82. requestData.put("license_expiry", mch.getLicenseExpiry());
  83. }
  84. if(mch.getSettMode()!=null){
  85. requestData.put("sett_mode", mch.getSettMode());
  86. }else {
  87. // 由汇聚自动结算
  88. requestData.put("sett_mode", JoinpayConstant.sett_mode1);
  89. }
  90. // 结算周期类型:自然日
  91. requestData.put("sett_date_type", JoinpayConstant.sett_date_type2);
  92. if(mch.getRiskDay()!=null){
  93. requestData.put("risk_day", mch.getRiskDay());
  94. }else{
  95. // 结算周期:1
  96. requestData.put("risk_day", 1);
  97. }
  98. if(JoinpayConstant.alt_merchant_type2== alt_merchant_type || JoinpayConstant.alt_merchant_type3== alt_merchant_type){
  99. // 企业用对公账户
  100. requestData.put("bank_account_type", JoinpayConstant.bank_account_type4);
  101. }else if(JoinpayConstant.alt_merchant_type1== alt_merchant_type){
  102. // 个人用借记卡
  103. requestData.put("bank_account_type", JoinpayConstant.bank_account_type1);
  104. }
  105. requestData.put("bank_account_name", AESUtil.encrypt(mch.getBankAccountName(), aes_key1 , aes_key2 ));
  106. requestData.put("bank_account_no", AESUtil.encrypt(mch.getBankAccountNo(), aes_key1 , aes_key2 ));
  107. requestData.put("bank_channel_no", mch.getBankChannelNo());
  108. JSONObject requestJson = new JSONObject(new TreeMap<String, Object>());
  109. requestJson.put("method", "altmch.add");
  110. requestJson.put("version", "2.0");
  111. requestJson.put("data", requestData);
  112. // 32位随机字符串
  113. String uuid = UUID.randomUUID().toString().trim().replaceAll("-", "");
  114. requestJson.put("rand_str", uuid);
  115. requestJson.put("sign_type", JoinpayConstant.sign_type_MD5);
  116. requestJson.put("mch_no", JoinpayConstant.mch_no);
  117. String sign = createMD5Sign(requestJson , JoinpayConstant.key);
  118. requestJson.put("sign", sign.toUpperCase());
  119. requestJson.put("aes_key", RSAUtil.encrypt(aes_key1+":"+aes_key2 , JoinpayConstant.publickey ));
  120. // logger.info("请求参数:" + requestJson);
  121. org.json.JSONObject jsonObject;
  122. try {
  123. jsonObject = HttpClientUtils.postJson(url, requestJson.toString());
  124. // logger.info("响应参数:" + jsonObject);
  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.setAltMchName(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. save(mch);
  146. if(jsonObject.has("resp_code")){
  147. String resp_code = jsonObject.getString("resp_code");
  148. mch.setRespCode(resp_code);
  149. if(JoinpayConstant.resp_code2.equals(resp_code)){
  150. org.json.JSONObject data = jsonObject.getJSONObject("data");
  151. if(data.has("biz_msg")){
  152. return data.getString("biz_msg");
  153. }
  154. }
  155. }
  156. } catch (IOException e) {
  157. e.printStackTrace();
  158. }
  159. return Constant.correct_code;
  160. }
  161. @Override
  162. public String updateMch(TJoinpayMch mch) {
  163. Long adminId = mch.getAdminId();
  164. if(null == adminId){
  165. return "找不到对应的管理员";
  166. }
  167. if(JoinpayConstant.alt_merchant_type1!=mch.getAltMerchantType()
  168. && JoinpayConstant.alt_merchant_type2!= mch.getAltMerchantType()
  169. && JoinpayConstant.alt_merchant_type3!= mch.getAltMerchantType()){
  170. return "商家类型不正确";
  171. }
  172. String url = "https://www.joinpay.com/allocFunds";
  173. JSONObject requestData = new JSONObject(new LinkedHashMap());
  174. // 格式为16 位随机字符串:16 位随机字符串
  175. String aes_key1 = getRandomString(16);
  176. String aes_key2 = getRandomString(16);
  177. requestData.put("alt_mch_no", mch.getAltMchNo());
  178. // requestData.put("legal_person", AESUtil.encrypt(legal_person, aes_key1 , aes_key2 ));
  179. requestData.put("legal_person", mch.getLegalPerson());
  180. // requestData.put("id_card_no", AESUtil.encrypt(id_card_no, aes_key1 , aes_key2 ));
  181. requestData.put("id_card_no", mch.getIdCardNo());
  182. if(JoinpayConstant.alt_merchant_type2== mch.getAltMerchantType() || JoinpayConstant.alt_merchant_type3== mch.getAltMerchantType()){
  183. // 企业用对公账户
  184. requestData.put("bank_account_type", JoinpayConstant.bank_account_type4);
  185. mch.setBankAccountType(JoinpayConstant.bank_account_type4);
  186. String alt_mch_name = mch.getBankAccountName();
  187. requestData.put("alt_mch_name", alt_mch_name);
  188. requestData.put("license_no", mch.getLicenseNo());
  189. // requestData.put("alt_mch_name", AESUtil.encrypt(alt_mch_name, aes_key1 , aes_key2 ));/**/
  190. }else if(JoinpayConstant.alt_merchant_type1== mch.getAltMerchantType()){
  191. // 个人用借记卡
  192. requestData.put("bank_account_type", JoinpayConstant.bank_account_type1);
  193. mch.setBankAccountType(JoinpayConstant.bank_account_type1);
  194. }
  195. requestData.put("bank_account_name", mch.getBankAccountName());
  196. // requestData.put("bank_account_name", AESUtil.encrypt(bank_account_name, aes_key1 , aes_key2 ));
  197. requestData.put("bank_account_no", mch.getBankAccountNo());
  198. // requestData.put("bank_account_no", AESUtil.encrypt(bank_account_no, aes_key1 , aes_key2 ));
  199. // requestData.put("bank_channel_no", AESUtil.encrypt(bank_channel_no, aes_key1 , aes_key2 ));
  200. requestData.put("bank_channel_no", mch.getBankChannelNo());
  201. if(mch.getSettMode()!=null){
  202. requestData.put("sett_mode", mch.getSettMode());
  203. }else {
  204. // 由汇聚自动结算
  205. requestData.put("sett_mode", JoinpayConstant.sett_mode1);
  206. }
  207. // 结算周期类型:自然日
  208. requestData.put("sett_date_type", JoinpayConstant.sett_date_type2);
  209. if(mch.getRiskDay()!=null){
  210. requestData.put("risk_day", mch.getRiskDay());
  211. }else{
  212. // 结算周期:1
  213. requestData.put("risk_day", 1);
  214. }
  215. // mch.setLegal_person(legal_person);
  216. // mch.setId_card_no(id_card_no);
  217. // mch.setAlt_merchant_type(alt_merchant_type);
  218. // mch.setBank_account_name(bank_account_name);
  219. // mch.setBank_account_no(bank_account_no);
  220. // mch.setBank_channel_no(bank_channel_no);
  221. if(mch.getAltMerchantType()==12){
  222. String alt_mch_name = mch.getBankAccountName();
  223. // mch.setAlt_mch_name(alt_mch_name);
  224. }
  225. JSONObject requestJson = new JSONObject(new TreeMap<String, Object>());
  226. requestJson.put("method", "altmch.modify");
  227. requestJson.put("version", "1.1");
  228. requestJson.put("data", requestData);
  229. // 32位随机字符串
  230. String uuid = UUID.randomUUID().toString().trim().replaceAll("-", "");
  231. requestJson.put("rand_str", uuid);
  232. requestJson.put("sign_type", JoinpayConstant.sign_type_MD5);
  233. requestJson.put("mch_no", JoinpayConstant.mch_no);
  234. String sign = createMD5Sign(requestJson , JoinpayConstant.key);
  235. requestJson.put("sign", sign.toUpperCase());
  236. requestJson.put("aes_key", RSAUtil.encrypt(aes_key1+":"+aes_key2 , JoinpayConstant.publickey ));
  237. // logger.info("请求参数:" + requestJson);
  238. org.json.JSONObject jsonObject;
  239. try {
  240. jsonObject = HttpClientUtils.postJson(url, requestJson.toString());
  241. // logger.info("响应参数:" + jsonObject);
  242. if(jsonObject.has("resp_code")){
  243. mch.setRespCode(jsonObject.getString("resp_code"));
  244. }
  245. if(jsonObject.has("data")){
  246. org.json.JSONObject data = jsonObject.getJSONObject("data");
  247. if(data.has("biz_code")){
  248. mch.setBizCode(data.getString("biz_code"));
  249. }
  250. if (data.has("alt_mch_no")){
  251. mch.setAltMchNo(data.getString("alt_mch_no"));
  252. }
  253. if(data.has("order_status")){
  254. mch.setOrderStatus(data.getString("order_status"));
  255. }
  256. }
  257. if(jsonObject.has("resp_code")){
  258. String resp_code = jsonObject.getString("resp_code");
  259. mch.setRespCode(resp_code);
  260. if(JoinpayConstant.resp_code2.equals(resp_code)){
  261. org.json.JSONObject data = jsonObject.getJSONObject("data");
  262. if(data.has("biz_msg")){
  263. return data.getString("biz_msg");
  264. }
  265. }
  266. }
  267. } catch (IOException e) {
  268. e.printStackTrace();
  269. }
  270. return Constant.correct_code;
  271. }
  272. // 协议内容签约接口
  273. @Override
  274. public String altMchSign(TJoinpayMch mch) {
  275. String url = "https://www.joinpay.com/allocFunds";
  276. if(StringUtils.isEmpty(mch.getAltMchNo())){
  277. return "找不到商家编号";
  278. }
  279. Date currentTime = new Date();
  280. SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  281. String dateString = formatter.format(currentTime);
  282. JSONObject requestData = new JSONObject(new LinkedHashMap());
  283. requestData.put("alt_mch_no" , mch.getAltMchNo());
  284. requestData.put("sign_status" , "P1000");
  285. requestData.put("sign_time" , dateString);
  286. JSONObject requestJson = new JSONObject(new TreeMap<String, Object>());
  287. requestJson.put("method", "altMchSign.sign");
  288. requestJson.put("version", "1.0");
  289. requestJson.put("data", requestData);
  290. // 32位随机字符串
  291. String uuid = UUID.randomUUID().toString().trim().replaceAll("-", "");
  292. requestJson.put("rand_str", uuid);
  293. requestJson.put("sign_type", JoinpayConstant.sign_type_MD5);
  294. requestJson.put("mch_no", JoinpayConstant.mch_no);
  295. String sign = createMD5Sign(requestJson , JoinpayConstant.key);
  296. requestJson.put("sign", sign.toUpperCase());
  297. // logger.info("请求参数:" + requestJson);
  298. String back=null;
  299. org.json.JSONObject jsonObject;
  300. try {
  301. jsonObject = HttpClientUtils.postJson(url, requestJson.toString());
  302. // logger.info("响应参数:" + jsonObject);
  303. // 判断请求是否正确,受理成功
  304. if(jsonObject.has("resp_code")){
  305. String resp_code = jsonObject.getString("resp_code");
  306. mch.setRespCode(resp_code);
  307. if(JoinpayConstant.resp_code2.equals(resp_code)){
  308. org.json.JSONObject data = jsonObject.getJSONObject("data");
  309. if(data.has("biz_msg")){
  310. return data.getString("biz_msg");
  311. }else{
  312. return JoinpayConstant.resp_code.get(resp_code);
  313. }
  314. }
  315. }else{
  316. return "请求失败";
  317. }
  318. // 处理data
  319. if(jsonObject.has("data")){
  320. org.json.JSONObject data = jsonObject.getJSONObject("data");
  321. String biz_code = data.getString("biz_code");
  322. if(biz_code.equals("B100000")){
  323. String sign_trx_no = data.getString("sign_trx_no");
  324. String sign_status = data.getString("sign_status");
  325. if(sign_status.equals("P1000")){
  326. sign_status="签约成功";
  327. }else {
  328. sign_status="签约失败";
  329. }
  330. mch.setSignStatus(sign_status);
  331. mch.setSignTrxNo(sign_trx_no);
  332. back = sign_status;
  333. }
  334. updateById(mch);
  335. }
  336. } catch (IOException e) {
  337. e.printStackTrace();
  338. }
  339. return back;
  340. }
  341. /**
  342. * 传送身份证图片
  343. * @param
  344. * @return
  345. */
  346. @Override
  347. public String sendCard(TJoinpayMch mch,String cardPositive,String cardNegative,String staus) {
  348. // String url = "https://www.joinpay.com/allocFunds";
  349. String url = "https://upload.joinpay.com/allocFunds";
  350. if(StringUtils.isEmpty(mch.getAltMchNo())){
  351. return "找不到商家编号";
  352. }
  353. // String card_positive = ImageToBase64ByLocal(cardPositive);
  354. String card_positive = cardPositive;
  355. // String card_negative = ImageToBase64ByLocal(cardNegative);
  356. String card_negative = cardNegative;
  357. JSONObject requestData = new JSONObject(new LinkedHashMap());
  358. requestData.put("alt_mch_no" , mch.getAltMchNo());
  359. requestData.put("card_positive" , card_positive);
  360. requestData.put("card_negative" , card_negative);
  361. JSONObject requestJson = new JSONObject(new TreeMap<String, Object>());
  362. if(staus.equals("0")){
  363. requestJson.put("method", "altMchPics.uploadPic");
  364. }else{
  365. requestJson.put("method", "altMchPics.modifyPic");
  366. }
  367. requestJson.put("version", "1.0");
  368. requestJson.put("data", requestData);
  369. // 32位随机字符串
  370. String uuid = UUID.randomUUID().toString().trim().replaceAll("-", "");
  371. requestJson.put("rand_str", uuid);
  372. requestJson.put("sign_type", JoinpayConstant.sign_type_MD5);
  373. requestJson.put("mch_no", JoinpayConstant.mch_no);
  374. String sign = createMD5Sign(requestJson , JoinpayConstant.key);
  375. requestJson.put("sign", sign.toUpperCase());
  376. // logger.info("请求参数:" + requestJson);
  377. String back=null;
  378. org.json.JSONObject jsonObject;
  379. try {
  380. jsonObject = HttpClientUtils.postJson(url, requestJson.toString());
  381. // logger.info("响应参数:" + jsonObject);
  382. // 判断请求是否正确,受理成功
  383. if(jsonObject.has("resp_code")){
  384. String resp_code = jsonObject.getString("resp_code");
  385. mch.setRespCode(resp_code);
  386. }else{
  387. return "请求失败";
  388. }
  389. // 处理data
  390. if(jsonObject.has("data")){
  391. org.json.JSONObject data = jsonObject.getJSONObject("data");
  392. String biz_code = data.getString("biz_code");
  393. if(biz_code.equals("B100000")){
  394. String approve_status = "审核中";
  395. mch.setApproveStatus(approve_status);
  396. mch.setApproveNote("");
  397. mch.setStep("1");
  398. back = approve_status;
  399. }
  400. if(biz_code.equals("B100002")){
  401. String approve_status = "上传失败";
  402. String approve_note = data.getString("biz_msg");
  403. mch.setApproveNote(approve_note);
  404. mch.setApproveStatus(approve_status);
  405. back = approve_status;
  406. }
  407. if(biz_code.equals("B101017")){
  408. String approve_status = "上传失败";
  409. String approve_note = data.getString("biz_msg");
  410. mch.setApproveNote(approve_note);
  411. mch.setApproveStatus(approve_status);
  412. back = approve_status;
  413. }
  414. updateById(mch);
  415. }
  416. } catch (IOException e) {
  417. e.printStackTrace();
  418. }
  419. return back;
  420. }
  421. /**
  422. * 传送身份证图片
  423. * @param
  424. * @return
  425. */
  426. @Override
  427. public String sendCardBusiness(TJoinpayMch mch, String cardPositive, String cardNegative, String tradeLicence, String openAccountLicence,String staus) {
  428. // String url = "https://www.joinpay.com/allocFunds";
  429. String url = "https://upload.joinpay.com/allocFunds";
  430. if(StringUtils.isEmpty(mch.getAltMchNo())){
  431. return "找不到商家编号";
  432. }
  433. // String card_positive = ImageToBase64ByLocal(cardPositive);
  434. String card_positive = cardPositive;
  435. // String card_negative = ImageToBase64ByLocal(cardNegative);
  436. String card_negative = cardNegative;
  437. String trade_licence = tradeLicence;
  438. String open_account_licence = openAccountLicence;
  439. JSONObject requestData = new JSONObject(new LinkedHashMap());
  440. requestData.put("alt_mch_no" , mch.getAltMchNo());
  441. requestData.put("card_positive" , card_positive);
  442. requestData.put("card_negative" , card_negative);
  443. requestData.put("trade_licence" , trade_licence);
  444. requestData.put("open_account_licence" , open_account_licence);
  445. JSONObject requestJson = new JSONObject(new TreeMap<String, Object>());
  446. if(staus.equals("0")){
  447. requestJson.put("method", "altMchPics.uploadPic");
  448. // 格式为16 位随机字符串:16 位随机字符串
  449. // String aes_key1 = getRandomString(16);
  450. // String aes_key2 = getRandomString(16);
  451. // requestJson.put("aes_key", RSAUtil.encrypt(aes_key1+":"+aes_key2 , JoinpayConstant.publickey ));
  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. // logger.info("请求参数:" + requestJson);
  465. String s = requestJson.toString();
  466. String back=null;
  467. org.json.JSONObject jsonObject;
  468. try {
  469. jsonObject = HttpClientUtils.postJson(url, requestJson.toString());
  470. // logger.info("响应参数:" + jsonObject);
  471. // 判断请求是否正确,受理成功
  472. if(jsonObject.has("resp_code")){
  473. String resp_code = jsonObject.getString("resp_code");
  474. mch.setRespCode(resp_code);
  475. }else{
  476. return "请求失败";
  477. }
  478. // 处理data
  479. if(jsonObject.has("data")){
  480. org.json.JSONObject data = jsonObject.getJSONObject("data");
  481. String biz_code = data.getString("biz_code");
  482. if(biz_code.equals("B100000")){
  483. String approve_status = "审核中";
  484. mch.setApproveStatus(approve_status);
  485. mch.setApproveNote("");
  486. back = approve_status;
  487. mch.setStep("1");
  488. }
  489. if(biz_code.equals("B100002")){
  490. String approve_status = "上传失败";
  491. String approve_note = data.getString("biz_msg");
  492. mch.setApproveNote(approve_note);
  493. mch.setApproveStatus(approve_status);
  494. back = approve_status;
  495. }
  496. if(biz_code.equals("B101017")){
  497. String approve_status = "上传失败";
  498. String approve_note = data.getString("biz_msg");
  499. mch.setApproveNote(approve_note);
  500. mch.setApproveStatus(approve_status);
  501. back = approve_status;
  502. }
  503. updateById(mch);
  504. }
  505. } catch (IOException e) {
  506. e.printStackTrace();
  507. }
  508. return back;
  509. }
  510. /**
  511. * 获取随机字符串
  512. * @return
  513. */
  514. public static String getRandomString(int length){
  515. String str="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
  516. Random random=new Random();
  517. StringBuffer sb=new StringBuffer();
  518. for(int i=0;i<length;i++){
  519. int number=random.nextInt(62);
  520. sb.append(str.charAt(number));
  521. }
  522. return sb.toString();
  523. }
  524. /**
  525. * 签名算法sign , MD5 签名
  526. * @param requestJson
  527. * @return
  528. */
  529. public static String createMD5Sign(JSONObject requestJson , String key){
  530. StringBuffer sb = new StringBuffer();
  531. Set es = requestJson.entrySet();
  532. Iterator it = es.iterator();
  533. while(it.hasNext()) {
  534. Map.Entry entry = (Map.Entry)it.next();
  535. String k = (String)entry.getKey();
  536. Object v = entry.getValue();
  537. if(null != v && !"".equals(v) && !"sign".equals(k) && !"key".equals(k)) {
  538. sb.append(k + "=" + v + "&");
  539. }
  540. }
  541. sb.append("key=" + key);
  542. // logger.info("签名字符串:"+sb.toString());
  543. String sign = DigestUtils.md5Hex(sb.toString());
  544. return sign;
  545. }
  546. @Override
  547. public String uniPay(String sn, BigDecimal amount, String productName, String productDesc, String commonParameter,
  548. String returnUrl, String notifyUrl, String frpCode, String isShowPic, String openId, String authCode,
  549. String appid, String transactionModel, String tradeMerchantNo, String buyerId, String isAlt, String altType,
  550. JSONArray altInfo, String altUrl, BigDecimal marketingAmount) throws UnsupportedEncodingException {
  551. String url = "https://www.joinpay.com/trade/uniPayApi.action";
  552. List<BasicNameValuePair> data = new ArrayList<BasicNameValuePair>();
  553. data.add(new BasicNameValuePair("p0_Version", JoinpayConstant.pay_version));
  554. data.add(new BasicNameValuePair("p1_MerchantNo", JoinpayConstant.mch_no));
  555. data.add(new BasicNameValuePair("p2_OrderNo", sn));
  556. data.add(new BasicNameValuePair("p3_Amount", amount.setScale(2, RoundingMode.HALF_DOWN).toString()));
  557. data.add(new BasicNameValuePair("p4_Cur", JoinpayConstant.Cur_RMB));
  558. data.add(new BasicNameValuePair("p5_ProductName", URLEncoder.encode(productName, "utf-8")));
  559. data.add(new BasicNameValuePair("p6_ProductDesc", URLEncoder.encode(productDesc, "utf-8")));
  560. data.add(new BasicNameValuePair("p7_Mp", URLEncoder.encode(commonParameter, "utf-8")));
  561. data.add(new BasicNameValuePair("p8_ReturnUrl", returnUrl));
  562. data.add(new BasicNameValuePair("p9_NotifyUrl", notifyUrl));
  563. data.add(new BasicNameValuePair("q1_FrpCode", frpCode));
  564. data.add(new BasicNameValuePair("q2_MerchantBankCode", ""));
  565. data.add(new BasicNameValuePair("q4_IsShowPic", isShowPic));
  566. data.add(new BasicNameValuePair("q5_OpenId", openId));
  567. data.add(new BasicNameValuePair("q6_AuthCode", authCode));
  568. data.add(new BasicNameValuePair("q7_AppId", appid));
  569. data.add(new BasicNameValuePair("q8_TerminalNo", ""));
  570. data.add(new BasicNameValuePair("q9_TransactionModel", transactionModel));
  571. if(!StringUtils.isEmpty(tradeMerchantNo)){
  572. data.add(new BasicNameValuePair("qa_TradeMerchantNo",tradeMerchantNo));
  573. }
  574. // data.add(new BasicNameValuePair("qa_TradeMerchantNo", tradeMerchantNo));
  575. data.add(new BasicNameValuePair("qb_buyerId", buyerId));
  576. data.add(new BasicNameValuePair("qc_IsAlt", isAlt));
  577. data.add(new BasicNameValuePair("qd_AltType", altType));
  578. data.add(new BasicNameValuePair("qe_AltInfo", altInfo==null?null:altInfo.toString()));
  579. data.add(new BasicNameValuePair("qf_AltUrl", altUrl));
  580. data.add(new BasicNameValuePair("qg_MarketingAmount", marketingAmount==null?null:marketingAmount.setScale(2, RoundingMode.HALF_DOWN).toString()));
  581. // TODO: 2019-04-01 空值不参与签名!!!!!!!!!!!!!!!!!!
  582. String hmac = createHmacSign(data, JoinpayConstant.key);
  583. data.add(new BasicNameValuePair("hmac", hmac));
  584. // logger.info("请求参数:" + data);
  585. String result = HttpClientUtils.postKeyValue(url, data);
  586. // logger.info("响应参数:" + result);
  587. return result;
  588. }
  589. /**
  590. * 签名算法sign , hmac 签名
  591. *
  592. * @param data
  593. * @return
  594. */
  595. public static String createHmacSign( List<BasicNameValuePair> data , String key) throws UnsupportedEncodingException {
  596. StringBuffer sb = new StringBuffer();
  597. Iterator<BasicNameValuePair> es = data.iterator();
  598. while (es.hasNext()) {
  599. BasicNameValuePair entry = (BasicNameValuePair) es.next();
  600. String k = (String) entry.getName();
  601. String v = (String) entry.getValue();
  602. if (null != v && !"".equals(v) && !"sign".equals(k) && !"key".equals(k)) {
  603. sb.append(URLDecoder.decode(String.valueOf(v), "utf-8"));
  604. }
  605. }
  606. sb.append(key);
  607. // logger.info("签名字符串:" + sb.toString());
  608. String sign = DigestUtils.md5Hex(sb.toString());
  609. return sign;
  610. }
  611. }