YqPayUtil.java 3.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package com.ym.mec.thirdparty.yqpay;
  2. import com.alibaba.fastjson.JSON;
  3. import java.math.BigDecimal;
  4. import java.util.*;
  5. public class YqPayUtil {
  6. private static final String merNo = "0021677"; //商户号
  7. private static final String version = "1.1";
  8. private static final String signType = "CFCA";
  9. private static final String payUrl = "https://qyfapi.95epay.com/api/api/hPay/toPayHtml";//支付提交地址
  10. private static final String payChannels = "{\"weChatPay\":true,\"weChatPayMobile\":false,\"aliPay\":true,\"fastpayXy\":true,\"aliPayMobile\":false,\"balancePay\":false}";//支付方式配置
  11. private static Map<String, Object> getRequestMap(String notifyUrl, Map<String, Object> resultMap) throws Exception {
  12. Map<String, Object> rqMap = new LinkedHashMap<>();
  13. rqMap.put("merNo", merNo);
  14. rqMap.put("version", version);
  15. rqMap.put("notifyUrl", notifyUrl);
  16. rqMap.put("timestamp", DateUtils.getDateTime());
  17. rqMap.put("apiContent", JSON.toJSONString(resultMap));
  18. rqMap.put("signType", signType);
  19. String beforeSignedData = CFCARAUtil.joinMapValue(rqMap, '&');
  20. String sign = CFCARAUtil.signMessageByP1(beforeSignedData, "config/certificate/yqpay.pfx", "aaa123123");
  21. rqMap.put("sign", sign);
  22. return rqMap;
  23. }
  24. /**
  25. * 获取支付Map
  26. *
  27. * @param amount
  28. * @param orderNo
  29. * @param notifyUrl
  30. * @param returnUrl
  31. * @param orderSubject
  32. * @param orderBody
  33. * @param routingMerNo
  34. * @return
  35. * @throws Exception
  36. */
  37. public static Map<String, Object> getPayMap(BigDecimal amount, String orderNo, String notifyUrl, String returnUrl, String orderSubject, String orderBody, String routingMerNo) throws Exception {
  38. List<Map> tempRoutingList = new ArrayList();
  39. Map<String, Object> routingList = new HashMap<>();
  40. routingList.put("routingMerNo", routingMerNo);//分佣账户
  41. routingList.put("routingFee", amount.subtract((amount.multiply(new BigDecimal(0.28)).divide(new BigDecimal(100))).setScale(2, BigDecimal.ROUND_HALF_UP))); //分佣金额
  42. tempRoutingList.add(routingList);
  43. Map<String, Object> contentMap = new LinkedHashMap<>();
  44. contentMap.put("sellerNo", merNo); //收款商户号
  45. contentMap.put("payChannels", payChannels); //支付方式
  46. contentMap.put("orderBody", orderBody); //订单信息
  47. contentMap.put("payAmount", amount); //支付金额
  48. contentMap.put("apiPayType", "1"); //*API支付类型1-即时支付,2-担保支付,3-预授权支付*/
  49. contentMap.put("tradeType", "0"); //*交易类型1—充值,0—收款*
  50. contentMap.put("merMerOrderNo", orderNo); //商户订单号
  51. contentMap.put("orderSubject", orderSubject); //订单标题
  52. contentMap.put("returnUrl", returnUrl); //前台页面地址
  53. if (routingMerNo != null && !routingMerNo.isEmpty()) {
  54. contentMap.put("tempRoutingList", JSON.toJSONString(tempRoutingList));//分账设置
  55. }
  56. Map<String, Object> payMap = getRequestMap(notifyUrl, contentMap);
  57. payMap.put("host", payUrl);
  58. return payMap;
  59. }
  60. /**
  61. * 验签
  62. *
  63. * @param rsMap
  64. * @return
  65. */
  66. public static boolean verify(Map<String, Object> rsMap) {
  67. String sign = (String) rsMap.get("sign");
  68. rsMap.remove("sign");
  69. String beforeSignedData = CFCARAUtil.joinMapValue(rsMap, '&');
  70. try {
  71. return CFCARAUtil.verifyMessageByP1(beforeSignedData, sign, "/config/certificate/sq_formal_sign.cer");
  72. } catch (Exception e) {
  73. return false;
  74. }
  75. }
  76. }