|
@@ -0,0 +1,438 @@
|
|
|
|
+package com.szwl.service.impl;
|
|
|
|
+
|
|
|
|
+import com.alibaba.fastjson.JSONArray;
|
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
|
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
|
+import com.szwl.mapper.TJoinpayMchMapper;
|
|
|
|
+import com.szwl.model.entity.TJoinpayMch;
|
|
|
|
+import com.szwl.model.utils.AESUtil;
|
|
|
|
+import com.szwl.model.utils.Constant;
|
|
|
|
+import com.szwl.model.utils.HttpClientUtils;
|
|
|
|
+import com.szwl.model.utils.JoinpayConstant;
|
|
|
|
+import com.szwl.model.utils.RSAUtil;
|
|
|
|
+import com.szwl.service.TJoinpayMchService;
|
|
|
|
+import org.apache.commons.codec.digest.DigestUtils;
|
|
|
|
+import org.apache.commons.lang.StringUtils;
|
|
|
|
+import org.apache.http.message.BasicNameValuePair;
|
|
|
|
+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.util.*;
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * <p>
|
|
|
|
+ * 汇聚支付用户收款信息表 服务实现类
|
|
|
|
+ * </p>
|
|
|
|
+ *
|
|
|
|
+ * @author wuhs
|
|
|
|
+ * @since 2022-04-29
|
|
|
|
+ */
|
|
|
|
+@Service
|
|
|
|
+public class TJoinpayMchServiceImpl extends ServiceImpl<TJoinpayMchMapper, TJoinpayMch> implements TJoinpayMchService {
|
|
|
|
+
|
|
|
|
+ @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<String, Object>());
|
|
|
|
+ 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<String, Object>());
|
|
|
|
+ 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;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 获取随机字符串
|
|
|
|
+ * @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<BasicNameValuePair> data = new ArrayList<BasicNameValuePair>();
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ 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<BasicNameValuePair> data , String key) throws UnsupportedEncodingException {
|
|
|
|
+
|
|
|
|
+ StringBuffer sb = new StringBuffer();
|
|
|
|
+ Iterator<BasicNameValuePair> 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;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+}
|