18 Commits
Author SHA1 Message Date
rjgonzale 4178d55145 New payload uses an array for receipt info 2023-03-20 13:04:37 -03:00
rjgonzale 1b118cc2cf Check that array is not empty 2023-03-20 12:25:42 -03:00
rjgonzale dacd98b510 Now unified receipt is an des ordered array so take the latest receipt only 2023-03-18 16:48:29 -03:00
rjgonzale e55e7aa66f Updated composer.json 2023-03-18 12:29:20 -03:00
rjgonzale 413de37e0e New payload sent by apple 2023-03-17 19:12:43 -03:00
rjgonzale 06a91150a7 Added DID_RENEW event 2020-12-17 16:03:03 -03:00
rjgonzale 547894fecf Fixed assignment when item is null 2020-09-29 14:58:18 -03:00
rjgonzale b10f00fa5e Allow creating payload from an array not only from a Request object 2020-09-29 13:07:19 -03:00
rjgonzale bd3c0fb660 Disabled shared secret check and return 500 not 400 on error 2020-09-09 10:59:17 -03:00
rjgonzale 9ba9e064dd Debug info removed 2020-09-05 15:02:32 -03:00
rjgonzale d5f561048d Check that latest receipt is defined 2020-09-04 18:05:57 -03:00
rjgonzale cfd16287de Added debug info to find the reason for the missing receipts 2020-09-04 17:39:25 -03:00
rjgonzale 362f3eb9c5 Reverted name change 2020-08-22 10:59:59 -03:00
rjgonzale 2346e33851 Changed package provider 2020-08-22 10:56:24 -03:00
rjgonzale 45e85c76c9 Added support for laravel 7.x 2020-08-22 10:43:54 -03:00
Daan Geurts 2680a2ad93 exclude editor settings 2019-11-21 12:44:52 +01:00
Daan Geurts 6295ad3b80 Versioning 2019-11-12 09:11:15 +01:00
Daan Geurts 4a01bd9c68 README update 2019-10-31 13:06:06 +01:00
8 changed files with 66 additions and 20 deletions
+1
View File
@@ -3,3 +3,4 @@ composer.lock
vendor vendor
coverage.clover coverage.clover
.phpunit.result.cache .phpunit.result.cache
.vscode
+3 -9
View File
@@ -1,20 +1,14 @@
language: php language: php
php:
- 7.2
cache: cache:
directories: directories:
- $HOME/.composer/cache - $HOME/.composer/cache
matrix: matrix:
fast_finish: true fast_finish: true
include:
- php: 7.2
env: LARAVEL='5.7.*' TESTBENCH='3.7.*' PHPENUM='1.*' PHPUNIT='7.*' COMPOSER_FLAGS='--prefer-stable'
- php: 7.3
env: LARAVEL='5.7.*' TESTBENCH='3.7.*' PHPENUM='1.*' PHPUNIT='7.*' COMPOSER_FLAGS='--prefer-lowest'
- php: 7.2
env: LARAVEL='5.8.*' TESTBENCH='3.8.*' PHPENUM='1.*' PHPUNIT='8.*' COMPOSER_FLAGS='--prefer-stable'
- php: 7.3
env: LARAVEL='5.8.*' TESTBENCH='3.8.*' PHPENUM='1.*' PHPUNIT='8.*' COMPOSER_FLAGS='--prefer-lowest'
before_install: before_install:
- travis_retry composer self-update - travis_retry composer self-update
+1 -1
View File
@@ -1,6 +1,6 @@
# Handle Appstore server-to-server notifications for auto-renewable subscriptions # Handle Appstore server-to-server notifications for auto-renewable subscriptions
[![Latest Version on Packagist](https://img.shields.io/packagist/v/app-vise/laravel-appstore-server-notifications.svg?style=flat-square)](https://packagist.org/packages/app-vise/laravel-appstore-server-notifications) [![Latest Version on Packagist](https://img.shields.io/packagist/v/tag/app-vise/laravel-appstore-server-notifications.svg?style=flat-square&sort=semver)](https://packagist.org/packages/app-vise/laravel-appstore-server-notifications)
[![Build Status](https://travis-ci.org/app-vise/laravel-appstore-notifications.svg?branch=master)](https://travis-ci.org/app-vise/laravel-appstore-notifications) [![Build Status](https://travis-ci.org/app-vise/laravel-appstore-notifications.svg?branch=master)](https://travis-ci.org/app-vise/laravel-appstore-notifications)
[![StyleCI](https://styleci.io/repos/215539443/shield?branch=master)](https://styleci.io/repos/215539443) [![StyleCI](https://styleci.io/repos/215539443/shield?branch=master)](https://styleci.io/repos/215539443)
[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/app-vise/laravel-appstore-notifications/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/app-vise/laravel-appstore-notifications/?branch=master) [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/app-vise/laravel-appstore-notifications/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/app-vise/laravel-appstore-notifications/?branch=master)
+3 -3
View File
@@ -1,5 +1,5 @@
{ {
"name": "app-vise/laravel-appstore-server-notifications", "name": "rjgonzale/laravel-appstore-server-notifications",
"description": "Handling Appstore server to server notifications", "description": "Handling Appstore server to server notifications",
"keywords": [ "keywords": [
"app-vise", "app-vise",
@@ -19,8 +19,8 @@
} }
], ],
"require": { "require": {
"php": "^7.1", "php": "^7.",
"illuminate/support": "~5.7.0|^6.0", "illuminate/support": "^5.5|^6.0|^7.",
"bensampo/laravel-enum": "^1.0" "bensampo/laravel-enum": "^1.0"
}, },
"require-dev": { "require-dev": {
+3 -1
View File
@@ -7,16 +7,18 @@ use Appvise\AppStoreNotifications\Model\NotificationType;
use Appvise\AppStoreNotifications\Model\AppleNotification; use Appvise\AppStoreNotifications\Model\AppleNotification;
use Appvise\AppStoreNotifications\Exceptions\WebhookFailed; use Appvise\AppStoreNotifications\Exceptions\WebhookFailed;
use Appvise\AppStoreNotifications\Model\NotificationPayload; use Appvise\AppStoreNotifications\Model\NotificationPayload;
use Illuminate\Support\Facades\Log;
class WebhooksController class WebhooksController
{ {
public function __invoke(Request $request) public function __invoke(Request $request)
{ {
$jobConfigKey = NotificationType::{$request->input('notification_type')}(); $jobConfigKey = NotificationType::{$request->input('notification_type')}();
$this->determineValidRequest($request->input('password'));
AppleNotification::storeNotification($jobConfigKey, $request->input()); AppleNotification::storeNotification($jobConfigKey, $request->input());
//$this->determineValidRequest($request->input('password'));
$payload = NotificationPayload::createFromRequest($request); $payload = NotificationPayload::createFromRequest($request);
$jobClass = config("appstore-server-notifications.jobs.{$jobConfigKey}", null); $jobClass = config("appstore-server-notifications.jobs.{$jobConfigKey}", null);
+1 -1
View File
@@ -8,7 +8,7 @@ class WebhookFailed extends Exception
{ {
public static function nonValidRequest() public static function nonValidRequest()
{ {
return new static("Your shared secret does not match password in Apple's request", 400); return new static("Your shared secret does not match password in Apple's request", 500);
} }
public static function jobClassDoesNotExist(string $jobClass) public static function jobClassDoesNotExist(string $jobClass)
+53 -5
View File
@@ -28,6 +28,43 @@ class NotificationPayload
{ {
} }
public static function createFromArray($notification) {
$instance = new self();
$instance->environment = $notification['environment'];
$instance->password = $notification['password'];
$instance->notificationType = $notification['notification_type'];
$instance->cancellationDate = $notification['cancellation_date'] ?? null;
$instance->cancellationDatePst = $notification['cancellation_date_pst'] ?? null;
$instance->cancellationDateMs = $notification['cancellation_date_ms'] ?? null;
$instance->webOrderLineItemId = $notification['web_order_line_item_id'] ?? null;
$instance->latestReceipt = $notification['latest_receipt'] ?? null;
if (isset($notification['latest_receipt_info'])) {
$instance->latestReceiptInfo = Receipt::createFromArray($notification['latest_receipt_info']);
} else {
$instance->latestReceiptInfo = null;
}
$instance->latestExpiredReceipt = $notification['latest_expired_receipt'] ?? null;
if (isset($notification['latest_expired_receipt_info'])) {
$instance->latestExpiredReceiptInfo = Receipt::createFromArray($notification['latest_expired_receipt_info']);
} else {
$instance->latestExpiredReceiptInfo = null;
}
$instance->autoRenewStatus = $notification['auto_renew_status'];
$instance->autoRenewProductId = $notification['auto_renew_product_id'];
$instance->autoRenewStatusChangeDate = $notification['auto_renew_status_change_date'] ?? null;
$instance->autoRenewStatusChangeDatePst = $notification['auto_renew_status_change_date_pst'] ?? null;
$instance->autoRenewStatusChangeDateMs = $notification['auto_renew_status_change_date_ms'] ?? null;
if (isset($notification['pending_renewal_info'])) {
foreach ($notification['pending_renewal_info'] as $pendingRenewalInfo) {
$instance->pendingRenewalInfo[] = RenewalInfo::createFromRequest($pendingRenewalInfo);
}
} else {
$instance->pendingRenewalInfo = null;
}
return $instance;
}
public static function createFromRequest(Request $request) public static function createFromRequest(Request $request)
{ {
$instance = new self(); $instance = new self();
@@ -38,11 +75,22 @@ class NotificationPayload
$instance->cancellationDatePst = $request->input('cancellation_date_pst'); $instance->cancellationDatePst = $request->input('cancellation_date_pst');
$instance->cancellationDateMs = $request->input('cancellation_date_ms'); $instance->cancellationDateMs = $request->input('cancellation_date_ms');
$instance->webOrderLineItemId = $request->input('web_order_line_item_id'); $instance->webOrderLineItemId = $request->input('web_order_line_item_id');
$instance->latestReceipt = $request->input('latest_receipt');
$instance->latestReceiptInfo = Receipt::createFromArray($request->input('latest_receipt_info')); $unified_receipt = $request->input('unified_receipt');
$instance->latestExpiredReceipt = $request->input('latest_expired_receipt');
if ($request->has('latest_expired_receipt_info')) { $instance->latestReceipt = $request->input('unified_receipt.latest_receipt');
$instance->latestExpiredReceiptInfo = Receipt::createFromArray($request->input('latest_expired_receipt_info')); if ($request->has('unified_receipt.latest_receipt_info')) {
if (count($request->input('unified_receipt.latest_receipt_info')) > 0) {
$instance->latestReceiptInfo = Receipt::createFromArray($request->input('unified_receipt.latest_receipt_info')[0]);
}
} else {
$instance->latestReceiptInfo = null;
}
$instance->latestExpiredReceipt = $request->input('unified_receipt.latest_expired_receipt');
if ($request->has('unified_receipt.latest_expired_receipt_info')) {
if (count($request->input('unified_receipt.latest_expired_receipt_info')) > 0) {
$instance->latestExpiredReceiptInfo = Receipt::createFromArray($request->input('unified_receipt.latest_expired_receipt_info')[0]);
}
} else { } else {
$instance->latestExpiredReceiptInfo = null; $instance->latestExpiredReceiptInfo = null;
} }
+1
View File
@@ -15,4 +15,5 @@ class NotificationType extends Enum
const DID_FAIL_TO_RENEW = 'did_fail_to_renew'; const DID_FAIL_TO_RENEW = 'did_fail_to_renew';
const DID_RECOVER = 'did_recover'; // replaces RENEWAL const DID_RECOVER = 'did_recover'; // replaces RENEWAL
const PRICE_INCREASE_CONSENT = 'price_increase_consent'; const PRICE_INCREASE_CONSENT = 'price_increase_consent';
const DID_RENEW = 'did_renew';
} }