CreateOrderController.java 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. package com.ljsd.controller;
  2. import com.google.gson.Gson;
  3. import com.ljsd.channel.Mock361YXSDK;
  4. import com.ljsd.channel.MockQuickSDK;
  5. import com.ljsd.pojo.ResMsg;
  6. import com.ljsd.util.BaseGlobal;
  7. import com.ljsd.util.StringUtils;
  8. import com.ljsd.util.TimeUtil;
  9. import com.mongodb.BasicDBObject;
  10. import com.mongodb.DBObject;
  11. import org.apache.http.client.methods.CloseableHttpResponse;
  12. import org.apache.http.client.methods.HttpGet;
  13. import org.apache.http.client.utils.URIBuilder;
  14. import org.apache.http.impl.client.CloseableHttpClient;
  15. import org.apache.http.impl.client.HttpClients;
  16. import org.apache.http.util.EntityUtils;
  17. import org.slf4j.Logger;
  18. import org.slf4j.LoggerFactory;
  19. import javax.servlet.ServletException;
  20. import javax.servlet.http.HttpServlet;
  21. import javax.servlet.http.HttpServletRequest;
  22. import javax.servlet.http.HttpServletResponse;
  23. import java.io.IOException;
  24. import java.io.PrintWriter;
  25. import java.security.SecureRandom;
  26. import java.util.HashMap;
  27. import java.util.Map;
  28. public class CreateOrderController extends HttpServlet {
  29. private static final Logger LOGGER = LoggerFactory.getLogger(CreateOrderController.class);
  30. private static Gson gson = new Gson();
  31. private final static String _COLLECTION_PAY = "pay";
  32. public CreateOrderController() {
  33. super();
  34. }
  35. public void destroy() {
  36. super.destroy();
  37. }
  38. public void doGet(HttpServletRequest request, HttpServletResponse response)
  39. throws ServletException, IOException {
  40. this.doPost(request, response);
  41. }
  42. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  43. request.setCharacterEncoding("UTF-8");
  44. response.setCharacterEncoding("UTF-8");
  45. response.setContentType("application/json; charset=utf-8");
  46. // /CreatOrder?openid=test001&uid=10000026&region=10001&channel=Android_QuickGame&pay_item=4000&price=1800
  47. String uid = request.getParameter("uid");
  48. String openId = request.getParameter("openid");
  49. String serverId = request.getParameter("region");
  50. String channel = request.getParameter("channel");
  51. String payItem = request.getParameter("pay_item");
  52. String price = request.getParameter("price");
  53. LOGGER.info("CreateOrderController request = {}", request);
  54. ResMsg resMsg = new ResMsg();
  55. resMsg.setCode(1);
  56. String orderId = generateOrderNumber(uid);
  57. DBObject payInfo = new BasicDBObject();
  58. payInfo.put("uid", uid);
  59. payInfo.put("pay_item", payItem);
  60. payInfo.put("region", serverId);
  61. payInfo.put("channel", channel);
  62. payInfo.put("cporderId", orderId);
  63. payInfo.put("openid", openId);
  64. payInfo.put("creattime", String.valueOf(TimeUtil.getTimeNow()));
  65. payInfo.put("money", Integer.valueOf(price));
  66. BaseGlobal.getInstance().mongoDBPool.save(_COLLECTION_PAY, payInfo);
  67. Map<String,String> parms = new HashMap<>();
  68. parms.put("orderId", orderId);
  69. resMsg.setParms(parms);
  70. resMsg.setParms(parms);
  71. resMsg.setCode(1);
  72. try (PrintWriter out = response.getWriter();){
  73. resMsg.setCode(0);
  74. out.print(gson.toJson(resMsg));
  75. }catch (Exception e){
  76. e.printStackTrace();
  77. }
  78. }
  79. // 订单号规则:玩家uid-6位随机数-校验码
  80. // 订单号各部分长度(可根据需求调整)
  81. private static final int RANDOM_LENGTH = 6; // 随机数长度
  82. /**
  83. * 生成唯一订单号
  84. * @param userId 用户ID(需为正整数)
  85. * @return 订单号(格式:时间戳-用户ID-随机数-校验码)
  86. */
  87. public static String generateOrderNumber(String userId) {
  88. // 1. 生成6位随机数(000000-999999)
  89. String randomPart = generateRandomString(RANDOM_LENGTH);
  90. // 2. 计算校验码(简单示例:前几位的和模100)
  91. String checksum = calculateChecksum(userId + randomPart);
  92. // 3. 拼接最终订单号
  93. return String.join("-", userId, randomPart, checksum);
  94. }
  95. /**
  96. * 生成指定长度的随机数字字符串
  97. */
  98. private static String generateRandomString(int length) {
  99. SecureRandom random = new SecureRandom(); // 更安全的随机数生成器
  100. StringBuilder sb = new StringBuilder();
  101. for (int i = 0; i < length; i++) {
  102. sb.append(random.nextInt(10)); // 0-9随机数
  103. }
  104. return sb.toString();
  105. }
  106. /**
  107. * 计算简单校验码(示例:前N位之和模100)
  108. * @param source 源字符串(如时间戳+用户ID+随机数)
  109. * @return 校验码(2位数字)
  110. */
  111. private static String calculateChecksum(String source) {
  112. int sum = 0;
  113. for (char c : source.toCharArray()) {
  114. if (Character.isDigit(c)) {
  115. sum += Character.getNumericValue(c);
  116. }
  117. }
  118. int checksum = sum % 100; // 模100得到两位数
  119. return String.format("%02d", checksum);
  120. }
  121. }