package com.mzl.flower.pay; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import java.net.URLEncoder; import java.util.Map; import java.util.TreeMap; @Slf4j public class SybPayService { /** * 封装订单信息 * @param trxamt 订单金额单位为分 * @param reqsn 商户订单号 * @param unireqsn 商户唯一订单号 * @param body 订单标题,订单描述信息,展示在收银台 * @param remark 备注 * @param notifyUrl 服务器异步通知页面路径,交易完成后,平台会将交易结果以后台通知的方式发送到该地址,商户需要以此通知判断用户订单交易是否成功。 * @return * @throws Exception */ public TreeMap createOrder(long trxamt, String reqsn, String unireqsn, String body, String remark, String notifyUrl) throws Exception{ TreeMap params = new TreeMap(); if(!SybUtil.isEmpty(SybConstants.SYB_ORGID)) params.put("orgid", SybConstants.SYB_ORGID); params.put("cusid", SybConstants.SYB_CUSID); params.put("appid", SybConstants.SYB_APPID); params.put("version", "12"); params.put("trxamt", String.valueOf(trxamt)); params.put("reqsn", reqsn); params.put("unireqsn", unireqsn); params.put("notify_url", notifyUrl); params.put("body", body); params.put("remark", remark); params.put("paytype", "W06"); params.put("randomstr", SybUtil.getValidatecode(8)); params.put("signtype", SybConstants.SIGN_TYPE); String appkey = ""; if(SybConstants.SIGN_TYPE.equals("RSA")) appkey = SybConstants.SYB_RSACUSPRIKEY; else if(SybConstants.SIGN_TYPE.equals("SM2")) appkey = SybConstants.SYB_SM2PPRIVATEKEY; else appkey = SybConstants.SYB_MD5_APPKEY; params.put("sign", SybUtil.unionSign(params,appkey,SybConstants.SIGN_TYPE)); return params; } /** * 撤销订单 * @param trxamt 原订单金额 * @param reqsn 商户的退款交易订单号 * @param oldtrxid 原交易的收银宝平台流水 * @param oldreqsn 原交易的商户交易单号 * @return * @throws Exception */ public Map cancel(long trxamt,String reqsn,String oldtrxid,String oldreqsn) throws Exception{ HttpConnectionUtil http = new HttpConnectionUtil(SybConstants.SYB_APIURL+"/tranx/cancel"); http.init(); TreeMap params = new TreeMap(); if(!SybUtil.isEmpty(SybConstants.SYB_ORGID)) params.put("orgid", SybConstants.SYB_ORGID); params.put("cusid", SybConstants.SYB_CUSID); params.put("appid", SybConstants.SYB_APPID); params.put("version", "11"); params.put("trxamt", String.valueOf(trxamt)); params.put("reqsn", reqsn); if (StringUtils.isNotBlank(oldtrxid)) { params.put("oldtrxid", oldtrxid); } if(StringUtils.isNotBlank(oldreqsn)){ params.put("oldreqsn", oldreqsn); } params.put("randomstr", SybUtil.getValidatecode(8)); params.put("signtype", SybConstants.SIGN_TYPE); String appkey = ""; if(SybConstants.SIGN_TYPE.equals("RSA")) appkey = SybConstants.SYB_RSACUSPRIKEY; else if(SybConstants.SIGN_TYPE.equals("SM2")) appkey = SybConstants.SYB_SM2PPRIVATEKEY; else appkey = SybConstants.SYB_MD5_APPKEY; params.put("sign", SybUtil.unionSign(params,appkey,SybConstants.SIGN_TYPE)); byte[] bys = http.postParams(params, true); String result = new String(bys,"UTF-8"); Map map = handleResult(result); return map; } /** * 退款 * @param trxamt 退款金额单位为分 * @param reqsn 商户的退款交易订单号 * @param oldtrxid 原交易的收银宝平台流水 * @param oldreqsn 原交易的商户订单号 * @return * @throws Exception */ public Map refund(long trxamt,String reqsn,String oldtrxid,String oldreqsn) throws Exception{ HttpConnectionUtil http = new HttpConnectionUtil(SybConstants.SYB_APIURL+"/tranx/refund"); http.init(); TreeMap params = new TreeMap(); if(!SybUtil.isEmpty(SybConstants.SYB_ORGID)) params.put("orgid", SybConstants.SYB_ORGID); params.put("cusid", SybConstants.SYB_CUSID); params.put("appid", SybConstants.SYB_APPID); params.put("version", "11"); params.put("trxamt", String.valueOf(trxamt)); params.put("reqsn", reqsn); if(StringUtils.isNotBlank(oldreqsn)){ params.put("oldreqsn", oldreqsn); } if (StringUtils.isNotBlank(oldtrxid)) { params.put("oldtrxid", oldtrxid); } params.put("randomstr", SybUtil.getValidatecode(8)); params.put("signtype", SybConstants.SIGN_TYPE); String appkey = ""; if(SybConstants.SIGN_TYPE.equals("RSA")) appkey = SybConstants.SYB_RSACUSPRIKEY; else if(SybConstants.SIGN_TYPE.equals("SM2")) appkey = SybConstants.SYB_SM2PPRIVATEKEY; else appkey = SybConstants.SYB_MD5_APPKEY; params.put("sign", SybUtil.unionSign(params,appkey,SybConstants.SIGN_TYPE)); byte[] bys = http.postParams(params, true); String result = new String(bys,"UTF-8"); Map map = handleResult(result); return map; } /** * 关闭订单 * @param oldtrxid 原通联平台交易流水 * @param oldreqsn 原商户订单号 * @return * @throws Exception */ public Map close(String oldtrxid,String oldreqsn) throws Exception{ HttpConnectionUtil http = new HttpConnectionUtil(SybConstants.SYB_APIURL+"/tranx/close"); http.init(); TreeMap params = new TreeMap(); if(!SybUtil.isEmpty(SybConstants.SYB_ORGID)) params.put("orgid", SybConstants.SYB_ORGID); params.put("cusid", SybConstants.SYB_CUSID); params.put("appid", SybConstants.SYB_APPID); params.put("version", "12"); if(StringUtils.isNotBlank(oldreqsn)){ params.put("oldreqsn", oldreqsn); } if (StringUtils.isNotBlank(oldtrxid)) { params.put("oldtrxid", oldtrxid); } params.put("randomstr", SybUtil.getValidatecode(8)); params.put("signtype", SybConstants.SIGN_TYPE); String appkey = ""; if(SybConstants.SIGN_TYPE.equals("RSA")) appkey = SybConstants.SYB_RSACUSPRIKEY; else if(SybConstants.SIGN_TYPE.equals("SM2")) appkey = SybConstants.SYB_SM2PPRIVATEKEY; else appkey = SybConstants.SYB_MD5_APPKEY; params.put("sign", SybUtil.unionSign(params,appkey,SybConstants.SIGN_TYPE)); byte[] bys = http.postParams(params, true); String result = new String(bys,"UTF-8"); Map map = handleResult(result); return map; } public Map query(String reqsn,String trxid) throws Exception{ HttpConnectionUtil http = new HttpConnectionUtil(SybConstants.SYB_APIURL+"/tranx/query"); http.init(); TreeMap params = new TreeMap(); if(!SybUtil.isEmpty(SybConstants.SYB_ORGID)) params.put("orgid", SybConstants.SYB_ORGID); params.put("cusid", SybConstants.SYB_CUSID); params.put("appid", SybConstants.SYB_APPID); params.put("version", "11"); params.put("reqsn", reqsn); if(StringUtils.isNotBlank(trxid)){ params.put("trxid", trxid); } params.put("randomstr", SybUtil.getValidatecode(8)); params.put("signtype", SybConstants.SIGN_TYPE); String appkey = ""; if(SybConstants.SIGN_TYPE.equals("RSA")) appkey = SybConstants.SYB_RSACUSPRIKEY; else if(SybConstants.SIGN_TYPE.equals("SM2")) appkey = SybConstants.SYB_SM2PPRIVATEKEY; else appkey = SybConstants.SYB_MD5_APPKEY; params.put("sign", SybUtil.unionSign(params,appkey,SybConstants.SIGN_TYPE)); byte[] bys = http.postParams(params, true); String result = new String(bys,"UTF-8"); Map map = handleResult(result); return map; } public static Map handleResult(String result) throws Exception{ log.info("通联支付返回结果:"+result); Map map = SybUtil.json2Obj(result, Map.class); if(map == null){ throw new Exception("返回数据错误"); } if("SUCCESS".equals(map.get("retcode"))){ TreeMap tmap = new TreeMap(); tmap.putAll(map); String appkey = ""; if(SybConstants.SIGN_TYPE.equals("RSA")) appkey = SybConstants.SYB_RSATLPUBKEY; else if(SybConstants.SIGN_TYPE.equals("SM2")) appkey = SybConstants.SYB_SM2TLPUBKEY; else appkey = SybConstants.SYB_MD5_APPKEY; if(SybUtil.validSign(tmap, appkey, SybConstants.SIGN_TYPE)){ System.out.println("签名成功"); return map; }else{ throw new Exception("验证签名失败"); } }else{ throw new Exception(map.get("retmsg").toString()); } } }