shaoxiadiablo/Assets/AGame/Scripts/Platform/KPlatform.Wechat.cs
2025-05-18 01:04:31 +08:00

1015 lines
32 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// ***********************************************************************
// Assembly : Game
// Author : Kimch
// Created : 2021-05-02
// Description :
// Last Modified By :
// Last Modified On :
// ***********************************************************************
// <copyright file= "KPlatform.Wechat" company="Kunpo"></copyright>
// <summary></summary>
// ***********************************************************************
#if SDK_WECHAT_WASM
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using WeChatWASM;
using WXAccountInfo = WeChatWASM.AccountInfo;
using WXSystemInfo = WeChatWASM.SystemInfo;
namespace G
{
/// <summary>
///
/// </summary>
partial class KPlatform
{
/// <summary>
/// 平台实现
/// </summary>
public class WechatPlatform : MonoBehaviour, IPlatformWapper
{
#region
private void Start()
{
this.name = "wechat";
this.Init();
}
/// <summary>
/// 游戏SDK初始化仅Android端
/// Init for Android client ios.
/// </summary>
public void Init()
{
// 打印当前sdk版本号
WX.InitSDK(OnInitCallback);
}
private void OnInitCallback(int code)
{
GetSystemInfo();
GetAccountInfo();
KPlatform.Instance.OnInitSuccess();
var launchResponse = WX.GetLaunchOptionsSync();
if (launchResponse != null)
OnLaunch(launchResponse);
WX.OnShow(this.OnShow);
WX.OnHide(this.OnHide);
WX.SetKeepScreenOn(new SetKeepScreenOnOption
{
keepScreenOn = true,
});
//if (envVersion == "develop")
// WX.OpenProfileStats();
}
WXSystemInfo _wxSystemInfo;
void GetSystemInfo()
{
_wxSystemInfo = WX.GetSystemInfoSync();
}
WXAccountInfo _wxAccountInfo;
void GetAccountInfo()
{
_wxAccountInfo = WX.GetAccountInfoSync();
}
void OnLaunch(LaunchOptionsGame option)
{
var rawData = option.query;
CheckShare(rawData);
}
void OnShow(OnShowCallbackResult showResponse)
{
var rawData = showResponse.query;
CheckShare(rawData);
CheckPayiOS(rawData, showResponse.referrerInfo);
KPlatform.Instance.OnApplicationFocus(true);
}
void OnHide(GeneralCallbackResult result)
{
KPlatform.Instance.OnApplicationFocus(false);
}
void CheckShare(Dictionary<string, string> rawData)
{
if (rawData != null /*&& !string.IsNullOrEmpty(rawData)*/)
{
var inviteInfo = new InviteInfo();// JsonUtility.FromJson<InviteInfo>(rawData);
//inviteInfo.userId = rawData["userId"];
rawData.TryGetValue("userId", out inviteInfo.userId);
rawData.TryGetValue("type", out inviteInfo.type);
if (inviteInfo != null && !string.IsNullOrEmpty(inviteInfo.userId))
{
KPlatform.Instance.inviteInfo = inviteInfo;
//Debug.Log("inviter " + inviteInfo.userId);
}
else
{
//Debug.Log("queryRaw " + rawData);
}
}
this.OnShare(0, "分享成功");
}
void CheckPayiOS(Dictionary<string, string> query, ResultReferrerInfo from)
{
if (query != null)
{
}
if (from != null)
{
Debug.Log(from.appId);
if (from.extraData != null)
foreach (var item in from.extraData)
{
Debug.Log(item.Key + " " + item.Value);
}
}
CheckPay();
}
#endregion
#region
/// <summary>
///
/// </summary>
public string appId
{
get { return _wxAccountInfo != null ? _wxAccountInfo.miniProgram.appId : null; }
}
/// <summary>
///
/// </summary>
public string envVersion
{
get { return _wxAccountInfo != null ? _wxAccountInfo.miniProgram.envVersion : null; }
}
/// <summary>
///
/// </summary>
public string version
{
get { return _wxSystemInfo != null ? _wxSystemInfo.version : "0.0.0"; }
}
/// <summary>
///
/// </summary>
public string platform
{
get { return _wxSystemInfo != null ? _wxSystemInfo.platform : ""; }
}
public bool iOSPlatform
{
get { return platform == "ios"; }
}
/// <summary>
///
/// </summary>
public int safeAreaTop
{
get
{
var safeArea = _wxSystemInfo.safeArea;
return (int)safeArea.top;
}
}
/// <summary>
///
/// </summary>
public int benchmarkLevel
{
get { return _wxSystemInfo != null ? (int)_wxSystemInfo.benchmarkLevel : 18; }
}
#endregion
#region
/// <summary>
/// 正式用户调用登录接口.
/// </summary>
public void NormalLogin()
{
LoginOption option = new LoginOption
{
success = OnLoginSuccess,
fail = OnLoginFailure,
timeout = 6000,
};
//Debug.Log("Wx Login 1");
try
{
WX.Login(option);
}
catch (Exception ex)
{
Debug.Log("Wx Login ex " + ex.Message);
}
//Debug.Log("Wx Login 2");
}
/// <summary>
/// 帐号切换.
/// </summary>
public void SwitchAccount()
{
}
/// <summary>
/// 游客帐号绑定.
/// </summary>
public void VisitorBindAccount()
{
}
/// <summary>
/// 是否为游客登录.
/// </summary>
/// <returns>是否为游客登录.</returns>
public bool IsVisitor()
{
return false;
}
public void ClearToken()
{
}
/// <summary>
///
/// </summary>
/// <param name="response"></param>
private void OnLoginSuccess(LoginSuccessCallbackResult response)
{
//Debug.Log("Wx LoginSuccess " + response.code + " " + response.errMsg);
try
{
KPlatform.Instance.OnLoginSuccess(response.code, "", 1, 1);
}
catch (Exception ex)
{
Debug.Log("Wx LoginSuccess" + ex.Message);
}
}
private void OnLoginFailure(GeneralCallbackResult response)
{
//Debug.Log("Wx OnLoginFailure " + response.errMsg);
try
{
KPlatform.Instance.OnLoginFailure(1, response.errMsg, 1);
}
catch (Exception ex)
{
Debug.Log("Wx OnLoginFailure" + ex.Message);
}
}
Callback2 _getUserInfoCallback;
public void GetUserNickName(Callback2 callback)
{
_getUserInfoCallback = callback;
AuthorizeOption option = new AuthorizeOption
{
scope = "scope.userInfo",
success = (authorizeResponse) => GetUserInfo(),
fail = (authorizeResponse) => ShowGetUserInfoButton(),
};
WX.Authorize(option);
}
void GetUserInfo()
{
GetUserInfoOption option = new GetUserInfoOption
{
lang = "zh_CN",
success = (getUserInfoResponse) =>
{
//Debug.Log("GetUserInfo result " + getUserInfoResponse.errCode + " " + getUserInfoResponse.errMsg);
PlayerProxy.Instance.socialAvatarUrl = getUserInfoResponse.userInfo.avatarUrl;
PlayerProxy.Instance.socialNickName = getUserInfoResponse.userInfo.nickName;
PlayerProxy.Instance.nickName = PlayerProxy.Instance.socialNickName;
GlobalNotifier.PostNotification(GlobalDefine.EVENT_NAME_CHANGED);
_getUserInfoCallback?.Invoke(0, getUserInfoResponse.errMsg);
},
fail = (getUserInfoResponse) =>
{ _getUserInfoCallback?.Invoke(0, getUserInfoResponse.errMsg); }
};
WX.GetUserInfo(option);
}
public void ShowGetUserInfoButton()
{
var btn = WX.CreateUserInfoButton(0, 0, Screen.width, Screen.height, "zh_CN", true);
btn.Show();
btn.OnTap((response) =>
{
//Debug.Log("CreateUserInfoButton result " + response.errCode + " " + response.errMsg);
if (response.errCode == 0)
{
GetUserInfo();
btn.Destroy();
}
});
}
#endregion
#region 广
WXRewardedVideoAd _wxAd;
public void LoadRewardVideoAd_V()
{
if (_wxAd == null)
{
_wxAd = WX.CreateRewardedVideoAd(new WXCreateRewardedVideoAdParam
{
adUnitId = "adunit-ba92aa9eb2ae6720",
});
_wxAd.OnLoad(OnRewardAdLoad);
_wxAd.OnClose(OnRewardedAdClosed);
_wxAd.OnError(OnVideoError);
}
if (_wxAd != null)
_wxAd.Load();
}
public int ShowRewardAd(string scene)
{
_wxAd.Show(OnRewardAdShowSuccess, OnRewardAdShowFailure);
return 0;
}
public int ShowRewardAd(string branchId, string branchDim)
{
_wxAd.Show(branchId, branchDim, OnRewardAdShowSuccess, OnRewardAdShowFailure);
return 0;
}
private void OnRewardAdLoad()
{
Debug.Log("ad OnRewardAdLoad");
}
private void OnRewardAdShowSuccess(WXTextResponse response)
{
KPlatform.Instance.OnRewardedAdShow();
Debug.Log("ad OnRewardAdShowSuccess");
}
private void OnRewardAdShowFailure(WXTextResponse response)
{
_wxAd.Load();
Debug.Log("ad OnRewardAdShowFailure");
}
private void OnRewardedAdShow()
{
KPlatform.Instance.OnRewardedAdShow();
}
private void OnRewardClick()
{
KPlatform.Instance.OnRewardClick();
}
private void OnRewardedAdClosed(WXRewardedVideoAdOnCloseResponse response)
{
Debug.Log("ad OnRewardedAdClosed");
if (response.isEnded)
KPlatform.Instance.OnRewardVerify(true, 1f, "");
KPlatform.Instance.OnRewardedAdClosed();
_wxAd.Load();
}
private void OnVideoError(WXADErrorResponse response)
{
Debug.Log("ad OnVideoError");
KPlatform.Instance.OnVideoError();
}
#endregion
#region
//输入的兑换码
public void Redeem(string redeemCode)
{
}
#endregion
#region AB Test
[Serializable]
class ABConfig
{
public string expt_share;
}
/// <summary>
/// 获取AB测试的配置
/// Gets the ab config.
/// </summary>
/// <returns>The ab config.</returns>
/// <param name="key">Key.</param>
/// <param name="defaultValue">Default value.</param>
/// <typeparam name="T">The 1st type parameter 类型需是JSON兼容的数据类型.</typeparam>
public string GetAbConfig(string key, string defaultValue)
{
var result = WX.GetExptInfoSync<ABConfig>(new string[] { key });
Debug.Log("GetAbConfig" + result);
return result.expt_share.ToString();
}
#endregion
#region
/// <summary>
/// 获取邮件.
/// </summary>
public void FetchMail()
{
}
/// <summary>
/// 确认邮件.
/// </summary>
/// <param name="mailIds">需要确认的邮件id.</param>
public void AckMail(int[] mailIds)
{
}
#endregion
#region
Callback2 _payCallback;
PayProxy.PayInfo _payInfo;
// 查询是否支持支付
public bool QueryPay()
{
if (!KRemoteConfig.Instance.supportPay)
return false;
if (iOSPlatform && !KRemoteConfig.Instance.supportPayiOS)
return false;
return true;
}
void CheckPay()
{
if (iOSPlatform)
{
if (_payCallback != null)
_payCallback(0, "ios");
_payCallback = null;
}
}
/// <summary>
/// 支付
/// </summary>
/// <param name="payData"></param>
/// <param name="callback"></param>
public void Pay(object payData, Callback2 callback)
{
_payCallback = callback;
var payInfo = payData as PayProxy.PayInfo;
if (iOSPlatform)
{
PayWithMiniApp(payInfo);
}
else
{
PayWithMidas(payInfo);
}
}
void PayWithMidas(PayProxy.PayInfo payInfo)
{
payInfo.payMethod = 0;
var payParam = new RequestMidasPaymentOption
{
env = 0,
currencyType = "CNY",
platform = "android",
mode = "game",
offerId = "1450031767",
buyQuantity = envVersion == "develop" ? 10 : payInfo.buyAmount,
zoneId = "1",
success = OnPayResultSuccess,
fail = OnPayResultFail
};
WX.RequestMidasPayment(payParam);
}
//void PayWithService(PayProxy.PayInfo payInfo)
//{
// string severAppId = "KHQiAUtB";
// if (envVersion == "develop")
// severAppId = "KHQiAUtB&dev=1";
// string payKey = payInfo.payKey;
// var param = new OpenCustomerServiceConversationOption
// {
// sessionFrom = $"{{\"receive_param\":\"{payKey}\",\"open_param\":\"{payKey}\",\"params\":\"uid={realPayInfo.userId}&gid={payKey}&aid={severAppId}&cb={ServerProxy.SERVER_URL + "/api/iospay/delivery"}\"}}",
// showMessageCard = true,
// sendMessageImg = "https://bingdu-kunpo.oss-cn-hangzhou.aliyuncs.com/sanguo/wxShare/other/rechargeTop.png",
// success = (response) =>
// {
// },
// fail = (response) =>
// {
// _payCallback?.Invoke(1, response.errMsg);
// }
// };
// WX.OpenCustomerServiceConversation(param);
//}
void PayWithMiniApp(PayProxy.PayInfo payInfo)
{
payInfo.payMethod = 1;
if (_iOSPayData == null)
{
_iOSPayData = new Dictionary<string, string>
{
{ "goods_id","" },
{ "goods_price","" },
{ "goods_name","" },
{ "player_id","" },
{ "notify_path","" },
{ "kunpo_appsecret","146d03ddeb4cd2c87aa5ec8c11fa4648" },
{ "kunpo_appid","KHQiAUtB" },
{ "openid","" },
{ "out_trade_no","" },
{ "sandbox","" },
{ "extra","" },
};
}
var dict = _iOSPayData;
dict["openid"] = KPlatform.Instance.openId;
dict["out_trade_no"] = payInfo.trade_no;
dict["goods_id"] = payInfo.payKey;
dict["goods_price"] = (payInfo.buyAmount * 10).ToString();
dict["goods_name"] = payInfo.payName;
dict["player_id"] = payInfo.userId;
dict["notify_path"] = ServerProxy.SERVER_URL + "/api/iospay/delivery";
dict["sandbox"] = envVersion == "develop" ? "1" : "";
NavigateToMiniProgramOption navigateToMiniProgramOption = new NavigateToMiniProgramOption
{
appId = "wx5576c8e128f9902f",
path = "pages/pay/pay",
extraData = dict,
};
//if (envVersion == "develop")
// navigateToMiniProgramOption.envVersion = "trial";
WX.NavigateToMiniProgram(navigateToMiniProgramOption);
}
Dictionary<string, string> _iOSPayData;
private void OnPayResultSuccess(GeneralCallbackResult result)
{
_payCallback?.Invoke(0, result.errMsg);
_payCallback = null;
}
private void OnPayResultFail(MidasPaymentError response)
{
_payCallback?.Invoke(1, response.errMsg);
_payCallback = null;
}
#endregion
#region
public void SetClipboardData(string data)
{
var param = new SetClipboardDataOption
{
data = data
};
WX.SetClipboardData(param);
}
public void GetClipboardData(Callback3 callback)
{
var param = new GetClipboardDataOption
{
success = (response) =>
{
callback?.Invoke(0, "", response.data);
},
fail = (response) =>
{
callback?.Invoke(1, response.errMsg, null);
}
};
WX.GetClipboardData(param);
}
#endregion
#region
Callback2 _shareCallback;
/// <summary>
///
/// </summary>
/// <param name="shareInfo"></param>
/// <param name="callback"></param>
public void Share(ShareInfo shareInfo, Callback2 callback)
{
_shareCallback = callback;
ShareAppMessageOption shareParam = new ShareAppMessageOption();
shareParam.query = shareInfo.data;
shareParam.title = shareInfo.title;
shareParam.imageUrl = shareInfo.imgUrl;
if (!string.IsNullOrEmpty(shareParam.imageUrlId))
shareParam.imageUrlId = shareInfo.imgUrlId;
WX.ShareAppMessage(shareParam);
}
/// <summary>
///
/// </summary>
/// <param name="error"></param>
/// <param name="message"></param>
private void OnShare(int error, string message)
{
_shareCallback?.Invoke(0, message);
_shareCallback = null;
}
/// <summary>
///
/// </summary>
/// <param name="appId"></param>
/// <param name="extraData"></param>
public void JumpToApp(string appId, object extraData)
{
NavigateToMiniProgramOption navigateToMiniProgramOption = new NavigateToMiniProgramOption
{
appId = appId,
};
//WXNavigateToMiniProgramParam param = new WXNavigateToMiniProgramParam
//{
// appId = appId,
// extraData = extraData,
//};
WX.NavigateToMiniProgram(navigateToMiniProgramOption);
}
#endregion
#region
/// <summary>
/// 显示 loading 提示框。需主动调用 wx.hideLoading 才能关闭提示框
/// </summary>
/// <param name="title"></param>
/// <param name="mask">是否显示透明蒙层,防止触摸穿透</param>
public void ShowLoading(string title, bool mask)
{
var param = new ShowLoadingOption()
{
title = title,
mask = mask,
};
WX.ShowLoading(param);
}
/// <summary>
/// 隐藏 loading 提示框
/// </summary>
public void HideLoading()
{
var param = new HideLoadingOption();
WX.HideLoading(param);
}
/// <summary>
///
/// </summary>
public void ShowToast()
{
var param = new ShowToastOption();
WX.ShowToast(param);
}
public void HideToast()
{
var param = new HideToastOption();
WX.HideToast(param);
}
public void ShowModal()
{
var param = new ShowModalOption();
WX.ShowModal(param);
}
public void CreateGameClubButton()
{
var param = new WXCreateGameClubButtonParam();
WX.CreateGameClubButton(param);
}
#endregion
#region
public void ShowOpenData(Texture texture, int x, int y, int w, int h)
{
WX.ShowOpenData(texture, x, y, w, h);
}
public void HideOpenData()
{
WX.HideOpenData();
}
public void SetUserCloudStorage(IDictionary<string, string> kvData, Callback2 callback)
{
var param = new SetUserCloudStorageOption
{
success = (response) => callback?.Invoke(0, response.errMsg),
fail = (response) => callback?.Invoke(1, response.errMsg),
};
if (kvData != null)
{
param.KVDataList = new KVData[kvData.Count];
int i = 0;
foreach (var item in kvData)
{
param.KVDataList[i++] = new KVData { key = item.Key, value = item.Value };
}
}
WX.SetUserCloudStorage(param);
}
public void RemoveUserCloudStorage(ICollection<string> keys, Callback2 callback)
{
var param = new RemoveUserCloudStorageOption
{
success = (response) => callback?.Invoke(0, response.errMsg),
fail = (response) => callback?.Invoke(1, response.errMsg),
};
if (keys != null)
{
param.keyList = new string[keys.Count];
int i = 0;
foreach (var item in keys)
{
param.keyList[i++] = item;
}
}
WX.RemoveUserCloudStorage(param);
}
#endregion
#region
string[] _vibrateType = new string[]
{
"heavy",
"medium",
"light"
};
/// <summary>
/// 震动强度类型有效值为heavy、medium、light
/// </summary>
public void VibrateShort(int type)
{
VibrateShortOption option = new VibrateShortOption
{
type = _vibrateType[type],
};
WX.VibrateShort(option);
}
public void VibrateLong()
{
VibrateLongOption option = new VibrateLongOption
{
};
WX.VibrateLong(option);
}
#endregion
#region
public void PreLoadMusic()
{
}
WXInnerAudioContext _lastMusicContext;
public void PlayMusic(string musicPath, float volume)
{
if (!WXInnerAudioContext.Dict.TryGetValue(musicPath, out var musicContext))
{
musicContext = WX.CreateInnerAudioContext(new InnerAudioContextParam()
{
src = musicPath,
volume = volume,
loop = true,
needDownload = true
});
}
if (_lastMusicContext != null)
{
_lastMusicContext.Stop();
_lastMusicContext = null;
}
musicContext.OnCanplay(() =>
{
musicContext.Play();
_lastMusicContext = musicContext;
});
}
public void PauseMusic(bool pause)
{
if (_lastMusicContext != null)
if (pause)
{
_lastMusicContext.Stop();
}
else
{
_lastMusicContext.Play();
}
}
public void PreLoadShortAudio(string[] audios)
{
WX.ShortAudioPlayer.PreLoadAudio(audios);
}
public void PlayShortAudio(string audio, float volume)
{
WX.ShortAudioPlayer.StopOthersAndPlay(audio, volume);
}
#endregion
#region
/// <summary>
///
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
public void SetEventCommonHeader(string key, string value)
{
}
/// <summary>
/// 上报v3事件。
/// Ons the event v3.
/// </summary>
/// <param name="label">Label. 事件名,应用内需唯一 .</param>
/// <param name="paramJson">Parameter. 事件参数 json .</param>
public void ReportEvent(string label, string paramJson)
{
}
/// 用于分支相关的UI组件一般是按钮相关事件的上报事件目前有曝光、点击两种
/// </summary>
/// <param name="branchId">分支ID在「小程序管理后台」获取</param>
/// <param name="branchDim">自定义维度</param>
/// <param name="eventType">事件类型1曝光 2点击</param>
public void ReportUserBehaviorBranchAnalytics(string branchId, string branchDim, int eventType)
{
WX.ReportUserBehaviorBranchAnalytics(branchId, branchDim, eventType);
}
#endregion
#region
public void OpenCustomerServiceConversation()
{
var param = new OpenCustomerServiceConversationOption
{
showMessageCard = false,
sendMessageTitle = "我是小客服oooooo",
sendMessageImg = "https://bingdu-kunpo.oss-cn-hangzhou.aliyuncs.com/sanguo/wxShare/other/rechargeTop.png",
complete = (response) =>
{
Debug.Log("客服 " + response.errMsg);
}
};
WX.OpenCustomerServiceConversation(param);
}
/// <summary>
/// 应用内引导评分
/// </summary>
public void InAppRating()
{
}
/// <summary>
/// 验证敏感词.
/// </summary>
/// <param name="sensitiveWords">输入的敏感词信息.</param>
/// <param name="verifyResult">返回的敏感词结果.</param>
public void VerifySensitiveWords(string sensitiveWords, System.Action<int> verifyResult)
{
verifyResult?.Invoke(0);
}
/// <summary>
/// 播放品牌特效.
/// </summary>
/// <param name="portrait">游戏是否竖屏竖屏游戏填true横屏游戏填false.</param>
/// <param name="splashBrandEffectListener">品牌特效完成回调.</param>
public void PlaySplashBrandEffect(bool portrait, System.Action splashBrandEffectAction)
{
//LightGameSDK.PlaySplashBrandEffect(portrait, splashBrandEffectAction);
}
/// <summary>
/// openwebview
/// </summary>
/// <param name="url"></param>
public void OpenWebView(string url)
{
Application.OpenURL(url);
}
public void Logoff(Action<string> onSuccess, Action<int, string> onFail)
{
}
public void OpenUserProtocol()
{
}
public void OpenPrivacyProtocol()
{
}
public void OpenIdentifyProtocol()
{
}
public void ClearCache()
{
if (WX.CleanAllFileCache())
{
WX.ExitMiniProgram(new ExitMiniProgramOption
{
success = reslut => { },
fail = result => { },
});
}
}
#endregion
}
}
}
#endif