PayServiceImpl.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387
  1. package com.xc.service.impl;
  2. import com.xc.common.CmcPayConfig;
  3. import com.xc.common.ServerResponse;
  4. import com.xc.dao.UserMapper;
  5. import com.xc.dao.UserRechargeMapper;
  6. import com.xc.pojo.User;
  7. import com.xc.pojo.UserRecharge;
  8. import com.xc.service.IPayService;
  9. import com.xc.service.IUserService;
  10. import com.xc.utils.KeyUtils;
  11. import com.xc.utils.PropertiesUtil;
  12. import com.xc.utils.pay.CmcPayOuterRequestUtil;
  13. import com.xc.utils.pay.CmcPayTool;
  14. import com.xc.vo.pay.FlyPayVO;
  15. import com.xc.vo.pay.GuoPayVO;
  16. import java.io.UnsupportedEncodingException;
  17. import java.math.BigDecimal;
  18. import java.net.URLDecoder;
  19. import java.security.MessageDigest;
  20. import java.security.NoSuchAlgorithmException;
  21. import java.text.SimpleDateFormat;
  22. import java.util.Date;
  23. import java.util.HashMap;
  24. import java.util.Map;
  25. import java.util.Random;
  26. import javax.servlet.http.HttpServletRequest;
  27. import net.sf.json.JSONObject;
  28. import org.apache.commons.codec.digest.DigestUtils;
  29. import org.apache.commons.collections.map.LinkedMap;
  30. import org.apache.commons.lang3.StringUtils;
  31. import org.apache.http.HttpResponse;
  32. import org.slf4j.Logger;
  33. import org.slf4j.LoggerFactory;
  34. import org.springframework.beans.factory.annotation.Autowired;
  35. import org.springframework.stereotype.Service;
  36. @Service("iPayService")
  37. public class PayServiceImpl implements IPayService {
  38. private static final Logger log = LoggerFactory.getLogger(PayServiceImpl.class);
  39. @Autowired
  40. IUserService iUserService;
  41. @Autowired
  42. UserRechargeMapper userRechargeMapper;
  43. @Autowired
  44. UserMapper userMapper;
  45. private static final String juhe1_key = "vd7omkkexkt7fvl6wm2jl9yan3g79y6i";
  46. public ServerResponse juhe1(String payType, String payAmt, HttpServletRequest request) {
  47. if (StringUtils.isBlank(payType) || StringUtils.isBlank(payAmt)) {
  48. return ServerResponse.createByErrorMsg("参数不能为空");
  49. }
  50. BigDecimal payAmtBig = new BigDecimal(payAmt);
  51. if ((new BigDecimal("0")).compareTo(payAmtBig) != -1) {
  52. return ServerResponse.createByErrorMsg("支付金额必须大于0");
  53. }
  54. User user = this.iUserService.getCurrentRefreshUser(request);
  55. UserRecharge userRecharge = new UserRecharge();
  56. userRecharge.setUserId(user.getId());
  57. userRecharge.setNickName(user.getRealName());
  58. userRecharge.setAgentId(user.getAgentId());
  59. userRecharge.setAgentName(user.getAgentName());
  60. userRecharge.setPhone(user.getPhone());
  61. String ordersn = KeyUtils.getRechargeOrderSn();
  62. userRecharge.setOrderSn(ordersn);
  63. String saveChannel = "";
  64. if ("902".equals(payType)) {
  65. saveChannel = "微信-线上";
  66. } else {
  67. saveChannel = "支付宝-线上";
  68. }
  69. userRecharge.setPayChannel(saveChannel);
  70. userRecharge.setPayAmt(new BigDecimal(payAmt));
  71. userRecharge.setOrderStatus(Integer.valueOf(0));
  72. userRecharge.setAddTime(new Date());
  73. int insertCount = this.userRechargeMapper.insert(userRecharge);
  74. if (insertCount > 0) {
  75. log.info("线上支付,创建支付订单成功!");
  76. } else {
  77. log.info("线上支付,创建支付订单失败!");
  78. }
  79. String pay_bankcode = "";
  80. if ("902".equals(payType)) {
  81. pay_bankcode = payType;
  82. } else if ("907".equals(payType)) {
  83. pay_bankcode = payType;
  84. } else {
  85. pay_bankcode = "903";
  86. }
  87. String AuthorizationURL = "http://pay.ksunpay.com:8080/Pay_Index.html";
  88. String merchantId = "10098";
  89. String keyValue = "vd7omkkexkt7fvl6wm2jl9yan3g79y6i";
  90. String pay_memberid = merchantId;
  91. String pay_orderid = ordersn;
  92. String pay_applydate = generateTime();
  93. String pay_notifyurl = PropertiesUtil.getProperty("juhe1.pay.notifyurl");
  94. String pay_callbackurl = PropertiesUtil.getProperty("juhe1.pay.callbackurl");
  95. String pay_amount = payAmt;
  96. String pay_attach = "";
  97. String pay_productname = "100元话费充币";
  98. String pay_productnum = "";
  99. String pay_productdesc = "";
  100. String pay_producturl = "";
  101. String stringSignTemp = "pay_amount=" + pay_amount + "&pay_applydate=" + pay_applydate + "&pay_bankcode=" + pay_bankcode + "&pay_callbackurl=" + pay_callbackurl + "&pay_memberid=" + pay_memberid + "&pay_notifyurl=" + pay_notifyurl + "&pay_orderid=" + pay_orderid + "&key=" + keyValue + "";
  102. String pay_md5sign = "";
  103. try {
  104. pay_md5sign = md5(stringSignTemp);
  105. } catch (Exception e) {
  106. log.error("加密md5出错 e= {}", e);
  107. }
  108. GuoPayVO guoPayVO = new GuoPayVO();
  109. guoPayVO.setPostUrl(AuthorizationURL);
  110. guoPayVO.setPay_memberid(merchantId);
  111. guoPayVO.setPay_orderid(pay_orderid);
  112. guoPayVO.setPay_applydate(pay_applydate);
  113. guoPayVO.setPay_bankcode(pay_bankcode);
  114. guoPayVO.setPay_notifyurl(pay_notifyurl);
  115. guoPayVO.setPay_callbackurl(pay_callbackurl);
  116. guoPayVO.setPay_amount(pay_amount);
  117. guoPayVO.setPay_productname(pay_productname);
  118. guoPayVO.setPay_productnum(pay_productnum);
  119. guoPayVO.setPay_productdesc(pay_productdesc);
  120. guoPayVO.setPay_producturl(pay_producturl);
  121. guoPayVO.setPay_md5sign(pay_md5sign);
  122. return ServerResponse.createBySuccess(guoPayVO);
  123. }
  124. public ServerResponse juhe1Notify(HttpServletRequest request) {
  125. String memberid = request.getParameter("memberid");
  126. String orderid = request.getParameter("orderid");
  127. String amount = request.getParameter("amount");
  128. String datetime = request.getParameter("datetime");
  129. String returncode = request.getParameter("returncode");
  130. String transaction_id = request.getParameter("transaction_id");
  131. String attach = request.getParameter("attach");
  132. String sign = request.getParameter("sign");
  133. log.info("支付通知的 orderid = {}", orderid);
  134. log.info("支付通知的 transaction_id = {}", transaction_id);
  135. log.info("支付通知的 amount = {}", amount);
  136. log.info("支付通知的 returncode = {}", returncode);
  137. String keyValue = "vd7omkkexkt7fvl6wm2jl9yan3g79y6i";
  138. String SignTemp = "amount=" + amount + "&datetime=" + datetime + "&memberid=" + memberid + "&orderid=" + orderid + "&returncode=" + returncode + "&transaction_id=" + transaction_id + "&key=" + keyValue + "";
  139. log.info("signtemp : {}", SignTemp);
  140. String md5sign = "";
  141. try {
  142. md5sign = md5(SignTemp);
  143. } catch (Exception e) {
  144. log.info("线上支付后台通知 生成md5sign出错,e = {}", e);
  145. }
  146. log.info("支付通知的sign = {}", sign);
  147. log.info("自己加密的sign = {}", md5sign);
  148. ServerResponse serverResponse = ServerResponse.createByError();
  149. if (sign.equals(md5sign)) {
  150. log.info("后台通知校验签名 通过");
  151. if (returncode.equals("00")) {
  152. log.info("后台通知成功,开始修改订单 {}", orderid);
  153. serverResponse = doSuccess(orderid, amount);
  154. } else {
  155. log.error("后台通知 returncode 不为 00 , 支付不成功");
  156. }
  157. } else {
  158. log.info("后台通知校验签名 不通过");
  159. }
  160. return serverResponse;
  161. }
  162. public ServerResponse flyPay(String payType, String payAmt, String currency, HttpServletRequest request) {
  163. User user = this.iUserService.getCurrentRefreshUser(request);
  164. UserRecharge userRecharge = new UserRecharge();
  165. userRecharge.setUserId(user.getId());
  166. userRecharge.setNickName(user.getRealName());
  167. userRecharge.setAgentId(user.getAgentId());
  168. userRecharge.setAgentName(user.getAgentName());
  169. userRecharge.setPhone(user.getPhone());
  170. String ordersn = KeyUtils.getRechargeOrderSn();
  171. userRecharge.setOrderSn(ordersn);
  172. userRecharge.setPayChannel(payType);
  173. userRecharge.setPayAmt(new BigDecimal(payAmt));
  174. userRecharge.setOrderStatus(Integer.valueOf(0));
  175. userRecharge.setAddTime(new Date());
  176. int insertCount = this.userRechargeMapper.insert(userRecharge);
  177. if (insertCount > 0) {
  178. log.info("fly支付,创建支付订单成功!");
  179. } else {
  180. log.info("fly支付,创建支付订单失败!");
  181. }
  182. FlyPayVO flyPayVO = new FlyPayVO();
  183. flyPayVO.setOrderno(ordersn);
  184. flyPayVO.setOrderamount(payAmt);
  185. flyPayVO.setPaytype(payType);
  186. flyPayVO.setOrdercurrency(currency);
  187. String sign = "";
  188. String tempStr = flyPayVO.getMerchantid() + ordersn + flyPayVO.getOrderamount() + flyPayVO.getServerbackurl() + flyPayVO.getCallbackurl() + PropertiesUtil.getProperty("fly.pay.token");
  189. sign = DigestUtils.md5Hex(tempStr);
  190. flyPayVO.setSign(sign);
  191. return ServerResponse.createBySuccess(flyPayVO);
  192. }
  193. public ServerResponse flyNotify(HttpServletRequest request) {
  194. String orderno = request.getParameter("orderno");
  195. String orderamount = request.getParameter("orderamount");
  196. String payamount = request.getParameter("payamount");
  197. String paytype = request.getParameter("paytype");
  198. String confirmpaytime = request.getParameter("confirmpaytime");
  199. String status = request.getParameter("status");
  200. String sign = request.getParameter("sign");
  201. log.info("支付通知的 orderno = {}", orderno);
  202. log.info("支付通知的 payamount = {}", payamount);
  203. log.info("支付通知的 status = {}", status);
  204. return doSuccess(orderno, payamount);
  205. }
  206. private ServerResponse doSuccess(String orderId, String amount) {
  207. UserRecharge userRecharge = this.userRechargeMapper.findUserRechargeByOrderSn(orderId);
  208. if (userRecharge == null) {
  209. return ServerResponse.createByErrorMsg("后台通知,查不到订单");
  210. }
  211. User user = this.userMapper.selectByPrimaryKey(userRecharge.getUserId());
  212. if (user == null) {
  213. return ServerResponse.createByErrorMsg("后台通知,查不到用户");
  214. }
  215. if (userRecharge.getPayAmt().compareTo(new BigDecimal(amount)) != 0) {
  216. return ServerResponse.createByErrorMsg("处理失败,后台通知金额和订单金额不一致");
  217. }
  218. userRecharge.setPayTime(new Date());
  219. userRecharge.setOrderStatus(Integer.valueOf(1));
  220. int updateCount = this.userRechargeMapper.updateByPrimaryKeySelective(userRecharge);
  221. if (updateCount > 0) {
  222. log.info("后台通知,修改订单状态成功");
  223. BigDecimal total_amt = user.getUserAmt().add(userRecharge.getPayAmt());
  224. user.setUserAmt(total_amt);
  225. BigDecimal total_enable = user.getEnableAmt().add(userRecharge.getPayAmt());
  226. user.setEnableAmt(total_enable);
  227. int updateUserCount = this.userMapper.updateByPrimaryKeySelective(user);
  228. if (updateUserCount > 0) {
  229. return ServerResponse.createBySuccessMsg("后台通知 处理成功");
  230. }
  231. return ServerResponse.createByErrorMsg("后台通知 处理失败 修改用户资金不成功");
  232. }
  233. log.error("后台通知,修改订单状态失败");
  234. return ServerResponse.createByErrorMsg("后台通知修改订单的状态失败");
  235. }
  236. public String generateOrderId() {
  237. String keyup_prefix = (new SimpleDateFormat("yyyyMMddHHmmss")).format(new Date());
  238. String keyup_append = String.valueOf((new Random()).nextInt(899999) + 100000);
  239. return keyup_prefix + keyup_append;
  240. }
  241. public String generateTime() {
  242. return (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(new Date());
  243. }
  244. public String md5(String str) throws NoSuchAlgorithmException {
  245. try {
  246. MessageDigest md = MessageDigest.getInstance("MD5");
  247. md.update(str.getBytes());
  248. byte[] byteDigest = md.digest();
  249. StringBuffer buf = new StringBuffer("");
  250. for (int offset = 0; offset < byteDigest.length; offset++) {
  251. int i = byteDigest[offset];
  252. if (i < 0)
  253. i += 256;
  254. if (i < 16)
  255. buf.append("0");
  256. buf.append(Integer.toHexString(i));
  257. }
  258. return buf.toString().toUpperCase();
  259. } catch (NoSuchAlgorithmException e) {
  260. e.printStackTrace();
  261. return null;
  262. }
  263. }
  264. public static void main(String[] args) {
  265. BigDecimal a = new BigDecimal("0.011");
  266. BigDecimal b = new BigDecimal("0.010");
  267. System.out.println(a.compareTo(b));
  268. }
  269. @Override
  270. public ServerResponse juhenewpay(String paramString1, String paramString2, HttpServletRequest request) throws Exception {
  271. User user = iUserService.getCurrentRefreshUser(request);
  272. String orderid = user.getId() + "_" + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
  273. String repson = CmcPayTool.submitOrder(paramString2, orderid, paramString1);
  274. JSONObject json = JSONObject.fromObject(repson);
  275. JSONObject data = (JSONObject) json.get("data");
  276. return ServerResponse.createBySuccess(data);
  277. }
  278. @Override
  279. public ServerResponse juhenewpayNotify(HttpServletRequest request) throws UnsupportedEncodingException {
  280. LinkedMap map = new LinkedMap();
  281. String out_trade_no = request.getParameter("out_trade_no");
  282. String[] arr = out_trade_no.split("_");
  283. map.put("amount", (String) request.getParameter("amount"));
  284. map.put("appid", (String) request.getParameter("appid"));
  285. map.put("currency_type", (String) request.getParameter("currency_type"));
  286. map.put("goods_name", (String) request.getParameter("goods_name"));
  287. map.put("out_trade_no", out_trade_no);
  288. map.put("pay_id", (String) request.getParameter("pay_id"));
  289. map.put("pay_no", (String) request.getParameter("pay_no"));
  290. map.put("payment", (String) request.getParameter("payment"));
  291. map.put("resp_code", (String) request.getParameter("resp_code"));
  292. map.put("resp_desc", URLDecoder.decode((String) request.getParameter("resp_desc"), "UTF-8"));
  293. map.put("sign_type", (String) request.getParameter("sign_type"));
  294. map.put("tran_amount", (String) request.getParameter("tran_amount"));
  295. map.put("version", (String) request.getParameter("version"));
  296. String _sign = CmcPayOuterRequestUtil.getSign(map, CmcPayConfig.KEY);
  297. if ("00".equals((String) request.getParameter("resp_code")) && _sign.equals((String) request.getParameter("sign"))) {
  298. iUserService.updateUserAmt((Double) map.get("amount"), new Integer(arr[0]));
  299. // response.getWriter().println("success");
  300. } else {
  301. // response.getWriter().println("error");
  302. }
  303. return null;
  304. }
  305. }