googleplay.js 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. //GooglePlay
  2. let mysql = require('mysql');
  3. let mysqlcn = require('../../terry/mysqlcn.js');
  4. let query = mysqlcn.query;
  5. let qs = require('querystring');
  6. let checkorder = require('../../terry/checkorder.js');
  7. let config = require('../config.js');
  8. let express = require('express');
  9. let router = express.Router();
  10. let crypto = require('crypto');
  11. // let IS_TEST = 2 //1是测试2是正式
  12. Date.prototype.Format = function (fmt) { //author: meizz
  13. let o = {
  14. "M+": this.getMonth() + 1, //月份
  15. "d+": this.getDate(), //日
  16. "h+": this.getHours(), //小时
  17. "m+": this.getMinutes(), //分
  18. "s+": this.getSeconds(), //秒
  19. "q+": Math.floor((this.getMonth() + 3) / 3), //季度
  20. "S": this.getMilliseconds() //毫秒
  21. };
  22. if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
  23. for (let k in o)
  24. if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
  25. return fmt;
  26. }
  27. let sql_insert = function(orderid, serverid,uid,rmb,moneytype,cfid,platform,channel,overtime,flag,product_id,user_id,purchase_date_ms,talkingdata,payment_type,istest){
  28. let sql = "INSERT INTO payinfo SET orderid=?, serverid=?, channel=?, submittime=?, flag=?, user_id=?, channel_order_id=?, money=?, cfid=?, platform=?,overtime=?,product_id=?,uid=?,moneytype=?,talkingdata=?,payment_type=?,istest=?";
  29. let values = [orderid, serverid, channel,purchase_date_ms,flag,user_id,orderid,rmb,cfid,platform,overtime,product_id,uid,moneytype,talkingdata,payment_type,istest];
  30. sql = mysql.format(sql, values);
  31. return sql;
  32. }
  33. function insert_str(str, insert_str, sn) {
  34. let newstr = "";
  35. for (let i = 0; i < str.length; i += sn) {
  36. let tmp = str.substring(i, i + sn);
  37. newstr += tmp + insert_str;
  38. }
  39. return newstr;
  40. }
  41. let RsaSha1Check = function(str,sig,publicKey){
  42. let public_key = insert_str(publicKey, '\n', 64);
  43. public_key = '-----BEGIN PUBLIC KEY-----\n' + public_key + '-----END PUBLIC KEY-----';
  44. let verifier = crypto.createVerify('RSA-SHA1');
  45. console.log('验证签名public key:\n' + public_key);
  46. console.log('验证签名src_sign:' + str);
  47. verifier.update(new Buffer(str, 'utf-8'));
  48. return verifier.verify(public_key, sig, 'base64');
  49. };
  50. let pay_success = function(args, res){
  51. if (args==null){
  52. console.log("[GooglePlay] 无效的充值请求!");
  53. try{res.send("error,1");}
  54. catch(e){}
  55. return;
  56. }
  57. let obj = null
  58. try {
  59. obj = qs.parse(args);
  60. } catch(e){
  61. console.log("[GooglePlay] 无效的充值请求!");
  62. try{res.send("error,1");}
  63. catch(e){}
  64. return
  65. }
  66. let orderid = obj.orderid; //订单号
  67. let channel_order_id = obj.channel_order_id //渠道订单id
  68. let serverid = obj.serverid;//服务器id
  69. let userid = obj.userid; //玩家的渠道帐号
  70. let uid = obj.uid; //玩家游戏uid
  71. let product_id = obj.product_id // 计费点
  72. let platformid = "googleplay";
  73. let ti = new Date().Format("yyyy-MM-dd hh:mm:ss");
  74. console.log("[GooglePlay] 订单 %s 请求 (%s):\n\tchannel_order_id=%s, serverid=%s,uid=%s,userid=%s,platform=%s,gp_appid=%s",
  75. orderid, ti, channel_order_id, serverid, uid, userid, platformid, gp_appid);
  76. console.log("[GooglePlay] 订单 %s 处理:\n\t商品配置:%s, 金额:%s, 类型:%s, 用户:%s, 服务器:%s",
  77. channel_order_id,cfid,money,moneytype,uid,serverid);
  78. let sql = mysql.format("SELECT * FROM payinfo where orderid=?", [orderid]);//在mysql库中检查订单号
  79. query(sql,function(qerr,vals,fields){
  80. if (qerr==null){
  81. if (vals[0]==null){
  82. console.log("[GooglePlay] 没有找到该订单");
  83. try{res.send("FAILURE");}
  84. catch(e){}
  85. return;
  86. }
  87. if (vals[0].overtime>0){
  88. console.log("[GooglePlay] 已经处理的订单");
  89. try{res.send("SUCCESS");}
  90. catch(e){}
  91. return;
  92. }
  93. //检查订单
  94. let channel = vals[0].channel
  95. let conf = config.parse(platformid, channel, product_id);
  96. let cfid = conf.cfid;
  97. let amountnum = conf.price
  98. let moneytype = conf.typename;
  99. if (cfid == 0){
  100. console.log("[GooglePlay] channel:%s获取cfid失败为platformid:%s,product_id:%s",channel, platformid, product_id);
  101. try{res.send("fail");}
  102. catch(e){}
  103. return
  104. }
  105. if (product_id != vals[0].product_id) {
  106. console.log("[GooglePlay] 充值订单不匹配:product_id = %s, vals[0].product_id = %s!!", product_id, vals[0].product_id);
  107. }
  108. let timestamp = Date.parse(new Date()) / 1000;
  109. //填充充值信息
  110. let sql_1 = "UPDATE payinfo SET \
  111. channel_order_id=?,\
  112. overtime=?,\
  113. flag=?,\
  114. money=?,\
  115. cfid=?,\
  116. platform=?,\
  117. channel=?,\
  118. moneytype=?,\
  119. product_id=?,\
  120. talkingdata=?,\
  121. payment_type=?, \
  122. istest=?\
  123. WHERE orderid=? \
  124. AND flag=2";//增加flag判断防止重复写入
  125. let values_2 = [channel_order_id,timestamp,1,amountnum,cfid,platform,channel,moneytype,product_id,1,payment_type,istest,cp_order_id];
  126. let sql_2 = mysql.format(sql_1, values_2);
  127. query(sql_2,function(qerr,rows,fields_)
  128. {
  129. if (qerr){
  130. console.log("[GooglePlay]逻辑错误,请检查数据表结构和sql语句:\n\t%s", qerr);
  131. try{res.send("FAILURE");}
  132. catch(e){}
  133. return;
  134. }
  135. if (rows.affectedRows > 0){//判断修改了多少个记录
  136. console.log("[GooglePlay]支付成功了,现在通知游戏服务器, orderId:%s, uid:%s, serverid:%s ,cfid:%s",
  137. cp_order_id,vals[0].uid,vals[0].serverid,cfid);
  138. checkorder.pushproduct(query,vals[0].serverid, cp_order_id, function(ok){
  139. if (ok) {
  140. console.log("[GooglePlay] 订单 %s: 成功发货!", cp_order_id);
  141. } else{
  142. console.log("[GooglePlay] 订单 %s: 发货地址无效!", cp_order_id);//在无效时返回成功,我们自己补单中会派发flag为1支付成功但是没成功发货的单
  143. }
  144. try{res.send("SUCCESS");}
  145. catch(e){}
  146. });
  147. res.send("SUCCESS");
  148. return;
  149. }else{
  150. console.log("SQL重复写入[GooglePlay]已经处理的订单");
  151. try{res.send("SUCCESS");}
  152. catch(e){}
  153. return;
  154. }
  155. })
  156. }else{
  157. console.log("[GooglePlay] 查询订单列表错误,请检查数据表结构和sql语句:\n\t%s", qerr);
  158. try{res.send("FAILURE");}
  159. catch(e){}
  160. return;
  161. }
  162. })
  163. }
  164. router.post('/googleplay', function(req, res) {
  165. console.log("谷歌,post ,host:%s, ip:%s,date:%s",req.hostname,req.ip,new Date());
  166. let data = "";
  167. req.on("data",function(chunk){
  168. data += chunk;
  169. })
  170. req.on("end",function(){
  171. pay_success(data,res);
  172. })
  173. req.on("error",function(err){
  174. res.send('erron,1');
  175. })
  176. });
  177. module.exports = router;