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发出的请求,并将已购商品分配给相应的用户,有关如何执行此操作的步骤可在我们的通用文档页面上找到 (要查看该文档,请单击此处)。