1. import java.io.BufferedOutputStream;
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.io.InputStreamReader;
  6. import java.util.HashMap;
  7. import java.util.Iterator;
  8. import java.util.Map;
  9. import javax.servlet.ServletException;
  10. import org.jdom.JDOMException;
  11. import org.slf4j.Logger;
  12. import org.slf4j.LoggerFactory;
  13. import org.springframework.beans.factory.annotation.Autowired;
  14. import org.springframework.beans.factory.annotation.Value;
  15. import org.springframework.stereotype.Controller;
  16. import org.springframework.web.bind.annotation.PathVariable;
  17. import org.springframework.web.bind.annotation.RequestMapping;
  18. import org.springframework.web.bind.annotation.RequestMethod;
  19. import org.springframework.web.bind.annotation.RequestParam;
  20. import org.springframework.web.bind.annotation.ResponseBody;
  21. import com.alibaba.fastjson.JSON;
  22. import com.alipay.api.AlipayClient;
  23. import com.alipay.api.DefaultAlipayClient;
  24. import com.alipay.api.internal.util.AlipaySignature;
  25. import com.alipay.api.request.AlipayTradePagePayRequest;
  26. import com.zqdl.base.BaseController;
  27. import com.zqdl.entity.Integral;
  28. import com.zqdl.enums.IntegralTypeEnum;
  29. import com.zqdl.service.UserService;
  30. import com.zqdl.util.CommUtil;
  31. import com.zqdl.util.DateUtil;
  32. import com.zqdl.util.HttpUtil;
  33. import com.zqdl.util.QRCodeUtil;
  34. import com.zqdl.util.Result;
  35. import com.zqdl.util.XMLUtil;
  36.  
  37. @Controller
  38. @RequestMapping(value = "/pay")
  39. public class PayController extends BaseController {
  40.  
  41. final static Logger logger = LoggerFactory.getLogger(PayController.class);
  42.  
  43. // 微信相关
  44. @Value("#{configProperties['mch_id']}")
  45. private String mch_id;
  46.  
  47. @Value("#{configProperties['appid']}")
  48. private String appid;
  49.  
  50. @Value("#{configProperties['notify_url']}")
  51. private String notify_url;
  52.  
  53. @Value("#{configProperties['fee_type']}")
  54. private String fee_type;
  55.  
  56. @Value("#{configProperties['device_info']}")
  57. private String device_info;
  58.  
  59. @Value("#{configProperties['trade_type']}")
  60. private String trade_type;
  61.  
  62. @Value("#{configProperties['sign_type']}")
  63. private String sign_type;
  64.  
  65. @Value("#{configProperties['api_key']}")
  66. private String api_key;
  67.  
  68. @Value("#{configProperties['ufdoder_url']}")
  69. private String ufdoder_url;
  70.  
  71. // 支付宝相关
  72. @Value("#{configProperties['app_id']}")
  73. private String app_id;
  74.  
  75. @Value("#{configProperties['merchant_private_key']}")
  76. private String merchant_private_key;
  77.  
  78. @Value("#{configProperties['alipay_public_key']}")
  79. private String alipay_public_key;
  80.  
  81. @Value("#{configProperties['signType']}")
  82. private String signType;
  83.  
  84. @Value("#{configProperties['charset']}")
  85. private String charset;
  86.  
  87. @Value("#{configProperties['gatewayUrl']}")
  88. private String gatewayUrl;
  89.  
  90. @Value("#{configProperties['notifyUrl']}")
  91. private String notifyUrl;
  92.  
  93. @Value("#{configProperties['returnUrl']}")
  94. private String returnUrl;
  95.  
  96. @Autowired
  97. private UserService userService;
  98.  
  99. /**
  100. * 微信扫码支付
  101. * @author maming
  102. * @param totalFee
  103. */
  104. @RequestMapping(value = "wechat_pay", method = RequestMethod.GET)
  105. public void wechatPay(@RequestParam Map<String,String> param) {
  106. Map<String, String> params = new HashMap<String, String>();
  107. try {
  108. params.put("mch_id", mch_id);
  109. params.put("appid", appid);
  110. params.put("notify_url", notify_url);
  111. params.put("fee_type", fee_type);
  112. params.put("device_info", device_info);
  113. params.put("trade_type", trade_type);
  114. params.put("sign_type", sign_type);
  115. String tradeNo = param.get("tradeNo");// 获取订单号
  116. params.put("nonce_str", tradeNo);
  117. params.put("out_trade_no", tradeNo);
  118. params.put("spbill_create_ip", CommUtil.getIpAddress(request));
  119. int totalFee = Integer.valueOf(param.get("totalFee"));
  120. params.put("total_fee", String.valueOf(totalFee)); // 将元转换成分
  121. String description = param.get("description");// 消费描述
  122. params.put("body", description);
  123. params.put("product_id", currentUser.getId() + ""); // 商品ID,对应用户ID
  124. params.put("sign", CommUtil.generateSignature(params, api_key, "HMACSHA256"));
  125. String requestXML = XMLUtil.mapToXml(params);
  126. String resultXML = HttpUtil.postData(ufdoder_url, requestXML);
  127. Map<String, String> result = XMLUtil.doXMLParse(resultXML);
  128. String codeURL = result.get("code_url");
  129. // 生成验证码
  130. QRCodeUtil.createQRCode(response, codeURL);
  131. } catch (Exception e) {
  132. logger.error("生成微信支付二维码异常", e);
  133. }
  134.  
  135. }
  136.  
  137. /**
  138. *
  139. * @throws ServletException
  140. * @throws IOException
  141. */
  142. @RequestMapping(value = "wechat_renotify", method = RequestMethod.GET)
  143. public void wechatPay() throws ServletException, IOException {
  144. InputStream inputStream;
  145. StringBuffer sb = new StringBuffer();
  146. inputStream = request.getInputStream();
  147. String s;
  148. BufferedReader in = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
  149. while ((s = in.readLine()) != null) {
  150. sb.append(s);
  151. }
  152. in.close();
  153. inputStream.close();
  154.  
  155. Map<String, String> params = null;
  156. try {
  157. params = XMLUtil.doXMLParse(sb.toString());
  158. } catch (JDOMException e) {
  159. logger.error(e.getMessage());
  160. }
  161.  
  162. String resXml = ""; // 反馈给微信服务器
  163. // 判断签名是否正确
  164. if (CommUtil.isTenpaySign("UTF-8", params, api_key)) {
  165. // 这里是支付成功
  166. if ("SUCCESS".equals((String) params.get("result_code"))) {
  167.  
  168. // 开始执行自己的业务逻辑
  169.  
  170. // String mch_id = params.get("mch_id");
  171. // String openid = params.get("openid");
  172. // String is_subscribe = params.get("is_subscribe");
  173. // String out_trade_no = params.get("out_trade_no");
  174. // String total_fee = params.get("total_fee");
  175.  
  176. // 设置积分记录参数
  177.  
  178. // 获取消费额度
  179. int total_fee = Integer.parseInt(params.get("total_fee"));
  180. // 获取商品ID,对应用户ID
  181. int userId = Integer.parseInt(params.get("product_id"));
  182. Integral integral = new Integral();
  183. integral.setIntegral(total_fee);
  184. integral.setIntegralType(IntegralTypeEnum.RECHARGE.getCode());
  185. integral.setDescription(String.format("通过微信充值%s积分", total_fee));
  186. integral.setUserId(userId);
  187. // 添加积分记录和修改用户总积分
  188. userService.modifyUserIntegral(integral);
  189.  
  190. // 结束执行自己的业务逻辑
  191.  
  192. logger.info("支付成功");
  193. // 通知微信.异步确认成功.必写.不然会一直通知后台.八次之后就认为交易失败了.
  194. resXml = "<xml>" + "<return_code><![CDATA[SUCCESS]]></return_code>"
  195. + "<return_msg><![CDATA[OK]]></return_msg>" + "</xml> ";
  196.  
  197. } else {
  198. logger.info("支付失败,错误信息:" + params.get("err_code"));
  199. resXml = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>"
  200. + "<return_msg><![CDATA[报文为空]]></return_msg>" + "</xml> ";
  201. }
  202.  
  203. } else {
  204. logger.info("签名验证错误");
  205. resXml = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>"
  206. + "<return_msg><![CDATA[签名验证错误]]></return_msg>" + "</xml> ";
  207. }
  208.  
  209. BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
  210. out.write(resXml.getBytes());
  211. out.flush();
  212. out.close();
  213. }
  214.  
  215. /**
  216. * 支付宝支付
  217. */
  218. @RequestMapping(value = "aliPay/{money}", method = RequestMethod.GET)
  219. @ResponseBody
  220. public String aliPay(@PathVariable("money") String money){
  221. Result rs = new Result();
  222. //获得初始化的AlipayClient
  223. AlipayClient alipayClient =
  224. new DefaultAlipayClient
  225. ( gatewayUrl,
  226. app_id,
  227. merchant_private_key,
  228. "json",
  229. charset,
  230. alipay_public_key,
  231. signType
  232. );
  233.  
  234. //设置请求参数
  235. AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
  236. // 页面跳转同步通知页面路径
  237. alipayRequest.setReturnUrl(returnUrl);
  238. // 服务器异步通知页面路径
  239. alipayRequest.setNotifyUrl(notifyUrl);
  240. //请求
  241. String result = "";
  242.  
  243. try {
  244. //商户订单号,商户网站订单系统中唯一订单号,必填
  245. String out_trade_no = new String(DateUtil.getOrderNum().getBytes("ISO-8859-1"), "UTF-8");
  246. //付款金额,必填
  247. String total_amount = new String("0.01".getBytes("ISO-8859-1"), "UTF-8");
  248. //订单名称,必填
  249. String subject = new String("IphoneX 68G".getBytes("ISO-8859-1"), "UTF-8");
  250. //商品描述,可空
  251. String userId = currentUser.getId() + "";
  252. String body = new String(userId.getBytes("ISO-8859-1"), "UTF-8");
  253. //该笔订单允许的最晚付款时间,逾期将关闭交易。取值范围:1m~15d。m-分钟,h-小时,d-天,1c-当天,可空
  254. String timeout_express = new String("10m".getBytes("ISO-8859-1"), "UTF-8");
  255. //销售产品码,可空
  256. String product_code = new String("FAST_INSTANT_TRADE_PAY".getBytes("ISO-8859-1"), "UTF-8");
  257.  
  258. Map<String, String> maps = new HashMap<String, String>();
  259. //商户订单号,商户网站订单系统中唯一订单号,必填
  260. maps.put("out_trade_no", out_trade_no);
  261. //付款金额,必填
  262. maps.put("total_amount", total_amount);
  263. //订单名称,必填
  264. maps.put("subject", subject);
  265. //用户id当做商品描述,可空
  266. maps.put("body", body);
  267. //该笔订单允许的最晚付款时间,逾期将关闭交易。取值范围:1m~15d。m-分钟,h-小时,d-天,1c-当天
  268. maps.put("timeout_express", timeout_express);
  269. //销售产品码,可空
  270. maps.put("product_code", product_code);
  271. String bizCon = JSON.toJSONString(maps);
  272. alipayRequest.setBizContent(bizCon);
  273.  
  274. result = alipayClient.pageExecute(alipayRequest).getBody();
  275. //输出
  276. //response.getWriter().write(result);
  277. } catch (Exception e) {
  278. getServerErrorResult(rs);
  279. logger.error("跳转到支付宝支付页面异常", e);
  280. }
  281.  
  282. return result;
  283. }
  284.  
  285. @RequestMapping(value = "ali_renotify", method = RequestMethod.POST)
  286. public void ali_renotify(){
  287. try {
  288. //获取支付宝POST过来反馈信息
  289. Map<String, String> params = new HashMap<String, String>();
  290. Map<String, String[]> requestParams = request.getParameterMap();
  291. for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext();) {
  292. String name = (String) iter.next();
  293. String[] values = (String[]) requestParams.get(name);
  294. String valueStr = "";
  295. for (int i = 0; i < values.length; i++) {
  296. valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";
  297. }
  298. //乱码解决,这段代码在出现乱码时使用
  299. valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
  300. params.put(name, valueStr);
  301. }
  302. boolean signVerified = AlipaySignature.rsaCheckV1(params, alipay_public_key, charset, signType); //调用SDK验证签名
  303.  
  304. if(signVerified) {//验证成功
  305. //订单金额
  306. String total_amount = new String(request.getParameter("total_amount").getBytes("ISO-8859-1"),"UTF-8");
  307.  
  308. //获取传入的用户id
  309. String body = new String(request.getParameter("body").getBytes("ISO-8859-1"),"UTF-8");
  310. Integer money = Integer.parseInt(total_amount);
  311. Integer userId = Integer.parseInt(body);
  312. Integral integral = new Integral();
  313. integral.setIntegral(money);
  314. integral.setIntegralType(IntegralTypeEnum.RECHARGE.getCode());
  315. integral.setDescription(String.format("通过支付宝充值%s积分", money));
  316. integral.setUserId(userId);
  317. // 添加积分记录和修改用户总积分
  318. userService.modifyUserIntegral(integral);
  319.  
  320. logger.info("支付成功");
  321.  
  322. response.getWriter().write("success");
  323.  
  324. }else {//验证失败
  325. response.getWriter().write("fail");
  326.  
  327. //调试用,写文本函数记录程序运行情况是否正常
  328. //String sWord = AlipaySignature.getSignCheckContentV1(params);
  329. //AlipayConfig.logResult(sWord);
  330. }
  331. } catch (Exception e) {
  332.  
  333. }
  334.  
  335. }
  336. }

