local PluginBase = require("luaScript.Plugins.PluginBase") local PluginConfig = require("preload.PluginConfig") local PluginIosPay = class("PluginIosPay" , PluginBase) IosPayData = defClass("IosPayData" , defVar("dataStr", VT_String, "") ) function PluginIosPay:ctor() PluginIosPay.super.ctor(self); self.plugin = nil --self.payData = IosPayData:new(); --self.filePath = cc.FileUtils:getInstance():getWritablePath() .. "iosPay.data"; self.payData = {} self.payDataFile = cc.FileUtils:getInstance():getWritablePath() .. "iosPay.data"; -- 登录PHP成功之后开始检测未完成的订单 app:addEventListener("PHP_LGIN_SUCCESSED", handler(self, self.checkPurchase)); end -- 检测是否有未完成的订单 -- PHP登录完成后检测 function PluginIosPay:checkPurchase() if self.plugin then logD("PluginIosPay call checkPurchase") self.plugin:callVoid("checkPurchase"); end end -- 启动插件 function PluginIosPay:start() self:loadData() -- 必须主动申明支持苹果内购 if not PluginConfig or not PluginConfig.isSupportIAP then return end self.plugin = cc.PluginManager:getInstance():createPlugin("IAPApple" , "IAPApple"); if self.plugin then self.plugin:callVoid("setDebugMode" , true); local developerInfo = { -- 回调函数 Listener = handler(self , self.onPayResult); }; self.plugin:callVoid("initIAP" , developerInfo); end end -- 停止插件 function PluginIosPay:stop() if self.plugin then cc.PluginManager:getInstance():removePlugin(self.plugin); self.plugin = nil; end end function PluginIosPay:isSupportPay() return true end -- 插件是否被支持 function PluginIosPay:isSupport() return self.plugin ~= nil; end function PluginIosPay:showWaitDialog(text) local waitUI = loadUI("res/ui/ui_tongyong/t_ios_paying.ui") waitUI.Items.ImageView_ring:playClip("rotate"); waitUI:setAnchorPoint(cc.p(0.5, 0.5)); waitUI.Items.Text_content:setText(text); self.waitDialog = app:showWaitUI(waitUI, nil, nil, false); end function PluginIosPay:closeWaitDialog() if not tolua.isnull(self.waitDialog) then self.waitDialog:removeFromParent() self.waitDialog = nil end end -- 支付 --[[ ["10182"] = { ["currency"] = 1, ["desc"] = "", ["ext"] = { }, ["icon"] = http://img.dingdingqipai.com/images/goods/5cb7e2f9138ba.png?v=1555555065, ["id"] = 10182, ["name"] = 50房卡, ["number"] = 50, ["order"] = 100, ["pay_type"] = { [1] = { ["id"] = 1, ["name"] = 苹果支付, }, }, ["price"] = 10, ["privilege_icon"] = , ["product_id"] = com_dangdang_chuannan_10, ["prop_id"] = 0, ["type"] = 0, }, ]] function PluginIosPay:pay(item) logD("PluginIosPay:pay() item = ", table.tostring(item)) if not item or not item.id then showTooltip("无效商品"); return end local url = getGlobalPhpUrl() local tt1 = { action = "order.create", item_id = item.id, uid = app.user.loginInfo.uid, app = getAppId(), productid = item.product_id, pay_type = PayType.Apple, } logD("PluginIosPay:pay() tt1 = ", table.tostring(tt1)) logD("PluginIosPay:pay() url = ", url) app.waitDialogManager:showTransparencyMask() httpPost(url, tt1, function(status, response) app.waitDialogManager:closeTransparencyMask() logD("PluginIosPay:pay() status = ", tostring(status)) logD("PluginIosPay:pay() response = ", tostring(response)) if status ~= "successed" then return; end -- 状态码 local data = json.decode(response) if tonumber(data.code) ~= 200 then return end -- 订单号 if not data.result or not data.result.orderid then return end local tt2 = { -- 商品ID productId = item.product_id; -- 商品数量 productNum = 1; -- 请求的信息 requestData = item.id .. "_" .. data.result.orderid; } --self:showWaitDialog("等待支付完成!"); app.waitDialogManager:showWaitNetworkDialog("等待支付完成!") self.plugin:callVoid("payForProduct" , tt2); end); end --[[ {"msg":\{"receiptData":"ewoJInNpZ25hdHVyZSIgPSAiQTU3T1loRkwveVByelRIU2t2eFBKWDJBVkhDa0tNZTlobjVkTUk0SXFFMHlDV2NaNGxyUmNONVltWmcxOVFZUnRnL2hSN2t3L2RFSW1DUEJ0RlU1VkFEWjZ3RkZzeWloWnYyUkg2bHQxN3k2UUFrdkVYNzNXN0pDZWk4a21obDNiOXBINUZ6TnM5dWxXQlZrSElibldBN3Vwd2FXb1VpeVBYbUNZSFkrRTFzK1NiYVVWdG9UMmh3WWtxb2M4Nk5YNGxxbG10Mm5qdkNxQkphaE1WV2laVVZ1NjYzZGl2RXVXUGZnOHZDWmZKZWE0UnlFM2ZRMUNyNGZGQ3hjMEtzNUMwWFQ4V1dPdHFiMFo3SnlRcUVwRDRlbG95eWFFUU9UVUFxM1FvU28rWVprTVAwYzQwWnBFZXNsUHF1Ni9qQWhIK3JwOWdJNGtqelNnU2lPZlljRzZpb0FBQVdBTUlJRmZEQ0NCR1NnQXdJQkFnSUlEdXRYaCtlZUNZMHdEUVlKS29aSWh2Y05BUUVGQlFBd2daWXhDekFKQmdOVkJBWVRBbFZUTVJNd0VRWURWUVFLREFwQmNIQnNaU0JKYm1NdU1Td3dLZ1lEVlFRTERDTkJjSEJzWlNCWGIzSnNaSGRwWkdVZ1JHVjJaV3h2Y0dWeUlGSmxiR0YwYVc5dWN6RkVNRUlHQTFVRUF3dzdRWEJ3YkdVZ1YyOXliR1IzYVdSbElFUmxkbVZzYjNCbGNpQlNaV3hoZEdsdmJuTWdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrd0hoY05NVFV4TVRFek1ESXhOVEE1V2hjTk1qTXdNakEzTWpFME9EUTNXakNCaVRFM01EVUdBMVVFQXd3dVRXRmpJRUZ3Y0NCVGRHOXlaU0JoYm1RZ2FWUjFibVZ6SUZOMGIzSmxJRkpsWTJWcGNIUWdVMmxuYm1sdVp6RXNNQ29HQTFVRUN3d2pRWEJ3YkdVZ1YyOXliR1IzYVdSbElFUmxkbVZzYjNCbGNpQlNaV3hoZEdsdmJuTXhFekFSQmdOVkJBb01Da0Z3Y0d4bElFbHVZeTR4Q3pBSkJnTlZCQVlUQWxWVE1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBcGMrQi9TV2lnVnZXaCswajJqTWNqdUlqd0tYRUpzczl4cC9zU2cxVmh2K2tBdGVYeWpsVWJYMS9zbFFZbmNRc1VuR09aSHVDem9tNlNkWUk1YlNJY2M4L1cwWXV4c1FkdUFPcFdLSUVQaUY0MWR1MzBJNFNqWU5NV3lwb041UEM4cjBleE5LaERFcFlVcXNTNCszZEg1Z1ZrRFV0d3N3U3lvMUlnZmRZZUZScjZJd3hOaDlLQmd4SFZQTTNrTGl5a29sOVg2U0ZTdUhBbk9DNnBMdUNsMlAwSzVQQi9UNXZ5c0gxUEttUFVockFKUXAyRHQ3K21mNy93bXYxVzE2c2MxRkpDRmFKekVPUXpJNkJBdENnbDdaY3NhRnBhWWVRRUdnbUpqbTRIUkJ6c0FwZHhYUFEzM1k3MkMzWmlCN2o3QWZQNG83UTAvb21WWUh2NGdOSkl3SURBUUFCbzRJQjF6Q0NBZE13UHdZSUt3WUJCUVVIQVFFRU16QXhNQzhHQ0NzR0FRVUZCekFCaGlOb2RIUndPaTh2YjJOemNDNWhjSEJzWlM1amIyMHZiMk56Y0RBekxYZDNaSEl3TkRBZEJnTlZIUTRFRmdRVWthU2MvTVIydDUrZ2l2Uk45WTgyWGUwckJJVXdEQVlEVlIwVEFRSC9CQUl3QURBZkJnTlZIU01FR0RBV2dCU0lKeGNKcWJZWVlJdnM2N3IyUjFuRlVsU2p0ekNDQVI0R0ExVWRJQVNDQVJVd2dnRVJNSUlCRFFZS0tvWklodmRqWkFVR0FUQ0IvakNCd3dZSUt3WUJCUVVIQWdJd2diWU1nYk5TWld4cFlXNWpaU0J2YmlCMGFHbHpJR05sY25ScFptbGpZWFJsSUdKNUlHRnVlU0J3WVhKMGVTQmhjM04xYldWeklHRmpZMlZ3ZEdGdVkyVWdiMllnZEdobElIUm9aVzRnWVhCd2JHbGpZV0pzWlNCemRHRnVaR0Z5WkNCMFpYSnRjeUJoYm1RZ1kyOXVaR2wwYVc5dWN5QnZaaUIxYzJVc0lHTmxjblJwWm1sallYUmxJSEJ2YkdsamVTQmhibVFnWTJWeWRHbG1hV05oZEdsdmJpQndjbUZqZEdsalpTQnpkR0YwWlcxbGJuUnpMakEyQmdnckJnRUZCUWNDQVJZcWFIUjBjRG92TDNkM2R5NWhjSEJzWlM1amIyMHZZMlZ5ZEdsbWFXTmhkR1ZoZFhSb2IzSnBkSGt2TUE0R0ExVWREd0VCL3dRRUF3SUhnREFRQmdvcWhraUc5Mk5rQmdzQkJBSUZBREFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBRGFZYjB5NDk0MXNyQjI1Q2xtelQ2SXhETUlKZjRGelJqYjY5RDcwYS9DV1MyNHlGdzRCWjMrUGkxeTRGRkt3TjI3YTQvdncxTG56THJSZHJqbjhmNUhlNXNXZVZ0Qk5lcGhtR2R2aGFJSlhuWTR3UGMvem83Y1lmcnBuNFpVaGNvT0FvT3NBUU55MjVvQVE1SDNPNXlBWDk4dDUvR2lvcWJpc0IvS0FnWE5ucmZTZW1NL2oxbU9DK1JOdXhUR2Y4YmdwUHllSUdxTktYODZlT2ExR2lXb1IxWmRFV0JHTGp3Vi8xQ0tuUGFObVNBTW5CakxQNGpRQmt1bGhnd0h5dmozWEthYmxiS3RZZGFHNllRdlZNcHpjWm04dzdISG9aUS9PamJiOUlZQVlNTnBJcjdONFl0UkhhTFNQUWp2eWdhWndYRzU2QWV6bEhSVEJoTDhjVHFBPT0iOwoJInB1cmNoYXNlLWluZm8iID0gImV3b0pJbTl5YVdkcGJtRnNMWEIxY21Ob1lYTmxMV1JoZEdVdGNITjBJaUE5SUNJeU1ERTNMVEEzTFRBMElESXhPakE0T2pRNElFRnRaWEpwWTJFdlRHOXpYMEZ1WjJWc1pYTWlPd29KSW5WdWFYRjFaUzFwWkdWdWRHbG1hV1Z5SWlBOUlDSTNZelZtWXpNMk16WXhZMkV5TURabVlXTXhOemxqWXpka1kyRXpaakl5TTJJNE9EWmtZV1prSWpzS0NTSnZjbWxuYVc1aGJDMTBjbUZ1YzJGamRHbHZiaTFwWkNJZ1BTQWlNVEF3TURBd01ETXhNalUxTlRjek1pSTdDZ2tpWW5aeWN5SWdQU0FpTVM0d0xqa2lPd29KSW5SeVlXNXpZV04wYVc5dUxXbGtJaUE5SUNJeE1EQXdNREF3TXpFeU5UVTFOek15SWpzS0NTSnhkV0Z1ZEdsMGVTSWdQU0FpTVNJN0Nna2liM0pwWjJsdVlXd3RjSFZ5WTJoaGMyVXRaR0YwWlMxdGN5SWdQU0FpTVRRNU9USXlOemN5T0RReU5TSTdDZ2tpZFc1cGNYVmxMWFpsYm1SdmNpMXBaR1Z1ZEdsbWFXVnlJaUE5SUNJelJEVkJNRGMwUlMwNE5UVXpMVFJHTVRZdE9FTXpPQzAwUWprek0wVTNNVUU1TlRVaU93b0pJbkJ5YjJSMVkzUXRhV1FpSUQwZ0ltTnZiUzVrYVc1blpHbHVaMmRoYldVdWNESXhMbU5oY21ReE1DSTdDZ2tpYVhSbGJTMXBaQ0lnUFNBaU1USTFOVFEzTlRJeU5TSTdDZ2tpWW1sa0lpQTlJQ0pqYjIwdVpHbHVaMlJwYm1kbllXMWxMbkF5TVNJN0Nna2ljSFZ5WTJoaGMyVXRaR0YwWlMxdGN5SWdQU0FpTVRRNU9USXlOemN5T0RReU5TSTdDZ2tpY0hWeVkyaGhjMlV0WkdGMFpTSWdQU0FpTWpBeE55MHdOeTB3TlNBd05Eb3dPRG8wT0NCRmRHTXZSMDFVSWpzS0NTSndkWEpqYUdGelpTMWtZWFJsTFhCemRDSWdQU0FpTWpBeE55MHdOeTB3TkNBeU1Ub3dPRG8wT0NCQmJXVnlhV05oTDB4dmMxOUJibWRsYkdWeklqc0tDU0p2Y21sbmFXNWhiQzF3ZFhKamFHRnpaUzFrWVhSbElpQTlJQ0l5TURFM0xUQTNMVEExSURBME9qQTRPalE0SUVWMFl5OUhUVlFpT3dwOSI7CgkiZW52aXJvbm1lbnQiID0gIlNhbmRib3giOwoJInBvZCIgPSAiMTAwIjsKCSJzaWduaW5nLXN0YXR1cyIgPSAiMCI7Cn0=","requestData":"MTAwOTA1MF8xNDk5MjI3Njk1","state":1,"productId":"com.dingdinggame.p21.card10","tradeSnid":"1000000312555732"\},"code":0\} --]] -- 把订单数据提交到服务器 function PluginIosPay:postReceiptData(msg) logD("PluginIosPay::postReceiptData() ") local msgData = json.decode(msg); logD("PluginIosPay::postReceiptData() msgData = ", table.tostring(msgData)); local msgData = json.decode(msg); local tradeSnid = msgData.tradeSnid; -- 将玩家的支付数据写本地 if tradeSnid ~= nil then self.payData[tradeSnid] = msgData; self:saveData() end local requestData = msgData.requestData; local arr = string.split(requestData, "_") local item_id = arr[1] local order_id = arr[2] local tt = { action = "order.receipt", app = getAppId(), uid = app.user.loginInfo.uid, item_id = item_id, productid = msgData.productId, orderid = order_id, receipt = msgData.receiptData, } logD("PluginIosPay::postReceiptData() tt = ", table.tostring(tt)); local url = getGlobalPhpUrl() logD("PluginIosPay::postReceiptData() url = ", url) if not url or url == "" then return end httpPost(url, tt, function(status, response) logD("PluginIosPay::postReceiptData() status = ", tostring(status)); logD("PluginIosPay::postReceiptData() response = ", tostring(response)); if status ~= "successed" then return; end -- 状态码 local data = json.decode(response) if tonumber(data.code) ~= 200 then logD("PluginIosPay::postReceiptData() tradeSnid = ", tradeSnid); if tradeSnid then self.plugin:callVoid("finishPurchase" , tradeSnid); end return end -- 房卡数量 if not data.result or not data.result.card then return end -- 更新房卡数量 app.user.loginInfo.curCardNum = tonumber(data.result.card); showConfirmDialog("恭喜您充值成功,祝您游戏愉快!"); -- 通知 APPLE 订单完成 logD("PluginIosPay::postReceiptData() tradeSnid = ", tradeSnid); self.plugin:callVoid("finishPurchase" , tradeSnid); end ) end -- 回调函数 function PluginIosPay:onPayResult(result) local resultJson = json.decode(result); local ret = resultJson.code; local msg = resultJson.msg; logD("PluginIosPay:onPayResult() code = ", ret) if type(msg) == "table" then logD("PluginIosPay:onPayResult() msg = ", table.tostring(msg)) else logD("PluginIosPay:onPayResult() msg = ", tostring(msg)) end if ret == 0 then -- 打印信息 logD("AppleIAP:" , msg); elseif ret == 1 then -- 支付成功 app.waitDialogManager:closeWaitNetworkDialog() self:postReceiptData(msg); elseif ret == 2 then -- 发现有订单丢失的情况 -- 首先上报异常,上报成功之后删除订单 app.waitDialogManager:closeWaitNetworkDialog() self:postReceiptData(msg); elseif ret == 3 then -- 支付失败 app.waitDialogManager:closeWaitNetworkDialog() --showConfirmDialog(string.format("支付失败: %s", msg)); elseif ret == 4 then -- 支付取消 app.waitDialogManager:closeWaitNetworkDialog() --showConfirmDialog(string.format("支付取消: %s", msg)); else -- 未知的回调信息 app.waitDialogManager:closeWaitNetworkDialog() end end function PluginIosPay:loadData() logD("PluginIosPay:loadData()") local fileSting = loadStringFromFile(self.payDataFile) logD("PluginIosPay:loadData() fileSting = ", fileSting); if not fileSting or string.len(fileSting) <= 0 then return end local function loadFromFile() logD("PluginIosPay:loadData() loadFromFile") self.payData = json.decode(fileSting); end local function loadFromFileFailed() logE("PluginIosPay:loadData() loadFromFileFailed") end -- 容错处理 xpcall(loadFromFile, loadFromFileFailed); logD("PluginIosPay:loadData() self.payData = ", table.tostring(self.payData)) end function PluginIosPay:saveData() logD("PluginIosPay:saveData() payData = ", table.tostring(self.payData)) local fileSting = json.encode(self.payData) logD("PluginIosPay:saveData() fileSting = ", fileSting) saveStringToFile(fileSting, self.payDataFile); end return PluginIosPay;