У меня есть приложение Xamarin iOS со встроенными приложениями. Я получаю base64 закодированное приложение квитанции:Распаковать приложение iOS в C# и php
NSUrl receiptURL = NSBundle.MainBundle.AppStoreReceiptUrl;
String receiptData = receipt.GetBase64EncodedString(0);
Согласно Apple, документы 7.0+ Квитанции приложения упаковывается в pkcs7 контейнере с использованием ASN1. Когда я отправляю его на сервер apple, он возвращает квитанцию в JSON. Но я хочу разобрать его локально, чтобы узнать, что пользователь iaps уже имеет. Мне не нужна проверка, так как Apple делает это дистанционно, мне просто нужно получить квитанции для приобретенных inaps.
До сих пор, как следствие, я разбирал его в php с phpseclib вручную (не знаю, как это сделать программно), и получил его и проанализировал его.
$asn_parser = new File_ASN1();
//parse the receipt binary string
$pkcs7 = $asn_parser->decodeBER(base64_decode($f));
//print_r($pkcs7);
$payload_sequence = $pkcs7[0]['content'][1]['content'][0]['content'][2]['content'];
$pld = $asn_parser->decodeBER($payload_sequence[1]['content'][0]['content']);
//print_r($pld);
$prd = $asn_parser->decodeBER($pld[0]['content'][21]['content'][2]['content']);
print_r($prd);
Но даже так у меня есть беспорядок атрибутов, каждый выглядит следующим образом:
Array
(
[start] => 271
[headerlength] => 2
[type] => 4
[content] => 2016-08-22T13:22:00Z
[length] => 24
)
Это не читаемый человек, мне нужно что-то вроде (выход с print_r из возвращаемого Apple) :
[receipt] => Array
(
[receipt_type] => ProductionSandbox
[adam_id] => 0
[app_item_id] => 0
[bundle_id] => com.my.test.app.iOS
...
[in_app] => Array
(
[0] => Array
(
[quantity] => 1
[product_id] => test_iap_1
[transaction_id] => 1000000230806171
...
[is_trial_period] => false
)
)
)
Все кажется слишком сложным, я с трудом верю, что распаковка чеков настолько сложна. Кто-нибудь знает, как справиться с этим? Я нашел this post, но библиотека написана в объективе-C, который не применим к моей текущей среде. Я бы сказал, что источники этой библиотеки меня пугают: столько сложного кода просто для распаковки стандартного контейнера. Я имею в виду, что работать с json, bson и т. Д. Очень просто, но не asn1.
Квитанция не является отличным способом для управления запасами, так как расходные материалы исчезают из него (или, по крайней мере, это документально поведение, YMMV). Неиспользуемые материалы могут быть обнаружены, если пользователь выполняет восстановление. Что происходит, когда вам нужно знать, что находится в квитанции? –
переустановленное приложение, обновленная приписка к приему - единственное место, где я могу увидеть, какой pruduct приобретен. Разумеется, ресурсы хранятся в локальных файлах и облаках. Во всяком случае, я распаковал его с помощью Liping Dai LCLib (lipingshare.com). Asn1Parser возвращает дерево типа DOM с корневым узлом - очень удобная библиотека. – Tertium
Хорошая находка в библиотеке. Все еще немного запутано - в квитанции не должно быть никаких расходных материалов, и восстановление пользователя должно вернуть вам неиспользованные ресурсы, но если это сработает для вас, то, думаю, вы в порядке. –