yuda_abd.js 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. /*
  2. 充值测试处理模块
  3. */
  4. var mysql = require('mysql');
  5. var mysqlcn = require('../../terry/mysqlcn.js');
  6. var query = mysqlcn.query;
  7. var qs = require('querystring');
  8. var encryption = require('../ordinary/encryption.js');
  9. var checkorder = require('../../terry/checkorder.js');
  10. var config = require('../config.js');
  11. var pay_success = function(args,res){
  12. console.log("yuda_abd 回调接收:%s", args);
  13. var receipt
  14. try {
  15. receipt = qs.parse(args)
  16. console.log("qs解析成功")
  17. } catch(e) {
  18. console.log(e)
  19. res.send("FAILURE");
  20. return;
  21. }
  22. var money = receipt.amount // 玩家付款金额
  23. //var goods_id = receipt.goods_id // 产品配置表id
  24. var channel_order_id = receipt.trade_no // SDK生成的订单号
  25. var payment_type = receipt.payment_type // 支付类型(具体使用的SDK)
  26. var istest = 1 // 充值模式 istest=1沙盒测试 2:正式
  27. var cp_order_id = receipt.game_trade_no // CP订单号
  28. // 玩家的付款金额、充值档位、购买份数 需要进行校验
  29. var sql = mysql.format("SELECT * FROM payinfo where orderid=?", [cp_order_id]);//在mysql库中检查订单号
  30. query(sql,function(qerr,vals,fields){
  31. if (qerr==null){
  32. if (vals[0]==null){
  33. console.log("[yuda_abd] 没有找到该订单");
  34. try{res.send("FAILURE");}
  35. catch(e){}
  36. return;
  37. }
  38. if (vals[0].overtime>0){
  39. console.log("[yuda_abd] 已经处理的订单");
  40. try{res.send("SUCCESS");}
  41. catch(e){}
  42. return;
  43. }
  44. var amountnum = money
  45. var platform = vals[0].platform;
  46. platform = platform ? platform.toLowerCase() : 'null'
  47. var str
  48. if (platform == 'ios') {
  49. str = "com.yoo.and.lybmyz.ios"
  50. } else if (platform == 'android') {
  51. str = "com.yoo.and.lymxads"
  52. }
  53. else {
  54. console.log("################## 错误的平台platform: %s", platform)
  55. try{res.send("FAILURE");}
  56. catch(e){}
  57. return
  58. }
  59. var pos1 = receipt.goods_id.indexOf(str) + str.length
  60. var pos2 = receipt.goods_id.length
  61. var goods_id = receipt.goods_id.substring(pos1,pos2)
  62. var channel = vals[0].channel
  63. var timestamp = Date.parse(new Date()) / 1000;
  64. console.log("################## goods_id %s", goods_id)
  65. console.log("platform:%s,channel:%s,amountnum:%s",platform,channel,amountnum)
  66. var option = config.parse(platform,channel,goods_id)
  67. var cfid = option.cfid;
  68. var product_id = option.name
  69. if (cfid == 0){
  70. console.log("[yuda_abd] 获取cfid失败为cfid:%s,product_id:%s", cfid,product_id);
  71. try{res.send("FAILURE");}
  72. catch(e){}
  73. return
  74. }
  75. if (goods_id != cfid){
  76. console.log("[yuda_abd] 充值计费点不同goods_id:%s,cfid:%s", goods_id,cfid);
  77. try{res.send("FAILURE");}
  78. catch(e){}
  79. return
  80. }
  81. if (amountnum != option.price){
  82. console.log("[yuda_abd] 充值金额不同amountnum:%s,option.price:%s", amountnum, option.price);
  83. try{res.send("FAILURE");}
  84. catch(e){}
  85. return
  86. }
  87. //填充充值信息
  88. var sql_1 = "UPDATE payinfo SET \
  89. channel_order_id=?,\
  90. overtime=?,\
  91. flag=?,\
  92. money=?,\
  93. cfid=?,\
  94. platform=?,\
  95. channel=?,\
  96. moneytype=?,\
  97. product_id=?,\
  98. talkingdata=?,\
  99. payment_type=?, \
  100. istest=?\
  101. WHERE orderid=? \
  102. AND flag=2";//增加flag判断防止重复写入
  103. var values_2 = [channel_order_id,timestamp,1,amountnum,cfid,platform,channel,option.typename,product_id,1,payment_type,istest,cp_order_id];
  104. var sql_2 = mysql.format(sql_1, values_2);
  105. query(sql_2,function(qerr,rows,fields_)
  106. {
  107. if (qerr){
  108. console.log("[yuda_abd]逻辑错误,请检查数据表结构和sql语句:\n\t%s", qerr);
  109. try{res.send("FAILURE");}
  110. catch(e){}
  111. return;
  112. }
  113. if (rows.affectedRows > 0){//判断修改了多少个记录
  114. console.log("[yuda_abd]支付成功了,现在通知游戏服务器, orderId:%s, uid:%s, serverid:%s ,cfid:%s",
  115. cp_order_id,vals[0].uid,vals[0].serverid,cfid);
  116. checkorder.pushproduct(query,vals[0].serverid, cp_order_id, function(ok){
  117. if (ok) {
  118. console.log("[yuda_abd] 订单 %s: 成功发货!", cp_order_id);
  119. } else{
  120. console.log("[yuda_abd] 订单 %s: 发货地址无效!", cp_order_id);//在无效时返回成功,我们自己补单中会派发flag为1支付成功但是没成功发货的单
  121. }
  122. try{res.send("SUCCESS");}
  123. catch(e){}
  124. });
  125. // 向 TalkingData 报告充值数据
  126. var appId = config.getAppID(channel);
  127. if (istest == 2) {
  128. checkorder.pushtalkingdata(query,appId,platform,vals[0].uid,cp_order_id,option.price,option.typename,option.diamond,timestamp,payment_type,vals[0].serverid);
  129. }
  130. res.send("SUCCESS");
  131. return;
  132. }else{
  133. console.log("SQL重复写入[yuda_abd]已经处理的订单");
  134. try{res.send("SUCCESS");}
  135. catch(e){}
  136. return;
  137. }
  138. })
  139. }else{
  140. console.log("[yuda_abd] 查询订单列表错误,请检查数据表结构和sql语句:\n\t%s", qerr);
  141. try{res.send("FAILURE");}
  142. catch(e){}
  143. return;
  144. }
  145. })
  146. }
  147. var express = require('express');
  148. var router = express.Router();
  149. router.get('/yuda_abd_pay', function(req, res) {
  150. var pos = req.url.indexOf('?')
  151. var str = req.url
  152. if (pos == -1) { //请求的url是否包含?包含返回-1,==-1为不包含
  153. console.log("yuda_abd 回调接收未找到参数");
  154. res.send("FAILURE");
  155. } else {
  156. var data = str.substring(pos+1,str.length)
  157. pay_success(data, res)
  158. };
  159. req.on("error",function(err){
  160. console.log("error:%s",err);
  161. res.send("FAILURE");
  162. });
  163. });
  164. module.exports = router;