Получение 401 несанкционированного ответа на вызов Apple Developer APIAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Получение 401 несанкционированного ответа на вызов Apple Developer API

Сообщение Anonymous »

Я реализовал покупку подписки с помощью пакета Plugin.InAppBilling, его коды приведены ниже.

Код: Выделить всё

private async void PlanClicked(Object sender, EventArgs e)
{
UserDialogs.Instance.ShowLoading("");
if (IsBusy)
return;

IsBusy = true;
try
{
// check internet first with Essentials
if (Connectivity.NetworkAccess != NetworkAccess.Internet)
return;

// connect to the app store api
var connected = await CrossInAppBilling.Current.ConnectAsync();
if (!connected)
return;

UserDialogs.Instance.HideHud();
//try to make purchase, this will return a purchase, empty, or throw an exception
var purchase = await CrossInAppBilling.Current.PurchaseAsync(productId, ItemType.Subscription);

if (purchase == null)
{
//nothing was purchased
return;
}

if (purchase.State == PurchaseState.Purchased)
{
Debug.WriteLine("Purchase successfull");
Debug.WriteLine("Purchase token:>>" + purchase.PurchaseToken);
Debug.WriteLine("Purchase id:>>" + purchase.Id);
}
else
{
throw new InAppBillingPurchaseException(PurchaseError.GeneralError);
}
}
catch (InAppBillingPurchaseException purchaseEx)
{
// Handle all the different error codes that can occure and do a pop up
Debug.WriteLine("purchaseEx:>>" + purchaseEx);
}
catch (Exception ex)
{
// Handle a generic exception as something really went wrong
Debug.WriteLine("exception:>>" + ex);
}
finally
{
await CrossInAppBilling.Current.DisconnectAsync();
IsBusy = false;
}
}
После успешной покупки я получаю PurchaseToken и идентификатор из магазина приложений и магазина игр.
Теперь я использую это необходимо получить сведения о подписке пользователя. Какой API разработчика App Store и API разработчика Play Store подходят для этого?
Я пробовал использовать этот API от Apple и этот API от Play Store. Это правильный API для получения сведений о подписке?
Когда я пытаюсь использовать Apple API, я получаю ответ 401 Unauthorized.
Используя приведенный ниже код, я генерирую токен JWT.

Код: Выделить всё

private string LoadPrivateKey()
{
string fileName = "API key (.p8 file)";

using var stream = FileSystem.OpenAppPackageFileAsync(fileName).Result;
using var reader = new StreamReader(stream);
var privateKey = reader.ReadToEnd();

// Remove the header and footer lines
privateKey = privateKey
.Replace("-----BEGIN PRIVATE KEY-----", string.Empty)
.Replace("-----END PRIVATE KEY-----", string.Empty)
.Replace("\n", string.Empty)
.Replace("\r", string.Empty);

return privateKey;
}

public async void JWTGenerator(Object sender, EventArgs e)
{
try
{
// Key ID from Apple Developer account
string keyId = "keyId";

// Team ID from Apple Developer account
string teamId = "teamId";

// Load your private key from the .p8 file
string privateKey = LoadPrivateKey();

// Call the GenerateToken method to create a JWT
string jwtToken = AppleApiTokenGenerator.GenerateToken(keyId, teamId, privateKey);
DisplayAlert("JWT Token", jwtToken, "OK");
}
catch (Exception ex)
{
Debug.WriteLine("JWTException:>" + ex);
}

}

public class AppleApiTokenGenerator
{
public static string GenerateToken(string keyId, string teamId, string privateKey)
{
byte[] privateKeyBytes = Convert.FromBase64String(privateKey);
var tokenHandler = new JwtSecurityTokenHandler();
var key = new SymmetricSecurityKey(Convert.FromBase64String(privateKey));
var credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(new[]
{
new Claim(JwtRegisteredClaimNames.Iss, teamId),
new Claim(JwtRegisteredClaimNames.Aud, "https://api.storekit-sandbox.itunes.apple.com/inApps/v1/subscriptions/{transactionId}"),
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
}),
Expires = DateTime.UtcNow.AddMinutes(20),
SigningCredentials = credentials
};

var token = tokenHandler.CreateToken(tokenDescriptor);
Console.WriteLine($"JWT token:{tokenHandler.WriteToken(token)}");
return tokenHandler.WriteToken(token);
}
}
Файл .P8, который мы добавили в раздел «Ресурсы/строка», и установили действие сборки как MauAsset.
Может ли кто-нибудь предоставить решение или рекомендации ?
Заранее спасибо за помощь!

Подробнее здесь: https://stackoverflow.com/questions/790 ... r-api-call
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»