工具类

  1. public class CommUtil {
  2. private static Logger logger = LoggerFactory.getLogger(CommUtil.class);
  3.  
  4. public static String generateUUID() {
  5. return UUID.randomUUID().toString().replaceAll("-", "").substring(0, 32);
  6. }
  7.  
  8. /**
  9. * 取出一个指定长度大小的随机正整数.
  10. *
  11. * @param length
  12. * int 设定所取出随机数的长度。length小于11
  13. * @return int 返回生成的随机数。
  14. */
  15. public static int buildRandom(int length) {
  16. int num = 1;
  17. double random = Math.random();
  18. if (random < 0.1) {
  19. random = random + 0.1;
  20. }
  21. for (int i = 0; i < length; i++) {
  22. num = num * 10;
  23. }
  24. return (int) ((random * num));
  25. }
  26.  
  27. /**
  28. * 获取当前时间 yyyyMMddHHmmss
  29. * 生成订单号
  30. * @return String
  31. */
  32.  
  33. public synchronized static String getNonce_str() {
  34. Date now = new Date();
  35. SimpleDateFormat outFormat = new SimpleDateFormat("yyyyMMddHHmmss");
  36. String bg = outFormat.format(now);
  37. bg.substring(8, bg.length());
  38. String end = String.valueOf(buildRandom(4));
  39. return bg + end;
  40. }
  41.  
  42. /**
  43. * 生成签名. 注意,若含有sign_type字段,必须和signType参数保持一致。
  44. *
  45. * @param data
  46. * 待签名数据
  47. * @param key
  48. * API密钥
  49. * @param signType
  50. * 签名方式
  51. * @return 签名
  52. */
  53. public static String generateSignature(final Map<String, String> data, String key,
  54. String signType) throws Exception {
  55. Set<String> keySet = data.keySet();
  56. String[] keyArray = keySet.toArray(new String[keySet.size()]);
  57. Arrays.sort(keyArray);
  58. StringBuilder sb = new StringBuilder();
  59. for (String k : keyArray) {
  60. if (k.equals("sign")) {
  61. continue;
  62. }
  63. if (data.get(k).trim().length() > 0) // 参数值为空,则不参与签名
  64. sb.append(k).append("=").append(data.get(k).trim()).append("&");
  65. }
  66. sb.append("key=").append(key);
  67. if ("MD5".equals(signType)) {
  68. return MD5(sb.toString()).toUpperCase();
  69. } else if ("HMACSHA256".equals(signType)) {
  70. return HMACSHA256(sb.toString(), key);
  71. } else {
  72. throw new RuntimeException(String.format("Invalid sign_type: %s", signType));
  73. }
  74. }
  75.  
  76. /**
  77. * 生成 MD5
  78. *
  79. * @param data
  80. * 待处理数据
  81. * @return MD5结果
  82. * @throws NoSuchAlgorithmException
  83. * @throws UnsupportedEncodingException
  84. */
  85. public static String MD5(String data) throws NoSuchAlgorithmException, UnsupportedEncodingException {
  86. java.security.MessageDigest md = MessageDigest.getInstance("MD5");
  87. byte[] array = md.digest(data.getBytes("UTF-8"));
  88. StringBuilder sb = new StringBuilder();
  89. for (byte item : array) {
  90. sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3));
  91. }
  92. return sb.toString().toUpperCase();
  93. }
  94.  
  95. /**
  96. * 生成 HMACSHA256
  97. *
  98. * @param data
  99. * 待处理数据
  100. * @param key
  101. * 密钥
  102. * @return 加密结果
  103. * @throws NoSuchAlgorithmException
  104. * @throws UnsupportedEncodingException
  105. * @throws InvalidKeyException
  106. * @throws Exception
  107. */
  108. public static String HMACSHA256(String data, String key) throws NoSuchAlgorithmException, UnsupportedEncodingException, InvalidKeyException{
  109. Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
  110. SecretKeySpec secret_key = new SecretKeySpec(key.getBytes("UTF-8"), "HmacSHA256");
  111. sha256_HMAC.init(secret_key);
  112. byte[] array = sha256_HMAC.doFinal(data.getBytes("UTF-8"));
  113. StringBuilder sb = new StringBuilder();
  114. for (byte item : array) {
  115. sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3));
  116. }
  117. return sb.toString().toUpperCase();
  118. }
  119.  
  120. /**
  121. * 是否签名正确,规则是:按参数名称a-z排序,遇到空值的参数不参加签名。
  122. *
  123. * @return boolean
  124. */
  125. public static boolean isTenpaySign(String characterEncoding, Map<String, String> params,
  126. String API_KEY) {
  127. StringBuffer sb = new StringBuffer();
  128. Set<Entry<String, String>> es = params.entrySet();
  129. Iterator<Entry<String, String>> it = es.iterator();
  130. while (it.hasNext()) {
  131. Entry<String, String> entry = it.next();
  132. String k = (String) entry.getKey();
  133. String v = (String) entry.getValue();
  134. if (!"sign".equals(k) && null != v && !"".equals(v)) {
  135. sb.append(k + "=" + v + "&");
  136. }
  137. }
  138.  
  139. sb.append("key=" + API_KEY);
  140.  
  141. // 算出摘要
  142. String mysign = Md5Utils.MD5Encode(sb.toString(), characterEncoding).toLowerCase();
  143. String tenpaySign = ((String) params.get("sign")).toLowerCase();
  144.  
  145. return tenpaySign.equals(mysign);
  146. }
  147.  
  148. /**
  149. * 获取客户端IP
  150. *
  151. * @param request
  152. * @return
  153. */
  154. public static String getIpAddress(HttpServletRequest request) {
  155.  
  156. String ipAddress = request.getHeader("x-forwarded-for");
  157.  
  158. if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
  159. ipAddress = request.getHeader("Proxy-Client-IP");
  160. }
  161. if (ipAddress == null || ipAddress.length() == 0 || "unknow".equalsIgnoreCase(ipAddress)) {
  162. ipAddress = request.getHeader("WL-Proxy-Client-IP");
  163. }
  164. if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
  165. ipAddress = request.getRemoteAddr();
  166.  
  167. if (ipAddress.equals(Constants.LOCALHOST1) || ipAddress.equals(Constants.LOCALHOST2)) {
  168. // 根据网卡获取本机配置的IP地址
  169. InetAddress inetAddress = null;
  170. try {
  171. inetAddress = InetAddress.getLocalHost();
  172. } catch (UnknownHostException e) {
  173. logger.error(e.getMessage());
  174. }
  175. if(inetAddress != null){
  176. ipAddress = inetAddress.getHostAddress();
  177. }
  178. }
  179. }
  180.  
  181. // 对于通过多个代理的情况,第一个IP为客户端真实的IP地址,多个IP按照','分割
  182. if (null != ipAddress && ipAddress.length() > 15) {
  183. if (ipAddress.indexOf(",") > 0) {
  184. ipAddress = ipAddress.substring(0, ipAddress.indexOf(","));
  185. }
  186. }
  187.  
  188. return ipAddress;
  189. }
  190.  
  191. }
  1. public class XMLUtil {
  2.  
  3. /**
  4. * 解析xml,返回第一级元素键值对。如果第一级元素有子节点,则此节点的值是子节点的xml数据。
  5. *
  6. * @param strxml
  7. * @return
  8. * @throws JDOMException
  9. * @throws IOException
  10. */
  11. public static Map<String, String> doXMLParse(String strxml) throws JDOMException, IOException {
  12. strxml = strxml.replaceFirst("encoding=\".*\"", "encoding=\"UTF-8\"");
  13.  
  14. if (null == strxml || "".equals(strxml)) {
  15. return null;
  16. }
  17.  
  18. Map<String, String> map = new HashMap<String, String>();
  19.  
  20. InputStream in = new ByteArrayInputStream(strxml.getBytes("UTF-8"));
  21. SAXBuilder builder = new SAXBuilder();
  22. Document doc = builder.build(in);
  23. Element root = doc.getRootElement();
  24. @SuppressWarnings("unchecked")
  25. List<Element> list = root.getChildren();
  26. Iterator<Element> it = list.iterator();
  27. while (it.hasNext()) {
  28. Element e = it.next();
  29. String k = e.getName();
  30. String v = "";
  31. @SuppressWarnings("unchecked")
  32. List<Element> children = e.getChildren();
  33. if (children.isEmpty()) {
  34. v = e.getTextNormalize();
  35. } else {
  36. v = XMLUtil.getChildrenText(children);
  37. }
  38.  
  39. map.put(k, v);
  40. }
  41. // 关闭流
  42. in.close();
  43.  
  44. return map;
  45. }
  46.  
  47. /**
  48. * 将Map转换为XML格式的字符串
  49. *
  50. * @param data
  51. * Map类型数据
  52. * @return XML格式的字符串
  53. * @throws ParserConfigurationException
  54. * @throws TransformerException
  55. * @throws Exception
  56. * @throws Exception
  57. */
  58. public static String mapToXml(Map<String, String> data) throws ParserConfigurationException, TransformerException{
  59. DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
  60. DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
  61. org.w3c.dom.Document document = documentBuilder.newDocument();
  62. org.w3c.dom.Element root = document.createElement("xml");
  63. document.appendChild(root);
  64. for (String key : data.keySet()) {
  65. String value = data.get(key);
  66. if (value == null) {
  67. value = "";
  68. }
  69. value = value.trim();
  70. org.w3c.dom.Element filed = document.createElement(key);
  71. filed.appendChild(document.createTextNode(value));
  72. root.appendChild(filed);
  73. }
  74. TransformerFactory tf = TransformerFactory.newInstance();
  75. Transformer transformer = tf.newTransformer();
  76. DOMSource source = new DOMSource(document);
  77. transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
  78. transformer.setOutputProperty(OutputKeys.INDENT, "yes");
  79. StringWriter writer = new StringWriter();
  80. StreamResult result = new StreamResult(writer);
  81. transformer.transform(source, result);
  82. String output = writer.getBuffer().toString(); // .replaceAll("\n|\r",
  83. // "");
  84. try {
  85. writer.close();
  86. } catch (Exception ex) {
  87. }
  88. return output;
  89. }
  90.  
  91. /**
  92. * 获取子结点的xml
  93. *
  94. * @param children
  95. * @return String
  96. */
  97. public static String getChildrenText(List<Element> children) {
  98. StringBuffer sb = new StringBuffer();
  99. if (!children.isEmpty()) {
  100. Iterator<Element> it = children.iterator();
  101. while (it.hasNext()) {
  102. Element e = it.next();
  103. String name = e.getName();
  104. String value = e.getTextNormalize();
  105. @SuppressWarnings("unchecked")
  106. List<Element> list = e.getChildren();
  107. sb.append("<" + name + ">");
  108. if (!list.isEmpty()) {
  109. sb.append(XMLUtil.getChildrenText(list));
  110. }
  111. sb.append(value);
  112. sb.append("</" + name + ">");
  113. }
  114. }
  115.  
  116. return sb.toString();
  117. }
  118. }
  1. public class HttpUtil {
  2.  
  3. private static Logger logger = Logger.getLogger("HttpUtil");
  4.  
  5. private final static int CONNECT_TIMEOUT = 5000; // in milliseconds
  6. private final static String DEFAULT_ENCODING = "UTF-8";
  7. public static final MediaType MEDIA_TYPE = MediaType.parse("application/json; charset=utf-8");
  8. public static final OkHttpClient client = new OkHttpClient();
  9.  
  10. public static void httpGet(String urlStr) {
  11. Request request = new Request.Builder().url(urlStr).build();
  12. try {
  13. Response response = client.newCall(request).execute();
  14. if (response.isSuccessful()) {
  15. logger.info(response.body().string());
  16. } else {
  17. logger.info("服务器端错误: " + response);
  18. }
  19. } catch (IOException e) {
  20. logger.error(e.getMessage());
  21. }
  22. }
  23.  
  24. public static void httpPost(String urlStr, String json) {
  25. RequestBody body = RequestBody.create(MEDIA_TYPE, json);
  26. Request request = new Request.Builder().url(urlStr).post(body).build();
  27. try {
  28. Response response = client.newCall(request).execute();
  29. if (response.isSuccessful()) {
  30. logger.info(response.body().string());
  31. } else {
  32. logger.info("服务器端错误: " + response);
  33. }
  34. } catch (IOException e) {
  35. logger.error(e.getMessage());
  36. }
  37. }
  38.  
  39. public static void httpPost(String urlStr, Map<String, String> params) {
  40. FormEncodingBuilder builder = new FormEncodingBuilder();
  41. if (params != null && !params.isEmpty()) {
  42. Set<String> keys = params.keySet();
  43. for (String key : keys) {
  44. builder.add(key, params.get(key));
  45. }
  46. }
  47. RequestBody body = builder.build();
  48. Request request = new Request.Builder().url(urlStr).post(body).build();
  49. try {
  50. Response response = client.newCall(request).execute();
  51. if (response.isSuccessful()) {
  52. logger.info(response.body().string());
  53. } else {
  54. logger.info("服务器端错误: " + response);
  55. }
  56. } catch (IOException e) {
  57. logger.error(e.getMessage());
  58. }
  59. }
  60.  
  61. public static String postData(String urlStr, String data) {
  62. return postData(urlStr, data, null);
  63. }
  64.  
  65. public static String postData(String urlStr, String data, String contentType) {
  66. BufferedReader reader = null;
  67. try {
  68. URL url = new URL(urlStr);
  69. URLConnection conn = url.openConnection();
  70. conn.setDoOutput(true);
  71. conn.setConnectTimeout(CONNECT_TIMEOUT);
  72. conn.setReadTimeout(CONNECT_TIMEOUT);
  73. if (contentType != null)
  74. conn.setRequestProperty("content-type", contentType);
  75. OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream(), DEFAULT_ENCODING);
  76. if (data == null)
  77. data = "";
  78. writer.write(data);
  79. writer.flush();
  80. writer.close();
  81.  
  82. reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), DEFAULT_ENCODING));
  83. StringBuilder sb = new StringBuilder();
  84. String line = null;
  85. while ((line = reader.readLine()) != null) {
  86. sb.append(line);
  87. sb.append("\r\n");
  88. }
  89. return sb.toString();
  90. } catch (IOException e) {
  91. } finally {
  92. try {
  93. if (reader != null)
  94. reader.close();
  95. } catch (IOException e) {
  96. }
  97. }
  98. return null;
  99. }
  100. }

