package com.szwl.service.impl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.RandomUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.szwl.constant.JoinpayConstant;
import com.szwl.feign.bean.PayFeign;
import com.szwl.mapper.TJoinpayMchMapper;
import com.szwl.model.bo.BalanceBo;
import com.szwl.model.bo.SettlementRecordBo;
import com.szwl.model.entity.TAdmin;
import com.szwl.model.entity.THuifuMch;
import com.szwl.model.entity.TJoinpayMch;
import com.szwl.model.entity.WithdrawalRecord;
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.szwl.service.WithdrawalRecordService;
import lombok.extern.slf4j.Slf4j;
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
*/
@Slf4j
@Service
public class TJoinpayMchServiceImpl extends ServiceImpl implements TJoinpayMchService {
@Autowired
WithdrawalRecordService withdrawalRecordService;
@Autowired
PayFeign payFeign;
@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";
mch.setLoginName(login_name);
String alt_mch_name = mch.getBankAccountName();
mch.setAltMchName(alt_mch_name);
mch.setAltMchShortName("");
// 格式为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));
org.json.JSONObject jsonObject;
try {
jsonObject = HttpClientUtils.postJson(url, requestJson.toString());
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"));
}
}
/**
* 更新一下分销商户的 各种响应码 & login_name
*/
mch.setCreateDate(new Date());
mch.setModifyDate(new Date());
mch.setType("1");
if (StringUtils.isNotEmpty(mch.getAltMchNo())) {
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();
}
if (StringUtils.isNotEmpty(mch.getAltMchNo())) {
return Constant.correct_code;
} else {
return "注册失败";
}
}
@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());
if (StringUtils.isNotEmpty(mch.getApproveStatus())) {
if (!mch.getApproveStatus().equals("审核通过")) {
requestData.put("legal_person", mch.getLegalPerson());
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();
if (StringUtils.isNotEmpty(mch.getApproveStatus()) && !mch.getApproveStatus().equals("审核通过")) {
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_no", mch.getBankAccountNo());
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);
}
if (mch.getAltMerchantType() == 12) {
String alt_mch_name = mch.getBankAccountName();
}
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));
org.json.JSONObject jsonObject;
try {
jsonObject = HttpClientUtils.postJson(url, requestJson.toString());
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());
String back = null;
org.json.JSONObject jsonObject;
try {
jsonObject = HttpClientUtils.postJson(url, requestJson.toString());
// 判断请求是否正确,受理成功
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;
}
String approve_note = data.getString("biz_msg");
mch.setApproveNote(approve_note);
if (StringUtils.isEmpty(back)) {
back = approve_note;
}
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");
} 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());
String s = requestJson.toString();
String back = null;
org.json.JSONObject jsonObject;
try {
jsonObject = HttpClientUtils.postJson(url, requestJson.toString());
// 判断请求是否正确,受理成功
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;
}
@Override
public String updateApproveStatus(TJoinpayMch mch) {
String url = "https://www.joinpay.com/allocFunds";
if (StringUtils.isEmpty(mch.getAltMchNo())) {
return "找不到商家编号";
}
JSONObject requestData = new JSONObject(new LinkedHashMap());
requestData.put("alt_mch_no", mch.getAltMchNo());
JSONObject requestJson = new JSONObject(new TreeMap());
requestJson.put("method", "altMchPics.queryPicsInfo");
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());
System.out.println(jsonObject.getJSONObject("data"));
// 判断请求是否正确,受理成功
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");
String approve_status = data.getString("approve_status");
String approve_note = data.getString("approve_note");
if (biz_code.equals("B100000")) {
if (approve_status.equals("P1000")) {
mch.setApproveStatus("审核通过");
mch.setApproveNote("");
back = approve_status;
} else if (approve_status.equals("P2000")) {
mch.setApproveStatus("审核不通过");
mch.setApproveNote(approve_note);
back = approve_status;
}
}
updateById(mch);
}
} catch (IOException e) {
e.printStackTrace();
}
return back;
}
@Override
public BalanceBo getBalance(TJoinpayMch mch) {
String url = "https://www.joinpay.com/allocFunds";
BalanceBo balanceBo = new BalanceBo();
JSONObject requestData = new JSONObject(new LinkedHashMap());
requestData.put("alt_mch_no", mch.getAltMchNo());
JSONObject requestJson = new JSONObject(new TreeMap());
requestJson.put("method", "altAccount.get");
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());
org.json.JSONObject jsonObject;
try {
jsonObject = HttpClientUtils.postJson(url, requestJson.toString());
log.info("查询余额返回数据:{}", jsonObject);
// 判断请求是否正确,受理成功
if (jsonObject.has("resp_code")) {
String resp_code = jsonObject.getString("resp_code");
if (JoinpayConstant.resp_code1.equals(resp_code)) {
// 处理data
if (jsonObject.has("data")) {
org.json.JSONObject data = jsonObject.getJSONObject("data");
// 更新账户的金额
if (data.has("alt_avil_balance")) {
// 可提现金额
BigDecimal altAvilBalance = new BigDecimal(data.getString("alt_avil_balance")).divide(new BigDecimal(100));
balanceBo.setWithdrawableBalance(altAvilBalance);
if (data.has("alt_main_balance")) {
BigDecimal altMainBalance = new BigDecimal(data.getString("alt_main_balance")).divide(new BigDecimal(100));
balanceBo.setReceivableBalance(altMainBalance.subtract(altAvilBalance));
}
}
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
return balanceBo;
}
@Override
public String withdraw(TJoinpayMch mch, WithdrawalRecord withdrawalRecord) {
String url = "https://www.joinpay.com/allocFunds";
JSONObject requestData = new JSONObject(new LinkedHashMap());
//分账方编号
requestData.put("alt_mch_no", mch.getAltMchNo());
//结算金额
requestData.put("settle_amount", String.valueOf(withdrawalRecord.getAmount()));
//结算请求号
String mch_order_no = RandomUtil.randomNumbers(18);
requestData.put("mch_order_no", mch_order_no);
requestData.put("product_code", "2");
//通知地址
requestData.put("callback_url",JoinpayConstant.Jiesuan_Url);
JSONObject requestJson = new JSONObject(new TreeMap());
requestJson.put("method", "altSettle.launch");
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());
log.info("提现参数:{}", requestJson);
org.json.JSONObject jsonObject;
try {
jsonObject = HttpClientUtils.postJson(url, requestJson.toString());
log.info("提现结果:{}", jsonObject);
// 判断请求是否正确,受理成功
if(jsonObject.has("resp_code")){
String respCode = jsonObject.getString("resp_code");
if(JoinpayConstant.resp_code1.equals(respCode)){
org.json.JSONObject data = jsonObject.getJSONObject("data");
String bizCode = data.getString("biz_code");
if(JoinpayConstant.biz_code1.equals(bizCode)){
// 申请提现成功,保存记录
withdrawalRecord.setCreateDate(new Date());
withdrawalRecord.setOrderNo(mch_order_no);
withdrawalRecord.setStatus(0);
withdrawalRecordService.save(withdrawalRecord);
return bizCode;
}else{
// 提现失败
String bizMsg = data.getString("biz_msg");
return bizMsg;
}
} else {
// 受理失败
String respMsg = jsonObject.getString("resp_msg");
return respMsg;
}
}
} catch (IOException e) {
e.printStackTrace();
}
return "提现失败";
}
@Override
public List getAutoSettlement(TJoinpayMch joinpayMch, String date) {
String url = "https://www.joinpay.com/allocFunds";
JSONObject requestData = new JSONObject(new LinkedHashMap());
//分账方编号
requestData.put("alt_mch_no", joinpayMch.getAltMchNo());
//结算日期
requestData.put("settle_date", date);
JSONObject requestJson = new JSONObject(new TreeMap());
requestJson.put("method", "altSettle.getAutoSettle");
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());
List recordBos = new ArrayList<>();
org.json.JSONObject jsonObject;
try {
jsonObject = HttpClientUtils.postJson(url, requestJson.toString());
// 判断请求是否正确,受理成功
if(jsonObject.has("resp_code")){
String respCode = jsonObject.getString("resp_code");
if(JoinpayConstant.resp_code1.equals(respCode)){
org.json.JSONObject data = jsonObject.getJSONObject("data");
String bizCode = data.getString("biz_code");
if(JoinpayConstant.biz_code1.equals(bizCode)){
org.json.JSONArray recordList = data.getJSONArray("record_list");
for (int i = 0; i < recordList.length(); i++) {
org.json.JSONObject record = recordList.getJSONObject(i);
if(record.has("order_status")) {
// 结算状态
String orderStatus = record.getString("order_status");
// 结算时间
String settleDate = record.getString("settle_date");
// 结算流水号
String serialNo = record.getString("settle_trx_no");
// 银行账户
String altMchName = record.getString("alt_mch_name");
// 银行账号
String bankAccountNo = record.getString("bank_account_no");
// 结算金额
String settleAmount = record.getString("settle_amount");
// 结算描述
String bizMsg = record.getString("biz_msg");
SettlementRecordBo recordBo = new SettlementRecordBo();
if(JoinpayConstant.order_status2.equals(orderStatus)){
// 结算成功
recordBo.setAdminId(joinpayMch.getAdminId());
recordBo.setSerialNo(serialNo);
recordBo.setBankAccountNo(bankAccountNo);
recordBo.setBankAccountName(altMchName);
recordBo.setAmount(new BigDecimal(settleAmount));
recordBo.setDate(settleDate);
recordBo.setStatus(1);
} else if(JoinpayConstant.order_status3.equals(orderStatus)){
// 结算失败
recordBo.setAdminId(joinpayMch.getAdminId());
recordBo.setSerialNo(serialNo);
recordBo.setBankAccountNo(bankAccountNo);
recordBo.setBankAccountName(altMchName);
recordBo.setAmount(new BigDecimal(settleAmount));
recordBo.setDate(settleDate);
recordBo.setStatus(2);
recordBo.setFailReason(bizMsg);
} else if(JoinpayConstant.order_status4.equals(orderStatus)){
// 结算中
recordBo.setAdminId(joinpayMch.getAdminId());
recordBo.setSerialNo(serialNo);
recordBo.setBankAccountNo(bankAccountNo);
recordBo.setBankAccountName(altMchName);
recordBo.setAmount(new BigDecimal(settleAmount));
recordBo.setDate(settleDate);
recordBo.setStatus(0);
}
recordBos.add(recordBo);
}
}
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
return recordBos;
}
@Override
public void withdrawStatus(TAdmin admin, WithdrawalRecord withdrawalRecord) {
String url = "https://www.joinpay.com/allocFunds";
JSONObject requestData = new JSONObject(new LinkedHashMap());
// 结算订单号
requestData.put("mch_order_no", withdrawalRecord.getOrderNo());
JSONObject requestJson = new JSONObject(new TreeMap());
requestJson.put("method", "altSettle.get");
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());
log.info("提现参数:{}", requestJson);
org.json.JSONObject jsonObject;
try {
jsonObject = HttpClientUtils.postJson(url, requestJson.toString());
log.info("提现结果:{}", jsonObject);
// 判断请求是否正确,受理成功
if(jsonObject.has("resp_code")){
String respCode = jsonObject.getString("resp_code");
if(JoinpayConstant.resp_code1.equals(respCode)){
org.json.JSONObject data = jsonObject.getJSONObject("data");
String bizCode = data.getString("biz_code");
if(JoinpayConstant.biz_code1.equals(bizCode)){
// 申请提现成功,保存记录
String orderStatus = data.getString("order_status");
if (JoinpayConstant.order_status2.equals(orderStatus)) {
withdrawalRecord.setStatus(1);
withdrawalRecord.setArrivalDate(new Date());
} else if (JoinpayConstant.order_status3.equals(orderStatus)) {
withdrawalRecord.setStatus(2);
withdrawalRecord.setResultMsg(data.getString("biz_msg"));
}
withdrawalRecordService.updateById(withdrawalRecord);
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public String newCreateMch(TJoinpayMch joinpayMch) {
Integer altMerchantType = joinpayMch.getAltMerchantType();
String url = "https://www.joinpay.com/allocFunds";
JSONObject requestData = new JSONObject(new LinkedHashMap());
String loginName = "sunzee" + RandomUtil.randomNumbers(10) + "@mianhuatang.com";
joinpayMch.setLoginName(loginName);
String altMchName = joinpayMch.getBankAccountName();
joinpayMch.setAltMchName(altMchName);
// 格式为16 位随机字符串:16 位随机字符串
// String aeskey1 = getRandomString(16);
// String aeskey2 = getRandomString(16);
requestData.put("login_name", loginName);
requestData.put("alt_mch_name", altMchName);
requestData.put("alt_merchant_type", altMerchantType);
requestData.put("busi_contact_name", joinpayMch.getBusiContactName());
requestData.put("busi_contact_mobile_no", joinpayMch.getBusiContactMobileNo());
requestData.put("phone_no", joinpayMch.getPhoneNo());
// requestData.put("legal_person", AESUtil.encrypt(joinpayMch.getLegalPerson(), aeskey1, aeskey2));
// requestData.put("id_card_no", AESUtil.encrypt(joinpayMch.getIdCardNo(), aeskey1, aeskey2));
requestData.put("legal_person", joinpayMch.getLegalPerson());
requestData.put("id_card_no", joinpayMch.getIdCardNo());
requestData.put("id_card_expiry", joinpayMch.getIdCardExpiry());
// 企业必填:营业执照编号 / 营业执照有效期
if (JoinpayConstant.ALT_MERCHANT_TYPE_ENTERPRISE == altMerchantType) {
requestData.put("license_no", joinpayMch.getLicenseNo());
requestData.put("license_expiry", joinpayMch.getLicenseExpiry());
}
if (joinpayMch.getSettMode() != null) {
requestData.put("sett_mode", joinpayMch.getSettMode());
} else {
// 由汇聚自动结算
requestData.put("sett_mode", JoinpayConstant.SETT_MODE_ONE);
}
// 结算周期类型:自然日
requestData.put("sett_date_type", JoinpayConstant.SETT_DATE_DAY);
if (joinpayMch.getRiskDay() != null) {
requestData.put("risk_day", joinpayMch.getRiskDay());
} else {
// 结算周期:1
requestData.put("risk_day", 1);
}
if (JoinpayConstant.ALT_MERCHANT_TYPE_ENTERPRISE == altMerchantType) {
// 企业用对公账户
requestData.put("bank_account_type", JoinpayConstant.BANK_ACCOUNT_TYPE_FOUR);
requestData.put("bank_channel_no", joinpayMch.getBankChannelNo());
} else if (JoinpayConstant.ALT_MERCHANT_TYPE_PERSON == altMerchantType) {
// 个人用借记卡
requestData.put("bank_account_type", JoinpayConstant.BANK_ACCOUNT_TYPE_ONE);
}
// requestData.put("bank_account_name", AESUtil.encrypt(joinpayMch.getBankAccountName(), aeskey1, aeskey2));
// requestData.put("bank_account_no", AESUtil.encrypt(joinpayMch.getBankAccountNo(), aeskey1, aeskey2));
requestData.put("bank_account_name", joinpayMch.getBankAccountName());
requestData.put("bank_account_no", joinpayMch.getBankAccountNo());
requestData.put("notify_url", JoinpayConstant.MERCHANT_URL);
JSONObject requestJson = new JSONObject(new TreeMap());
requestJson.put("method", "altmch.create");
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());
String result = "";
try {
org.json.JSONObject jsonObject = HttpClientUtils.postJson(url, requestJson.toString());
String respCode = jsonObject.getString("resp_code");
String respMsg = jsonObject.getString("resp_msg");
joinpayMch.setRespCode(respCode);
if (JoinpayConstant.resp_code1.equals(respCode)) {
// 受理成功
if (jsonObject.has("data")) {
org.json.JSONObject data = jsonObject.getJSONObject("data");
if (data.has("biz_code")) {
joinpayMch.setBizCode(data.getString("biz_code"));
}
if (data.has("alt_mch_no")) {
joinpayMch.setAltMchNo(data.getString("alt_mch_no"));
}
if (data.has("order_status")) {
joinpayMch.setOrderStatus(data.getString("order_status"));
}
}
}
return respMsg;
/**
* 更新一下分销商户的 各种响应码 & login_name
*/
// joinpayMch.setCreateDate(new Date());
// joinpayMch.setModifyDate(new Date());
// joinpayMch.setType("1");
// if (StringUtils.isNotEmpty(joinpayMch.getAltMchNo())) {
// save(joinpayMch);
// }
//
// 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();
}
// if (StringUtils.isNotEmpty(mch.getAltMchNo())) {
// return Constant.correct_code;
// } else {
// return "注册失败";
// }
return "";
}
/**
* 获取随机字符串
*
* @return
*/
public static String getRandomString(int length) {
String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
Random random = new Random();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < length; i++) {
int number = random.nextInt(62);
sb.append(str.charAt(number));
}
return sb.toString();
}
/**
* 签名算法sign , MD5 签名
*
* @param requestJson
* @return
*/
public static String createMD5Sign(JSONObject requestJson, String key) {
StringBuffer sb = new StringBuffer();
Set es = requestJson.entrySet();
Iterator it = es.iterator();
while (it.hasNext()) {
Map.Entry entry = (Map.Entry) it.next();
String k = (String) entry.getKey();
Object v = entry.getValue();
if (null != v && !"".equals(v) && !"sign".equals(k) && !"key".equals(k)) {
sb.append(k + "=" + v + "&");
}
}
sb.append("key=" + key);
// logger.info("签名字符串:"+sb.toString());
String sign = DigestUtils.md5Hex(sb.toString());
return sign;
}
@Override
public String uniPay(String sn, BigDecimal amount, String productName, String productDesc, String commonParameter,
String returnUrl, String notifyUrl, String frpCode, String isShowPic, String openId, String authCode,
String appid, String transactionModel, String tradeMerchantNo, String buyerId, String isAlt, String altType,
JSONArray altInfo, String altUrl, BigDecimal marketingAmount) throws UnsupportedEncodingException {
String url = "https://www.joinpay.com/trade/uniPayApi.action";
List 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;
}
@Override
public String refreshMch(TJoinpayMch mch) {
String login_name = mch.getLoginName();
if (StringUtils.isEmpty(login_name)) {
return "账户不存在";
}
String url = "https://www.joinpay.com/allocFunds";
JSONObject requestData = new JSONObject(new LinkedHashMap());
// requestData.put("alt_login_name", "test1_" + mch.getAdminId() + "@mianhuatang.com");
requestData.put("alt_login_name", mch.getLoginName());
JSONObject requestJson = new JSONObject(new TreeMap());
requestJson.put("method", "altmch.query");
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);
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 (data.has("alt_main_balance")) {
mch.setAltMainBalance(new BigDecimal(data.getString("alt_main_balance")));
}
}
// 判断请求是否正确,受理成功
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 "请求失败";
}
} catch (IOException e) {
e.printStackTrace();
}
updateById(mch);
return Constant.correct_code;
}
@Override
public String refreshMyAccount(TJoinpayMch mch) {
String url = "https://www.joinpay.com/allocFunds";
if (StringUtils.isEmpty(mch.getAltMchNo())) {
return "找不到商家编号";
}
JSONObject requestData = new JSONObject(new LinkedHashMap());
requestData.put("alt_mch_no", mch.getAltMchNo());
JSONObject requestJson = new JSONObject(new TreeMap());
requestJson.put("method", "altAccount.get");
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);
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");
// 更新账户的金额
if (data.has("alt_main_balance")) {
mch.setAltMainBalance(new BigDecimal(data.getString("alt_main_balance")).divide(new BigDecimal(100)));
}
if (data.has("alt_guar_balance")) {
mch.setAltGuarBalance(new BigDecimal(data.getString("alt_guar_balance")).divide(new BigDecimal(100)));
}
if (data.has("alt_avil_balance")) {
mch.setAltAvilBalance(new BigDecimal(data.getString("alt_avil_balance")).divide(new BigDecimal(100)));
}
updateById(mch);
}
} catch (IOException e) {
e.printStackTrace();
}
return Constant.correct_code;
}
/**
* 签名算法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;
}
}