package com.ljsd.controller; import com.google.gson.Gson; import com.ljsd.channel.Mock361YXSDK; import com.ljsd.channel.MockQuickSDK; import com.ljsd.pojo.ResMsg; import com.ljsd.util.BaseGlobal; import com.ljsd.util.StringUtils; import com.ljsd.util.TimeUtil; import com.mongodb.BasicDBObject; import com.mongodb.DBObject; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.utils.URIBuilder; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import java.security.SecureRandom; import java.util.HashMap; import java.util.Map; public class CreateOrderController extends HttpServlet { private static final Logger LOGGER = LoggerFactory.getLogger(CreateOrderController.class); private static Gson gson = new Gson(); private final static String _COLLECTION_PAY = "pay"; public CreateOrderController() { super(); } public void destroy() { super.destroy(); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); response.setContentType("application/json; charset=utf-8"); // /CreatOrder?openid=test001&uid=10000026®ion=10001&channel=Android_QuickGame&pay_item=4000&price=1800 String uid = request.getParameter("uid"); String openId = request.getParameter("openid"); String serverId = request.getParameter("region"); String channel = request.getParameter("channel"); String payItem = request.getParameter("pay_item"); String price = request.getParameter("price"); LOGGER.info("CreateOrderController request = {}", request); ResMsg resMsg = new ResMsg(); resMsg.setCode(1); String orderId = generateOrderNumber(uid); DBObject payInfo = new BasicDBObject(); payInfo.put("uid", uid); payInfo.put("pay_item", payItem); payInfo.put("region", serverId); payInfo.put("channel", channel); payInfo.put("cporderId", orderId); payInfo.put("openid", openId); payInfo.put("creattime", String.valueOf(TimeUtil.getTimeNow())); payInfo.put("money", Integer.valueOf(price)); BaseGlobal.getInstance().mongoDBPool.save(_COLLECTION_PAY, payInfo); Map parms = new HashMap<>(); parms.put("orderId", orderId); resMsg.setParms(parms); resMsg.setParms(parms); resMsg.setCode(1); try (PrintWriter out = response.getWriter();){ resMsg.setCode(0); out.print(gson.toJson(resMsg)); }catch (Exception e){ e.printStackTrace(); } } // 订单号规则:玩家uid-6位随机数-校验码 // 订单号各部分长度(可根据需求调整) private static final int RANDOM_LENGTH = 6; // 随机数长度 /** * 生成唯一订单号 * @param userId 用户ID(需为正整数) * @return 订单号(格式:时间戳-用户ID-随机数-校验码) */ public static String generateOrderNumber(String userId) { // 1. 生成6位随机数(000000-999999) String randomPart = generateRandomString(RANDOM_LENGTH); // 2. 计算校验码(简单示例:前几位的和模100) String checksum = calculateChecksum(userId + randomPart); // 3. 拼接最终订单号 return String.join("-", userId, randomPart, checksum); } /** * 生成指定长度的随机数字字符串 */ private static String generateRandomString(int length) { SecureRandom random = new SecureRandom(); // 更安全的随机数生成器 StringBuilder sb = new StringBuilder(); for (int i = 0; i < length; i++) { sb.append(random.nextInt(10)); // 0-9随机数 } return sb.toString(); } /** * 计算简单校验码(示例:前N位之和模100) * @param source 源字符串(如时间戳+用户ID+随机数) * @return 校验码(2位数字) */ private static String calculateChecksum(String source) { int sum = 0; for (char c : source.toCharArray()) { if (Character.isDigit(c)) { sum += Character.getNumericValue(c); } } int checksum = sum % 100; // 模100得到两位数 return String.format("%02d", checksum); } }