From 3219d96596d726685cc77542a7aec37dd981c6af Mon Sep 17 00:00:00 2001 From: 宋庆平 Date: Tue, 26 Jul 2022 15:52:05 +0800 Subject: [PATCH] 1.0.10。兼容抖音部分功能 --- wxsdk/WXSDK.ts | 11 +++++++---- wxsdk/base/SDKConst.ts | 11 +++++++---- wxsdk/douyin/DouyinInterstitial.ts | 43 +++++++++++++++++++++++++++++++++++++++++++ wxsdk/douyin/DouyinPay.ts | 175 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ wxsdk/http/SDKApi.ts | 1 + wxsdk/service/AdService.ts | 7 ++++++- wxsdk/service/GameService.ts | 7 ++++++- wxsdk/service/ShareVideoService.ts | 7 +++++-- wxsdk/share/SDKVideo.ts | 21 +++++++++++++-------- 9 files changed, 263 insertions(+), 20 deletions(-) create mode 100644 wxsdk/douyin/DouyinInterstitial.ts create mode 100644 wxsdk/douyin/DouyinPay.ts diff --git a/wxsdk/WXSDK.ts b/wxsdk/WXSDK.ts index b159946..f97c1b1 100644 --- a/wxsdk/WXSDK.ts +++ b/wxsdk/WXSDK.ts @@ -36,13 +36,16 @@ export default class WXSDK { public static async init() { + // await platf if (this.isWx) { WxInit.I.init(); //视频预加载 启动预加载视频会闪屏 - setTimeout(() => { - WxInterstitial.initInterstitialAd();//插屏预加载 - ShareVideoService.I.preloadVideo(); - }, 2000); + if (cc.sys.platform === cc.sys.WECHAT_GAME) { + setTimeout(() => { + WxInterstitial.initInterstitialAd();//插屏预加载 + ShareVideoService.I.preloadVideo(); + }, 2000); + } } DataService.I.updateTodayOnlineTime(); await this.game.env(); diff --git a/wxsdk/base/SDKConst.ts b/wxsdk/base/SDKConst.ts index 098c898..c08b105 100644 --- a/wxsdk/base/SDKConst.ts +++ b/wxsdk/base/SDKConst.ts @@ -32,8 +32,10 @@ export const GAMEDATA = { } } + + // sdk版本 -export const SDKVersion = 'v1.0.9'; +export const SDKVersion = 'v1.0.10'; // 是否打印 export const __LOG__ = false; // 是否mock @@ -108,9 +110,10 @@ export const HostKeys = { behavior: 'api/douyin/behavior', //抖音投放关键行为 attribute: 'api/member/attribute/set', //修改用户属性 //订单 - orderReport: 'api/order/v2/mimas/new', //订单信息上报 - orderQuery: 'api/order/query', //订单信息查询 - preorder: 'api/order/v2/preorder', //获取支付方式 + orderReport: 'api/order/v2/mimas/new', //订单信息上报 + orderQuery: 'api/order/query', //订单信息查询 + preorder: 'api/order/v2/preorder', //获取支付方式 + bytedanceOrderReport: 'api/order/v2/bytedance', //字节订单信息上报 // goodslist: 'api/v2/goodslist', //商品列表 }; diff --git a/wxsdk/douyin/DouyinInterstitial.ts b/wxsdk/douyin/DouyinInterstitial.ts new file mode 100644 index 0000000..307ac1b --- /dev/null +++ b/wxsdk/douyin/DouyinInterstitial.ts @@ -0,0 +1,43 @@ +import { GAMEDATA } from "../base/SDKConst"; + +export default class DouyinInterstitial { + /** 插屏广告ID */ + private static interstitialAdId: string = GAMEDATA.interstitialAdId; + /** 插屏广告实例 */ + public static interstitialAd: any; + /** 插屏广告是否加载完成 */ + private static interstitialSuccell: boolean = false; + /** 初始化插屏广告 */ + public static initInterstitialAd(adUnitId: string = GAMEDATA.interstitialAdId) { + // this.interstitialAdId = adUnitId; + // this.createInterstitial(); + } + + private static canReTry = false; + /** 显示插屏广告 */ + public static showInterstitialAd(adUnitId: string = GAMEDATA.interstitialAdId) { + const interstitiaAd = tt.createInterstitialAd({ adUnitId: this.interstitialAdId }); + this.canReTry = true; + let onLoadHandle = ()=> { + console.log("插屏广告onload成功") + interstitiaAd.show().then(() => { + console.log("插屏广告展示成功"); + }); + } + interstitiaAd.onLoad(onLoadHandle); //创建会自动load + + let onErrorHandle = (err)=>{ + // 这里要等待一定时间后,或者等待下次需要展示的时候,参考频控,尝试一次,或者几次,不能一直尝试。 + if (this.canReTry) { + this.canReTry = false; + interstitiaAd.load(); //如果需要,这里等待一定时间后,或者等待下次需要展示的时候,再次 load->onLoad-> show。 + } else { + tt.showToast({ + title: "暂无广告", + icon: "none", + }); + } + } + interstitiaAd.onError(onErrorHandle); // 自动load 的失败会走到这里 + } +} \ No newline at end of file diff --git a/wxsdk/douyin/DouyinPay.ts b/wxsdk/douyin/DouyinPay.ts new file mode 100644 index 0000000..8026a93 --- /dev/null +++ b/wxsdk/douyin/DouyinPay.ts @@ -0,0 +1,175 @@ +import { GAMEDATA } from '../base/SDKConst'; +import { EnvCode } from '../base/SDKEnum'; +import { SDKApi } from '../http/SDKApi'; +import DataService from '../service/DataService'; +import WxSystem from '../wx/WxSystem'; + +export default class DouyinPay { + /** + * 发起支付 + */ + pay(params: { payid: string, goodid: string, money: number; orderid: string }, opts: any = {}): Promise { + return new Promise((resolve, reject) => { + let { Mode, OfferId, ZoneId, CurrencyType, Platform } = GAMEDATA.MidasPay; + // 环境配置,0:米大师正式环境 1:米大师沙箱环境 + let env = DataService.I.EnvEnum === EnvCode.Prod ? 0 : 1; + // 平台类型,android or ios,config.js有配置走配置,否则判断系统id + let platform = DataService.I.Platform; + let pms = { + mode: Mode, + env, + platform, + offerId: OfferId, + currencyType: CurrencyType, + buyQuantity: params.money / 10, + zoneId: ZoneId + }; + let extend = ""; + for (let key in opts) { + extend += (`${key}=${opts[key]}&`) + } + extend = extend.substring(0, extend.length - 1); + extend = encodeURIComponent(extend); + + let payParams = { + ...this.buildParams(), + extend, + orderid: params.orderid, + // payid: params.payid, + goodid: params.goodid, + money: params.money, + platform + }; + console.log("payParams", payParams); + SDKApi.bytedanceOrderReport(payParams).then(res => { + console.log("res", res); + if (!res.code) { + let { mode, env, currencyType, platform, buyQuantity, zoneId, customId, extraInfo } = res.data; + tt.requestGamePayment({ + mode, // 支付类型 + env, //支付环境 + currencyType, // 币种:目前仅为 "CNY" + platform, // 申请接入时的平台:目前仅为"android" + buyQuantity, // 购买数量,必须满足:金币数量*金币单价 = 限定价格等级(详见金币限定等级) + zoneId, + customId,//开发者自定义唯一订单号。如不填,支付结果回调将不包含此字段,将导致游戏开发者无法发放游戏道具, 基础库版本低于1.55.0没有此字段 + extraInfo,//extraInfo要转成字符串 + success(res) { + // console.log("调用函数成功", res); + resolve({ code: 0, msg: '支付成功!' }) + }, + fail(err) { + // console.log("调用函数失败", res); + resolve({ code: err.errCode, msg: '支付失败' }); + }, + complete(res) { + // console.log("调用完成", res); + }, + }) + // tt.requestGamePayment(pms) + // .then(() => this.handlePaySuccess({ ...params, platform }, opts, resolve, reject)) + // .catch(err => this.handlePayError({ ...params, platform }, opts, err, reject)); + } else { + reject(res); + } + }) + }); + } + + private async handlePaySuccess(data: { payid: string, goodid: string, money: number; orderid: string, platform: string }, opts: any, resolve: any, reject: any, t = 1000) { + // let code = await WxApi.I.login(); + + let extend = ""; + for (let key in opts) { + extend += (`${key}=${opts[key]}&`) + } + extend = extend.substring(0, extend.length - 1); + extend = encodeURIComponent(extend); + let params = { + ...this.buildParams(), + extend, + midasenv: DataService.I.EnvEnum === EnvCode.Prod ? 0 : 1, + orderid: data.orderid, + payid: data.payid, goodid: data.goodid, + type: 1, + money: data.money, + platform: data.platform + }; + var that = this; + SDKApi.bytedanceOrderReport(params) + .then(res => { + if (!res.code) { + resolve(res); + } else { + t = Math.min(t * 2, 60000) + // console.error("上报失败,重新上报", t) + setTimeout(() => { + that.handlePaySuccess(data, opts, resolve, reject, t) + }, t); + } + }) + } + + private handlePayError(data: { payid: string, goodid: string, money: number; orderid: string, platform: string }, opts, err: any, reject: any) { + console.log("支付失败", JSON.stringify(err)); + let type = 2; + if (err.errCode + '' == '1') { + type = 3; + } + let extend = ""; + for (let key in opts) { + extend += (`${key}=${opts[key]}&`) + } + extend = extend.substring(0, extend.length - 1); + extend = encodeURIComponent(extend); + let params = { + ...this.buildParams(), + extend, + midasenv: DataService.I.EnvEnum === EnvCode.Prod ? 0 : 1, + orderid: data.orderid, + payid: data.payid, goodid: data.goodid, + type, + money: data.money, + platform: data.platform + }; + SDKApi.bytedanceOrderReport(params) + reject(err); + } + + /** + * 构建支付公用参数 + */ + private buildParams() { + let gameid = GAMEDATA.game_id; + let channel = DataService.I.ChannelId; + let openid = DataService.I.OpenId; + let brand = WxSystem.I.brand; + let model = WxSystem.I.model; + let version = WxSystem.I.version; + let system = WxSystem.I.system; + let sdkversion = WxSystem.I.SDKVersion; + let scene = DataService.I.Scene + ''; + let uid = DataService.I.UserId; + let token = DataService.I.Token; + let env = DataService.I.EnvEnum === 1 ? 'pre' : 'prod'; + return { + gameid, + openid, + channel, + brand, + model, + version, + system, + sdkversion, + scene, + uid, + token, + env + }; + } + + private static _instance: DouyinPay; + static get I(): DouyinPay { + return this._instance || (this._instance = new DouyinPay); + } +} \ No newline at end of file diff --git a/wxsdk/http/SDKApi.ts b/wxsdk/http/SDKApi.ts index 3d371a4..9ce53aa 100644 --- a/wxsdk/http/SDKApi.ts +++ b/wxsdk/http/SDKApi.ts @@ -73,6 +73,7 @@ export class SDKApi { // OrderApi public static pay = (...args) => SDKHttp.httpPost(DataService.I.OrderApi, HostKeys.orderReport, ...args); + public static bytedanceOrderReport = (...args) => SDKHttp.httpPost(DataService.I.OrderApi, HostKeys.bytedanceOrderReport, ...args); public static orderQuery = (...args) => SDKHttp.httpPost(DataService.I.OrderApi, HostKeys.orderQuery, ...args); public static preorder = (...args) => SDKHttp.httpPost(DataService.I.OrderApi, HostKeys.preorder, ...args); diff --git a/wxsdk/service/AdService.ts b/wxsdk/service/AdService.ts index b3720de..656e421 100644 --- a/wxsdk/service/AdService.ts +++ b/wxsdk/service/AdService.ts @@ -4,6 +4,7 @@ import WxCustom from "../wx/WxCustom"; import WxInterstitial from "../wx/WxInterstitial"; import { GAMEDATA } from "../base/SDKConst"; import LogService from "./LogService"; +import DouyinInterstitial from "../douyin/DouyinInterstitial"; @@ -43,7 +44,11 @@ export default class AdService { * @param adUnitId */ createInterstitialAd(adUnitId: string) { - return WxInterstitial.showInterstitialAd(adUnitId) + if (cc.sys.platform === cc.sys.BYTEDANCE_GAME) { + return DouyinInterstitial.showInterstitialAd(adUnitId); + } else { + return WxInterstitial.showInterstitialAd(adUnitId) + } } /** diff --git a/wxsdk/service/GameService.ts b/wxsdk/service/GameService.ts index c237c0d..0021ee3 100644 --- a/wxsdk/service/GameService.ts +++ b/wxsdk/service/GameService.ts @@ -5,6 +5,7 @@ import WxLogin from "../wx/WxLogin"; import WxApi from "../wx/WxApi"; import WxPay from "../wx/WxPay"; import WxSystem from "../wx/WxSystem"; +import DouyinPay from "../douyin/DouyinPay"; export default class GameService { @@ -99,7 +100,11 @@ export default class GameService { * @returns */ pay(params: { payid: string, goodid: string, money: number; orderid: string }, opts: any = {}) { - return WxPay.I.pay(params, opts); + if (cc.sys.platform === cc.sys.BYTEDANCE_GAME) { + return DouyinPay.I.pay(params, opts); + } else { + return WxPay.I.pay(params, opts); + } } /** * 订单查询 diff --git a/wxsdk/service/ShareVideoService.ts b/wxsdk/service/ShareVideoService.ts index 2d89729..dc2a73a 100644 --- a/wxsdk/service/ShareVideoService.ts +++ b/wxsdk/service/ShareVideoService.ts @@ -33,9 +33,12 @@ export default class ShareVideoService { // console.log(JSON.stringify(data)) SDKShare.I.updateShareMenu(true);//打开群分享 - if (GAMEDATA.shareMessageToFriend.scene > 0) { - wx.setMessageToFriendQuery({ shareMessageToFriendScene: GAMEDATA.shareMessageToFriend.scene }) + if (cc.sys.platform === cc.sys.WECHAT_GAME) { + if (GAMEDATA.shareMessageToFriend.scene > 0) { + wx.setMessageToFriendQuery({ shareMessageToFriendScene: GAMEDATA.shareMessageToFriend.scene }) + } } + if (this.forwardKey) this.forward(this.forwardKey); } diff --git a/wxsdk/share/SDKVideo.ts b/wxsdk/share/SDKVideo.ts index 708545a..da4bb97 100644 --- a/wxsdk/share/SDKVideo.ts +++ b/wxsdk/share/SDKVideo.ts @@ -55,7 +55,7 @@ export default class SDKVideo { that.isPreload = false __LOG__ && console.warn("视频预加载成功", that.preloadVideoAd) // that.preloadVideoAd.ttttttt = '111111' - console.warn(that.preloadVideoAd.isReady()); + // console.warn(that.preloadVideoAd.isReady()); } offPreload() { @@ -137,17 +137,22 @@ export default class SDKVideo { private async handleLoaded() { let that = SDKVideo.I; try { - __LOG__ && console.warn("handleLoaded2", that.videoAd, that.videoAd.isReady()); + // __LOG__ && console.warn("handleLoaded2", that.videoAd, that.videoAd.isReady()); LogService.I.adStat(this.videoKey, this.adUnitId, DOT_AD_TYPE.video, DOT_AD_STATUS.show) - if (that.videoAd.isReady()) { + if (cc.sys.platform === cc.sys.WECHAT_GAME) { + if (that.videoAd.isReady()) {//抖音没有 isReady + that.show_time = Date.now(); + await that.videoAd.show(); + } else { + that.videoAd.load().then(() => { + that.show_time = Date.now(); + that.videoAd.show(); + }).catch(that.handleError) + } + } else { that.show_time = Date.now(); await that.videoAd.show(); - } else { - that.videoAd.load().then(() => { - that.show_time = Date.now(); - that.videoAd.show(); - }).catch(that.handleError) } __LOG__ && console.log("handleLoaded_show") //打点 -- libgit2 0.21.0