Unity OSP (中文)
1. 创建C#脚本
要在Unity中实施OSP,请创建一个包含逻辑且可添加到IAP按钮的脚本。 首先创建一个动态值和一个静态值(产品ID和服务器URL),这样每个按钮都会有服务器URL,其中包含可用于获取OSP URL的端点,但每个按钮可以关联不同的产品。
public string productId;
//可用于获取一步付款URL的URL
private static string SERVER_URL = "mygamestudio.com/url";
然后创建启动OSP购买流程的函数,并将其设置为关联按钮的onClick侦听器。 为避免重复,您还可以将Unity活动存储为字段,并在“启动”时将其实例化。
//这两个字段稍后将是必填字段
private AndroidJavaObject activity;
private static int MATCH_DEFAULT_ONLY_ANDROID_PM = 65536;
void Start () {
var unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
activity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
GetComponent<Button>().onClick.AddListener(TaskOnClick);
}
void TaskOnClick(){
StartCoroutine(GetURL());
}
2. 从您的服务器获取OSP URL
要完成此步骤,您首先需要一个带有可生成OSP URL的端点的服务器,我们的通用文档解释了执行此操作的过程(要查看该文档,请单击此处)。
然后,要从服务器获取URL,您可以像这样使用UnityEngine.Networking类:
在GetUrlRequest中,您应该添加一个有关用户ID的字段,以便服务器可借助对用户的引用来构建URL,并在验证购买时知道应该将产品分配给谁。
IEnumerator GetURL()
{
var postData = new GetUrlRequest();
postData.product = productId;
var json = JsonUtility.ToJson(postData);
byte[] bodyRaw = Encoding.UTF8.GetBytes(json);
UnityWebRequest request = new UnityWebRequest(SERVER_URL, "POST", (DownloadHandler) new DownloadHandlerBuffer(), (UploadHandler) new UploadHandlerRaw(bodyRaw));
request.SetRequestHeader("Content-Type", "application/json");
yield return request.SendWebRequest();
if (request.result != UnityWebRequest.Result.Success)
yield break;
var response = JsonUtility.FromJson<GetUrlResponse>(request.downloadHandler.text);
Purchase(response.url);
}
[Serializable]
private class GetUrlRequest {
public string product;
}
[Serializable]
private class GetUrlResponse {
public string url;
}
3. 创建意图以处理付款
在应用/游戏内,应使用Web浏览器(只要未安装AppCoins Wallet)或通过AppCoins Wallet打开带有URL的意图。
在某些情况下,已安装AppCoins Wallet的用户依然选择用浏览器打开URL,或甚至选择始终用浏览器打开URL的选项。 为避免这种情况,请添加以下示例来触发一步计费流程。
// 这是在GetURL结束时调用的方法
void Purchase(string url)
{
var intent = BuildTargetIntent(url);
activity.Call("startActivity", intent);
}
// 此方法使用所提供的一步付款URL生成意图以
// 将AppCoins Wallet定为目标。
AndroidJavaObject BuildTargetIntent(string url)
{
var uriClass = new AndroidJavaClass("android.net.Uri");
var uri = uriClass.CallStatic<AndroidJavaObject>("parse", url);
AndroidJavaClass intentClass = new AndroidJavaClass("android.content.Intent");
AndroidJavaObject actionView = intentClass.GetStatic<AndroidJavaObject>("ACTION_VIEW");
AndroidJavaObject intent = new AndroidJavaObject("android.content.Intent", actionView);
intent.Call<AndroidJavaObject>("setData", uri);
var appsList = GetAppsList(intent);
var appsCount = appsList.Call<int>("size");
for (int i=0; i<appsCount; i++) {
var app = appsList.Call<AndroidJavaObject>("get", i);
var packageName = app.Get<AndroidJavaObject>("activityInfo").Get<string>("packageName");
if (packageName == "cm.aptoide.pt") {
// 如果安装了Aptoide,始终选择默认使用Aptoide打开URL
intent.Call<AndroidJavaObject>("setPackage", packageName);
break;
} else if (packageName == "com.appcoins.wallet") {
// 如果未安装Aptoide但已安装钱包,则选择
// 默认使用钱包打开URL
intent.Call<AndroidJavaObject>("setPackage", packageName);
}
}
return intent;
}
//获取可以运行意图的应用
private AndroidJavaObject GetAppsList(AndroidJavaObject intent)
{
var packageManager = activity.Call<AndroidJavaObject>("getApplicationContext").Call<AndroidJavaObject>("getPackageManager");
var appsList = packageManager.Call<AndroidJavaObject>("queryIntentActivities", intent, MATCH_DEFAULT_ONLY_ANDROID_PM);
return appsList;
}
4. 创建要用作回调URL的Web服务端点
接下来的步骤是准备好服务器,以处理向回调URL发出的请求,并将已购商品分配给相应的用户,有关如何执行此操作的步骤可在我们的通用文档页面上找到 (要查看该文档,请单击此处)。
Updated 9 days ago