package com.jmfy.controller; import cn.hutool.core.util.XmlUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.jmfy.Application; import com.jmfy.dao.MongoConnectDao; import com.jmfy.handler.PayHandler; import com.jmfy.model.ServerInfo; import com.jmfy.modelVo.PayVo; import com.jmfy.redisProperties.RedisUserKey; import com.jmfy.sdk.SdkSign; import com.jmfy.util.*; import com.jmfy.util.loginRedis.TimeUtil; import com.ljsd.jieling.thrift.idl.Result; import com.ljsd.jieling.thrift.idl.itemData; import com.mongodb.BasicDBObject; import com.mongodb.DBCollection; import com.mongodb.DBObject; import org.apache.commons.lang.StringEscapeUtils; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.BasicQuery; import org.springframework.web.bind.annotation.*; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import javax.annotation.Resource; import javax.crypto.Cipher; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import java.io.BufferedReader; import java.io.IOException; import java.io.StringReader; import java.io.UnsupportedEncodingException; import java.net.InetAddress; import java.net.URLEncoder; import java.net.UnknownHostException; import java.security.KeyFactory; import java.security.PublicKey; import java.security.Signature; import java.security.spec.X509EncodedKeySpec; import java.util.*; import static com.jmfy.util.MD5Util.encrypByMd5; import static com.jmfy.util.SdkUtil.getOrderIdByTime; @RestController public class PayController { // private static final String _COLLECTION_NAME = "user_register_info"; private static final String _COLLECTION_NAME_Order = "order"; public static final Logger LOGGER = LoggerFactory.getLogger(PayController.class); @Resource private MongoConnectDao mongoConnectDao; @Resource private PayHandler payHandler; //生成订单号 (之前老的,现在没用到) @RequestMapping(value = "/order/genOrder", method = {RequestMethod.GET, RequestMethod.POST}) public void genOrder(String uid, HttpServletResponse response) { try { String orderId = uid + getOrderIdByTime(); MongoTemplate mongoTemplate; DBObject doc = new BasicDBObject(); //doc.put("_id", name); doc.put("uid", uid); doc.put("gameOrder", orderId); //存储 mongoTemplate = mongoConnectDao.getConnect().getMongoTemplete(Application.coreDb); DBCollection dBCollection = mongoTemplate.getCollection(_COLLECTION_NAME_Order); dBCollection.save(doc); JSONObject returnResult = new JSONObject(); returnResult.put("gameOrder", orderId); LOGGER.info("/sdk6kw/verify uid {} gameOrder {}", uid, returnResult.get("gameOrder")); response.setContentType("application/json"); response.getOutputStream().write(returnResult.toJSONString().getBytes()); } catch (Exception e) { e.printStackTrace(); } } /** * sdk统一创建订单接口 * * @param openid 玩家的openid * @param uid 玩家的uid * @param region 区服 * @param channel 渠道 * @param pay_item 支付项,支付表的id * @param price 金额 单位:分 * @param CurrencyCode 币种 * @return */ @RequestMapping(value = "/pay/CreatOrder", method = {RequestMethod.GET, RequestMethod.POST}) public String CreatOrder(String openid, int uid, int region, String channel, String pay_item, int price,String CurrencyCode, int devalueId) { try { if (channel == "" || channel == null) { channel = "0123"; } LOGGER.info("--CreatOrder日志:openid={},uid={},region={},channel={},pay_item={},price={},CurrencyCode={}",openid,uid,region,channel,pay_item,price,CurrencyCode); PayVo payVo = new PayVo(openid, uid, region, channel, pay_item, TimeUtil.getTimeStamp(System.currentTimeMillis()), price,CurrencyCode); String orderId = CreateUniqueCodeManager.createBillno(10031, 1); payVo.setBillno(orderId); MongoTemplate mongoTemplate = mongoConnectDao.getConnect().getMongoTemplete(Application.coreDb); int serverId = payVo.getRegion(); //查询mongo:客户端传的serverId找到合服后的对应的真实的serverId //Query query = new Query(); //Criteria cr = new Criteria(); //cr.andOperator(Criteria.where("server_id").is(serverId)); //query.addCriteria(cr); //ServerInfo serverInfo = mongoTemplate.findOne(query, ServerInfo.class); //查询mongo:客户端传的serverId找到合服后的对应的真实的serverId BasicQuery query = new BasicQuery(new BasicDBObject("server_id", serverId+"")); ServerInfo serverInfo = mongoTemplate.findOne(query, ServerInfo.class, "server_info"); if(serverInfo != null){ serverId = serverInfo.getRealServerId(); payVo.setRegion(serverId); } LOGGER.info("--CreatOrder日志01:region={}, serverId={},serverInfo={},query={}",payVo.getRegion(),serverId, JSON.toJSON(serverInfo),JSON.toJSON(query)); String rpcString = RedisUtil.getInstence().getObject(RedisUserKey.LOGIC_SERVER_INFO, String.valueOf(serverId), String.class, -1); LOGGER.info("rpcString " + rpcString); if (null == rpcString) { LOGGER.error("serverAddress not exist"); } String thriftIp = rpcString.split(":")[0]; String thriftPort = rpcString.split(":")[3]; if (thriftIp == null || thriftIp.isEmpty() || null == thriftPort || thriftPort.isEmpty()) { LOGGER.error("serverAddress not exist"); } else { //判断达到最大购买次数 long now = System.currentTimeMillis(); Result resultOrder = RPCClient.deliveryOrder(thriftIp, thriftPort, uid, pay_item, now, orderId, devalueId); if (resultOrder.getResultCode() != 1) { LOGGER.info("processOrder uid={}, goodsId={}, orderTime={},serverId={},errCode={},msg={},orderId={}",uid,pay_item,now,serverId,resultOrder.getResultCode(),resultOrder.getResultMsg(),orderId); JSONObject returnResult = new JSONObject(); returnResult.put("errCode", resultOrder.getResultCode()); returnResult.put("msg", resultOrder.getResultMsg()); returnResult.put("orderId", orderId); return returnResult.toJSONString(); } LOGGER.info("processOrder uid=" + uid + " goodsId = " + pay_item + " orderTime = " + now + " serverId = " + serverId + " CreatOrder is ok "); } mongoTemplate.insert(payVo); JSONObject returnResult = new JSONObject(); //returnResult.put("errCode", 1); //正确的不返回errCode,客户端要求 returnResult.put("msg", ""); returnResult.put("orderId", orderId); return returnResult.toJSONString(); } catch (Exception ex) { ex.printStackTrace(); } return null; } @RequestMapping(value = "/pay/sign", method = {RequestMethod.GET, RequestMethod.POST}) public JSONObject CreatOrder(String channel, String game_area, Integer game_guid, String game_orderid, String game_price, String subject) { JSONObject returnResult = new JSONObject(); StringBuilder sb = new StringBuilder(); switch (channel){ case "Android_XiaoQi": sb.append("game_area=").append(game_area).append("&"); sb.append("game_guid=").append(game_guid).append("&"); sb.append("game_orderid=").append(game_orderid).append("&"); sb.append("game_price=").append(game_price).append("&"); sb.append("subject=").append(subject); sb.append(Constant.X7_PUBLIC_KEY); returnResult.put("game_sign", MD5Util.encrypByMd5(sb.toString())); break; default: returnResult.put("code", 600); returnResult.put("msg", "channel not exist"); returnResult.put("game_sign", ""); return returnResult; } LOGGER.info("pay order channel:{}, param: {}", channel, sb); return returnResult; } @RequestMapping(value = "/pay/xiaomiOrder", method = {RequestMethod.GET, RequestMethod.POST}) public JSONObject xiaomiOrder(HttpServletRequest request) { try { JSONObject json = new JSONObject(); String appId = request.getParameter("appId");// 应用ID String cpOrderId = request.getParameter("cpOrderId");// 开发商订单ID String cpUserInfo = request.getParameter("cpUserInfo");// 开发商透传信息 String xiaomiUid = request.getParameter("uid");// 用户ID String orderId = request.getParameter("orderId");// 游戏平台订单ID String orderStatus = request.getParameter("orderStatus");// 订单状态TRADE_SUCCESS代表成功 String amonut = request.getParameter("payFee");// 支付金额,单位为分,即0.01 米币 String productCode = request.getParameter("productCode");// 商品代码 String productName = request.getParameter("productName");// 商品名称 String productCount = request.getParameter("productCount");// 商品数量 String payTime = request.getParameter("payTime");// 支付时间,格式 yyyy-MM-dd // HH:mm:ss String partnerGiftConsume = request.getParameter("partnerGiftConsume"); // 可选,使用游戏券金额 // (如果订单使用游戏券则有,long型),如果有则参与签名 String signature = request.getParameter("signature");// 签名:以上参数按字母顺序排序然后进行签名。 String parameterView = "appId:" + appId + ",cpOrderId:" + cpOrderId + ",cpUserInfo:" + cpUserInfo + ",uid:" + xiaomiUid + ",orderId:" + orderId + ",orderStatus:" + orderStatus + ",payFee:" + amonut + ",productCode:" + productCode + ",productName:" + productName + ",productCount:" + productCount + ",payTime:" + payTime + ",signature:" + signature; //if (LOGGER.isDebugEnabled()) { LOGGER.debug("pay:xiaomi," + parameterView); if (StringUtils.isEmpty(appId) || StringUtils.isEmpty(cpOrderId) || StringUtils.isEmpty(cpUserInfo) || StringUtils.isEmpty(xiaomiUid) || StringUtils.isEmpty(orderId) || StringUtils.isEmpty(orderStatus) || StringUtils.isEmpty(amonut) || StringUtils.isEmpty(productCode) || StringUtils.isEmpty(productName) || StringUtils.isEmpty(productCount) || StringUtils.isEmpty(payTime) || StringUtils.isEmpty(signature)) { LOGGER.error("pay:xiaomi,errcode:0,parameter has null," + parameterView); json.put("errcode", 0); json.put("errMsg", "接收失败,回调参数有误"); return json; } // 订单状态 TRADE_SUCCESS 代表成功 if (!"TRADE_SUCCESS".equals(orderStatus)) { LOGGER.error("pay:xiaomi,errcode:0,orderStatus is not TRADE_SUCCESS," + parameterView); json.put("errcode", 0); json.put("errMsg", "订单状态支付不成功"); return json; } if (!Constant.XIAOMIAPPID.equals(appId)) { LOGGER.error("pay:xiaomi,errcode:1515,appId is error," + parameterView); json.put("errcode", 1515); json.put("errMsg", "appId 错误"); return json; } // 游戏券金额,有则参与签名 String encryptText = ""; if (StringUtils.isEmpty(partnerGiftConsume)) { encryptText = String.format("appId=%s&cpOrderId=%s&cpUserInfo=%s&orderId=%s&orderStatus=%s&payFee=%s&payTime=%s&productCode=%s&productCount=%s&productName=%s&uid=%s", Constant.XIAOMIAPPID, cpOrderId, cpUserInfo, orderId, orderStatus, amonut, payTime, productCode, productCount, productName, xiaomiUid); } else { encryptText = String.format("appId=%s&cpOrderId=%s&cpUserInfo=%s&orderId=%s&orderStatus=%s&partnerGiftConsume=%s&payFee=%s&payTime=%s&productCode=%s&productCount=%s&productName=%s&uid=%s", Constant.XIAOMIAPPID, cpOrderId, cpUserInfo, orderId, orderStatus, partnerGiftConsume, amonut, payTime, productCode, productCount, productName, xiaomiUid); } String sign = SdkSign.xiaomiSign(encryptText, Constant.XIAOMIAPPSECRET); if (signature.equals(sign)) { PayHandler payHandler = new PayHandler(); int payres = payHandler.processOrder(cpOrderId, orderId); if (payres == 1) { json.put("errcode", 200); json.put("errMsg", "发货成功"); return json; } else { LOGGER.error("pay:xiaomi,errcode:3515,cpUserInfo is error," + parameterView); json.put("errcode", 3515); json.put("errMsg", "订单信息不一致"); return json; } } else { LOGGER.error("pay:xiaomi,errcode:1525,signature check error," + parameterView); json.put("errcode", 1525); json.put("errMsg", "signature 错误"); return json; } } catch (Exception ex) { ex.printStackTrace(); } return null; } @RequestMapping(value = "/pay/weiweiOrder", method = {RequestMethod.POST}) public String gameNoticeInterface(String out_trade_no, String price, int pay_status, String extend, String signType, String sign) { try { /* @param orderId 游戏订单号 * @param out_trade_no 渠道订单号 */ LOGGER.info("pay:gameNoticeInterface, out_trade_no={},price={},pay_status={},extend={},sign={}", out_trade_no, price, pay_status, extend, sign); String[] extendStrs = extend.split("_"); String orderId = extendStrs[3]; String context = out_trade_no + price + pay_status + extend + Constant.WEIWEIORDERKEY; String mySign = MD5Util.encrypByMd5(context); if (!mySign.equals(sign)) { LOGGER.error("pay:gameNoticeInterface,sign err, sign={},mySign={}", sign, mySign); return "sign err!"; } // PayHandler payHandler = new PayHandler(); // 统一发货接口 int payres = payHandler.processOrder(orderId, out_trade_no); // 成功 if (payres == 1) { return "success"; } else if (payres == -1) { LOGGER.error("pay:gameNoticeInterface, {} 订单不存在,", orderId); } else if (payres == -2) { LOGGER.error("pay:gameNoticeInterface, {} 订单参数错误,", orderId); } else if (payres == -3) { LOGGER.error("pay:gameNoticeInterface, {} 服务器配置错误,", orderId); } else if (payres == -4) { LOGGER.error("pay:gameNoticeInterface, {} 充值失败,", orderId); } else { LOGGER.error("pay:gameNoticeInterface, {} 返回错误,", orderId); return "err"; } } catch (Exception ex) { ex.printStackTrace(); } return "err"; } /** * 百度sdk回调 * * @param AppID 应用 ID * @param OrderSerial SDK 系统内部订单号 * @param CooperatorOrderSerial CP 订单号 * @param Sign 签名 * @param Content 数据结构:JSO N 编码格式: UTF8,Base64 编码 * @return 线上回调地址:http://120.131.0.103:9076/idip/sfzb/pay/baiduNotify */ @RequestMapping(value = "/pay/baiduNotify", method = {RequestMethod.POST}) public JSONObject payBaiduNotify(int AppID, String OrderSerial, String CooperatorOrderSerial, String Content, String Sign) { JSONObject json = new JSONObject(); try { LOGGER.info("payBaiduNotify, AppID={},OrderSerial={},CooperatorOrderSerial={},Sign={},Content={}", AppID, OrderSerial, CooperatorOrderSerial, Sign, Content); //请求参数签名方式: MD5(AppID+OrderSerial+CooperatorOrderSerial+Content+AppSecret) String context = AppID + OrderSerial + CooperatorOrderSerial + Content + Constant.BAIDU_SECRET_KEY; String mySign = MD5Util.encrypByMd5(context); json.put("AppID",AppID); json.put("Sign",mySign); if (!mySign.equals(Sign)) { LOGGER.error("pay:gameNoticeInterface,sign err, sign={},mySign={}", Sign, mySign); json.put("ResultMsg","Sign err"); json.put("ResultCode",91); return json; } if (Constant.BAIDU_APPID != AppID) { LOGGER.error("pay:baiduNotify,appId is error,BAIDU_APPID =" + Constant.BAIDU_APPID + ",AppID =" + AppID); json.put("ResultMsg","AppID err"); json.put("ResultCode",91); return json; } String orderId = CooperatorOrderSerial; String out_trade_no = OrderSerial; JSONObject jsonObj = JSONObject.parseObject(Content); int payId = jsonObj.getIntValue("PayId"); //pay_source, — 付款渠道, 0表示为微信支付, 1表示支付宝支付, 2表示苹果支付, 3表示谷歌支付,4 表示onestore, 5 表示mycard, // 统一发货接口 int payres = payHandler.processOrder(orderId, out_trade_no,String.valueOf(payId)); //orderId 游戏订单号 out_trade_no 渠道订单号 // 成功 if (payres == 1) { json.put("ResultMsg","success"); json.put("ResultCode",1); return json; } else if (payres == -1) { LOGGER.error("pay:gameNoticeInterface, {} 订单不存在,", orderId); } else if (payres == -2) { LOGGER.error("pay:gameNoticeInterface, {} 订单参数错误,", orderId); } else if (payres == -3) { LOGGER.error("pay:gameNoticeInterface, {} 服务器配置错误,", orderId); } else if (payres == -4) { LOGGER.error("pay:gameNoticeInterface, {} 充值失败,", orderId); } else { LOGGER.error("pay:gameNoticeInterface, {} 返回错误,", orderId); json.put("ResultMsg","err"); json.put("ResultCode",91); return json; } } catch (Exception ex) { ex.printStackTrace(); } json.put("ResultMsg","err"); json.put("ResultCode",91); return json; } /** * 百度sdk回调 测试 * * @param AppID 应用 ID * @param OrderSerial SDK 系统内部订单号 * @param CooperatorOrderSerial CP 订单号 * @param Sign 签名 * @param Content 数据结构:JSO N 编码格式: UTF8,Base64 编码 * @return 线上回调地址:http://120.131.0.103:9076/idip/sfzb/pay/baiduTestNotify */ @RequestMapping(value = "/pay/baiduTestNotify", method = {RequestMethod.POST}) public JSONObject payBaiduTestNotify(int AppID, String OrderSerial, String CooperatorOrderSerial, String Content, String Sign) { JSONObject json = new JSONObject(); try { LOGGER.info("payBaiduNotify, AppID={},OrderSerial={},CooperatorOrderSerial={},Sign={},Content={}", AppID, OrderSerial, CooperatorOrderSerial, Sign, Content); //请求参数签名方式: MD5(AppID+OrderSerial+CooperatorOrderSerial+Content+AppSecret) String context = AppID + OrderSerial + CooperatorOrderSerial + Content + Constant.BAIDU_TEST_SECRET_KEY; String mySign = MD5Util.encrypByMd5(context); json.put("AppID",AppID); json.put("Sign",mySign); if (!mySign.equals(Sign)) { LOGGER.error("pay:gameNoticeInterface,sign err, sign={},mySign={}", Sign, mySign); json.put("ResultMsg","Sign err"); json.put("ResultCode",91); return json; } // if (Constant.BAIDU_TEST_APPID != AppID) { // LOGGER.error("pay:baiduNotify,appId is error,BAIDU_TEST_APPID =" + Constant.BAIDU_TEST_APPID + ",AppID =" + AppID); // json.put("ResultMsg","AppID err"); // json.put("ResultCode",91); // return json; // } String orderId = CooperatorOrderSerial; String out_trade_no = OrderSerial; JSONObject jsonObj = JSONObject.parseObject(Content); int payId = jsonObj.getIntValue("PayId"); //pay_source, — 付款渠道, 0表示为微信支付, 1表示支付宝支付, 2表示苹果支付, 3表示谷歌支付,4 表示onestore, 5 表示mycard, // 统一发货接口 int payres = payHandler.processOrder(orderId, out_trade_no,String.valueOf(payId)); //orderId 游戏订单号 out_trade_no 渠道订单号 // 成功 if (payres == 1) { json.put("ResultMsg","success"); json.put("ResultCode",1); return json; } else if (payres == -1) { LOGGER.error("pay:gameNoticeInterface, {} 订单不存在,", orderId); } else if (payres == -2) { LOGGER.error("pay:gameNoticeInterface, {} 订单参数错误,", orderId); } else if (payres == -3) { LOGGER.error("pay:gameNoticeInterface, {} 服务器配置错误,", orderId); } else if (payres == -4) { LOGGER.error("pay:gameNoticeInterface, {} 充值失败,", orderId); } else { LOGGER.error("pay:gameNoticeInterface, {} 返回错误,", orderId); json.put("ResultMsg","err"); json.put("ResultCode",91); return json; } } catch (Exception ex) { ex.printStackTrace(); } json.put("ResultMsg","err"); json.put("ResultCode",91); return json; } @RequestMapping(value = "/pay/test") public String gameNoticeInterface(String out_trade_no) throws Exception { int payHandle1r = payHandler.processOrder(out_trade_no, out_trade_no); return "1"; } @RequestMapping(value = "/pay/6kwotherNotify", method = {RequestMethod.POST}) public String sixkwotherNotify(int appid, String data, String sign) { try { LOGGER.info("6kwotherNotify, AppID={},data={},Sign={}", appid, data, sign); if (appid != Constant.SIXKW_OTHER_APPID) { LOGGER.info("6kwotherNotify appid error"); return "fail"; } //请求参数签名方式: MD5(AppID+OrderSerial+CooperatorOrderSerial+Content+AppSecret) Map mapObj = JSONObject.parseObject(data, Map.class); String bodyUrl = StringUtil.mapToString(mapObj); String context = Constant.SIXKW_OTHER_APPID + bodyUrl + Constant.SIXKW_OTHER_PAY_SECRER; LOGGER.info("6kwotherNotify sign str {}", context); String mySign = MD5Util.encrypByMd5(context); if (!mySign.equals(sign)) { LOGGER.error("pay:gameNoticeInterface,sign err, sign={},mySign={}", sign, mySign); return "91"; } String orderId = String.valueOf(mapObj.get("cpOrder")); String out_trade_no = String.valueOf(mapObj.get("orderId")); // 统一发货接口 int payres = payHandler.processOrder(orderId, out_trade_no); //orderId 游戏订单号 out_trade_no 渠道订单号 // 成功 if (payres == 1) { return "SUCCESS"; } else if (payres == -1) { LOGGER.error("pay:gameNoticeInterface, {} 订单不存在,", orderId); } else if (payres == -2) { LOGGER.error("pay:gameNoticeInterface, {} 订单参数错误,", orderId); } else if (payres == -3) { LOGGER.error("pay:gameNoticeInterface, {} 服务器配置错误,", orderId); } else if (payres == -4) { LOGGER.error("pay:gameNoticeInterface, {} 充值失败,", orderId); } else { LOGGER.error("pay:gameNoticeInterface, {} 返回错误,", orderId); return "err"; } } catch (Exception ex) { ex.printStackTrace(); } return "err"; } @RequestMapping(value = "/pay/6kwNotify") public String sixkwNotify(HttpServletRequest request) { try { JSONObject responseObj = new JSONObject(); int resultCode = Constant.CODE_SUCCESS; BufferedReader br; br = request.getReader(); String str, wholeStr = ""; while ((str = br.readLine()) != null) { wholeStr += str; } String jsonStr = wholeStr; String exam = Constant.SIXKW_PAY_SECRER; String tmpSign = encrypByMd5(jsonStr + exam); String sign = request.getHeader("AUTH6KW"); LOGGER.info("notify jsonStr {} tmpSign {} sign {}", jsonStr, tmpSign, sign); if (!tmpSign.equals(sign)) { LOGGER.error("pay:gameNoticeInterface,sign err, sign={},mySign={}", sign, tmpSign); return "91"; } JSONObject obj = JSON.parseObject(jsonStr); String orderId = String.valueOf(obj.get("gameOrder")); String out_trade_no = String.valueOf(obj.get("orderID")); // 统一发货接口 int payres = payHandler.processOrder(orderId, out_trade_no); //orderId 游戏订单号 out_trade_no 渠道订单号 // 成功 if (payres == 1) { return "SUCCESS"; } else if (payres == -1) { LOGGER.error("pay:gameNoticeInterface, {} 订单不存在,", orderId); } else if (payres == -2) { LOGGER.error("pay:gameNoticeInterface, {} 订单参数错误,", orderId); } else if (payres == -3) { LOGGER.error("pay:gameNoticeInterface, {} 服务器配置错误,", orderId); } else if (payres == -4) { LOGGER.error("pay:gameNoticeInterface, {} 充值失败,", orderId); } else { LOGGER.error("pay:gameNoticeInterface, {} 返回错误,", orderId); return "err"; } } catch (Exception ex) { ex.printStackTrace(); } return "err"; } /** * 唯4366支付回调 * @param order_id 平台订单号 * @param user_id 平台用户 ID * @param server_id 区服 ID(CP 区服 ID) * @param money 充值金额,单位元 * @param extra_info 透传参数 * @param time 当前时间戳 * @param sign 签名: md5(order_id+ user_id+server_id+money+extra_info+time +'#'+ secret_key) * @param sandbox 是否是测试订单,1:是: 0:否 * @return 线上回调地址:http://120.131.0.103:9076/idip/sfzb/pay/payWeiWei4366Notify */ @RequestMapping(value = "/pay/payWeiWei4366Notify", method = {RequestMethod.POST,RequestMethod.GET}) public JSONObject payWeiWei4366Notify(HttpServletRequest request,String order_id, String user_id, String server_id, String money, String extra_info,int time,String sign,String sandbox) { JSONObject json = new JSONObject(); try { List ipWhiteList = new ArrayList<>(); ipWhiteList.add("119.23.175.96"); ipWhiteList.add("120.77.12.228"); ipWhiteList.add("119.23.24.106"); ipWhiteList.add("120.78.192.221"); ipWhiteList.add("14.29.126.78"); ipWhiteList.add("14.23.117.83"); ipWhiteList.add("121.8.199.83"); ipWhiteList.add("47.106.234.30"); ipWhiteList.add("112.74.113.198"); ipWhiteList.add("27.18.94.43"); //获取自己游戏订单id ,通过extra_info字段穿透传值 String[] split = extra_info.split("_"); String self_OrderId = split[3].substring(0,split[3].length()-2); String ipAddr = getIpAddr(request); LOGGER.info("payWeiWei4366Notify, order_id={},user_id={},server_id={},money={},extra_info={},time={},sign={},sandbox={},ip={},self_OrderId={}", order_id, user_id, server_id, money, extra_info,time,sign,sandbox,ipAddr,self_OrderId); boolean contains = ipWhiteList.contains(ipAddr); if(!contains){ LOGGER.error("pay:payWeiWei4366Notify, ip = {},白名单ip = {}, ip错误,不在白名单中!!!,", ipAddr,ipWhiteList.toString()); json.put("state",2); json.put("msg","请勿非法提交订单,如有问题请联系客服!!!"); return json; } //签名: md5(order_id+ user_id+server_id+money+extra_info+time +'#'+ secret_key) String context = order_id + user_id + server_id + money + extra_info + time +'#'+ Constant.WEIWEI_4366_SECRET_KEY ; String mySign = MD5Util.encrypByMd5(context); json.put("Sign",mySign); json.put("order_id",order_id); json.put("user_id",user_id); json.put("server_id",server_id); // json.put("money",money); // json.put("extra_info",extra_info); // json.put("time",time); // json.put("sign",sign); if (!mySign.equals(sign)) { LOGGER.error("pay:gameNoticeInterface,sign err, sign={},mySign={}", sign, mySign); json.put("state",0); json.put("msg","Sign err"); return json; } // if (Constant.BAIDU_APPID != AppID) { // LOGGER.error("pay:baiduNotify,appId is error,BAIDU_APPID =" + Constant.BAIDU_APPID + ",AppID =" + AppID); // json.put("ResultMsg","AppID err"); // json.put("ResultCode",91); // return json; // } String orderId = self_OrderId; String out_trade_no = order_id; //JSONObject jsonObj = JSONObject.parseObject(Content); //int payId = jsonObj.getIntValue("PayId"); //pay_source, — 付款渠道, 0表示为微信支付, 1表示支付宝支付, 2表示苹果支付, 3表示谷歌支付,4 表示onestore, 5 表示mycard, int amount =Double.valueOf(money).intValue()*100; //元转为分 (带小数点字符串转int类型) // 统一发货接口 // int payres = payHandler.processOrder(orderId, out_trade_no,String.valueOf(payId)); //orderId 游戏订单号 out_trade_no 渠道订单号 int payres = payHandler.processOrderNew(orderId, out_trade_no,amount); //orderId 游戏订单号 out_trade_no 渠道订单号,amount 支付金额 单位分 // 统一发货接口 // int payres = 0; // if(sandbox.equals(0)){ //正式订单 (是否是测试订单,1:是: 0:否) // payHandler.processOrder(orderId, out_trade_no); //orderId 游戏订单号 out_trade_no 渠道订单号 // }else if(sandbox.equals(1)){ //测试订单 // payHandler.processOrderTest(orderId, out_trade_no); //orderId 游戏订单号 out_trade_no 渠道订单号 // } // 成功 if (payres == 1) { json.put("state",1); json.put("msg","充值成功/重复充值"); return json; } else if (payres == -1) { LOGGER.error("pay:gameNoticeInterface, {} 订单不存在,", orderId); } else if (payres == -2) { LOGGER.error("pay:gameNoticeInterface, {} 订单参数错误,", orderId); } else if (payres == -3) { LOGGER.error("pay:gameNoticeInterface, {} 服务器配置错误,", orderId); } else if (payres == -4) { LOGGER.error("pay:gameNoticeInterface, {} 充值失败,", orderId); } else { LOGGER.error("pay:gameNoticeInterface, {} 返回错误,", orderId); json.put("state",2); json.put("msg","err"); return json; } } catch (Exception ex) { ex.printStackTrace(); } json.put("state",3); json.put("msg","err"); return json; } /** * 支付回调:赤兔回调 * @param request * @param uid 用户ID(唯一) * @param order_id 平台方订单号 * @param server 服务器唯一标识 * @param amount 金额/单位元 * @param extra 透传参数, 在SDK传入, 回调原样返回 * @param sandbox 是否是测试订单,1:是: 0:否 * @param timestamp 服务器时间戳, 秒 * @param sign MD5签名: sign = md5(uid + order_id + server + amount + extra + sandbox + timestamp + key) * @return 线上回调地址:http://cn_pay.caiyanghuyu.com/idip/sfzb/pay/chituNotify */ @RequestMapping(value = "/pay/chituNotify", method = {RequestMethod.POST,RequestMethod.GET}) public JSONObject chituNotify(HttpServletRequest request,String uid, String order_id, String server, String amount, String extra,String sandbox,String timestamp,String sign) { JSONObject json = new JSONObject(); try { List ipWhiteList = new ArrayList<>(); ipWhiteList.add("159.75.250.101"); ipWhiteList.add("159.75.228.66"); ipWhiteList.add("42.193.162.86"); ipWhiteList.add("106.52.165.154"); ipWhiteList.add("81.71.37.182"); ipWhiteList.add("113.108.204.50"); //wifi的ip String strUnEscapeHTML = StringEscapeUtils.unescapeHtml(extra); //获取自己游戏订单id ,通过extra字段穿透传值 String[] split = strUnEscapeHTML.split("_"); String self_OrderId = split[3].substring(0,split[3].length()-2); String ipAddr = getIpAddr(request); LOGGER.info("chituNotify, uid={},order_id={},server={},amount={},extra={},sandbox={},timestamp={},sign={},ip={},self_OrderId={}", uid, order_id, server, amount, strUnEscapeHTML,sandbox,timestamp,sign,ipAddr,self_OrderId); boolean contains = ipWhiteList.contains(ipAddr); if(!contains){ LOGGER.error("pay:chituNotify, ip = {},白名单ip = {}, ip错误,不在白名单中!!!,", ipAddr,ipWhiteList.toString()); json.put("state",2); json.put("msg","请勿非法提交订单,如有问题请联系客服!!!"); return json; } // MD5签名: sign = md5(uid + order_id + server + amount + extra + sandbox + timestamp + key) String context = uid + order_id + server + amount + extra + sandbox + timestamp + Constant.CHITU_SECRET_KEY ; String mySign = MD5Util.encrypByMd5(context); json.put("Sign",mySign); json.put("order_id",order_id); json.put("user_id",uid); json.put("server_id",server); // json.put("money",money); // json.put("extra_info",extra_info); // json.put("time",time); // json.put("sign",sign); if (!mySign.equals(sign)) { LOGGER.error("----签名不一致----pay:chituNotify,sign err, sign={},mySign={}", sign, mySign); json.put("state",0); json.put("msg","Sign err"); return json; } String orderId = self_OrderId; String out_trade_no = order_id; //JSONObject jsonObj = JSONObject.parseObject(Content); //int payId = jsonObj.getIntValue("PayId"); //pay_source, — 付款渠道, 0表示为微信支付, 1表示支付宝支付, 2表示苹果支付, 3表示谷歌支付,4 表示onestore, 5 表示mycard, int money =Double.valueOf(amount).intValue()*100; //元转为分 (带小数点字符串转int类型) // 统一发货接口 // int payres = payHandler.processOrder(orderId, out_trade_no,String.valueOf(payId)); //orderId 游戏订单号 out_trade_no 渠道订单号 int payres = payHandler.processOrderNew(orderId, out_trade_no,money); //orderId 游戏订单号 out_trade_no 渠道订单号,amount 支付金额 单位分 // 统一发货接口 // int payres = 0; // if(sandbox.equals(0)){ //正式订单 (是否是测试订单,1:是: 0:否) // payHandler.processOrder(orderId, out_trade_no); //orderId 游戏订单号 out_trade_no 渠道订单号 // }else if(sandbox.equals(1)){ //测试订单 // payHandler.processOrderTest(orderId, out_trade_no); //orderId 游戏订单号 out_trade_no 渠道订单号 // } // 成功 if (payres == 1) { json.put("status",0); json.put("msg","充值成功/重复充值"); return json; } else if (payres == -1) { LOGGER.error("pay:gameNoticeInterface, {} 订单不存在,", orderId); } else if (payres == -2) { LOGGER.error("pay:gameNoticeInterface, {} 订单参数错误,", orderId); } else if (payres == -3) { LOGGER.error("pay:gameNoticeInterface, {} 服务器配置错误,", orderId); } else if (payres == -4) { LOGGER.error("pay:gameNoticeInterface, {} 充值失败,", orderId); } else { LOGGER.error("pay:gameNoticeInterface, {} 返回错误,", orderId); json.put("status",2); json.put("msg","err"); return json; } } catch (Exception ex) { ex.printStackTrace(); } json.put("status",3); json.put("msg","err"); return json; } /** * 支付回调:韩国回调 * @param request * @param userId 用户ID * @param transactionId 订单号(GPA-xxxx-xxxx-) * @param store 商店信息(apple、google、one) * @param projectId 项目ID * @param productId Google/Apple/ONE Store中注册的商品ID * @param platform 操作平台信息(android、ios) * @param payment 支付方式 * @param uniqueId 唯一ID(调用purchase api时输入的uniqueId) * @param gamepotOrderId GAMEPOT Order ID * @param serverId serverId(调用purchase api时输入的serverId) * @param playerId playerId(调用purchase api时输入的playerId) * @param tp 1:测试支付 0:一般支付 * @param etc etc(调用purchase api时输入的 etc) * 说明文档: https://guide.ncloud-docs.com/docs/zh/game-gamepotserver * 线上回调地址:http://acpay.ilod.co.kr/idip/sfzb/pay/ilodNotify */ @RequestMapping(value = "/pay/ilodNotify", method = {RequestMethod.POST,RequestMethod.GET}) public JSONObject ilodNotify(HttpServletRequest request,String userId, String transactionId,String store, String projectId, String productId, String platform,String payment,String uniqueId,String gamepotOrderId,String serverId,String playerId,int tp,String etc) { JSONObject json = new JSONObject(); try { List ipWhiteList = new ArrayList<>(); ipWhiteList.add("49.236.143.202"); ipWhiteList.add("49.236.143.198"); ipWhiteList.add("106.10.53.19"); ipWhiteList.add("106.10.52.84"); String ipAddr = getIpAddr(request); LOGGER.info("ilodNotify, userId={},transactionId={},store={},projectId={},productId={},platform={},payment={},uniqueId={},gamepotOrderId={},serverId={},playerId={},tp={},etc={},ip={}", userId, transactionId, store, projectId, productId,platform,payment,uniqueId,gamepotOrderId,serverId,playerId,tp,etc,ipAddr); //获取自己游戏订单id ,通过extra_info字段穿透传值 String[] split = etc.split("_"); String self_OrderId = split[3].substring(0,split[3].length()-2); boolean contains = ipWhiteList.contains(ipAddr); if(!contains){ LOGGER.error("pay:ilodNotify, ip = {},白名单ip = {}, ip错误,不在白名单中!!!,", ipAddr,ipWhiteList.toString()); json.put("status",0); json.put("message","请勿非法提交订单,如有问题请联系客服!!!"); return json; } String orderId = self_OrderId; String out_trade_no = transactionId; // 统一发货接口 // int payres = payHandler.processOrderNew(orderId, out_trade_no,0); //orderId 游戏订单号 out_trade_no 渠道订单号,amount 支付金额 单位分 // 统一发货接口 int payres = 0; if(tp==0){ //正式订单 (0:一般支付,1:测试支付) payres = payHandler.processOrderNew(orderId, out_trade_no,0); //orderId 游戏订单号 out_trade_no 渠道订单号 }else if(tp==1){ //测试订单 payres = payHandler.processOrderTest(orderId, out_trade_no); //orderId 游戏订单号 out_trade_no 渠道订单号 } // 成功 if (payres == 1) { json.put("status",1); json.put("message","充值成功/重复充值"); return json; } else if (payres == -1) { LOGGER.error("pay:gameNoticeInterface, {} 订单不存在,", orderId); } else if (payres == -2) { LOGGER.error("pay:gameNoticeInterface, {} 订单参数错误,", orderId); } else if (payres == -3) { LOGGER.error("pay:gameNoticeInterface, {} 服务器配置错误,", orderId); } else if (payres == -4) { LOGGER.error("pay:gameNoticeInterface, {} 充值失败,", orderId); } else { LOGGER.error("pay:gameNoticeInterface, {} 返回错误,payres = {}", orderId,payres); json.put("status",0); json.put("message","Pay Fail EerrorCord:001"); return json; } } catch (Exception ex) { ex.printStackTrace(); } json.put("status",0); json.put("message","Pay Fail EerrorCord:002"); return json; } /** * 支付回调:韩国优惠劵回调 * @param request * @param userId 用户ID(唯一) * @param projectId 项目ID * @param platform 操作平台信息(android、ios) * @param store 商店信息(apple、google、one) * @param title 在仪表盘 > 游戏 > 送礼物 > 标题中输入的值 * @param content 在仪表盘 > 游戏 > 送礼物 > 标题中输入的值 * @param target 在仪表盘 > 游戏 > 送礼物 > 标题中输入的值 * @param expireMs 在仪表盘 > 游戏 > 送礼物 > 有效期中输入的值时间戳(GMT+9) * @param userData 调用优惠券API时,在第二个参数中输入的值 * @param itemId itemData Array - itemData(JSON) {"item_id" : String, "store_item_id" : String, "count" : Number} * item_id:在仪表盘游戏 > 道具中创建的道具项目的唯一ID * store_item_id:要发放的道具ID * count:要发放的道具的数量 * 说明文档:https://guide.ncloud-docs.com/docs/zh/game-gamepotserver * 优惠劵线上回调地址:http://acpay.ilod.co.kr/idip/sfzb/pay/ilodCouponNotify */ @RequestMapping(value = "/pay/ilodCouponNotify", method = {RequestMethod.POST,RequestMethod.GET}) // public JSONObject ilodCouponNotify(HttpServletRequest request,String userId, String projectId,String platform, String store, String title, String content,String target,String expireMs,String userData,List itemId) { public JSONObject ilodCouponNotify(HttpServletRequest request,String userId, String projectId,String platform, String store, String title, String content,String target,String expireMs,String userData,String itemId) { JSONObject json = new JSONObject(); try { List ipWhiteList = new ArrayList<>(); ipWhiteList.add("49.236.143.202"); ipWhiteList.add("49.236.143.198"); ipWhiteList.add("106.10.53.19"); ipWhiteList.add("106.10.52.84"); String ipAddr = getIpAddr(request); List itemDataList = readListValue(itemId, itemData.class); LOGGER.info("ilodCouponNotify, userId={},projectId={},platform={},store={},title={},content={},target={},expireMs={},ip={},userData={},itemId={}", userId, projectId, platform, store, title,content,target,expireMs,ipAddr,userData,itemId); //获取自己游戏订单id ,通过userData字段穿透传值 String[] split = userData.split("#"); int gameUserId = Integer.parseInt(split[0]); //游戏里角色Id = userId int serverId = Integer.parseInt(split[1]); //服务器Id String couponCode = split[2]; //兑换码 boolean contains = ipWhiteList.contains(ipAddr); if(!contains){ LOGGER.error("pay:ilodCouponNotify, ip = {},白名单ip = {}, ip错误,不在白名单中!!!,", ipAddr,ipWhiteList.toString()); json.put("status",0); json.put("msg","请勿非法提交订单,如有问题请联系客服!!!"); return json; } // 优惠劵 发货接口 int payres = payHandler.processCoupon(gameUserId,serverId,couponCode,title,content,itemDataList); // 统一发货接口 // int payres = 0; // if(sandbox.equals(0)){ //正式订单 (是否是测试订单,1:是: 0:否) // payHandler.processOrder(orderId, out_trade_no); //orderId 游戏订单号 out_trade_no 渠道订单号 // }else if(sandbox.equals(1)){ //测试订单 // payHandler.processOrderTest(orderId, out_trade_no); //orderId 游戏订单号 out_trade_no 渠道订单号 // } // 成功 if (payres == 1) { json.put("status",1); json.put("message","充值成功/重复充值"); return json; } else if (payres == -2) { LOGGER.error("pay:gameNoticeInterface, {} 服务器配置错误,", gameUserId); } else if (payres == -3) { LOGGER.error("pay:gameNoticeInterface, {} 兑换失败,", gameUserId); } else { LOGGER.error("pay:gameNoticeInterface, {} 返回错误,payres={}", gameUserId,payres); json.put("status",0); json.put("message","err"); return json; } } catch (Exception ex) { ex.printStackTrace(); } json.put("status",0); json.put("message","err!"); return json; } /** * 支付回调:国内渠道 QuickGame Android * * 说明文档: https://www.quicksdk.com/doc-15.html * 测试服回调地址:http://1.13.176.142/idip/sfzb/pay/quickNotify */ @RequestMapping(value = "/pay/quickNotify", method = {RequestMethod.POST,RequestMethod.GET}) public String quickNotify(HttpServletRequest request1,String nt_data,String sign,String md5Sign) { try { LOGGER.info("quickNotify--01, nt_data={},sign={},md5Sign={}", nt_data,sign,md5Sign); String signStr = nt_data + sign + Constant.MD5_KEY; String mySign=MD5Util.encrypByMd5(signStr); if(!mySign.equals(md5Sign)){ LOGGER.error("错误信息:签名不一致 mySign={},md5Sign={}", mySign,md5Sign); return "-1"; } String deCodeDateXml = QuickSDKUtil.decode(nt_data, Constant.CALLBACK_KEY); LOGGER.info("quickNotify--02 deCodeDateXml={}",deCodeDateXml); Map stringObjectMap = XmlUtil.xmlToMap(deCodeDateXml); Map message = (Map)stringObjectMap.get("message"); String is_test=(String) message.get("is_test"); //是否为测试订单 1为测试 0为线上正式订单,游戏应根据情况确定上线后是否向测试订单发放道具。 String channel=(String) message.get("channel"); //渠道标示ID 注意:游戏可根据实情,确定发放道具时是否校验充值来源渠道是否与该角色注册渠道相符 String channel_uid=(String) message.get("channel_uid"); //渠道用户唯一标示,该值从客户端GetUserId()中可获取 String game_order=(String) message.get("game_order"); //游戏在调用QuickSDK发起支付时传递的游戏方订单,这里会原样传回 String order_no=(String) message.get("order_no"); //QuickSDK唯一订单号 String pay_time=(String) message.get("pay_time"); //支付时间 2015-01-01 23:00:00 String amount=(String) message.get("amount"); //成交金额,单位元,游戏最终发放道具金额应以此为准 String status=(String) message.get("status"); //充值状态:0成功, 1失败(为1时 应返回FAILED失败) String extras_params=(String) message.get("extras_params"); //可为空,充值状态游戏客户端调用SDK发起支付时填写的透传参数.没有则为空 LOGGER.info("quickNotify--03, is_test={},channel={},channel_uid={},game_order={},order_no={},pay_time={},amount={},status={},extras_params={}", is_test,channel,channel_uid,game_order,order_no,pay_time,amount,status,extras_params); String orderId = game_order; //游戏订单号 String out_trade_no = order_no; //渠道订单号 // 统一发货接口 int payres = 0; if(is_test.equals("0")){ //正式订单 (0:一般支付,1:测试支付) Double amountDouble = Double.valueOf(amount) * 100; payres = payHandler.processOrderNew(orderId, out_trade_no,amountDouble.intValue()); //orderId 游戏订单号 out_trade_no 渠道订单号,支付金额 单位分 }else if(is_test.equals("1")){ //测试订单 payres = payHandler.processOrderTest(orderId, out_trade_no); //orderId 游戏订单号 out_trade_no 渠道订单号 } // 成功 if (payres == 1) { return "SUCCESS"; } else if (payres == -1) { LOGGER.error("pay:gameNoticeInterface, {} 订单不存在,", orderId); } else if (payres == -2) { LOGGER.error("pay:gameNoticeInterface, {} 订单参数错误,", orderId); } else if (payres == -3) { LOGGER.error("pay:gameNoticeInterface, {} 服务器配置错误,", orderId); } else if (payres == -4) { LOGGER.error("pay:gameNoticeInterface, {} 充值失败,", orderId); } else { LOGGER.error("pay:gameNoticeInterface, {} 返回错误,payres = {}", orderId,payres); return "-2"; } } catch (Exception ex) { ex.printStackTrace(); } return "-3"; } /** * 支付回调:国内渠道 QuickGame IOS * * 说明文档: https://www.quicksdk.com/doc-544.html * 测试服回调地址:http://1.13.176.142/idip/sfzb/pay/quickIosNotify */ @RequestMapping(value = "/pay/quickIosNotify", method = {RequestMethod.POST,RequestMethod.GET}) public String quickIosNotify(HttpServletRequest request1,String nt_data,String sign,String md5Sign) { try { LOGGER.info("quickIosNotify--01, nt_data={},sign={},md5Sign={}", nt_data,sign,md5Sign); String signStr = nt_data + sign + Constant.QUICK_IOS_MD5_KEY; String mySign=MD5Util.encrypByMd5(signStr); if(!mySign.equals(md5Sign)){ LOGGER.error("错误信息:签名不一致 mySign={},md5Sign={}", mySign,md5Sign); return "-1"; } String deCodeDateXml = QuickSDKUtil.decode(nt_data, Constant.QUICK_IOS_CALLBACK_KEY); LOGGER.info("quickIosNotify--02 deCodeDateXml={}",deCodeDateXml); Map stringObjectMap = XmlUtil.xmlToMap(deCodeDateXml); Map message = (Map)stringObjectMap.get("message"); String uid=(String) message.get("uid"); //购买道具的用户uid String login_name=(String) message.get("login_name"); //购买道具的用户username String out_order_no=(String) message.get("out_order_no"); //游戏下单时传递的游戏订单号,原样返回 String order_no=(String) message.get("order_no"); //SDK唯一订单号 String pay_time=(String) message.get("pay_time"); //用户支付时间,如2017-02-06 14:22:32 String amount=(String) message.get("amount"); //成交金额,单位元,游戏最终发放道具金额应以此为准 String status=(String) message.get("status"); //充值状态:0成功, 1失败(为1时 应返回FAILED失败) String extras_params=(String) message.get("extras_params"); //可为空,充值状态游戏客户端调用SDK发起支付时填写的透传参数.没有则为空 LOGGER.info("quickIosNotify--03, uid={},login_name={},out_order_no={},order_no={},pay_time={},amount={},status={},extras_params={}", uid,login_name,out_order_no,order_no,pay_time,amount,status,extras_params); String orderId = out_order_no; //游戏订单号 String out_trade_no = order_no; //渠道订单号 // 统一发货接口 //int payres = 0; //if(is_test.equals("0")){ //正式订单 (0:一般支付,1:测试支付) // Double amountDouble = Double.valueOf(amount) * 100; // payres = payHandler.processOrderNew(orderId, out_trade_no,amountDouble.intValue()); //orderId 游戏订单号 out_trade_no 渠道订单号,支付金额 单位分 //}else if(is_test.equals("1")){ //测试订单 // payres = payHandler.processOrderTest(orderId, out_trade_no); //orderId 游戏订单号 out_trade_no 渠道订单号 //} Double amountDouble = Double.valueOf(amount) * 100; int payres = payHandler.processOrderNew(orderId, out_trade_no,amountDouble.intValue()); //orderId 游戏订单号 out_trade_no 渠道订单号,支付金额 单位分 // 成功 if (payres == 1) { return "SUCCESS"; } else if (payres == -1) { LOGGER.error("pay:gameNoticeInterface, {} 订单不存在,", orderId); } else if (payres == -2) { LOGGER.error("pay:gameNoticeInterface, {} 订单参数错误,", orderId); } else if (payres == -3) { LOGGER.error("pay:gameNoticeInterface, {} 服务器配置错误,", orderId); } else if (payres == -4) { LOGGER.error("pay:gameNoticeInterface, {} 充值失败,", orderId); } else { LOGGER.error("pay:gameNoticeInterface, {} 返回错误,payres = {}", orderId,payres); return "-2"; } } catch (Exception ex) { ex.printStackTrace(); } return "-3"; } /** * 支付回调:国内渠道 九九互动渠道 * 说明文档: https://forever9.feishu.cn/docx/ErqPdeDlRo00RJxHqyfcN6GNnsb * 测试服回调地址:http://43.139.240.49/idip/sfzb/pay/jjChannelNotify */ @RequestMapping(value = "/pay/jjChannelNotify", method = {RequestMethod.POST,RequestMethod.GET}) public JSONObject jjChannelNotify(HttpServletRequest request,@RequestBody JSONObject jsonObject) { JSONObject json = new JSONObject(); try { //SDK所在服务器的所有IP List ipWhiteList = new ArrayList<>(); ipWhiteList.add("193.112.136.97"); String ipAddr = getIpAddr(request); //获取当前网络ip boolean contains = ipWhiteList.contains(ipAddr); if(!contains){ LOGGER.error("pay:jjChannelNotify, ip = {},白名单ip = {}, ip错误,不在白名单中!!!", ipAddr,ipWhiteList.toString()); json.put("ret",-1); json.put("msg","请勿非法提交订单,如有问题请联系客服!!!"); return json; } String appid = jsonObject.getString("appid"); //游戏appid String openid = jsonObject.getString("openid"); //用户openid String pid = jsonObject.getString("pid"); //研发商品id,发行不关心 int amount = jsonObject.getIntValue("amount"); //支付金额(单位:分),发货的时候一定要校验这个字段,防止中途支付金额被篡改 String transaction_id = jsonObject.getString("transaction_id"); //微信订单号 String out_trade_no = jsonObject.getString("out_trade_no"); //发行方订单号 String game_order_id = jsonObject.getString("game_order_id"); String params = jsonObject.getString("params"); //客户端传的透传参数 int state = jsonObject.getIntValue("state"); //状态是2表示支付成功 String created_at = jsonObject.getString("created_at"); //订单创建时间 String time_end = jsonObject.getString("time_end"); String order_id = jsonObject.getString("order_id"); //发行订单号 String sign = jsonObject.getString("sign"); //签名算法, 用MD5方式签名 签名key是游戏appid LOGGER.info("jjChannelNotify, appid={},openid={},pid={},amount={},transaction_id={},out_trade_no={},game_order_id={},params={},state={},created_at={},time_end={},order_id={},sign={},ip={}", appid, openid, pid, amount, transaction_id,out_trade_no,game_order_id,params,state,created_at,time_end,order_id,sign,ipAddr); //获取自己游戏订单id ,通过extra_info字段穿透传值 String[] split = params.split("_"); String self_OrderId = split[3].substring(0,split[3].length()-2); if(state != 2){ LOGGER.error("pay:jjChannelNotify, SDK支付失败,此处不发货,state = {}", state); json.put("ret",-2); json.put("msg","SDK支付失败,不发货"); return json; } //不用签名验证,走下面订单查询验证 // String signStr = appid; // String mySign=MD5Util.encrypByMd5(signStr); // if(!mySign.equals(sign)){ // LOGGER.error("错误信息:签名不一致 mySign={},sign={}", mySign,sign); // json.put("ret",-3); // json.put("msg","签名不一致"); // return json; // } String ret = jjChannelOrderSearch(appid, openid, order_id); if(!ret.equals("0")){ LOGGER.error("错误信息:订单信息不存在 ret={}", ret); json.put("ret",-4); json.put("msg","订单信息不存在"); return json; } // 统一发货接口 int payres = payHandler.processOrderNew(self_OrderId, out_trade_no,amount); //game_order_id 游戏订单号 out_trade_no 渠道订单号 // 成功 if (payres == 1) { json.put("ret",0); json.put("msg","SUCCESS"); return json; } else if (payres == -1) { LOGGER.error("pay:gameNoticeInterface, {} 订单不存在,", game_order_id); } else if (payres == -2) { LOGGER.error("pay:gameNoticeInterface, {} 订单参数错误,", game_order_id); } else if (payres == -3) { LOGGER.error("pay:gameNoticeInterface, {} 服务器配置错误,", game_order_id); } else if (payres == -4) { LOGGER.error("pay:gameNoticeInterface, {} 充值失败,", game_order_id); } else if (payres == -5) { LOGGER.error("pay:gameNoticeInterface, {} 提交的金额和支付的金额不一致,", game_order_id); } else if (payres == -6) { LOGGER.error("pay:gameNoticeInterface, {} 支付金额不能为0,", game_order_id); } else { LOGGER.error("pay:gameNoticeInterface, {} 返回错误,payres = {}", game_order_id,payres); json.put("ret",-100); json.put("msg","Pay Fail EerrorCord:001"); return json; } } catch (Exception ex) { ex.printStackTrace(); } json.put("ret",-200); json.put("msg","Pay Fail EerrorCord:002"); return json; } /** * 九九互动渠道 * 订单查询接口(GET) * @param appid 游戏appid * @param openId 用户openid * @param orderId 发货回调中的order_id字段 * @return */ public static String jjChannelOrderSearch(String appid,String openId,String orderId) { try { // 请求参数 Map headers = new HashMap(); headers.put("ContentType", "application/json"); String body = String.format("game_appid=%s&game_openid=%s&orderId=%s", appid, openId, orderId); String resurl = HttpUtil.fetch("GET", Constant.JJCHANNEL_ORDER_SEARCH_URL, body, headers); net.sf.json.JSONObject jsonresObject = net.sf.json.JSONObject.fromObject(resurl); LOGGER.info("jsonresObject="+jsonresObject.toString()); // ret为 0成功,非0失败 int ret = jsonresObject.getInt("ret"); if (ret == 0) { return "0"; }else { LOGGER.info("错误编号:" + ret); return String.valueOf(ret); } } catch (IOException e) { e.printStackTrace(); } return "-1"; } public static List readListValue(String json, Class tClazz){ return JSON.parseArray(json, tClazz); } /** * 获取当前网络ip * @param request * @return */ public String getIpAddr(HttpServletRequest request){ String ipAddress = request.getHeader("x-forwarded-for"); if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) { ipAddress = request.getHeader("Proxy-Client-IP"); } if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) { ipAddress = request.getHeader("WL-Proxy-Client-IP"); } if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) { ipAddress = request.getRemoteAddr(); if(ipAddress.equals("127.0.0.1") || ipAddress.equals("0:0:0:0:0:0:0:1")){ //根据网卡取本机配置的IP InetAddress inet=null; try { inet = InetAddress.getLocalHost(); } catch (UnknownHostException e) { e.printStackTrace(); } ipAddress= inet.getHostAddress(); } } //对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割 if(ipAddress!=null && ipAddress.length()>15){ //"***.***.***.***".length() = 15 if(ipAddress.indexOf(",")>0){ ipAddress = ipAddress.substring(0,ipAddress.indexOf(",")); } } return ipAddress; } /** * 支付回调:长尾渠道支付回调 * * 说明文档: https://www.quicksdk.com/doc-15.html * 测试服回调地址:http://1.13.176.142:8081/idip/sfzb/pay/changWeiNotify */ @RequestMapping(value = "/pay/changWeiNotify", method = {RequestMethod.POST,RequestMethod.GET}) public String changWeiNotify(HttpServletRequest request,String nt_data,String sign,String md5Sign) throws UnsupportedEncodingException { try { LOGGER.info("changWeiNotify--01, nt_data={},sign={},md5Sign={}", nt_data,sign,md5Sign); String signStr = nt_data + sign + Constant.CHANGWEI_MD5_KEY; String mySign=MD5Util.encrypByMd5(signStr); if(!mySign.equals(md5Sign)){ LOGGER.error("错误信息:签名不一致 mySign={},md5Sign={}", mySign,md5Sign); return "-1"; } String deCodeDateXml = QuickSDKUtil.decode(nt_data, Constant.CHANGWEI_CALLBACK_KEY); LOGGER.info("changWeiNotify--02 deCodeDateXml={}",deCodeDateXml); Map stringObjectMap = XmlUtil.xmlToMap(deCodeDateXml); Map message = (Map)stringObjectMap.get("message"); String is_test=(String) message.get("is_test"); //是否为测试订单 1为测试 0为线上正式订单,游戏应根据情况确定上线后是否向测试订单发放道具。 String channel=(String) message.get("channel"); //渠道标示ID 注意:游戏可根据实情,确定发放道具时是否校验充值来源渠道是否与该角色注册渠道相符 String channel_uid=(String) message.get("channel_uid"); //渠道用户唯一标示,该值从客户端GetUserId()中可获取 String game_order=(String) message.get("game_order"); //游戏在调用QuickSDK发起支付时传递的游戏方订单,这里会原样传回 String order_no=(String) message.get("order_no"); //QuickSDK唯一订单号 String pay_time=(String) message.get("pay_time"); //支付时间 2015-01-01 23:00:00 String amount=(String) message.get("amount"); //成交金额,单位元,游戏最终发放道具金额应以此为准 String status=(String) message.get("status"); //充值状态:0成功, 1失败(为1时 应返回FAILED失败) String extras_params=(String) message.get("extras_params"); //可为空,充值状态游戏客户端调用SDK发起支付时填写的透传参数.没有则为空 LOGGER.info("quickNotify--03, is_test={},channel={},channel_uid={},game_order={},order_no={},pay_time={},amount={},status={},extras_params={}", is_test,channel,channel_uid,game_order,order_no,pay_time,amount,status,extras_params); String orderId = game_order; //游戏订单号 String out_trade_no = order_no; //渠道订单号 // 统一发货接口 int payres = 0; if(is_test.equals("0")){ //正式订单 (0:一般支付,1:测试支付) Double amountDouble = Double.valueOf(amount) * 100; payres = payHandler.processOrderNew(orderId, out_trade_no,amountDouble.intValue()); //orderId 游戏订单号 out_trade_no 渠道订单号,支付金额 单位分 }else if(is_test.equals("1")){ //测试订单 payres = payHandler.processOrderTest(orderId, out_trade_no); //orderId 游戏订单号 out_trade_no 渠道订单号 } // 成功 if (payres == 1) { return "SUCCESS"; } else if (payres == -1) { LOGGER.error("pay:gameNoticeInterface, {} 订单不存在,", orderId); } else if (payres == -2) { LOGGER.error("pay:gameNoticeInterface, {} 订单参数错误,", orderId); } else if (payres == -3) { LOGGER.error("pay:gameNoticeInterface, {} 服务器配置错误,", orderId); } else if (payres == -4) { LOGGER.error("pay:gameNoticeInterface, {} 充值失败,", orderId); } else { LOGGER.error("pay:gameNoticeInterface, {} 返回错误,payres = {}", orderId,payres); return "-2"; } } catch (Exception ex) { ex.printStackTrace(); } return "-3"; } @GetMapping("/pay/superOrder") //bt版sdk public JSONObject superOrder(@RequestParam("order_sn") String orderSn, @RequestParam("good_name") String goodName, @RequestParam("game_order_sn") String gameOrderSn, @RequestParam("uuid") String uuid, @RequestParam("pay_money") Integer payMoney, @RequestParam("game_id") String gameId, @RequestParam("service_id") String serviceId, @RequestParam("service_name") String serviceName, @RequestParam("role_id") String roleId, @RequestParam("role_name") String roleName, @RequestParam("time") Integer time, @RequestParam("pay_status") Integer payStatus, @RequestParam("remark") String remark, @RequestParam("sign") String sign ) { StringBuilder sb = new StringBuilder(); JSONObject json = new JSONObject(); try { sb.append("good_name=").append(URLEncoder.encode(goodName, "utf-8")).append("&"); sb.append("uuid=").append(uuid).append("&"); sb.append("order_sn=").append(orderSn).append("&"); sb.append("game_order_sn=").append(gameOrderSn).append("&"); sb.append("game_id=").append(gameId).append("&"); sb.append("service_id=").append(serviceId).append("&"); sb.append("service_name=").append(URLEncoder.encode(serviceName, "utf-8")).append("&"); sb.append("role_id=").append(roleId).append("&"); sb.append("role_name=").append(URLEncoder.encode(roleName, "utf-8")).append("&"); sb.append("pay_money=").append(payMoney).append("&"); sb.append("pay_status=").append(payStatus).append("&"); sb.append("remark=").append(URLEncoder.encode(remark, "utf-8")).append("&"); sb.append("time=").append(time).append("&"); sb.append("key=").append(Constant.SUPER_ORDER_KEY); } catch (UnsupportedEncodingException e) { LOGGER.error("URLEncoder error, game_id:{}, game_order_sn:{}", gameId, gameOrderSn); json.put("code", 500); json.put("msg", "system error"); return json; } String mySign = encrypByMd5(sb.toString()); if (!mySign.equals(sign)){ LOGGER.error("super order sign error, game_id:{}, game_order_sn:{}, sign:{}, mySign:{}", gameId, gameOrderSn, sign, mySign); json.put("code", 600); json.put("msg", "sign error"); return json; } int payres = 0; try { payres = payHandler.processOrderNew(gameOrderSn, orderSn, payMoney * 100); } catch (Exception e) { LOGGER.error("processOrder error, game_id:{}, game_order_sn:{}", gameId, gameOrderSn, e); json.put("code", 500); json.put("msg", "system error"); return json; } // 成功 if (payres == 1) { json.put("code", 200); json.put("msg", "success"); return json; } else if (payres == -1) { LOGGER.error("pay error, {} 订单不存在,", gameOrderSn); } else if (payres == -2) { LOGGER.error("pay error, {} 订单参数错误,", gameOrderSn); } else if (payres == -3) { LOGGER.error("pay error, {} 服务器配置错误,", gameOrderSn); } else if (payres == -4) { LOGGER.error("pay error, {} 充值失败,", gameOrderSn); } else { LOGGER.error("pay error, {} 返回错误,", gameOrderSn); } json.put("code", 601); json.put("msg", "pay error"); return json; } @RequestMapping(value = "/pay/x7Order", method = {RequestMethod.POST,RequestMethod.GET})//小7sdk public String xiaoQiOrder(@RequestParam("encryp_data") String encrypData, @RequestParam("extends_info_data") String extendsInfoData, @RequestParam("game_area") String gameArea, @RequestParam("game_level") String gameLevel, @RequestParam("game_orderid") String gameOrderId, @RequestParam("game_role_id") String gameRoleId, @RequestParam("game_role_name") String gameRoleName, @RequestParam("sdk_version") String sdkVersion, @RequestParam("subject") String subject, @RequestParam("xiao7_goid") Integer xiao7Goid, @RequestParam("sign_data") String signData ) { StringBuilder sb = new StringBuilder(); sb.append("encryp_data=").append(encrypData).append("&"); sb.append("extends_info_data=").append(extendsInfoData).append("&"); sb.append("game_area=").append(gameArea).append("&"); sb.append("game_level=").append(gameLevel).append("&"); sb.append("game_orderid=").append(gameOrderId).append("&"); sb.append("game_role_id=").append(gameRoleId).append("&"); sb.append("game_role_name=").append(gameRoleName).append("&"); sb.append("sdk_version=").append(sdkVersion).append("&"); sb.append("subject=").append(subject).append("&"); sb.append("xiao7_goid=").append(xiao7Goid); String sourceStr = sb.toString(); X509EncodedKeySpec keySpec = new X509EncodedKeySpec(Base64.getDecoder().decode((Constant.X7_PUBLIC_KEY))); PublicKey publicKey = null; try { KeyFactory keyFactory = KeyFactory.getInstance("RSA"); publicKey = keyFactory.generatePublic(keySpec); } catch (Exception e) { LOGGER.error("generate public key error, encrypData:{}, gameOrderId:{}", encrypData, gameOrderId, e); return "failed:order error"; } try { byte[] rawSignData = Base64.getDecoder().decode(signData); Signature signature = Signature.getInstance("SHA1withRSA"); signature.initVerify(publicKey); signature.update(sourceStr.getBytes()); boolean verify = signature.verify(rawSignData); if (!verify){ LOGGER.error("x7 order sign verify fail, encrypData:{}, gameOrderId:{}, signData:{}, myData:{}", encrypData, gameOrderId, signData, sourceStr); return "sign_data_verify_failed"; } } catch (Exception e) { LOGGER.error("sign error, encrypData:{}, gameOrderId:{}", encrypData, gameOrderId, e); return "failed:order error"; } byte[] rawEncrypData = Base64.getDecoder().decode(encrypData); String decrypData = null; try { Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.DECRYPT_MODE, publicKey); decrypData = new String(cipher.doFinal(rawEncrypData)); } catch (Exception e) { LOGGER.error("decrypt data error, encrypData:{}, gameOrderId:{}", encrypData, gameOrderId, e); return "encryp_data_decrypt_failed"; } int payres = 0; try { String[] strings = decrypData.split("&"); String gameOrderSn = strings[0].split("=")[1]; double payMoney = Double.parseDouble(strings[2].split("=")[1]); payres = payHandler.processOrderNew(gameOrderSn, String.valueOf(xiao7Goid), (int)(payMoney * 100)); } catch (Exception e) { LOGGER.error("processOrder error, encrypData:{}, gameOrderId:{}", encrypData, gameOrderId, e); return "failed:order error"; } // 成功 if (payres == 1) { return "success"; } else if (payres == -1) { LOGGER.error("pay error, {} 订单不存在,", gameOrderId); } else if (payres == -2) { LOGGER.error("pay error, {} 订单参数错误,", gameOrderId); } else if (payres == -3) { LOGGER.error("pay error, {} 服务器配置错误,", gameOrderId); } else if (payres == -4) { LOGGER.error("pay error, {} 充值失败,", gameOrderId); } else { LOGGER.error("pay error, {} 返回错误,", gameOrderId); } return "failed:order error"; } @RequestMapping(value = "/pay/iCanOrder", method = {RequestMethod.POST,RequestMethod.GET})//艾肯sdk public JSONObject iCanOrder(@RequestParam("account") String account, @RequestParam("serverId") String serverId, @RequestParam("orderId") String orderId, @RequestParam("itemId") String itemId, @RequestParam("iMoney") Integer iMoney, @RequestParam("gMoney") Integer gMoney, @RequestParam("roleId") String roleId, @RequestParam("gOrderId") String gOrderId, @RequestParam("time") String time, @RequestParam("verify") String verify, @RequestParam("platform") String platform ) { LOGGER.info("iCan pay order, account:{}, serverId:{}, orderId:{}, itemId:{}, iMoney:{}, gMoney:{}, gOrderId:{}, roleId:{}, time:{}, platform:{}", account, serverId, orderId, itemId, iMoney, gMoney, gOrderId, roleId, time, platform); JSONObject jsonObject = new JSONObject(); StringBuilder sb = new StringBuilder(); sb.append(account).append(itemId).append(orderId).append(iMoney).append(Constant.AIKEN_SERVER_KEY).append(time).append(roleId); try { String mySign = encrypByMd5(sb.toString()); if (!mySign.equals(verify)){ LOGGER.error("iCan order sign verify fail, gOrderId:{}, roleId:{}", gOrderId, roleId); jsonObject.put("code", 3); jsonObject.put("msg", "verify error"); return jsonObject; } } catch (Exception e) { LOGGER.error("iCan order sign error, gOrderId:{}, roleId:{}", gOrderId, roleId, e); jsonObject.put("code", 3); jsonObject.put("msg", "verify error"); return jsonObject; } int payres = 0; try { payres = payHandler.processOrderWithPlatform(gOrderId, orderId, iMoney * 100, platform); } catch (Exception e) { LOGGER.error("processOrder error, gOrderId:{}, roleId:{}", gOrderId, roleId, e); jsonObject.put("code", 99); jsonObject.put("msg", "server error"); return jsonObject; } // 成功 if (payres == 1) { jsonObject.put("code", 0); jsonObject.put("msg", ""); return jsonObject; } else if (payres == -1) { LOGGER.error("pay error, {} 订单不存在,", gOrderId); } else if (payres == -2) { LOGGER.error("pay error, {} 订单参数错误,", gOrderId); } else if (payres == -3) { LOGGER.error("pay error, {} 服务器配置错误,", gOrderId); } else if (payres == -4) { LOGGER.error("pay error, {} 充值失败,", gOrderId); } else { LOGGER.error("pay error, {} 返回错误,", gOrderId); } jsonObject.put("code", 99); jsonObject.put("msg", "server error"); return jsonObject; } @RequestMapping(value = "/pay/qianqian", method = {RequestMethod.POST,RequestMethod.GET})//千千sdk public String iCanOrder(@RequestParam("appId") String appId, @RequestParam("userId") String userId, @RequestParam("channelId") String channelId, @RequestParam("orderId") String orderId, @RequestParam("orderStatus") String orderStatus, @RequestParam("amount") String amount, String currency, Integer isTest, String cpOrderID, String callBackInfo, @RequestParam("payTime") String payTime, @RequestParam("sign") String sign) { LOGGER.info("qianqian pay order, userId:{}, orderId:{}, amount:{}, currency:{}, cpOrderId:{}", userId, orderId, amount, currency, cpOrderID); StringBuilder sb = new StringBuilder(); sb.append("amount=").append(amount).append("&"); sb.append("appId=").append(appId).append("&"); if (callBackInfo != null){ sb.append("callBackInfo=").append(callBackInfo).append("&"); } sb.append("channelId=").append(channelId).append("&"); if (cpOrderID != null){ sb.append("cpOrderID=").append(cpOrderID).append("&"); } if (currency != null){ sb.append("currency=").append(currency).append("&"); } if (isTest != null){ sb.append("isTest=").append(isTest).append("&"); } sb.append("orderId=").append(orderId).append("&"); sb.append("orderStatus=").append(orderStatus).append("&"); sb.append("payTime=").append(payTime).append("&"); sb.append("userId=").append(userId).append("&"); sb.append("key=").append(Constant.QIANQIAN_KEY); String mySign = encrypByMd5(sb.toString()); if(!mySign.equals(sign)){ LOGGER.error("错误信息:签名不一致 mySign={},md5Sign={}", mySign, sign); return "sign fail"; } int payres = 0; try { payres = payHandler.processOrderNew(cpOrderID, orderId, Integer.parseInt(amount)); } catch (Exception e) { LOGGER.error("processOrder error, cpOrderID:{}, userId:{}", cpOrderID, userId, e); } if (payres == 1) { return "SUCCESS"; } else if (payres == -1) { LOGGER.error("pay error, {} 订单不存在,", cpOrderID); } else if (payres == -2) { LOGGER.error("pay error, {} 订单参数错误,", cpOrderID); } else if (payres == -3) { LOGGER.error("pay error, {} 服务器配置错误,", cpOrderID); } else if (payres == -4) { LOGGER.error("pay error, {} 充值失败,", cpOrderID); } else { LOGGER.error("pay error, {} 返回错误,", cpOrderID); } return "fail"; } @RequestMapping(value = "/pay/qianqian/quick", method = {RequestMethod.POST,RequestMethod.GET})//千千sdk public String iCanOrder(@RequestParam("nt_data") String ntData, @RequestParam("sign") String sign, @RequestParam("md5Sign") String md5Sign){ StringBuilder sb = new StringBuilder(); sb.append(ntData).append(sign).append(Constant.QUICK_MD5_KEY); String mySign = encrypByMd5(sb.toString()); if(!mySign.equals(md5Sign)){ LOGGER.error("错误信息:签名不一致 mySign={},md5Sign={}", mySign, md5Sign); return "sign fail"; } String xml = QuickSDKUtil.decode(ntData, Constant.QUICK_CALLBACK_KEY); DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder = null; Document doc = null; try { dBuilder = dbFactory.newDocumentBuilder(); doc = dBuilder.parse(new InputSource(new StringReader(xml))); } catch (ParserConfigurationException | SAXException | IOException e) { LOGGER.info("qianqian quick decode error ", e); return "decode fail"; } doc.getDocumentElement().normalize(); NodeList nodeList = doc.getElementsByTagName("message"); Node node = nodeList.item(0); if (node.getNodeType() == Node.ELEMENT_NODE) { Element element = (Element) node; String channel_uid = element.getElementsByTagName("channel_uid").item(0).getTextContent(); String game_order = element.getElementsByTagName("game_order").item(0).getTextContent(); String order_no = element.getElementsByTagName("order_no").item(0).getTextContent(); String amount = element.getElementsByTagName("amount").item(0).getTextContent(); int payres = 0; try { payres = payHandler.processOrderNew(game_order, order_no, (int)(Double.parseDouble(amount)) * 100); } catch (Exception e) { LOGGER.error("processOrder error, cpOrderID:{}, userId:{}", game_order, channel_uid, e); } if (payres == 1) { return "SUCCESS"; } else if (payres == -1) { LOGGER.error("pay error, {} 订单不存在,", game_order); } else if (payres == -2) { LOGGER.error("pay error, {} 订单参数错误,", game_order); } else if (payres == -3) { LOGGER.error("pay error, {} 服务器配置错误,", game_order); } else if (payres == -4) { LOGGER.error("pay error, {} 充值失败,", game_order); } else { LOGGER.error("pay error, {} 返回错误,", game_order); } return "fail"; }else { return "decode fail"; } } @RequestMapping(value = "/pay/ky/quick", method = {RequestMethod.POST,RequestMethod.GET}) public String kyOrder(@RequestParam("nt_data") String ntData, @RequestParam("sign") String sign, @RequestParam("md5Sign") String md5Sign){ StringBuilder sb = new StringBuilder(); sb.append(ntData).append(sign).append(Constant.QUICK_MD5_KEY_2); String mySign = encrypByMd5(sb.toString()); if(!mySign.equals(md5Sign)){ LOGGER.error("错误信息:签名不一致 mySign={},md5Sign={}", mySign, md5Sign); return "sign fail"; } String xml = QuickSDKUtil.decode(ntData, Constant.QUICK_CALLBACK_KEY_2); DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder = null; Document doc = null; try { dBuilder = dbFactory.newDocumentBuilder(); doc = dBuilder.parse(new InputSource(new StringReader(xml))); } catch (ParserConfigurationException | SAXException | IOException e) { LOGGER.info("ky quick decode error ", e); return "decode fail"; } doc.getDocumentElement().normalize(); NodeList nodeList = doc.getElementsByTagName("message"); Node node = nodeList.item(0); if (node.getNodeType() == Node.ELEMENT_NODE) { Element element = (Element) node; String channel_uid = element.getElementsByTagName("channel_uid").item(0).getTextContent(); String game_order = element.getElementsByTagName("game_order").item(0).getTextContent(); String order_no = element.getElementsByTagName("order_no").item(0).getTextContent(); String amount = element.getElementsByTagName("amount").item(0).getTextContent(); int payres = 0; try { payres = payHandler.processOrderNew(game_order, order_no, (int)(Double.parseDouble(amount)) * 100); } catch (Exception e) { LOGGER.error("processOrder error, cpOrderID:{}, userId:{}", game_order, channel_uid, e); } if (payres == 1) { return "SUCCESS"; } else if (payres == -1) { LOGGER.error("pay error, {} 订单不存在,", game_order); } else if (payres == -2) { LOGGER.error("pay error, {} 订单参数错误,", game_order); } else if (payres == -3) { LOGGER.error("pay error, {} 服务器配置错误,", game_order); } else if (payres == -4) { LOGGER.error("pay error, {} 充值失败,", game_order); } else { LOGGER.error("pay error, {} 返回错误,", game_order); } return "fail"; }else { return "decode fail"; } } }