QrCodeIcbcPaymentAdapt.java.txt 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. package com.java110.acct.smo.impl;
  2. import com.icbc.api.IcbcApiException;
  3. import com.icbc.api.DefaultIcbcClient;
  4. import com.icbc.api.IcbcConstants;
  5. import com.icbc.api.request.MybankPayQrcodeScannedPayRequestV5;
  6. import com.icbc.api.request.MybankPayQrcodeScannedPayRequestV5.MybankPayQrcodeScannedPayRequestV5Biz;
  7. import com.icbc.api.request.MybankPayQrcodeScannedPaystatusRequestV4;
  8. import com.icbc.api.response.MybankPayQrcodeScannedPaystatusResponseV4;
  9. import com.icbc.api.response.MybankQrcodeScannedPayResponseV5;
  10. import com.java110.acct.smo.IQrCodePaymentSMO;
  11. import com.java110.core.client.RestTemplate;
  12. import com.java110.core.factory.CommunitySettingFactory;
  13. import com.java110.core.log.LoggerFactory;
  14. import com.java110.dto.smallWeChat.SmallWeChatDto;
  15. import com.java110.intf.store.ISmallWeChatInnerServiceSMO;
  16. import com.java110.utils.cache.MappingCache;
  17. import com.java110.utils.constant.WechatConstant;
  18. import com.java110.utils.util.DateUtil;
  19. import com.java110.utils.util.PayUtil;
  20. import com.java110.vo.ResultVo;
  21. import org.slf4j.Logger;
  22. import org.springframework.beans.factory.annotation.Autowired;
  23. import org.springframework.stereotype.Service;
  24. import java.util.*;
  25. /**
  26. * 工商银行支付
  27. */
  28. @Service
  29. public class QrCodeIcbcPaymentAdapt implements IQrCodePaymentSMO {
  30. private static Logger logger = LoggerFactory.getLogger(QrCodeIcbcPaymentAdapt.class);
  31. //微信支付
  32. public static final String DOMAIN_WECHAT_PAY = "WECHAT_PAY";
  33. // 微信服务商支付开关
  34. public static final String WECHAT_SERVICE_PAY_SWITCH = "WECHAT_SERVICE_PAY_SWITCH";
  35. //开关ON打开
  36. public static final String WECHAT_SERVICE_PAY_SWITCH_ON = "ON";
  37. private static final String WECHAT_SERVICE_APP_ID = "SERVICE_APP_ID";
  38. private static final String WECHAT_SERVICE_MCH_ID = "SERVICE_MCH_ID";
  39. public static final String PAY_UNIFIED_ORDER_URL = "https://api.plutuspay.com/open/v2/pay";
  40. @Autowired
  41. private ISmallWeChatInnerServiceSMO smallWeChatInnerServiceSMOImpl;
  42. @Autowired
  43. private RestTemplate outRestTemplate;
  44. @Override
  45. public ResultVo pay(String communityId, String orderNum, double money, String authCode, String feeName) throws Exception {
  46. logger.info("【工商银行支付】 统一下单开始, 订单编号=" + orderNum);
  47. SortedMap<String, String> resultMap = new TreeMap<String, String>();
  48. //生成支付金额,开发环境处理支付金额数到0.01、0.02、0.03元
  49. double payAmount = PayUtil.getPayAmountByEnv(MappingCache.getValue("HC_ENV"), money);
  50. //添加或更新支付记录(参数跟进自己业务需求添加)
  51. String systemName = MappingCache.getValue(WechatConstant.WECHAT_DOMAIN, WechatConstant.PAY_GOOD_NAME);
  52. String privateKey = CommunitySettingFactory.getRemark(communityId, "ICBC_PRIVATE_KEY");
  53. String apiPublicKey = CommunitySettingFactory.getRemark(communityId, "ICBC_PUBLIC_KEY");
  54. String merId = CommunitySettingFactory.getValue(communityId, "ICBC_MER_ID");
  55. String merPrtclNo = CommunitySettingFactory.getValue(communityId, "ICBC_MER_PRTCL_NO");
  56. String deciveInfo = CommunitySettingFactory.getValue(communityId, "ICBC_DECIVE_INFO");
  57. String appName = CommunitySettingFactory.getValue(communityId, "ICBC_APP_NAME");
  58. String icbcAppId = CommunitySettingFactory.getValue(communityId, "ICBC_APP_ID");
  59. //签名类型为RSA2时,需传入appid,私钥和网关公钥,签名类型使用定值IcbcConstants.SIGN_TYPE_RSA2,其他参数使用缺省值
  60. DefaultIcbcClient client = new DefaultIcbcClient(icbcAppId, IcbcConstants.SIGN_TYPE_RSA, privateKey, apiPublicKey);
  61. MybankPayQrcodeScannedPayRequestV5 request = new MybankPayQrcodeScannedPayRequestV5();
  62. //4、根据测试环境和生产环境替换相应ip和端口
  63. request.setServiceUrl("https://gw.open.icbc.com.cn/api/mybank/pay/qrcode/scanned/pay/V5");
  64. //5、请对照接口文档用bizContent.setxxx()方法对业务上送数据进行赋值
  65. MybankPayQrcodeScannedPayRequestV5Biz bizContent = new MybankPayQrcodeScannedPayRequestV5Biz();
  66. bizContent.setMerId(merId); //商户编号
  67. bizContent.setQrCode(authCode); //付款码
  68. bizContent.setOutTradeNo(orderNum); //外部订单号
  69. bizContent.setTradeDate(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_H)); //交易日期 格式:YYYYMMDD
  70. bizContent.setTradeTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_N)); //交易时间hhmmss
  71. //bizContent.setAttach("1231"); //商户附加信息
  72. bizContent.setOrderAmt(payAmount + ""); //交易金额
  73. //bizContent.setSubAppId("wxfb72f1a7d061d631"); //子商户应用号
  74. //bizContent.setGoodsTag("DP"); //优惠标志
  75. // JSONArray goodsDetailArray = new JSONArray();
  76. // JSONObject gd1 = new JSONObject();
  77. // gd1.put("goods_id", "123456");
  78. // gd1.put("goods_name", "FOOD");
  79. // gd1.put("quantity", 1);
  80. // gd1.put("price", 100);
  81. // goodsDetailArray.add(gd1);
  82. // bizContent.setGoodsDetail(goodsDetailArray);
  83. // bizContent.setSubject("订单标题,128字节长度"); //订单标题,128字节长度
  84. HashMap<String, Object> terminalInfo = new HashMap<>();
  85. terminalInfo.put("device_type", "10");
  86. terminalInfo.put("device_id", deciveInfo);//| device_id | str | true | 15 | 终端设备号: 收单机构为商户终端分配的唯一编号。 | Sxxxxxx |
  87. bizContent.setTerminalInfo(terminalInfo);
  88. request.setBizContent(bizContent);
  89. MybankQrcodeScannedPayResponseV5 response;
  90. try {
  91. response = client.execute(request, System.currentTimeMillis() + "");//msgId消息通讯唯一编号,要求每次调用独立生成,APP级唯一
  92. if (response.getReturnCode() == 0) {
  93. // 6、业务成功处理,请根据接口文档用response.getxxx()获取同步返回的业务数据
  94. return new ResultVo(ResultVo.CODE_OK, "成功");
  95. } else {
  96. // 失败
  97. //System.out.println("ReturnCode:"+response.getReturnCode());
  98. //System.out.println("ReturnMsg:"+response.getReturnMsg());
  99. return new ResultVo(ResultVo.CODE_ERROR, response.getReturnMsg());
  100. }
  101. } catch (IcbcApiException e) {
  102. e.printStackTrace();
  103. }
  104. return new ResultVo(ResultVo.CODE_ERROR, "未知异常");
  105. }
  106. public ResultVo checkPayFinish(String communityId, String orderNum) {
  107. SmallWeChatDto shopSmallWeChatDto = null;
  108. Map<String, String> result = null;
  109. String privateKey = CommunitySettingFactory.getRemark(communityId, "ICBC_PRIVATE_KEY");
  110. String apiPublicKey = CommunitySettingFactory.getRemark(communityId, "ICBC_PUBLIC_KEY");
  111. String merId = CommunitySettingFactory.getValue(communityId, "ICBC_MER_ID");
  112. String merPrtclNo = CommunitySettingFactory.getValue(communityId, "ICBC_MER_PRTCL_NO");
  113. String deciveInfo = CommunitySettingFactory.getValue(communityId, "ICBC_DECIVE_INFO");
  114. String appName = CommunitySettingFactory.getValue(communityId, "ICBC_APP_NAME");
  115. String icbcAppId = CommunitySettingFactory.getValue(communityId, "ICBC_APP_ID");
  116. //签名类型为RSA2时,需传入appid,私钥和网关公钥,签名类型使用定值IcbcConstants.SIGN_TYPE_RSA2,其他参数使用缺省值
  117. DefaultIcbcClient client = new DefaultIcbcClient(icbcAppId, IcbcConstants.SIGN_TYPE_RSA, privateKey, apiPublicKey);
  118. MybankPayQrcodeScannedPaystatusRequestV4 request = new MybankPayQrcodeScannedPaystatusRequestV4();
  119. //4、根据测试环境和生产环境替换相应ip和端口
  120. request.setServiceUrl("https://gw.open.icbc.com.cn/api/mybank/pay/qrcode/scanned/paystatus/V4");
  121. //5、请对照接口文档用bizContent.setxxx()方法对业务上送数据进行赋值
  122. MybankPayQrcodeScannedPaystatusRequestV4.MybankPayQrcodeScannedPaystatusRequestV4Biz
  123. bizContent = new MybankPayQrcodeScannedPaystatusRequestV4.MybankPayQrcodeScannedPaystatusRequestV4Biz();
  124. bizContent.setMerId(merId); //商户编号
  125. bizContent.setOutTradeNo(orderNum); //外部订单号
  126. bizContent.setTradeDate(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_H)); //交易日期 格式:YYYYMMDD
  127. //bizContent.setOrderId("");
  128. bizContent.setDealFlag("0");
  129. request.setBizContent(bizContent);
  130. MybankPayQrcodeScannedPaystatusResponseV4 response;
  131. try {
  132. response = client.execute(request, System.currentTimeMillis() + "");//msgId消息通讯唯一编号,要求每次调用独立生成,APP级唯一
  133. if (response.getReturnCode() == 0) {
  134. // 6、业务成功处理,请根据接口文档用response.getxxx()获取同步返回的业务数据
  135. //System.out.println("response:" + JSON.toJSONString(response));
  136. //System.out.println("ReturnCode:"+response.getReturnCode());
  137. if ("1".equals(response.getPayStatus())) {
  138. return new ResultVo(ResultVo.CODE_OK, "成功");
  139. } else if ("0".equals(response.getPayStatus())) {
  140. return new ResultVo(ResultVo.CODE_WAIT_PAY, "等待支付完成");
  141. } else {
  142. return new ResultVo(ResultVo.CODE_ERROR, "支付已经被取消,银行 状态码:" + response.getPayStatus());
  143. }
  144. } else {
  145. // 失败
  146. //System.out.println("response:" + JSON.toJSONString(response));
  147. //System.out.println("ReturnCode:"+response.getReturnCode());
  148. //System.out.println("ReturnMsg:"+response.getReturnMsg());
  149. return new ResultVo(ResultVo.CODE_ERROR, response.getReturnMsg());
  150. }
  151. } catch (IcbcApiException e) {
  152. e.printStackTrace();
  153. }
  154. return new ResultVo(ResultVo.CODE_ERROR, "未知异常");
  155. }
  156. }