二维码相关操作代码

  1. public class QRCodeUtil {
  2.  
  3. final static Logger logger = LoggerFactory.getLogger(QRCodeUtil.class);
  4.  
  5. public static void createQRCode(HttpServletResponse response, String codeURL) {
  6.  
  7. // 生成二维码
  8. Map<EncodeHintType, Object> hints = new HashMap<EncodeHintType, Object>();
  9. // 指定纠错等级
  10. hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);
  11. // 指定编码格式
  12. hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
  13. hints.put(EncodeHintType.MARGIN, 1);
  14. try {
  15. BitMatrix bitMatrix = new MultiFormatWriter().encode(codeURL, BarcodeFormat.QR_CODE, 200, 200, hints);
  16. OutputStream out = response.getOutputStream();
  17. MatrixToImageWriter.writeToStream(bitMatrix, "png", out);// 输出二维码
  18. out.flush();
  19. out.close();
  20. } catch (Exception e) {
  21. logger.error(e.getMessage());
  22. }
  23.  
  24. }
  25.  
  26. }

PC端微信扫码支付和支付宝跳转支付的更多相关文章

  1. 【微信开发】PC端 微信扫码支付成功之后自动跳转

    场景: PC端   微信扫码支付 结果: 支付成功 自动跳转 实现思路: 支付二维码页面,写ajax请求支付状态,请求到结果,无论成功还是失败,都跳转到相应的结果页面 具体实现方法: html部分: ...

  2. PC 端微信扫码注册和登录

    一.前言 先声明一下,本文所注重点为实现思路,代码及数据库设计主要为了展现思路,如果对代码效率有着苛刻要求的项目切勿照搬. 相信做过微信开发的人授权这块都没少做过,但是一般来说我们更多的是为移动端的网 ...

  3. PHP PC端微信扫码支付【模式二】详细教程-附带源码(转)

    博主写这破玩意儿的时候花了大概快两天时间才整体的弄懂逻辑,考虑了一下~还是把所有代码都放出来给大家~抱着开源大无私的精神!谁叫我擅长拍黄片呢?同时也感谢我刚入行时候那些无私帮过我的程序员们! 首先还是 ...

  4. Java SpringMVC实现PC端网页微信扫码支付完整版

    一:前期微信支付扫盲知识 前提条件是已经有申请了微信支付功能的公众号,然后我们需要得到公众号APPID和微信商户号,这个分别在微信公众号和微信支付商家平台上面可以发现.其实在你申请成功支付功能之后,微 ...

  5. 微信公众号支付|微信H5支付|微信扫码支付|小程序支付|APP微信支付解决方案总结

    最近负责的一些项目开发,都用到了微信支付(微信公众号支付.微信H5支付.微信扫码支付.APP微信支付).在开发的过程中,在调试支付的过程中,或多或少都遇到了一些问题,今天总结下,分享,留存. 先说注意 ...

  6. C#版微信公众号支付|微信H5支付|微信扫码支付问题汇总及解决方案总结

    最近负责的一些项目开发,都用到了微信支付(微信公众号支付.微信H5支付.微信扫码支付).在开发的过程中,在调试支付的过程中,或多或少都遇到了一些问题,今天总结下,分享,留存.代码在文章结尾处,有需要的 ...

  7. 微信扫码支付PHP接入总结

    微信扫码支付分为两种模式, 模式一比较复杂,需要公众号配置回调地址. 模式二比较简单,只需要在代码中配置回调地址就可以了. 我这次使用的是模式二. 需要配置参数, const APPID = 'xxx ...

  8. 微信扫码i支付~官方DEMO的坑

    返回目录 之前写过关于微信支付那些坑的文章(<微信JSApi支付~集成到MVC环境后的最后一个坑(网上没有这种解决方案)>,<微信JSApi支付~坑和如何填坑>),下面说一下微 ...

  9. Net MVC微信扫码支付

    微信扫码支付+Asp.Net MVC 这里的扫码支付指的是PC网站上面使用微信支付,也就是官方的模式二,网站是Asp.net MVC,整理如下. 一.准备工作 使用的微信API中的统一下单方法,关键的 ...

