You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

320 lines
12 KiB

  1. local PluginBase = require("luaScript.Plugins.PluginBase")
  2. local PluginConfig = require("preload.PluginConfig")
  3. local PluginIosPay = class("PluginIosPay" , PluginBase)
  4. IosPayData = defClass("IosPayData"
  5. , defVar("dataStr", VT_String, "")
  6. )
  7. function PluginIosPay:ctor()
  8. PluginIosPay.super.ctor(self);
  9. self.plugin = nil
  10. --self.payData = IosPayData:new();
  11. --self.filePath = cc.FileUtils:getInstance():getWritablePath() .. "iosPay.data";
  12. self.payData = {}
  13. self.payDataFile = cc.FileUtils:getInstance():getWritablePath() .. "iosPay.data";
  14. -- 登录PHP成功之后开始检测未完成的订单
  15. app:addEventListener("PHP_LGIN_SUCCESSED", handler(self, self.checkPurchase));
  16. end
  17. -- 检测是否有未完成的订单
  18. -- PHP登录完成后检测
  19. function PluginIosPay:checkPurchase()
  20. if self.plugin then
  21. logD("PluginIosPay call checkPurchase")
  22. self.plugin:callVoid("checkPurchase");
  23. end
  24. end
  25. -- 启动插件
  26. function PluginIosPay:start()
  27. self:loadData()
  28. -- 必须主动申明支持苹果内购
  29. if not PluginConfig or not PluginConfig.isSupportIAP then
  30. return
  31. end
  32. self.plugin = cc.PluginManager:getInstance():createPlugin("IAPApple" , "IAPApple");
  33. if self.plugin then
  34. self.plugin:callVoid("setDebugMode" , true);
  35. local developerInfo =
  36. {
  37. -- 回调函数
  38. Listener = handler(self , self.onPayResult);
  39. };
  40. self.plugin:callVoid("initIAP" , developerInfo);
  41. end
  42. end
  43. -- 停止插件
  44. function PluginIosPay:stop()
  45. if self.plugin then
  46. cc.PluginManager:getInstance():removePlugin(self.plugin);
  47. self.plugin = nil;
  48. end
  49. end
  50. function PluginIosPay:isSupportPay()
  51. return true
  52. end
  53. -- 插件是否被支持
  54. function PluginIosPay:isSupport()
  55. return self.plugin ~= nil;
  56. end
  57. function PluginIosPay:showWaitDialog(text)
  58. local waitUI = loadUI("res/ui/ui_tongyong/t_ios_paying.ui")
  59. waitUI.Items.ImageView_ring:playClip("rotate");
  60. waitUI:setAnchorPoint(cc.p(0.5, 0.5));
  61. waitUI.Items.Text_content:setText(text);
  62. self.waitDialog = app:showWaitUI(waitUI, nil, nil, false);
  63. end
  64. function PluginIosPay:closeWaitDialog()
  65. if not tolua.isnull(self.waitDialog) then
  66. self.waitDialog:removeFromParent()
  67. self.waitDialog = nil
  68. end
  69. end
  70. -- 支付
  71. --[[
  72. ["10182"] = {
  73. ["currency"] = 1,
  74. ["desc"] = "",
  75. ["ext"] = {
  76. },
  77. ["icon"] = http://img.dingdingqipai.com/images/goods/5cb7e2f9138ba.png?v=1555555065,
  78. ["id"] = 10182,
  79. ["name"] = 50房卡,
  80. ["number"] = 50,
  81. ["order"] = 100,
  82. ["pay_type"] = {
  83. [1] = {
  84. ["id"] = 1,
  85. ["name"] = 苹果支付,
  86. },
  87. },
  88. ["price"] = 10,
  89. ["privilege_icon"] = ,
  90. ["product_id"] = com_dangdang_chuannan_10,
  91. ["prop_id"] = 0,
  92. ["type"] = 0,
  93. },
  94. ]]
  95. function PluginIosPay:pay(item)
  96. logD("PluginIosPay:pay() item = ", table.tostring(item))
  97. if not item or not item.id then
  98. showTooltip("无效商品");
  99. return
  100. end
  101. local url = getGlobalPhpUrl()
  102. local tt1 =
  103. {
  104. action = "order.create",
  105. item_id = item.id,
  106. uid = app.user.loginInfo.uid,
  107. app = getAppId(),
  108. productid = item.product_id,
  109. pay_type = PayType.Apple,
  110. }
  111. logD("PluginIosPay:pay() tt1 = ", table.tostring(tt1))
  112. logD("PluginIosPay:pay() url = ", url)
  113. app.waitDialogManager:showTransparencyMask()
  114. httpPost(url, tt1, function(status, response)
  115. app.waitDialogManager:closeTransparencyMask()
  116. logD("PluginIosPay:pay() status = ", tostring(status))
  117. logD("PluginIosPay:pay() response = ", tostring(response))
  118. if status ~= "successed" then
  119. return;
  120. end
  121. -- 状态码
  122. local data = json.decode(response)
  123. if tonumber(data.code) ~= 200 then
  124. return
  125. end
  126. -- 订单号
  127. if not data.result or not data.result.orderid then
  128. return
  129. end
  130. local tt2 =
  131. {
  132. -- 商品ID
  133. productId = item.product_id;
  134. -- 商品数量
  135. productNum = 1;
  136. -- 请求的信息
  137. requestData = item.id .. "_" .. data.result.orderid;
  138. }
  139. --self:showWaitDialog("等待支付完成!");
  140. app.waitDialogManager:showWaitNetworkDialog("等待支付完成!")
  141. self.plugin:callVoid("payForProduct" , tt2);
  142. end);
  143. end
  144. --[[
  145. {"msg":\{"receiptData":"ewoJInNpZ25hdHVyZSIgPSAiQTU3T1loRkwveVByelRIU2t2eFBKWDJBVkhDa0tNZTlobjVkTUk0SXFFMHlDV2NaNGxyUmNONVltWmcxOVFZUnRnL2hSN2t3L2RFSW1DUEJ0RlU1VkFEWjZ3RkZzeWloWnYyUkg2bHQxN3k2UUFrdkVYNzNXN0pDZWk4a21obDNiOXBINUZ6TnM5dWxXQlZrSElibldBN3Vwd2FXb1VpeVBYbUNZSFkrRTFzK1NiYVVWdG9UMmh3WWtxb2M4Nk5YNGxxbG10Mm5qdkNxQkphaE1WV2laVVZ1NjYzZGl2RXVXUGZnOHZDWmZKZWE0UnlFM2ZRMUNyNGZGQ3hjMEtzNUMwWFQ4V1dPdHFiMFo3SnlRcUVwRDRlbG95eWFFUU9UVUFxM1FvU28rWVprTVAwYzQwWnBFZXNsUHF1Ni9qQWhIK3JwOWdJNGtqelNnU2lPZlljRzZpb0FBQVdBTUlJRmZEQ0NCR1NnQXdJQkFnSUlEdXRYaCtlZUNZMHdEUVlKS29aSWh2Y05BUUVGQlFBd2daWXhDekFKQmdOVkJBWVRBbFZUTVJNd0VRWURWUVFLREFwQmNIQnNaU0JKYm1NdU1Td3dLZ1lEVlFRTERDTkJjSEJzWlNCWGIzSnNaSGRwWkdVZ1JHVjJaV3h2Y0dWeUlGSmxiR0YwYVc5dWN6RkVNRUlHQTFVRUF3dzdRWEJ3YkdVZ1YyOXliR1IzYVdSbElFUmxkbVZzYjNCbGNpQlNaV3hoZEdsdmJuTWdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrd0hoY05NVFV4TVRFek1ESXhOVEE1V2hjTk1qTXdNakEzTWpFME9EUTNXakNCaVRFM01EVUdBMVVFQXd3dVRXRmpJRUZ3Y0NCVGRHOXlaU0JoYm1RZ2FWUjFibVZ6SUZOMGIzSmxJRkpsWTJWcGNIUWdVMmxuYm1sdVp6RXNNQ29HQTFVRUN3d2pRWEJ3YkdVZ1YyOXliR1IzYVdSbElFUmxkbVZzYjNCbGNpQlNaV3hoZEdsdmJuTXhFekFSQmdOVkJBb01Da0Z3Y0d4bElFbHVZeTR4Q3pBSkJnTlZCQVlUQWxWVE1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBcGMrQi9TV2lnVnZXaCswajJqTWNqdUlqd0tYRUpzczl4cC9zU2cxVmh2K2tBdGVYeWpsVWJYMS9zbFFZbmNRc1VuR09aSHVDem9tNlNkWUk1YlNJY2M4L1cwWXV4c1FkdUFPcFdLSUVQaUY0MWR1MzBJNFNqWU5NV3lwb041UEM4cjBleE5LaERFcFlVcXNTNCszZEg1Z1ZrRFV0d3N3U3lvMUlnZmRZZUZScjZJd3hOaDlLQmd4SFZQTTNrTGl5a29sOVg2U0ZTdUhBbk9DNnBMdUNsMlAwSzVQQi9UNXZ5c0gxUEttUFVockFKUXAyRHQ3K21mNy93bXYxVzE2c2MxRkpDRmFKekVPUXpJNkJBdENnbDdaY3NhRnBhWWVRRUdnbUpqbTRIUkJ6c0FwZHhYUFEzM1k3MkMzWmlCN2o3QWZQNG83UTAvb21WWUh2NGdOSkl3SURBUUFCbzRJQjF6Q0NBZE13UHdZSUt3WUJCUVVIQVFFRU16QXhNQzhHQ0NzR0FRVUZCekFCaGlOb2RIUndPaTh2YjJOemNDNWhjSEJzWlM1amIyMHZiMk56Y0RBekxYZDNaSEl3TkRBZEJnTlZIUTRFRmdRVWthU2MvTVIydDUrZ2l2Uk45WTgyWGUwckJJVXdEQVlEVlIwVEFRSC9CQUl3QURBZkJnTlZIU01FR0RBV2dCU0lKeGNKcWJZWVlJdnM2N3IyUjFuRlVsU2p0ekNDQVI0R0ExVWRJQVNDQVJVd2dnRVJNSUlCRFFZS0tvWklodmRqWkFVR0FUQ0IvakNCd3dZSUt3WUJCUVVIQWdJd2diWU1nYk5TWld4cFlXNWpaU0J2YmlCMGFHbHpJR05sY25ScFptbGpZWFJsSUdKNUlHRnVlU0J3WVhKMGVTQmhjM04xYldWeklHRmpZMlZ3ZEdGdVkyVWdiMllnZEdobElIUm9aVzRnWVhCd2JHbGpZV0pzWlNCemRHRnVaR0Z5WkNCMFpYSnRjeUJoYm1RZ1kyOXVaR2wwYVc5dWN5QnZaaUIxYzJVc0lHTmxjblJwWm1sallYUmxJSEJ2YkdsamVTQmhibVFnWTJWeWRHbG1hV05oZEdsdmJpQndjbUZqZEdsalpTQnpkR0YwWlcxbGJuUnpMakEyQmdnckJnRUZCUWNDQVJZcWFIUjBjRG92TDNkM2R5NWhjSEJzWlM1amIyMHZZMlZ5ZEdsbWFXTmhkR1ZoZFhSb2IzSnBkSGt2TUE0R0ExVWREd0VCL3dRRUF3SUhnREFRQmdvcWhraUc5Mk5rQmdzQkJBSUZBREFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBRGFZYjB5NDk0MXNyQjI1Q2xtelQ2SXhETUlKZjRGelJqYjY5RDcwYS9DV1MyNHlGdzRCWjMrUGkxeTRGRkt3TjI3YTQvdncxTG56THJSZHJqbjhmNUhlNXNXZVZ0Qk5lcGhtR2R2aGFJSlhuWTR3UGMvem83Y1lmcnBuNFpVaGNvT0FvT3NBUU55MjVvQVE1SDNPNXlBWDk4dDUvR2lvcWJpc0IvS0FnWE5ucmZTZW1NL2oxbU9DK1JOdXhUR2Y4YmdwUHllSUdxTktYODZlT2ExR2lXb1IxWmRFV0JHTGp3Vi8xQ0tuUGFObVNBTW5CakxQNGpRQmt1bGhnd0h5dmozWEthYmxiS3RZZGFHNllRdlZNcHpjWm04dzdISG9aUS9PamJiOUlZQVlNTnBJcjdONFl0UkhhTFNQUWp2eWdhWndYRzU2QWV6bEhSVEJoTDhjVHFBPT0iOwoJInB1cmNoYXNlLWluZm8iID0gImV3b0pJbTl5YVdkcGJtRnNMWEIxY21Ob1lYTmxMV1JoZEdVdGNITjBJaUE5SUNJeU1ERTNMVEEzTFRBMElESXhPakE0T2pRNElFRnRaWEpwWTJFdlRHOXpYMEZ1WjJWc1pYTWlPd29KSW5WdWFYRjFaUzFwWkdWdWRHbG1hV1Z5SWlBOUlDSTNZelZtWXpNMk16WXhZMkV5TURabVlXTXhOemxqWXpka1kyRXpaakl5TTJJNE9EWmtZV1prSWpzS0NTSnZjbWxuYVc1aGJDMTBjbUZ1YzJGamRHbHZiaTFwWkNJZ1BTQWlNVEF3TURBd01ETXhNalUxTlRjek1pSTdDZ2tpWW5aeWN5SWdQU0FpTVM0d0xqa2lPd29KSW5SeVlXNXpZV04wYVc5dUxXbGtJaUE5SUNJeE1EQXdNREF3TXpFeU5UVTFOek15SWpzS0NTSnhkV0Z1ZEdsMGVTSWdQU0FpTVNJN0Nna2liM0pwWjJsdVlXd3RjSFZ5WTJoaGMyVXRaR0YwWlMxdGN5SWdQU0FpTVRRNU9USXlOemN5T0RReU5TSTdDZ2tpZFc1cGNYVmxMWFpsYm1SdmNpMXBaR1Z1ZEdsbWFXVnlJaUE5SUNJelJEVkJNRGMwUlMwNE5UVXpMVFJHTVRZdE9FTXpPQzAwUWprek0wVTNNVUU1TlRVaU93b0pJbkJ5YjJSMVkzUXRhV1FpSUQwZ0ltTnZiUzVrYVc1blpHbHVaMmRoYldVdWNESXhMbU5oY21ReE1DSTdDZ2tpYVhSbGJTMXBaQ0lnUFNBaU1USTFOVFEzTlRJeU5TSTdDZ2tpWW1sa0lpQTlJQ0pqYjIwdVpHbHVaMlJwYm1kbllXMWxMbkF5TVNJN0Nna2ljSFZ5WTJoaGMyVXRaR0YwWlMxdGN5SWdQU0FpTVRRNU9USXlOemN5T0RReU5TSTdDZ2tpY0hWeVkyaGhjMlV0WkdGMFpTSWdQU0FpTWpBeE55MHdOeTB3TlNBd05Eb3dPRG8wT0NCRmRHTXZSMDFVSWpzS0NTSndkWEpqYUdGelpTMWtZWFJsTFhCemRDSWdQU0FpTWpBeE55MHdOeTB3TkNBeU1Ub3dPRG8wT0NCQmJXVnlhV05oTDB4dmMxOUJibWRsYkdWeklqc0tDU0p2Y21sbmFXNWhiQzF3ZFhKamFHRnpaUzFrWVhSbElpQTlJQ0l5TURFM0xUQTNMVEExSURBME9qQTRPalE0SUVWMFl5OUhUVlFpT3dwOSI7CgkiZW52aXJvbm1lbnQiID0gIlNhbmRib3giOwoJInBvZCIgPSAiMTAwIjsKCSJzaWduaW5nLXN0YXR1cyIgPSAiMCI7Cn0=","requestData":"MTAwOTA1MF8xNDk5MjI3Njk1","state":1,"productId":"com.dingdinggame.p21.card10","tradeSnid":"1000000312555732"\},"code":0\}
  146. --]]
  147. -- 把订单数据提交到服务器
  148. function PluginIosPay:postReceiptData(msg)
  149. logD("PluginIosPay::postReceiptData() ")
  150. local msgData = json.decode(msg);
  151. logD("PluginIosPay::postReceiptData() msgData = ", table.tostring(msgData));
  152. local msgData = json.decode(msg);
  153. local tradeSnid = msgData.tradeSnid;
  154. -- 将玩家的支付数据写本地
  155. if tradeSnid ~= nil then
  156. self.payData[tradeSnid] = msgData;
  157. self:saveData()
  158. end
  159. local requestData = msgData.requestData;
  160. local arr = string.split(requestData, "_")
  161. local item_id = arr[1]
  162. local order_id = arr[2]
  163. local tt =
  164. {
  165. action = "order.receipt",
  166. app = getAppId(),
  167. uid = app.user.loginInfo.uid,
  168. item_id = item_id,
  169. productid = msgData.productId,
  170. orderid = order_id,
  171. receipt = msgData.receiptData,
  172. }
  173. logD("PluginIosPay::postReceiptData() tt = ", table.tostring(tt));
  174. local url = getGlobalPhpUrl()
  175. logD("PluginIosPay::postReceiptData() url = ", url)
  176. if not url or url == "" then
  177. return
  178. end
  179. httpPost(url, tt, function(status, response)
  180. logD("PluginIosPay::postReceiptData() status = ", tostring(status));
  181. logD("PluginIosPay::postReceiptData() response = ", tostring(response));
  182. if status ~= "successed" then
  183. return;
  184. end
  185. -- 状态码
  186. local data = json.decode(response)
  187. if tonumber(data.code) ~= 200 then
  188. logD("PluginIosPay::postReceiptData() tradeSnid = ", tradeSnid);
  189. if tradeSnid then
  190. self.plugin:callVoid("finishPurchase" , tradeSnid);
  191. end
  192. return
  193. end
  194. -- 房卡数量
  195. if not data.result or not data.result.card then
  196. return
  197. end
  198. -- 更新房卡数量
  199. app.user.loginInfo.curCardNum = tonumber(data.result.card);
  200. showConfirmDialog("恭喜您充值成功,祝您游戏愉快!");
  201. -- 通知 APPLE 订单完成
  202. logD("PluginIosPay::postReceiptData() tradeSnid = ", tradeSnid);
  203. self.plugin:callVoid("finishPurchase" , tradeSnid);
  204. end )
  205. end
  206. -- 回调函数
  207. function PluginIosPay:onPayResult(result)
  208. local resultJson = json.decode(result);
  209. local ret = resultJson.code;
  210. local msg = resultJson.msg;
  211. logD("PluginIosPay:onPayResult() code = ", ret)
  212. if type(msg) == "table" then
  213. logD("PluginIosPay:onPayResult() msg = ", table.tostring(msg))
  214. else
  215. logD("PluginIosPay:onPayResult() msg = ", tostring(msg))
  216. end
  217. if ret == 0 then
  218. -- 打印信息
  219. logD("AppleIAP:" , msg);
  220. elseif ret == 1 then
  221. -- 支付成功
  222. app.waitDialogManager:closeWaitNetworkDialog()
  223. self:postReceiptData(msg);
  224. elseif ret == 2 then
  225. -- 发现有订单丢失的情况
  226. -- 首先上报异常,上报成功之后删除订单
  227. app.waitDialogManager:closeWaitNetworkDialog()
  228. self:postReceiptData(msg);
  229. elseif ret == 3 then
  230. -- 支付失败
  231. app.waitDialogManager:closeWaitNetworkDialog()
  232. --showConfirmDialog(string.format("支付失败: %s", msg));
  233. elseif ret == 4 then
  234. -- 支付取消
  235. app.waitDialogManager:closeWaitNetworkDialog()
  236. --showConfirmDialog(string.format("支付取消: %s", msg));
  237. else
  238. -- 未知的回调信息
  239. app.waitDialogManager:closeWaitNetworkDialog()
  240. end
  241. end
  242. function PluginIosPay:loadData()
  243. logD("PluginIosPay:loadData()")
  244. local fileSting = loadStringFromFile(self.payDataFile)
  245. logD("PluginIosPay:loadData() fileSting = ", fileSting);
  246. if not fileSting or string.len(fileSting) <= 0 then
  247. return
  248. end
  249. local function loadFromFile()
  250. logD("PluginIosPay:loadData() loadFromFile")
  251. self.payData = json.decode(fileSting);
  252. end
  253. local function loadFromFileFailed()
  254. logE("PluginIosPay:loadData() loadFromFileFailed")
  255. end
  256. -- 容错处理
  257. xpcall(loadFromFile, loadFromFileFailed);
  258. logD("PluginIosPay:loadData() self.payData = ", table.tostring(self.payData))
  259. end
  260. function PluginIosPay:saveData()
  261. logD("PluginIosPay:saveData() payData = ", table.tostring(self.payData))
  262. local fileSting = json.encode(self.payData)
  263. logD("PluginIosPay:saveData() fileSting = ", fileSting)
  264. saveStringToFile(fileSting, self.payDataFile);
  265. end
  266. return PluginIosPay;