PinganUtil.java 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. package com.kmall.common.utils.pingan;
  2. import com.kmall.common.utils.DateUtils;
  3. import com.kmall.common.utils.MapUtils;
  4. import com.kmall.common.utils.StringUtils;
  5. import com.kmall.common.utils.pingan.dto.PinganPayOrderDto;
  6. import com.kmall.common.utils.pingan.dto.PinganResponseDto;
  7. import com.kmall.common.utils.pingan.properties.PinganPayPropertiesBuilder;
  8. import com.kmall.common.utils.pingan.utils.InterfaceParams;
  9. import com.kmall.common.utils.pingan.utils.TLinx2Util;
  10. import com.kmall.common.utils.pingan.utils.TLinxAESCoder;
  11. import com.kmall.common.utils.pingan.utils.TLinxSHA1;
  12. import com.kmall.common.utils.wechat.WechatRefundQueryResult;
  13. import net.sf.json.JSONObject;
  14. import org.apache.log4j.Logger;
  15. import java.util.Date;
  16. import java.util.TreeMap;
  17. public class PinganUtil {
  18. private static final String SUCCESS_CODE = "0";
  19. private static Logger logger = Logger.getLogger(PinganUtil.class);
  20. /**
  21. * 构建平安支付订单信息
  22. */
  23. public static PinganPayOrderDto buildPayOrderDto(JSONObject dataObject) {
  24. PinganPayOrderDto payorder = new PinganPayOrderDto();
  25. payorder.setOutNo(MapUtils.getString("out_no", dataObject).equals("null") ? null : MapUtils.getString("out_no", dataObject));
  26. payorder.setPmtName(MapUtils.getString("pmt_name", dataObject).equals("null") ? null : MapUtils.getString("pmt_name", dataObject));
  27. payorder.setPmtTag(MapUtils.getString("pmt_tag", dataObject).equals("null") ? null : MapUtils.getString("pmt_tag", dataObject));
  28. payorder.setOrdMctId(MapUtils.getInteger("ord_mct_id", dataObject));
  29. payorder.setOrdShopId(MapUtils.getInteger("ord_shop_id", dataObject));
  30. payorder.setOrdCurrency(MapUtils.getString("ord_currency", dataObject).equals("null") ? null : MapUtils.getString("ord_currency", dataObject));
  31. payorder.setCurrencySign(MapUtils.getString("currency_sign", dataObject).equals("null") ? null : MapUtils.getString("currency_sign", dataObject));
  32. payorder.setOrdNo(MapUtils.getString("ord_no", dataObject).equals("null") ? null : MapUtils.getString("ord_no", dataObject));
  33. payorder.setOrdType(MapUtils.getInteger("ord_type", dataObject));
  34. payorder.setOriginalAmount(MapUtils.getInteger("original_amount", dataObject));
  35. payorder.setDiscountAmount(MapUtils.getInteger("discount_amount", dataObject));
  36. payorder.setIgnoreAmount(MapUtils.getInteger("ignore_amount", dataObject));
  37. payorder.setTradeAccount(MapUtils.getString("trade_account", dataObject).equals("null") ? null : MapUtils.getString("trade_account", dataObject));
  38. payorder.setTradeNo(MapUtils.getString("trade_no", dataObject).equals("null") ? null : MapUtils.getString("trade_no", dataObject));
  39. payorder.setTradeAmount(MapUtils.getInteger("trade_amount", dataObject));
  40. payorder.setTradeQrcode(MapUtils.getString("trade_qrcode", dataObject).equals("null") ? null : MapUtils.getString("trade_qrcode", dataObject));
  41. payorder.setAmount(MapUtils.getString("amount", dataObject).equals("null") ? null : MapUtils.getString("amount", dataObject));
  42. payorder.setTradeTime(MapUtils.getString("trade_time", dataObject) == null || MapUtils.getString("trade_time", dataObject).equals("null") ? null : DateUtils.strToDate(MapUtils.getString("trade_time", dataObject)));
  43. payorder.setTradePayTime(MapUtils.getString("trade_pay_time", dataObject) == null || MapUtils.getString("trade_pay_time", dataObject).equals("null") ? null : DateUtils.strToDate(MapUtils.getString("trade_pay_time", dataObject)));
  44. payorder.setPayTime(MapUtils.getString("pay_time", dataObject).equals("null") ? null : MapUtils.getString("pay_time", dataObject));
  45. payorder.setStatus(MapUtils.getInteger("status", dataObject));
  46. payorder.setTradeResult(MapUtils.getString("trade_result", dataObject).equals("null") ? null : MapUtils.getString("trade_result", dataObject));
  47. payorder.setJsapiPayUrl(MapUtils.getString("jsapi_pay_url", dataObject).equals("null") ? null : MapUtils.getString("jsapi_pay_url", dataObject));
  48. payorder.setJsapiPayUrl(MapUtils.getString("rand_str", dataObject).equals("null") ? null : MapUtils.getString("rand_str", dataObject));
  49. payorder.setAppid(MapUtils.getString("appId", dataObject).equals("null") ? null : MapUtils.getString("appId", dataObject));
  50. payorder.setNoncestr(MapUtils.getString("nonceStr", dataObject).equals("null") ? null : MapUtils.getString("nonceStr", dataObject));
  51. payorder.setSigntype(MapUtils.getString("signType", dataObject).equals("null") ? null : MapUtils.getString("signType", dataObject));
  52. payorder.setPrepayId(MapUtils.getString("package", dataObject).equals("null") ? null : MapUtils.getString("package", dataObject));
  53. payorder.setPaysign(MapUtils.getString("paySign", dataObject).equals("null") ? null : MapUtils.getString("paySign", dataObject));
  54. return payorder;
  55. }
  56. public static WechatRefundQueryResult buildWechatRefundQueryResult(JSONObject tradeResult, int count) {
  57. WechatRefundQueryResult refundQueryResult = new WechatRefundQueryResult();
  58. refundQueryResult.setOut_refund_no(MapUtils.getString("out_refund_no_" + (count), tradeResult).equals("null") ? null : MapUtils.getString("out_refund_no_" + (count), tradeResult));
  59. refundQueryResult.setRefund_account(MapUtils.getString("refund_account_" + (count), tradeResult).equals("null") ? null : MapUtils.getString("refund_account_" + (count), tradeResult));
  60. refundQueryResult.setRefund_channel(MapUtils.getString("refund_channel_" + (count), tradeResult).equals("null") ? null : MapUtils.getString("refund_channel_" + (count), tradeResult));
  61. refundQueryResult.setRefund_fee(MapUtils.getString("refund_fee_" + (count), tradeResult).equals("null") ? null : MapUtils.getString("refund_fee_" + (count), tradeResult));
  62. refundQueryResult.setRefund_id(MapUtils.getString("refund_id_" + (count), tradeResult).equals("null") ? null : MapUtils.getString("refund_id_" + (count), tradeResult));
  63. refundQueryResult.setRefund_recv_accout(MapUtils.getString("refund_recv_accout_" + (count), tradeResult).equals("null") ? null : MapUtils.getString("refund_recv_accout_" + (count), tradeResult));
  64. refundQueryResult.setRefund_status(MapUtils.getString("refund_status_" + (count), tradeResult).equals("null") ? null : MapUtils.getString("refund_status_" + (count), tradeResult));
  65. refundQueryResult.setRefund_success_time(MapUtils.getString("refund_success_time_" + (count), tradeResult).equals("null") ? null : MapUtils.getString("refund_success_time_" + (count), tradeResult));
  66. return refundQueryResult;
  67. }
  68. /**
  69. * 平安订单退款接口
  70. */
  71. public static PinganResponseDto pinganPayRefund(String outNo, String refundOutNo, Integer refundAmount, String tradeNo) {
  72. // 初始化参数
  73. String timestamp = new Date().getTime() / 1000 + ""; // 时间
  74. PinganResponseDto response = null;
  75. try {
  76. // 固定参数
  77. TreeMap<String, String> postmap = new TreeMap<String, String>(); // 请求参数的map
  78. postmap.put("open_id", PinganPayPropertiesBuilder.instance().getPayOpenId());
  79. postmap.put("timestamp", timestamp);
  80. TreeMap<String, String> datamap = new TreeMap<String, String>(); // data参数的map
  81. datamap.put("out_no", outNo);
  82. datamap.put("refund_out_no", refundOutNo);
  83. datamap.put("refund_amount", refundAmount + "");
  84. datamap.put("trade_no", tradeNo);
  85. datamap.put("shop_pass", TLinxSHA1.SHA1("123456"));
  86. TLinx2Util.handleEncrypt(datamap, postmap);
  87. postmap.put("sign_type", "RSA");
  88. TLinx2Util.handleSignRSA(postmap);
  89. String rspStr = TLinx2Util.handlePost(postmap, InterfaceParams.PAYREFUND);
  90. System.out.println("返回字符串=" + rspStr);
  91. JSONObject respObject = JSONObject.fromObject(rspStr);
  92. logger.info("返回错误码:【" + MapUtils.getString("errcode", respObject) + "】");
  93. logger.info("返回错误提示【" + MapUtils.getString("msg", respObject) + "】");
  94. logger.info("平安支付下单返回数据:【" + MapUtils.getString("data", respObject) + "】");
  95. logger.info("接口签名【" + MapUtils.getString("sign", respObject) + "】");
  96. response = new PinganResponseDto();
  97. response.setErrcode(MapUtils.getString("errcode", respObject));
  98. response.setMsg(MapUtils.getString("msg", respObject));
  99. response.setData(MapUtils.getString("data", respObject));
  100. response.setSign(MapUtils.getString("sign", respObject));
  101. if (StringUtils.isNotEmpty(MapUtils.getString("timestamp", respObject))) {
  102. Long tstm = Long.parseLong(MapUtils.getString("timestamp", respObject)) * 1000;
  103. response.setTimestamp(new Date(tstm));
  104. }
  105. response.setReqInterface(InterfaceParams.PAYREFUND);
  106. if (SUCCESS_CODE.equals(MapUtils.getString("errcode", respObject))) {
  107. Object dataStr = MapUtils.getString("data", respObject);
  108. if (!rspStr.isEmpty() && (dataStr != null)) {
  109. if (TLinx2Util.verifySign(respObject)) { // 验签成功
  110. String respData = TLinxAESCoder.decrypt(dataStr.toString(), PinganPayPropertiesBuilder.instance().getPayOpenKey());
  111. System.out.println("==================响应data内容:" + respData);
  112. response.setDatajson(respData);
  113. } else {
  114. System.out.println("=====验签失败=====");
  115. }
  116. } else {
  117. System.out.println("=====没有返回data数据=====");
  118. }
  119. }
  120. } catch (Exception e) {
  121. e.printStackTrace();
  122. }
  123. return response;
  124. }
  125. /**
  126. * 平安订单取消接口
  127. * 1、接口适用于所有等待支付的订单。
  128. * 2、已成功支付的只支持“微信刷卡”类型的订单取消。
  129. * 3、仅当日订单可以触发,已支付订单按支付完成时间,未支付订单按订单下单时间。
  130. * 4、下单后,系统会在12分钟后自动取消未支付订单,调用本接口前请先查询订单状态。
  131. */
  132. public static PinganResponseDto pinganPayCancel(String ordNo, String outNo) {
  133. // 初始化参数
  134. String timestamp = new Date().getTime() / 1000 + ""; // 时间
  135. PinganResponseDto response = null;
  136. try {
  137. // 固定参数
  138. TreeMap<String, String> postmap = new TreeMap<String, String>(); // 请求参数的map
  139. postmap.put("open_id", PinganPayPropertiesBuilder.instance().getPayOpenId());
  140. postmap.put("timestamp", timestamp);
  141. TreeMap<String, String> datamap = new TreeMap<String, String>(); // data参数的map
  142. datamap.put("out_no", outNo);
  143. datamap.put("ord_no", ordNo);
  144. TLinx2Util.handleEncrypt(datamap, postmap);
  145. //签名方式
  146. postmap.put("sign_type", "RSA");
  147. System.out.println("postmap---:" + postmap);
  148. TLinx2Util.handleSignRSA(postmap);
  149. String rspStr = TLinx2Util.handlePost(postmap, InterfaceParams.PAYCANCEL);
  150. System.out.println("返回字符串=" + new String(rspStr.getBytes("UTF-8")));
  151. JSONObject respObject = JSONObject.fromObject(rspStr);
  152. logger.info("返回错误码:【" + MapUtils.getString("errcode", respObject) + "】");
  153. logger.info("返回错误提示【" + MapUtils.getString("msg", respObject) + "】");
  154. logger.info("平安支付下单返回数据:【" + MapUtils.getString("data", respObject) + "】");
  155. logger.info("接口签名【" + MapUtils.getString("sign", respObject) + "】");
  156. response = new PinganResponseDto();
  157. response.setErrcode(MapUtils.getString("errcode", respObject));
  158. response.setMsg(MapUtils.getString("msg", respObject));
  159. response.setData(MapUtils.getString("data", respObject));
  160. response.setSign(MapUtils.getString("sign", respObject));
  161. if (StringUtils.isNotEmpty(MapUtils.getString("timestamp", respObject))) {
  162. Long tstm = Long.parseLong(MapUtils.getString("timestamp", respObject)) * 1000;
  163. response.setTimestamp(new Date(tstm));
  164. }
  165. response.setReqInterface(InterfaceParams.PAYCANCEL);
  166. if (SUCCESS_CODE.equals(MapUtils.getString("errcode", respObject))) {
  167. Object dataStr = MapUtils.getString("data", respObject);
  168. if (!rspStr.isEmpty() || (dataStr != null)) {
  169. if (TLinx2Util.verifySign(respObject)) { // 验签成功
  170. String respData = TLinxAESCoder.decrypt(dataStr.toString(), PinganPayPropertiesBuilder.instance().getPayOpenKey());
  171. System.out.println("==================响应data内容:" + respData);
  172. response.setDatajson(respData);
  173. } else {
  174. System.out.println("=====验签失败=====");
  175. }
  176. } else {
  177. System.out.println("=====没有返回data数据=====");
  178. }
  179. }
  180. } catch (Exception e) {
  181. e.printStackTrace();
  182. }
  183. return response;
  184. }
  185. /**
  186. * 平安查询付款状态
  187. */
  188. public static PinganResponseDto pinganPaystatus(String outNo) {
  189. // 初始化参数
  190. String timestamp = new Date().getTime() / 1000 + ""; // 时间
  191. PinganResponseDto response = null;
  192. try {
  193. // 固定参数
  194. TreeMap<String, String> postmap = new TreeMap<String, String>(); // 请求参数的map
  195. postmap.put("open_id", PinganPayPropertiesBuilder.instance().getPayOpenId());
  196. postmap.put("timestamp", timestamp);
  197. TreeMap<String, String> datamap = new TreeMap<String, String>(); // data参数的map
  198. datamap.put("out_no", outNo);
  199. TLinx2Util.handleEncrypt(datamap, postmap);
  200. TLinx2Util.handleSign(postmap);
  201. String rspStr = TLinx2Util.handlePost(postmap, InterfaceParams.QUERYPAYSTATUS);
  202. System.out.println("返回字符串=" + rspStr);
  203. JSONObject respObject = JSONObject.fromObject(rspStr);
  204. logger.info("返回错误码:【" + MapUtils.getString("errcode", respObject) + "】");
  205. logger.info("返回错误提示【" + MapUtils.getString("msg", respObject) + "】");
  206. logger.info("平安支付下单返回数据:【" + MapUtils.getString("data", respObject) + "】");
  207. logger.info("接口签名【" + MapUtils.getString("sign", respObject) + "】");
  208. response = new PinganResponseDto();
  209. response.setErrcode(MapUtils.getString("errcode", respObject));
  210. response.setMsg(MapUtils.getString("msg", respObject));
  211. response.setData(MapUtils.getString("data", respObject));
  212. response.setSign(MapUtils.getString("sign", respObject));
  213. if (StringUtils.isNotEmpty(MapUtils.getString("timestamp", respObject))) {
  214. Long tstm = Long.parseLong(MapUtils.getString("timestamp", respObject)) * 1000;
  215. response.setTimestamp(new Date(tstm));
  216. }
  217. response.setReqInterface(InterfaceParams.QUERYPAYSTATUS);
  218. if (SUCCESS_CODE.equals(MapUtils.getString("errcode", respObject))) {
  219. Object dataStr = MapUtils.getString("data", respObject);
  220. if (!rspStr.isEmpty() || (dataStr != null)) {
  221. if (TLinx2Util.verifySign(respObject)) { // 验签成功
  222. String respData = TLinxAESCoder.decrypt(dataStr.toString(), PinganPayPropertiesBuilder.instance().getPayOpenKey());
  223. System.out.println("==================响应data内容:" + respData);
  224. response.setDatajson(respData);
  225. } else {
  226. System.out.println("=====验签失败=====");
  227. }
  228. } else {
  229. System.out.println("=====没有返回data数据=====");
  230. }
  231. }
  232. } catch (Exception e) {
  233. e.printStackTrace();
  234. }
  235. return response;
  236. }
  237. /**
  238. * 平安订单退款查询
  239. */
  240. public static PinganResponseDto pinganQueryRefund(String refund_out_no, String refund_ord_no) {
  241. // 初始化参数
  242. String timestamp = new Date().getTime() / 1000 + ""; // 时间
  243. PinganResponseDto response = null;
  244. try {
  245. // 固定参数
  246. TreeMap<String, String> postmap = new TreeMap<String, String>(); // 请求参数的map
  247. postmap.put("open_id", PinganPayPropertiesBuilder.instance().getPayOpenId());
  248. postmap.put("timestamp", timestamp);
  249. TreeMap<String, String> datamap = new TreeMap<String, String>(); // data参数的map
  250. datamap.put("refund_out_no", refund_out_no);
  251. datamap.put("refund_ord_no", refund_ord_no);
  252. TLinx2Util.handleEncrypt(datamap, postmap);
  253. TLinx2Util.handleSign(postmap);
  254. String rspStr = TLinx2Util.handlePost(postmap, InterfaceParams.QUERYPAYREFUND);
  255. System.out.println("返回字符串=" + rspStr);
  256. JSONObject respObject = JSONObject.fromObject(rspStr);
  257. logger.info("返回错误码:【" + MapUtils.getString("errcode", respObject) + "】");
  258. logger.info("返回错误提示【" + MapUtils.getString("msg", respObject) + "】");
  259. logger.info("平安支付下单返回数据:【" + MapUtils.getString("data", respObject) + "】");
  260. logger.info("接口签名【" + MapUtils.getString("sign", respObject) + "】");
  261. response = new PinganResponseDto();
  262. response.setErrcode(MapUtils.getString("errcode", respObject));
  263. response.setMsg(MapUtils.getString("msg", respObject));
  264. response.setData(MapUtils.getString("data", respObject));
  265. response.setSign(MapUtils.getString("sign", respObject));
  266. if (StringUtils.isNotEmpty(MapUtils.getString("timestamp", respObject))) {
  267. Long tstm = Long.parseLong(MapUtils.getString("timestamp", respObject)) * 1000;
  268. response.setTimestamp(new Date(tstm));
  269. }
  270. response.setReqInterface(InterfaceParams.QUERYPAYREFUND);
  271. if (SUCCESS_CODE.equals(MapUtils.getString("errcode", respObject))) {
  272. Object dataStr = MapUtils.getString("data", respObject);
  273. if (!rspStr.isEmpty() && (dataStr != null)) {
  274. if (TLinx2Util.verifySign(respObject)) { // 验签成功
  275. String respData = TLinxAESCoder.decrypt(dataStr.toString(), PinganPayPropertiesBuilder.instance().getPayOpenKey());
  276. System.out.println("==================响应data内容:" + respData);
  277. response.setDatajson(respData);
  278. } else {
  279. System.out.println("=====验签失败=====");
  280. }
  281. } else {
  282. System.out.println("=====没有返回data数据=====");
  283. }
  284. }
  285. } catch (Exception e) {
  286. e.printStackTrace();
  287. }
  288. return response;
  289. }
  290. }