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;
}
}