随机推荐

  1. b+tree索引在MyIsam和InnoDB的不同实现方式

    普通二叉搜索树当索引的劣势: (1)每个节点占用的空间太少,不能很好的利用磁盘的预读性 (2)数据不规律的话,很可能形成链表 (3)频繁IO b树当索引机制相比于二叉树的优势和劣势: (1)每个节点有 ...

  2. Nginx事件管理之ngx_event_core_module模块

    1. 概述 ngx_event_core_module 模块是一个事件类型的模块,它在所有事件模块中的顺序是第一位.它主要完成以下两点任务: 创建连接池(包括读/写事件): 决定究竟使用哪些事件驱动机 ...

  3. 查看HearthBuddy.exe文件是x86还是x64版本

    https://www.cnblogs.com/chucklu/p/10020221.html 使用Powershell查看 PS C:\repository\GitHub\ChuckLu\Test\ ...

  4. 5.Hiveguigun滚(ノ`Д)ノ竟然竞争谨慎谨慎谨慎哈喇子罢工八公

    1.Hive简介 2.Hive部署与安装 3.Hive的使用 4.Hive JDBC编程

  5. [转]spring的filter中targetFilterLifecycle作用

    在web.xml中进行配置,对所有的URL请求进行过滤,就像"击鼓传花"一样,链式处理. 配置分为两种A和B. A:普通配置 在web.xml中增加如下内容:<filter& ...

  6. 编写javad代码实现使用Scanner从键盘读取一行输入,去掉其中重复字符, 打印出不同的那些字符

    package com.loaderman.test; import java.util.HashSet; import java.util.Scanner; public class Test2 { ...

  7. 5、kubernetes资源清单定义入门

    使用配置清单创建资源 定义pod时使用yaml格式 master ~]# kubectl get pod NAME READY STATUS RESTARTS AGE client / Error 1 ...

  8. Java学习之==>Java8 新特性详解

    一.简介 Java 8 已经发布很久了,很多报道表明Java 8 是一次重大的版本升级.Java 8是 Java 自 Java 5(发布于2004年)之后的最重要的版本.这个版本包含语言.编译器.库. ...

  9. Delphi GetDir 获取指定驱动器的当前路径名

    //获取指定驱动器的当前路径名 GetDirvardir: string;b: Byte;beginb := 0;GetDir(b,dir);ShowMessage(dir); // //第一个参数: ...

  10. 算法之顺序、二分、hash查找

    算法之顺序.二分.hash查找   一.查找/搜索 - 我们现在把注意力转向计算中经常出现的一些问题,即搜索或查找的问题.搜索是在元素集合中查找特定元素的算法过程.搜索通常对于元素是否存在返回 Tru ...