package com.szwl.service.impl; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.szwl.feign.bean.PayFeign; import com.szwl.mapper.TShandeMchMapper; import com.szwl.model.bo.JoinpayConstant; import com.szwl.model.bo.R; import com.szwl.model.entity.TJoinpayMch; import com.szwl.mapper.TJoinpayMchMapper; import com.szwl.model.entity.TJoinpayMchCheck; import com.szwl.model.entity.TOrder; import com.szwl.model.entity.TShandeMch; import com.szwl.model.utils.AESUtil; import com.szwl.model.utils.Constant; import com.szwl.model.utils.HttpClientUtils; import com.szwl.model.utils.RSAUtil; import com.szwl.service.TJoinpayMchService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.lang.StringUtils; import org.apache.http.message.BasicNameValuePair; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.math.BigDecimal; import java.math.RoundingMode; import java.net.URLDecoder; import java.net.URLEncoder; import java.text.SimpleDateFormat; import java.util.*; /** *

* 汇聚支付用户收款信息表 服务实现类 *

* * @author wuhs * @since 2022-04-29 */ @Service public class TJoinpayMchServiceImpl extends ServiceImpl implements TJoinpayMchService { @Autowired PayFeign payFeign; @Autowired TShandeMchMapper shandeMchMapper; @Override public String createMch(TJoinpayMch mch) { Long adminId = mch.getAdminId(); if(null == adminId){ return "找不到对应的管理员"; } Integer alt_merchant_type = mch.getAltMerchantType(); String url = "https://www.joinpay.com/allocFunds"; JSONObject requestData = new JSONObject(new LinkedHashMap()); String login_name = "test1_" + adminId + "@mianhuatang.com"; // String login_name = mch.getLegal_person(); mch.setLoginName(login_name); // String alt_mch_name = "test1_" + adminId + "@mianhuatang.com"; // String alt_mch_name = mch.getLegal_person(); String alt_mch_name = mch.getBankAccountName(); mch.setAltMchName(alt_mch_name); mch.setAltMchShortName(""); // mch.setAlt_mch_short_name(""); // 格式为16 位随机字符串:16 位随机字符串 String aes_key1 = getRandomString(16); String aes_key2 = getRandomString(16); requestData.put("login_name", login_name); requestData.put("alt_mch_name", alt_mch_name); requestData.put("alt_mch_short_name", ""); requestData.put("alt_merchant_type", mch.getAltMerchantType()); requestData.put("busi_contact_name", mch.getBusiContactName()); requestData.put("busi_contact_mobile_no", mch.getBusiContactMobileNo()); requestData.put("phone_no", mch.getPhoneNo()); requestData.put("manage_scope", mch.getManageScope()); requestData.put("manage_addr", mch.getManageAddr()); requestData.put("legal_person", AESUtil.encrypt(mch.getLegalPerson() , aes_key1 , aes_key2 )); requestData.put("id_card_no", AESUtil.encrypt(mch.getIdCardNo(), aes_key1 , aes_key2 )); requestData.put("id_card_expiry", mch.getIdCardExpiry()); // 个体工商户和企业必填:营业执照编号 / 营业执照有效期 if(JoinpayConstant.alt_merchant_type2== alt_merchant_type || JoinpayConstant.alt_merchant_type3== alt_merchant_type){ requestData.put("license_no", mch.getLicenseNo()); requestData.put("license_expiry", mch.getLicenseExpiry()); } if(mch.getSettMode()!=null){ requestData.put("sett_mode", mch.getSettMode()); }else { // 由汇聚自动结算 requestData.put("sett_mode", JoinpayConstant.sett_mode1); } // 结算周期类型:自然日 requestData.put("sett_date_type", JoinpayConstant.sett_date_type2); if(mch.getRiskDay()!=null){ requestData.put("risk_day", mch.getRiskDay()); }else{ // 结算周期:1 requestData.put("risk_day", 1); } if(JoinpayConstant.alt_merchant_type2== alt_merchant_type || JoinpayConstant.alt_merchant_type3== alt_merchant_type){ // 企业用对公账户 requestData.put("bank_account_type", JoinpayConstant.bank_account_type4); }else if(JoinpayConstant.alt_merchant_type1== alt_merchant_type){ // 个人用借记卡 requestData.put("bank_account_type", JoinpayConstant.bank_account_type1); } requestData.put("bank_account_name", AESUtil.encrypt(mch.getBankAccountName(), aes_key1 , aes_key2 )); requestData.put("bank_account_no", AESUtil.encrypt(mch.getBankAccountNo(), aes_key1 , aes_key2 )); requestData.put("bank_channel_no", mch.getBankChannelNo()); JSONObject requestJson = new JSONObject(new TreeMap()); requestJson.put("method", "altmch.add"); requestJson.put("version", "2.0"); requestJson.put("data", requestData); // 32位随机字符串 String uuid = UUID.randomUUID().toString().trim().replaceAll("-", ""); requestJson.put("rand_str", uuid); requestJson.put("sign_type", JoinpayConstant.sign_type_MD5); requestJson.put("mch_no", JoinpayConstant.mch_no); String sign = createMD5Sign(requestJson , JoinpayConstant.key); requestJson.put("sign", sign.toUpperCase()); requestJson.put("aes_key", RSAUtil.encrypt(aes_key1+":"+aes_key2 , JoinpayConstant.publickey )); // logger.info("请求参数:" + requestJson); org.json.JSONObject jsonObject; try { jsonObject = HttpClientUtils.postJson(url, requestJson.toString()); // logger.info("响应参数:" + jsonObject); if(jsonObject.has("resp_code")){ mch.setRespCode(jsonObject.getString("resp_code")); } if(jsonObject.has("data")){ org.json.JSONObject data = jsonObject.getJSONObject("data"); if(data.has("biz_code")){ mch.setBizCode(data.getString("biz_code")); } if (data.has("alt_mch_no")){ mch.setAltMchName(data.getString("alt_mch_no")); } if(data.has("order_status")){ mch.setOrderStatus(data.getString("order_status")); } } /** * 更新一下分销商户的 各种响应码 & login_name */ mch.setCreateDate(new Date()); mch.setModifyDate(new Date()); save(mch); if(jsonObject.has("resp_code")){ String resp_code = jsonObject.getString("resp_code"); mch.setRespCode(resp_code); if(JoinpayConstant.resp_code2.equals(resp_code)){ org.json.JSONObject data = jsonObject.getJSONObject("data"); if(data.has("biz_msg")){ return data.getString("biz_msg"); } } } } catch (IOException e) { e.printStackTrace(); } return Constant.correct_code; } @Override public String updateMch(TJoinpayMch mch) { Long adminId = mch.getAdminId(); if(null == adminId){ return "找不到对应的管理员"; } if(JoinpayConstant.alt_merchant_type1!=mch.getAltMerchantType() && JoinpayConstant.alt_merchant_type2!= mch.getAltMerchantType() && JoinpayConstant.alt_merchant_type3!= mch.getAltMerchantType()){ return "商家类型不正确"; } String url = "https://www.joinpay.com/allocFunds"; JSONObject requestData = new JSONObject(new LinkedHashMap()); // 格式为16 位随机字符串:16 位随机字符串 String aes_key1 = getRandomString(16); String aes_key2 = getRandomString(16); requestData.put("alt_mch_no", mch.getAltMchNo()); // requestData.put("legal_person", AESUtil.encrypt(legal_person, aes_key1 , aes_key2 )); requestData.put("legal_person", mch.getLegalPerson()); // requestData.put("id_card_no", AESUtil.encrypt(id_card_no, aes_key1 , aes_key2 )); requestData.put("id_card_no", mch.getIdCardNo()); if(JoinpayConstant.alt_merchant_type2== mch.getAltMerchantType() || JoinpayConstant.alt_merchant_type3== mch.getAltMerchantType()){ // 企业用对公账户 requestData.put("bank_account_type", JoinpayConstant.bank_account_type4); mch.setBankAccountType(JoinpayConstant.bank_account_type4); String alt_mch_name = mch.getBankAccountName(); requestData.put("alt_mch_name", alt_mch_name); requestData.put("license_no", mch.getLicenseNo()); // requestData.put("alt_mch_name", AESUtil.encrypt(alt_mch_name, aes_key1 , aes_key2 ));/**/ }else if(JoinpayConstant.alt_merchant_type1== mch.getAltMerchantType()){ // 个人用借记卡 requestData.put("bank_account_type", JoinpayConstant.bank_account_type1); mch.setBankAccountType(JoinpayConstant.bank_account_type1); } requestData.put("bank_account_name", mch.getBankAccountName()); // requestData.put("bank_account_name", AESUtil.encrypt(bank_account_name, aes_key1 , aes_key2 )); requestData.put("bank_account_no", mch.getBankAccountNo()); // requestData.put("bank_account_no", AESUtil.encrypt(bank_account_no, aes_key1 , aes_key2 )); // requestData.put("bank_channel_no", AESUtil.encrypt(bank_channel_no, aes_key1 , aes_key2 )); requestData.put("bank_channel_no", mch.getBankChannelNo()); if(mch.getSettMode()!=null){ requestData.put("sett_mode", mch.getSettMode()); }else { // 由汇聚自动结算 requestData.put("sett_mode", JoinpayConstant.sett_mode1); } // 结算周期类型:自然日 requestData.put("sett_date_type", JoinpayConstant.sett_date_type2); if(mch.getRiskDay()!=null){ requestData.put("risk_day", mch.getRiskDay()); }else{ // 结算周期:1 requestData.put("risk_day", 1); } // mch.setLegal_person(legal_person); // mch.setId_card_no(id_card_no); // mch.setAlt_merchant_type(alt_merchant_type); // mch.setBank_account_name(bank_account_name); // mch.setBank_account_no(bank_account_no); // mch.setBank_channel_no(bank_channel_no); if(mch.getAltMerchantType()==12){ String alt_mch_name = mch.getBankAccountName(); // mch.setAlt_mch_name(alt_mch_name); } JSONObject requestJson = new JSONObject(new TreeMap()); requestJson.put("method", "altmch.modify"); requestJson.put("version", "1.1"); requestJson.put("data", requestData); // 32位随机字符串 String uuid = UUID.randomUUID().toString().trim().replaceAll("-", ""); requestJson.put("rand_str", uuid); requestJson.put("sign_type", JoinpayConstant.sign_type_MD5); requestJson.put("mch_no", JoinpayConstant.mch_no); String sign = createMD5Sign(requestJson , JoinpayConstant.key); requestJson.put("sign", sign.toUpperCase()); requestJson.put("aes_key", RSAUtil.encrypt(aes_key1+":"+aes_key2 , JoinpayConstant.publickey )); // logger.info("请求参数:" + requestJson); org.json.JSONObject jsonObject; try { jsonObject = HttpClientUtils.postJson(url, requestJson.toString()); // logger.info("响应参数:" + jsonObject); if(jsonObject.has("resp_code")){ mch.setRespCode(jsonObject.getString("resp_code")); } if(jsonObject.has("data")){ org.json.JSONObject data = jsonObject.getJSONObject("data"); if(data.has("biz_code")){ mch.setBizCode(data.getString("biz_code")); } if (data.has("alt_mch_no")){ mch.setAltMchNo(data.getString("alt_mch_no")); } if(data.has("order_status")){ mch.setOrderStatus(data.getString("order_status")); } } if(jsonObject.has("resp_code")){ String resp_code = jsonObject.getString("resp_code"); mch.setRespCode(resp_code); if(JoinpayConstant.resp_code2.equals(resp_code)){ org.json.JSONObject data = jsonObject.getJSONObject("data"); if(data.has("biz_msg")){ return data.getString("biz_msg"); } } } } catch (IOException e) { e.printStackTrace(); } return Constant.correct_code; } // 协议内容签约接口 @Override public String altMchSign(TJoinpayMch mch) { String url = "https://www.joinpay.com/allocFunds"; if(StringUtils.isEmpty(mch.getAltMchNo())){ return "找不到商家编号"; } Date currentTime = new Date(); SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String dateString = formatter.format(currentTime); JSONObject requestData = new JSONObject(new LinkedHashMap()); requestData.put("alt_mch_no" , mch.getAltMchNo()); requestData.put("sign_status" , "P1000"); requestData.put("sign_time" , dateString); JSONObject requestJson = new JSONObject(new TreeMap()); requestJson.put("method", "altMchSign.sign"); requestJson.put("version", "1.0"); requestJson.put("data", requestData); // 32位随机字符串 String uuid = UUID.randomUUID().toString().trim().replaceAll("-", ""); requestJson.put("rand_str", uuid); requestJson.put("sign_type", JoinpayConstant.sign_type_MD5); requestJson.put("mch_no", JoinpayConstant.mch_no); String sign = createMD5Sign(requestJson , JoinpayConstant.key); requestJson.put("sign", sign.toUpperCase()); // logger.info("请求参数:" + requestJson); String back=null; org.json.JSONObject jsonObject; try { jsonObject = HttpClientUtils.postJson(url, requestJson.toString()); // logger.info("响应参数:" + jsonObject); // 判断请求是否正确,受理成功 if(jsonObject.has("resp_code")){ String resp_code = jsonObject.getString("resp_code"); mch.setRespCode(resp_code); if(JoinpayConstant.resp_code2.equals(resp_code)){ org.json.JSONObject data = jsonObject.getJSONObject("data"); if(data.has("biz_msg")){ return data.getString("biz_msg"); }else{ return JoinpayConstant.resp_code.get(resp_code); } } }else{ return "请求失败"; } // 处理data if(jsonObject.has("data")){ org.json.JSONObject data = jsonObject.getJSONObject("data"); String biz_code = data.getString("biz_code"); if(biz_code.equals("B100000")){ String sign_trx_no = data.getString("sign_trx_no"); String sign_status = data.getString("sign_status"); if(sign_status.equals("P1000")){ sign_status="签约成功"; }else { sign_status="签约失败"; } mch.setSignStatus(sign_status); mch.setSignTrxNo(sign_trx_no); back = sign_status; } updateById(mch); } } catch (IOException e) { e.printStackTrace(); } return back; } /** * 传送身份证图片 * @param * @return */ @Override public String sendCard(TJoinpayMch mch,String cardPositive,String cardNegative,String staus) { // String url = "https://www.joinpay.com/allocFunds"; String url = "https://upload.joinpay.com/allocFunds"; if(StringUtils.isEmpty(mch.getAltMchNo())){ return "找不到商家编号"; } // String card_positive = ImageToBase64ByLocal(cardPositive); String card_positive = cardPositive; // String card_negative = ImageToBase64ByLocal(cardNegative); String card_negative = cardNegative; JSONObject requestData = new JSONObject(new LinkedHashMap()); requestData.put("alt_mch_no" , mch.getAltMchNo()); requestData.put("card_positive" , card_positive); requestData.put("card_negative" , card_negative); JSONObject requestJson = new JSONObject(new TreeMap()); if(staus.equals("0")){ requestJson.put("method", "altMchPics.uploadPic"); }else{ requestJson.put("method", "altMchPics.modifyPic"); } requestJson.put("version", "1.0"); requestJson.put("data", requestData); // 32位随机字符串 String uuid = UUID.randomUUID().toString().trim().replaceAll("-", ""); requestJson.put("rand_str", uuid); requestJson.put("sign_type", JoinpayConstant.sign_type_MD5); requestJson.put("mch_no", JoinpayConstant.mch_no); String sign = createMD5Sign(requestJson , JoinpayConstant.key); requestJson.put("sign", sign.toUpperCase()); // logger.info("请求参数:" + requestJson); String back=null; org.json.JSONObject jsonObject; try { jsonObject = HttpClientUtils.postJson(url, requestJson.toString()); // logger.info("响应参数:" + jsonObject); // 判断请求是否正确,受理成功 if(jsonObject.has("resp_code")){ String resp_code = jsonObject.getString("resp_code"); mch.setRespCode(resp_code); }else{ return "请求失败"; } // 处理data if(jsonObject.has("data")){ org.json.JSONObject data = jsonObject.getJSONObject("data"); String biz_code = data.getString("biz_code"); if(biz_code.equals("B100000")){ String approve_status = "审核中"; mch.setApproveStatus(approve_status); mch.setApproveNote(""); mch.setStep("1"); back = approve_status; } if(biz_code.equals("B100002")){ String approve_status = "上传失败"; String approve_note = data.getString("biz_msg"); mch.setApproveNote(approve_note); mch.setApproveStatus(approve_status); back = approve_status; } if(biz_code.equals("B101017")){ String approve_status = "上传失败"; String approve_note = data.getString("biz_msg"); mch.setApproveNote(approve_note); mch.setApproveStatus(approve_status); back = approve_status; } updateById(mch); } } catch (IOException e) { e.printStackTrace(); } return back; } /** * 传送身份证图片 * @param * @return */ @Override public String sendCardBusiness(TJoinpayMch mch, String cardPositive, String cardNegative, String tradeLicence, String openAccountLicence,String staus) { // String url = "https://www.joinpay.com/allocFunds"; String url = "https://upload.joinpay.com/allocFunds"; if(StringUtils.isEmpty(mch.getAltMchNo())){ return "找不到商家编号"; } // String card_positive = ImageToBase64ByLocal(cardPositive); String card_positive = cardPositive; // String card_negative = ImageToBase64ByLocal(cardNegative); String card_negative = cardNegative; String trade_licence = tradeLicence; String open_account_licence = openAccountLicence; JSONObject requestData = new JSONObject(new LinkedHashMap()); requestData.put("alt_mch_no" , mch.getAltMchNo()); requestData.put("card_positive" , card_positive); requestData.put("card_negative" , card_negative); requestData.put("trade_licence" , trade_licence); requestData.put("open_account_licence" , open_account_licence); JSONObject requestJson = new JSONObject(new TreeMap()); if(staus.equals("0")){ requestJson.put("method", "altMchPics.uploadPic"); // 格式为16 位随机字符串:16 位随机字符串 // String aes_key1 = getRandomString(16); // String aes_key2 = getRandomString(16); // requestJson.put("aes_key", RSAUtil.encrypt(aes_key1+":"+aes_key2 , JoinpayConstant.publickey )); }else{ requestJson.put("method", "altMchPics.modifyPic"); } requestJson.put("version", "1.0"); requestJson.put("data", requestData); // 32位随机字符串 String uuid = UUID.randomUUID().toString().trim().replaceAll("-", ""); requestJson.put("rand_str", uuid); requestJson.put("sign_type", JoinpayConstant.sign_type_MD5); requestJson.put("mch_no", JoinpayConstant.mch_no); String sign = createMD5Sign(requestJson , JoinpayConstant.key); requestJson.put("sign", sign.toUpperCase()); // logger.info("请求参数:" + requestJson); String s = requestJson.toString(); String back=null; org.json.JSONObject jsonObject; try { jsonObject = HttpClientUtils.postJson(url, requestJson.toString()); // logger.info("响应参数:" + jsonObject); // 判断请求是否正确,受理成功 if(jsonObject.has("resp_code")){ String resp_code = jsonObject.getString("resp_code"); mch.setRespCode(resp_code); }else{ return "请求失败"; } // 处理data if(jsonObject.has("data")){ org.json.JSONObject data = jsonObject.getJSONObject("data"); String biz_code = data.getString("biz_code"); if(biz_code.equals("B100000")){ String approve_status = "审核中"; mch.setApproveStatus(approve_status); mch.setApproveNote(""); back = approve_status; mch.setStep("1"); } if(biz_code.equals("B100002")){ String approve_status = "上传失败"; String approve_note = data.getString("biz_msg"); mch.setApproveNote(approve_note); mch.setApproveStatus(approve_status); back = approve_status; } if(biz_code.equals("B101017")){ String approve_status = "上传失败"; String approve_note = data.getString("biz_msg"); mch.setApproveNote(approve_note); mch.setApproveStatus(approve_status); back = approve_status; } updateById(mch); } } catch (IOException e) { e.printStackTrace(); } return back; } /** * 获取随机字符串 * @return */ public static String getRandomString(int length){ String str="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; Random random=new Random(); StringBuffer sb=new StringBuffer(); for(int i=0;i data = new ArrayList(); data.add(new BasicNameValuePair("p0_Version", JoinpayConstant.pay_version)); data.add(new BasicNameValuePair("p1_MerchantNo", JoinpayConstant.mch_no)); data.add(new BasicNameValuePair("p2_OrderNo", sn)); data.add(new BasicNameValuePair("p3_Amount", amount.setScale(2, RoundingMode.HALF_DOWN).toString())); data.add(new BasicNameValuePair("p4_Cur", JoinpayConstant.Cur_RMB)); data.add(new BasicNameValuePair("p5_ProductName", URLEncoder.encode(productName, "utf-8"))); data.add(new BasicNameValuePair("p6_ProductDesc", URLEncoder.encode(productDesc, "utf-8"))); data.add(new BasicNameValuePair("p7_Mp", URLEncoder.encode(commonParameter, "utf-8"))); data.add(new BasicNameValuePair("p8_ReturnUrl", returnUrl)); data.add(new BasicNameValuePair("p9_NotifyUrl", notifyUrl)); data.add(new BasicNameValuePair("q1_FrpCode", frpCode)); data.add(new BasicNameValuePair("q2_MerchantBankCode", "")); data.add(new BasicNameValuePair("q4_IsShowPic", isShowPic)); data.add(new BasicNameValuePair("q5_OpenId", openId)); data.add(new BasicNameValuePair("q6_AuthCode", authCode)); data.add(new BasicNameValuePair("q7_AppId", appid)); data.add(new BasicNameValuePair("q8_TerminalNo", "")); data.add(new BasicNameValuePair("q9_TransactionModel", transactionModel)); if(!StringUtils.isEmpty(tradeMerchantNo)){ data.add(new BasicNameValuePair("qa_TradeMerchantNo",tradeMerchantNo)); } // data.add(new BasicNameValuePair("qa_TradeMerchantNo", tradeMerchantNo)); data.add(new BasicNameValuePair("qb_buyerId", buyerId)); data.add(new BasicNameValuePair("qc_IsAlt", isAlt)); data.add(new BasicNameValuePair("qd_AltType", altType)); data.add(new BasicNameValuePair("qe_AltInfo", altInfo==null?null:altInfo.toString())); data.add(new BasicNameValuePair("qf_AltUrl", altUrl)); data.add(new BasicNameValuePair("qg_MarketingAmount", marketingAmount==null?null:marketingAmount.setScale(2, RoundingMode.HALF_DOWN).toString())); // TODO: 2019-04-01 空值不参与签名!!!!!!!!!!!!!!!!!! String hmac = createHmacSign(data, JoinpayConstant.key); data.add(new BasicNameValuePair("hmac", hmac)); // logger.info("请求参数:" + data); String result = HttpClientUtils.postKeyValue(url, data); // logger.info("响应参数:" + result); return result; } /** * 签名算法sign , hmac 签名 * * @param data * @return */ public static String createHmacSign( List data , String key) throws UnsupportedEncodingException { StringBuffer sb = new StringBuffer(); Iterator es = data.iterator(); while (es.hasNext()) { BasicNameValuePair entry = (BasicNameValuePair) es.next(); String k = (String) entry.getName(); String v = (String) entry.getValue(); if (null != v && !"".equals(v) && !"sign".equals(k) && !"key".equals(k)) { sb.append(URLDecoder.decode(String.valueOf(v), "utf-8")); } } sb.append(key); // logger.info("签名字符串:" + sb.toString()); String sign = DigestUtils.md5Hex(sb.toString()); return sign; } }