@mathrunet/masamune 0.4.4 → 0.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +27 -0
- package/dist/functions/android_auth_code.d.ts +1 -0
- package/dist/functions/android_auth_code.js +76 -0
- package/dist/functions/android_auth_code.js.map +1 -0
- package/dist/functions/android_token.d.ts +1 -0
- package/dist/functions/android_token.js +117 -0
- package/dist/functions/android_token.js.map +1 -0
- package/dist/functions/consumable_verify_android.d.ts +1 -0
- package/dist/functions/consumable_verify_android.js +132 -0
- package/dist/functions/consumable_verify_android.js.map +1 -0
- package/dist/functions/consumable_verify_ios.d.ts +1 -0
- package/dist/functions/consumable_verify_ios.js +92 -0
- package/dist/functions/consumable_verify_ios.js.map +1 -0
- package/dist/functions/gmail.js +8 -3
- package/dist/functions/gmail.js.map +1 -1
- package/dist/functions/nonconsumable_verify_android.d.ts +1 -0
- package/dist/functions/nonconsumable_verify_android.js +126 -0
- package/dist/functions/nonconsumable_verify_android.js.map +1 -0
- package/dist/functions/nonconsumable_verify_ios.d.ts +1 -0
- package/dist/functions/nonconsumable_verify_ios.js +86 -0
- package/dist/functions/nonconsumable_verify_ios.js.map +1 -0
- package/dist/functions/purchase_hook_android.d.ts +1 -0
- package/dist/functions/purchase_hook_android.js +237 -0
- package/dist/functions/purchase_hook_android.js.map +1 -0
- package/dist/functions/purchase_hook_ios.d.ts +1 -0
- package/dist/functions/purchase_hook_ios.js +135 -0
- package/dist/functions/purchase_hook_ios.js.map +1 -0
- package/dist/functions/send_grid.js +6 -1
- package/dist/functions/send_grid.js.map +1 -1
- package/dist/functions/stripe.js +46 -12
- package/dist/functions/stripe.js.map +1 -1
- package/dist/functions/stripe_hook_secure.js +5 -1
- package/dist/functions/stripe_hook_secure.js.map +1 -1
- package/dist/functions/subscription_verify_android.d.ts +1 -0
- package/dist/functions/subscription_verify_android.js +159 -0
- package/dist/functions/subscription_verify_android.js.map +1 -0
- package/dist/functions/subscription_verify_ios.d.ts +1 -0
- package/dist/functions/subscription_verify_ios.js +128 -0
- package/dist/functions/subscription_verify_ios.js.map +1 -0
- package/dist/functions.d.ts +62 -0
- package/dist/functions.js +62 -0
- package/dist/functions.js.map +1 -1
- package/dist/lib/gmail.d.ts +6 -1
- package/dist/lib/gmail.js +1 -1
- package/dist/lib/gmail.js.map +1 -1
- package/dist/lib/send_grid.d.ts +6 -1
- package/dist/lib/send_grid.js +1 -1
- package/dist/lib/send_grid.js.map +1 -1
- package/dist/lib/update_subscription.d.ts +83 -0
- package/dist/lib/update_subscription.js +142 -0
- package/dist/lib/update_subscription.js.map +1 -0
- package/dist/lib/update_unlock.d.ts +13 -0
- package/dist/lib/update_unlock.js +64 -0
- package/dist/lib/update_unlock.js.map +1 -0
- package/dist/lib/update_wallet.d.ts +19 -0
- package/dist/lib/update_wallet.js +70 -0
- package/dist/lib/update_wallet.js.map +1 -0
- package/dist/lib/utils.d.ts +10 -2
- package/dist/lib/utils.js +2 -2
- package/dist/lib/utils.js.map +1 -1
- package/dist/lib/verify_android.d.ts +56 -0
- package/dist/lib/verify_android.js +128 -0
- package/dist/lib/verify_android.js.map +1 -0
- package/dist/lib/verify_ios.d.ts +26 -0
- package/dist/lib/verify_ios.js +115 -0
- package/dist/lib/verify_ios.js.map +1 -0
- package/package.json +2 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
26
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
27
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
28
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
29
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
30
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
31
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
32
|
+
});
|
|
33
|
+
};
|
|
34
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
35
|
+
const functions = __importStar(require("firebase-functions"));
|
|
36
|
+
const verifier = __importStar(require("../lib/verify_ios"));
|
|
37
|
+
const updater = __importStar(require("../lib/update_unlock"));
|
|
38
|
+
/**
|
|
39
|
+
* Performs non-consumable in-app purchases. Unlock by setting the value of the field in the document specified in [path] to `true`.
|
|
40
|
+
*
|
|
41
|
+
* 非消費型のアプリ内課金を行います。[path]に指定したドキュメント内のフィールドの値を`true`にすることでアンロックを行います。
|
|
42
|
+
*
|
|
43
|
+
* @param purchase.ios.shared_secret
|
|
44
|
+
* SharedSecret for AppStore, obtained from [Apps]->[App Info]->[Shared Secret for App] in the AppStore.
|
|
45
|
+
*
|
|
46
|
+
* AppStoreのSharedSecret。AppStoreの[アプリ]->[App情報]->[App用共有シークレット]から取得します。
|
|
47
|
+
*
|
|
48
|
+
* @param path
|
|
49
|
+
* The path, including the key, of the field in the document where the unlock information is to be stored.
|
|
50
|
+
*
|
|
51
|
+
* アンロック情報を保存するドキュメント内のフィールドのキーを含めたパス。
|
|
52
|
+
*
|
|
53
|
+
* @param receiptData
|
|
54
|
+
* Receipt data for purchases.
|
|
55
|
+
*
|
|
56
|
+
* 購入の際のレシートデータ。
|
|
57
|
+
*/
|
|
58
|
+
module.exports = (regions) => functions.region(...regions).https.onCall((query) => __awaiter(void 0, void 0, void 0, function* () {
|
|
59
|
+
try {
|
|
60
|
+
const config = functions.config().purchase;
|
|
61
|
+
/* ==== IOS検証ここから ==== */
|
|
62
|
+
const res = yield verifier.verifyIOS({
|
|
63
|
+
receiptData: query.receiptData,
|
|
64
|
+
password: config.ios.shared_secret,
|
|
65
|
+
});
|
|
66
|
+
const status = res["status"];
|
|
67
|
+
if (status !== 0) {
|
|
68
|
+
throw new functions.https.HttpsError("unauthenticated", "Illegal receipt.");
|
|
69
|
+
}
|
|
70
|
+
/* ==== ここまでIOS検証 ==== */
|
|
71
|
+
if (!query.path) {
|
|
72
|
+
return res;
|
|
73
|
+
}
|
|
74
|
+
/* ==== Firestoreの更新ここから ==== */
|
|
75
|
+
yield updater.updateUnlock({
|
|
76
|
+
targetDocumentFieldPath: query.path,
|
|
77
|
+
});
|
|
78
|
+
/* ==== ここまでFirestoreの更新 ==== */
|
|
79
|
+
return res;
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
console.error(err);
|
|
83
|
+
throw err;
|
|
84
|
+
}
|
|
85
|
+
}));
|
|
86
|
+
//# sourceMappingURL=nonconsumable_verify_ios.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nonconsumable_verify_ios.js","sourceRoot":"","sources":["../../src/functions/nonconsumable_verify_ios.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,8DAAgD;AAChD,4DAA8C;AAC9C,8DAAgD;AAEhD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,OAAO,GAAG,CAAC,OAAiB,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,KAAK,CAAC,MAAM,CAC7E,CAAO,KAAK,EAAE,EAAE;IACZ,IAAI;QACA,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC;QAC3C,yBAAyB;QACzB,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC;YACjC,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,aAAa;SACrC,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7B,IAAI,MAAM,KAAK,CAAC,EAAE;YACd,MAAM,IAAI,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,iBAAiB,EAAE,kBAAkB,CAAC,CAAC;SAC/E;QACD,yBAAyB;QACzB,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;YACb,OAAO,GAAG,CAAC;SACd;QACD,gCAAgC;QAChC,MAAM,OAAO,CAAC,YAAY,CAAC;YACvB,uBAAuB,EAAE,KAAK,CAAC,IAAI;SACtC,CAAC,CAAC;QACH,gCAAgC;QAChC,OAAO,GAAG,CAAC;KACd;IAAC,OAAO,GAAG,EAAE;QACV,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACnB,MAAM,GAAG,CAAC;KACb;AACL,CAAC,CAAA,CACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
26
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
27
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
28
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
29
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
30
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
31
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
32
|
+
});
|
|
33
|
+
};
|
|
34
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
35
|
+
const functions = __importStar(require("firebase-functions"));
|
|
36
|
+
const admin = __importStar(require("firebase-admin"));
|
|
37
|
+
const verifier = __importStar(require("../lib/verify_android"));
|
|
38
|
+
const utils = __importStar(require("../lib/utils"));
|
|
39
|
+
/**
|
|
40
|
+
* This is a webhook endpoint for Android. you can create a `purchasing` topic in GCP's pub/sub and set the principal to "google-play-developer-notifications@system.gserviceaccount.com" to receive notifications.
|
|
41
|
+
*
|
|
42
|
+
* Android用のWebhookのエンドポイントです。GCPのpub/subに`purchasing`のトピックを作成しプリンシパルに「google-play-developer-notifications@system.gserviceaccount.com」を設定することで通知を受け取ることができるようになります。
|
|
43
|
+
*
|
|
44
|
+
* @param purchase.android.refresh_token
|
|
45
|
+
* Describe the refresh token that can be obtained by accessing [android_auth_code].
|
|
46
|
+
*
|
|
47
|
+
* [android_auth_code]にアクセスすることで取得できるリフレッシュトークンを記述します。
|
|
48
|
+
*
|
|
49
|
+
* @param purchase.android.client_id
|
|
50
|
+
* Google's OAuth 2.0 client ID.
|
|
51
|
+
* Create an OAuth consent screen from the URL below.
|
|
52
|
+
* https://console.cloud.google.com/apis/credentials/consent
|
|
53
|
+
* Then create an OAuth 2.0 client ID from the credentials.
|
|
54
|
+
* https://console.cloud.google.com/apis/credentials
|
|
55
|
+
*
|
|
56
|
+
* GoogleのOAuth2.0のクライアントID。
|
|
57
|
+
* 下記のURLからOAuthの同意画面を作成します。
|
|
58
|
+
* https://console.cloud.google.com/apis/credentials/consent
|
|
59
|
+
* その後、認証情報からOAuth 2.0 クライアントIDを作成します。
|
|
60
|
+
* https://console.cloud.google.com/apis/credentials
|
|
61
|
+
*
|
|
62
|
+
* @param purchase.android.client_secret
|
|
63
|
+
* Google's OAuth 2.0 client secret.
|
|
64
|
+
* Create an OAuth consent screen from the URL below.
|
|
65
|
+
* https://console.cloud.google.com/apis/credentials/consent
|
|
66
|
+
* Then create an OAuth 2.0 client ID from the credentials.
|
|
67
|
+
* https://console.cloud.google.com/apis/credentials
|
|
68
|
+
*
|
|
69
|
+
* GoogleのOAuth2.0のクライアントシークレット。
|
|
70
|
+
* 下記のURLからOAuthの同意画面を作成します。
|
|
71
|
+
* https://console.cloud.google.com/apis/credentials/consent
|
|
72
|
+
* その後、認証情報からOAuth 2.0 クライアントIDを作成します。
|
|
73
|
+
* https://console.cloud.google.com/apis/credentials
|
|
74
|
+
*
|
|
75
|
+
* @param purchase.android.subscription_path
|
|
76
|
+
* Describes the path to the collection of subscriptions.
|
|
77
|
+
*
|
|
78
|
+
* サブスクリプションのコレクションのパスを記述します。
|
|
79
|
+
*/
|
|
80
|
+
module.exports = functions.pubsub
|
|
81
|
+
.topic("purchasing")
|
|
82
|
+
.onPublish((message) => __awaiter(void 0, void 0, void 0, function* () {
|
|
83
|
+
try {
|
|
84
|
+
const messageBody = message.data ?
|
|
85
|
+
JSON.parse(Buffer.from(message.data, "base64").toString()) :
|
|
86
|
+
null;
|
|
87
|
+
if (messageBody) {
|
|
88
|
+
const firestoreInstance = admin.firestore();
|
|
89
|
+
const config = functions.config().purchase;
|
|
90
|
+
const targetPath = config.subscription_path;
|
|
91
|
+
if (!config.android.client_id || !config.android.client_secret || !config.android.refresh_token || !targetPath) {
|
|
92
|
+
throw new Error("The data is invalid.");
|
|
93
|
+
}
|
|
94
|
+
const { subscriptionNotification, packageName, } = messageBody;
|
|
95
|
+
if (subscriptionNotification) {
|
|
96
|
+
const { notificationType, purchaseToken, subscriptionId, } = subscriptionNotification;
|
|
97
|
+
if (!purchaseToken || !packageName || !subscriptionId) {
|
|
98
|
+
throw new Error("The data is invalid.");
|
|
99
|
+
}
|
|
100
|
+
const res = yield verifier.verifyAndroid({
|
|
101
|
+
type: "subscriptions",
|
|
102
|
+
clientId: config.android.client_id,
|
|
103
|
+
clientSecret: config.android.client_secret,
|
|
104
|
+
refreshToken: config.android.refresh_token,
|
|
105
|
+
packageName: packageName,
|
|
106
|
+
productId: subscriptionId,
|
|
107
|
+
purchaseToken: purchaseToken,
|
|
108
|
+
});
|
|
109
|
+
const search = yield firestoreInstance.collection(targetPath).where("token", "==", purchaseToken).get();
|
|
110
|
+
if (search.empty) {
|
|
111
|
+
throw new Error("The purchased data is not found.");
|
|
112
|
+
}
|
|
113
|
+
const doc = search.docs[0];
|
|
114
|
+
const data = doc === null || doc === void 0 ? void 0 : doc.data();
|
|
115
|
+
const path = doc === null || doc === void 0 ? void 0 : doc.ref.path;
|
|
116
|
+
if (!data) {
|
|
117
|
+
throw new Error("The purchased data is not found.");
|
|
118
|
+
}
|
|
119
|
+
const user = data["userId"];
|
|
120
|
+
console.log(`notificationType: ${notificationType}`);
|
|
121
|
+
switch (notificationType) {
|
|
122
|
+
case SubscriptionNotificationTypes.SUBSCRIPTION_RECOVERED:
|
|
123
|
+
case SubscriptionNotificationTypes.SUBSCRIPTION_RESTARTED:
|
|
124
|
+
case SubscriptionNotificationTypes.SUBSCRIPTION_RENEWED:
|
|
125
|
+
case SubscriptionNotificationTypes.SUBSCRIPTION_IN_GRACE_PERIOD: {
|
|
126
|
+
for (const key in res) {
|
|
127
|
+
if (!data[key]) {
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
data[key] = utils.parse(res[key]);
|
|
131
|
+
}
|
|
132
|
+
data["expired"] = false;
|
|
133
|
+
data["expiredTime"] = parseInt(res["expiryTimeMillis"]);
|
|
134
|
+
data["orderId"] = res["orderId"];
|
|
135
|
+
data["@time"] = new Date();
|
|
136
|
+
yield firestoreInstance.doc(path).set(data);
|
|
137
|
+
console.log(`Updated subscription: ${data["productId"]}:${user}`);
|
|
138
|
+
break;
|
|
139
|
+
}
|
|
140
|
+
case SubscriptionNotificationTypes.SUBSCRIPTION_DEFERRED:
|
|
141
|
+
case SubscriptionNotificationTypes.SUBSCRIPTION_PRICE_CHANGE_CONFIRMED:
|
|
142
|
+
case SubscriptionNotificationTypes.SUBSCRIPTION_PAUSE_SCHEDULE_CHANGED: {
|
|
143
|
+
for (const key in res) {
|
|
144
|
+
if (!data[key]) {
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
data[key] = utils.parse(res[key]);
|
|
148
|
+
}
|
|
149
|
+
data["expiredTime"] = parseInt(res["expiryTimeMillis"]);
|
|
150
|
+
data["orderId"] = res["orderId"];
|
|
151
|
+
data["@time"] = new Date();
|
|
152
|
+
yield firestoreInstance.doc(path).set(data);
|
|
153
|
+
console.log(`Updated subscription: ${data["productId"]}:${user}`);
|
|
154
|
+
break;
|
|
155
|
+
}
|
|
156
|
+
case SubscriptionNotificationTypes.SUBSCRIPTION_REVOKED:
|
|
157
|
+
case SubscriptionNotificationTypes.SUBSCRIPTION_EXPIRED:
|
|
158
|
+
case SubscriptionNotificationTypes.SUBSCRIPTION_CANCELED:
|
|
159
|
+
case SubscriptionNotificationTypes.SUBSCRIPTION_PAUSED:
|
|
160
|
+
case SubscriptionNotificationTypes.SUBSCRIPTION_ON_HOLD: {
|
|
161
|
+
for (const key in res) {
|
|
162
|
+
if (!data[key]) {
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
data[key] = utils.parse(res[key]);
|
|
166
|
+
}
|
|
167
|
+
data["expired"] = true;
|
|
168
|
+
yield firestoreInstance.doc(path).set(data);
|
|
169
|
+
console.log(`Expired subscription: ${data["productId"]}:${user}`);
|
|
170
|
+
break;
|
|
171
|
+
}
|
|
172
|
+
default:
|
|
173
|
+
break;
|
|
174
|
+
}
|
|
175
|
+
if (res["linkedPurchaseToken"]) {
|
|
176
|
+
const linkedPurchaseToken = res["linkedPurchaseToken"];
|
|
177
|
+
const search = yield firestoreInstance.collection(targetPath).where("token", "==", linkedPurchaseToken).get();
|
|
178
|
+
if (search.empty) {
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
const doc = search.docs[0];
|
|
182
|
+
const data = doc === null || doc === void 0 ? void 0 : doc.data();
|
|
183
|
+
const path = doc === null || doc === void 0 ? void 0 : doc.ref.path;
|
|
184
|
+
if (!data) {
|
|
185
|
+
throw new Error("The purchased data is not found.");
|
|
186
|
+
}
|
|
187
|
+
const user = data["userId"];
|
|
188
|
+
data["expired"] = true;
|
|
189
|
+
data["@time"] = new Date();
|
|
190
|
+
yield firestoreInstance.doc(path).set(data);
|
|
191
|
+
console.log(`Expired subscription: ${data["productId"]}:${user}`);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
catch (err) {
|
|
197
|
+
console.error(err);
|
|
198
|
+
throw new functions.https.HttpsError("unknown", "Unknown error.");
|
|
199
|
+
}
|
|
200
|
+
}));
|
|
201
|
+
/**
|
|
202
|
+
* Notification Type.
|
|
203
|
+
*
|
|
204
|
+
* 通知タイプ。
|
|
205
|
+
*/
|
|
206
|
+
var SubscriptionNotificationTypes;
|
|
207
|
+
(function (SubscriptionNotificationTypes) {
|
|
208
|
+
// 定期購入がアカウントの一時停止から復帰した。
|
|
209
|
+
SubscriptionNotificationTypes[SubscriptionNotificationTypes["SUBSCRIPTION_RECOVERED"] = 1] = "SUBSCRIPTION_RECOVERED";
|
|
210
|
+
// アクティブな定期購入が更新された。
|
|
211
|
+
SubscriptionNotificationTypes[SubscriptionNotificationTypes["SUBSCRIPTION_RENEWED"] = 2] = "SUBSCRIPTION_RENEWED";
|
|
212
|
+
// 定期購入が自発的または非自発的にキャンセルされた。
|
|
213
|
+
// 自発的なキャンセルの場合、ユーザーがキャンセルしたときに送信されます。
|
|
214
|
+
SubscriptionNotificationTypes[SubscriptionNotificationTypes["SUBSCRIPTION_CANCELED"] = 3] = "SUBSCRIPTION_CANCELED";
|
|
215
|
+
// 新しい定期購入が購入された。
|
|
216
|
+
SubscriptionNotificationTypes[SubscriptionNotificationTypes["SUBSCRIPTION_PURCHASED"] = 4] = "SUBSCRIPTION_PURCHASED";
|
|
217
|
+
// 定期購入でアカウントが一時停止された(有効な場合)。
|
|
218
|
+
SubscriptionNotificationTypes[SubscriptionNotificationTypes["SUBSCRIPTION_ON_HOLD"] = 5] = "SUBSCRIPTION_ON_HOLD";
|
|
219
|
+
// 定期購入が猶予期間に入った(有効な場合)。
|
|
220
|
+
SubscriptionNotificationTypes[SubscriptionNotificationTypes["SUBSCRIPTION_IN_GRACE_PERIOD"] = 6] = "SUBSCRIPTION_IN_GRACE_PERIOD";
|
|
221
|
+
// ユーザーが [Play] > [アカウント] > [定期購入] から
|
|
222
|
+
// 定期購入を再有効化した(定期購入の再開にはオプトインが必要)。
|
|
223
|
+
SubscriptionNotificationTypes[SubscriptionNotificationTypes["SUBSCRIPTION_RESTARTED"] = 7] = "SUBSCRIPTION_RESTARTED";
|
|
224
|
+
// 定期購入の料金変更がユーザーによって確認された。
|
|
225
|
+
SubscriptionNotificationTypes[SubscriptionNotificationTypes["SUBSCRIPTION_PRICE_CHANGE_CONFIRMED"] = 8] = "SUBSCRIPTION_PRICE_CHANGE_CONFIRMED";
|
|
226
|
+
// 定期購入の契約期間が延長された。
|
|
227
|
+
SubscriptionNotificationTypes[SubscriptionNotificationTypes["SUBSCRIPTION_DEFERRED"] = 9] = "SUBSCRIPTION_DEFERRED";
|
|
228
|
+
// 定期購入が一時停止された。
|
|
229
|
+
SubscriptionNotificationTypes[SubscriptionNotificationTypes["SUBSCRIPTION_PAUSED"] = 10] = "SUBSCRIPTION_PAUSED";
|
|
230
|
+
// 定期購入の一時停止スケジュールが変更された。
|
|
231
|
+
SubscriptionNotificationTypes[SubscriptionNotificationTypes["SUBSCRIPTION_PAUSE_SCHEDULE_CHANGED"] = 11] = "SUBSCRIPTION_PAUSE_SCHEDULE_CHANGED";
|
|
232
|
+
// 有効期限前にユーザーが定期購入を取り消した。
|
|
233
|
+
SubscriptionNotificationTypes[SubscriptionNotificationTypes["SUBSCRIPTION_REVOKED"] = 12] = "SUBSCRIPTION_REVOKED";
|
|
234
|
+
// 定期購入が期限切れになった。
|
|
235
|
+
SubscriptionNotificationTypes[SubscriptionNotificationTypes["SUBSCRIPTION_EXPIRED"] = 13] = "SUBSCRIPTION_EXPIRED";
|
|
236
|
+
})(SubscriptionNotificationTypes || (SubscriptionNotificationTypes = {}));
|
|
237
|
+
//# sourceMappingURL=purchase_hook_android.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"purchase_hook_android.js","sourceRoot":"","sources":["../../src/functions/purchase_hook_android.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,8DAAgD;AAChD,sDAAwC;AACxC,gEAAkD;AAClD,oDAAsC;AAEtC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,MAAM,CAAC,OAAO,GAAG,SAAS,CAAC,MAAM;KAC5B,KAAK,CAAC,YAAY,CAAC;KACnB,SAAS,CAAC,CAAO,OAAO,EAAE,EAAE;IACzB,IAAI;QACA,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;YAC9B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YAC5D,IAAI,CAAC;QACT,IAAI,WAAW,EAAE;YACb,MAAM,iBAAiB,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;YAC5C,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC;YAC3C,MAAM,UAAU,GAAG,MAAM,CAAC,iBAAiB,CAAC;YAC5C,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,IAAI,CAAC,UAAU,EAAE;gBAC5G,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;aAC3C;YACD,MAAM,EACF,wBAAwB,EACxB,WAAW,GACd,GAAG,WAAW,CAAC;YAChB,IAAI,wBAAwB,EAAE;gBAC1B,MAAM,EACF,gBAAgB,EAChB,aAAa,EACb,cAAc,GACjB,GAAG,wBAAwB,CAAC;gBAC7B,IAAI,CAAC,aAAa,IAAI,CAAC,WAAW,IAAI,CAAC,cAAc,EAAE;oBACnD,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;iBAC3C;gBACD,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC;oBACrC,IAAI,EAAE,eAAe;oBACrB,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS;oBAClC,YAAY,EAAE,MAAM,CAAC,OAAO,CAAC,aAAa;oBAC1C,YAAY,EAAE,MAAM,CAAC,OAAO,CAAC,aAAa;oBAC1C,WAAW,EAAE,WAAW;oBACxB,SAAS,EAAE,cAAc;oBACzB,aAAa,EAAE,aAAa;iBAC/B,CAAC,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC,GAAG,EAAE,CAAC;gBACxG,IAAI,MAAM,CAAC,KAAK,EAAE;oBACd,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;iBACvD;gBACD,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAC3B,MAAM,IAAI,GAAG,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,IAAI,EAAE,CAAC;gBACzB,MAAM,IAAI,GAAG,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,GAAG,CAAC,IAAI,CAAC;gBAC3B,IAAI,CAAC,IAAI,EAAE;oBACP,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;iBACvD;gBACD,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC5B,OAAO,CAAC,GAAG,CAAC,qBAAqB,gBAAgB,EAAE,CAAC,CAAC;gBACrD,QAAQ,gBAAgB,EAAE;oBACtB,KAAK,6BAA6B,CAAC,sBAAsB,CAAC;oBAC1D,KAAK,6BAA6B,CAAC,sBAAsB,CAAC;oBAC1D,KAAK,6BAA6B,CAAC,oBAAoB,CAAC;oBACxD,KAAK,6BAA6B,CAAC,4BAA4B,CAAC,CAAC;wBAC7D,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE;4BACnB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;gCACZ,SAAS;6BACZ;4BACD,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;yBACrC;wBACD,IAAI,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC;wBACxB,IAAI,CAAC,aAAa,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC;wBACxD,IAAI,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC;wBACjC,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC;wBAC3B,MAAM,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;wBAC5C,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;wBAClE,MAAM;qBACT;oBACD,KAAK,6BAA6B,CAAC,qBAAqB,CAAC;oBACzD,KAAK,6BAA6B,CAAC,mCAAmC,CAAC;oBACvE,KAAK,6BAA6B,CAAC,mCAAmC,CAAC,CAAC;wBACpE,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE;4BACnB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;gCACZ,SAAS;6BACZ;4BACD,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;yBACrC;wBACD,IAAI,CAAC,aAAa,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC;wBACxD,IAAI,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC;wBACjC,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC;wBAC3B,MAAM,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;wBAC5C,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;wBAClE,MAAM;qBACT;oBACD,KAAK,6BAA6B,CAAC,oBAAoB,CAAC;oBACxD,KAAK,6BAA6B,CAAC,oBAAoB,CAAC;oBACxD,KAAK,6BAA6B,CAAC,qBAAqB,CAAC;oBACzD,KAAK,6BAA6B,CAAC,mBAAmB,CAAC;oBACvD,KAAK,6BAA6B,CAAC,oBAAoB,CAAC,CAAC;wBACrD,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE;4BACnB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;gCACZ,SAAS;6BACZ;4BACD,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;yBACrC;wBACD,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;wBACvB,MAAM,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;wBAC5C,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;wBAClE,MAAM;qBACT;oBACD;wBACI,MAAM;iBACb;gBACD,IAAI,GAAG,CAAC,qBAAqB,CAAC,EAAE;oBAC5B,MAAM,mBAAmB,GAAG,GAAG,CAAC,qBAAqB,CAAC,CAAC;oBACvD,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,mBAAmB,CAAC,CAAC,GAAG,EAAE,CAAC;oBAC9G,IAAI,MAAM,CAAC,KAAK,EAAE;wBACd,OAAO;qBACV;oBACD,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBAC3B,MAAM,IAAI,GAAG,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,IAAI,EAAE,CAAC;oBACzB,MAAM,IAAI,GAAG,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,GAAG,CAAC,IAAI,CAAC;oBAC3B,IAAI,CAAC,IAAI,EAAE;wBACP,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;qBACvD;oBACD,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;oBAC5B,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;oBACvB,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC;oBAC3B,MAAM,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;oBAC5C,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;iBACrE;aACJ;SACJ;KACJ;IAAC,OAAO,GAAG,EAAE;QACV,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACnB,MAAM,IAAI,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;KACrE;AACL,CAAC,CAAA,CACJ,CAAC;AAEF;;;;GAIG;AACH,IAAK,6BA6BJ;AA7BD,WAAK,6BAA6B;IAC9B,yBAAyB;IACzB,qHAA0B,CAAA;IAC1B,oBAAoB;IACpB,iHAAwB,CAAA;IACxB,4BAA4B;IAC5B,sCAAsC;IACtC,mHAAyB,CAAA;IACzB,iBAAiB;IACjB,qHAA0B,CAAA;IAC1B,6BAA6B;IAC7B,iHAAwB,CAAA;IACxB,wBAAwB;IACxB,iIAAgC,CAAA;IAChC,qCAAqC;IACrC,kCAAkC;IAClC,qHAA0B,CAAA;IAC1B,2BAA2B;IAC3B,+IAAuC,CAAA;IACvC,mBAAmB;IACnB,mHAAyB,CAAA;IACzB,gBAAgB;IAChB,gHAAwB,CAAA;IACxB,yBAAyB;IACzB,gJAAwC,CAAA;IACxC,yBAAyB;IACzB,kHAAyB,CAAA;IACzB,iBAAiB;IACjB,kHAAyB,CAAA;AAC7B,CAAC,EA7BI,6BAA6B,KAA7B,6BAA6B,QA6BjC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
26
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
27
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
28
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
29
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
30
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
31
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
32
|
+
});
|
|
33
|
+
};
|
|
34
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
35
|
+
const functions = __importStar(require("firebase-functions"));
|
|
36
|
+
const admin = __importStar(require("firebase-admin"));
|
|
37
|
+
const utils = __importStar(require("../lib/utils"));
|
|
38
|
+
/**
|
|
39
|
+
* Webhook endpoint for IOS, which allows you to receive notifications by setting the endpoint in AppStoreConnect's [App]->[App Information]->[App Store Server Notification].
|
|
40
|
+
*
|
|
41
|
+
* IOS用のWebhookのエンドポイントです。AppStoreConnectの[App]->[App情報]->[App Storeサーバ通知]にエンドポイントを設定することで通知を受け取ることができるようになります。
|
|
42
|
+
*
|
|
43
|
+
* @param purchase.android.subscription_path
|
|
44
|
+
* Describes the path to the collection of subscriptions.
|
|
45
|
+
*
|
|
46
|
+
* サブスクリプションのコレクションのパスを記述します。
|
|
47
|
+
*/
|
|
48
|
+
module.exports = (regions) => functions.region(...regions).https.onRequest((req, res) => __awaiter(void 0, void 0, void 0, function* () {
|
|
49
|
+
try {
|
|
50
|
+
const message = req.body;
|
|
51
|
+
const signedPayload = message.signedPayload;
|
|
52
|
+
if (signedPayload) {
|
|
53
|
+
const signedPayloadBody = signedPayload.replace(/-/g, "+").replace(/_/g, "/").split(".")[1];
|
|
54
|
+
const messageBody = JSON.parse(Buffer.from(signedPayloadBody, "base64").toString());
|
|
55
|
+
if (messageBody) {
|
|
56
|
+
const { notificationType, data, } = messageBody;
|
|
57
|
+
const { signedTransactionInfo, } = data;
|
|
58
|
+
const signedTransactionInfoBody = signedTransactionInfo.replace(/-/g, "+").replace(/_/g, "/").split(".")[1];
|
|
59
|
+
const transactionInfo = JSON.parse(Buffer.from(signedTransactionInfoBody, "base64").toString());
|
|
60
|
+
const firestoreInstance = admin.firestore();
|
|
61
|
+
const config = functions.config().purchase;
|
|
62
|
+
const targetPath = config.subscription_path;
|
|
63
|
+
if (transactionInfo) {
|
|
64
|
+
const transactionId = transactionInfo.originalTransactionId;
|
|
65
|
+
const doc = yield firestoreInstance.doc(`${targetPath}/${transactionId}`).get();
|
|
66
|
+
const data = doc === null || doc === void 0 ? void 0 : doc.data();
|
|
67
|
+
const path = doc === null || doc === void 0 ? void 0 : doc.ref.path;
|
|
68
|
+
if (!data) {
|
|
69
|
+
throw new Error("The purchased data is not found.");
|
|
70
|
+
}
|
|
71
|
+
const user = data["userId"];
|
|
72
|
+
console.log(`notificationType: ${notificationType}`);
|
|
73
|
+
switch (notificationType) {
|
|
74
|
+
case "CONSUMPTION_REQUEST":
|
|
75
|
+
case "DID_CHANGE_RENEWAL_STATUS":
|
|
76
|
+
case "DID_FAIL_TO_RENEW":
|
|
77
|
+
case "PRICE_INCREASE":
|
|
78
|
+
case "REFUND_DECLINED": {
|
|
79
|
+
for (const key in transactionInfo) {
|
|
80
|
+
if (!data[key]) {
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
data[key] = utils.parse(transactionInfo[key]);
|
|
84
|
+
}
|
|
85
|
+
data["expiredTime"] = parseInt(transactionInfo["expiresDate"]);
|
|
86
|
+
data["orderId"] = transactionInfo["transactionId"];
|
|
87
|
+
yield firestoreInstance.doc(path).set(data);
|
|
88
|
+
console.log(`Updated subscription: ${data["productId"]}:${user}`);
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
case "DID_CHANGE_RENEWAL_PREF":
|
|
92
|
+
case "DID_RENEW":
|
|
93
|
+
case "OFFER_REDEEMED":
|
|
94
|
+
case "RENEWAL_EXTENDED": {
|
|
95
|
+
for (const key in transactionInfo) {
|
|
96
|
+
if (!data[key]) {
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
data[key] = utils.parse(transactionInfo[key]);
|
|
100
|
+
}
|
|
101
|
+
data["expired"] = false;
|
|
102
|
+
data["expiredTime"] = parseInt(transactionInfo["expiresDate"]);
|
|
103
|
+
data["orderId"] = transactionInfo["transactionId"];
|
|
104
|
+
yield firestoreInstance.doc(path).set(data);
|
|
105
|
+
console.log(`Updated subscription: ${data["productId"]}:${user}`);
|
|
106
|
+
break;
|
|
107
|
+
}
|
|
108
|
+
case "EXPIRED":
|
|
109
|
+
case "REVOKE":
|
|
110
|
+
case "GRACE_PERIOD_EXPIRED":
|
|
111
|
+
case "REFUND": {
|
|
112
|
+
for (const key in transactionInfo) {
|
|
113
|
+
if (!data[key]) {
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
data[key] = utils.parse(transactionInfo[key]);
|
|
117
|
+
}
|
|
118
|
+
data["expired"] = true;
|
|
119
|
+
yield firestoreInstance.doc(path).set(data);
|
|
120
|
+
console.log(`Expired subscription: ${data["productId"]}:${user}`);
|
|
121
|
+
break;
|
|
122
|
+
}
|
|
123
|
+
default:
|
|
124
|
+
break;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
catch (err) {
|
|
131
|
+
console.error(err);
|
|
132
|
+
throw new functions.https.HttpsError("unknown", "Unknown error.");
|
|
133
|
+
}
|
|
134
|
+
}));
|
|
135
|
+
//# sourceMappingURL=purchase_hook_ios.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"purchase_hook_ios.js","sourceRoot":"","sources":["../../src/functions/purchase_hook_ios.ts"],"names":[],"mappings":"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"}
|
|
@@ -70,7 +70,12 @@ module.exports = (regions) => functions.region(...regions).https.onCall((query)
|
|
|
70
70
|
if (!from || !to || !title || !content) {
|
|
71
71
|
throw new functions.https.HttpsError("invalid-argument", "Query parameter is invalid.");
|
|
72
72
|
}
|
|
73
|
-
yield sendgrid.send(
|
|
73
|
+
yield sendgrid.send({
|
|
74
|
+
from: from,
|
|
75
|
+
to: to,
|
|
76
|
+
title: title,
|
|
77
|
+
content: content,
|
|
78
|
+
});
|
|
74
79
|
return {
|
|
75
80
|
success: true,
|
|
76
81
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"send_grid.js","sourceRoot":"","sources":["../../src/functions/send_grid.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,8DAAgD;AAChD,2DAA6C;AAE7C;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,CAAC,OAAO,GAAG,CAAC,OAAiB,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,KAAK,CAAC,MAAM,CAC7E,CAAO,KAAK,EAAE,EAAE;IACZ,IAAI;QACA,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QACxB,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;QACpB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QAC1B,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAC9B,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,EAAE;YACpC,MAAM,IAAI,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,kBAAkB,EAAE,6BAA6B,CAAC,CAAC;SAC3F;QACD,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"send_grid.js","sourceRoot":"","sources":["../../src/functions/send_grid.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,8DAAgD;AAChD,2DAA6C;AAE7C;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,CAAC,OAAO,GAAG,CAAC,OAAiB,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,KAAK,CAAC,MAAM,CAC7E,CAAO,KAAK,EAAE,EAAE;IACZ,IAAI;QACA,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QACxB,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;QACpB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QAC1B,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAC9B,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,EAAE;YACpC,MAAM,IAAI,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,kBAAkB,EAAE,6BAA6B,CAAC,CAAC;SAC3F;QACD,MAAM,QAAQ,CAAC,IAAI,CAAC;YAChB,IAAI,EAAE,IAAI;YACV,EAAE,EAAE,EAAE;YACN,KAAK,EAAE,KAAK;YACZ,OAAO,EAAE,OAAO;SACnB,CAAC,CAAC;QACH,OAAO;YACH,OAAO,EAAE,IAAI;SAChB,CAAC;KACL;IAAC,OAAO,GAAG,EAAE;QACV,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACnB,MAAM,GAAG,CAAC;KACb;AACL,CAAC,CAAA,CACJ,CAAC"}
|
package/dist/functions/stripe.js
CHANGED
|
@@ -561,11 +561,21 @@ module.exports = (regions) => functions.region(...regions).https.onCall((query)
|
|
|
561
561
|
if (emailFrom && email && emailTitle && emailContent) {
|
|
562
562
|
switch (stripeEmailProvider) {
|
|
563
563
|
case "gmail": {
|
|
564
|
-
yield gmail.send(
|
|
564
|
+
yield gmail.send({
|
|
565
|
+
from: emailFrom,
|
|
566
|
+
to: email,
|
|
567
|
+
title: emailTitle,
|
|
568
|
+
content: emailContent.replace("{url}", nextActionUrl),
|
|
569
|
+
});
|
|
565
570
|
break;
|
|
566
571
|
}
|
|
567
572
|
case "sendgrid": {
|
|
568
|
-
yield sendgrid.send(
|
|
573
|
+
yield sendgrid.send({
|
|
574
|
+
from: emailFrom,
|
|
575
|
+
to: email,
|
|
576
|
+
title: emailTitle,
|
|
577
|
+
content: emailContent.replace("{url}", nextActionUrl),
|
|
578
|
+
});
|
|
569
579
|
break;
|
|
570
580
|
}
|
|
571
581
|
}
|
|
@@ -781,12 +791,16 @@ module.exports = (regions) => functions.region(...regions).https.onCall((query)
|
|
|
781
791
|
throw new functions.https.HttpsError("invalid-argument", "The user id is empty.");
|
|
782
792
|
}
|
|
783
793
|
if (!online) {
|
|
784
|
-
returnUrl = returnUrl + "?token=" + utils.encrypt(
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
794
|
+
returnUrl = returnUrl + "?token=" + utils.encrypt({
|
|
795
|
+
raw: JSON.stringify({
|
|
796
|
+
userId: userId,
|
|
797
|
+
orderId: orderId,
|
|
798
|
+
successUrl: successUrl,
|
|
799
|
+
failureUrl: failureUrl,
|
|
800
|
+
}),
|
|
801
|
+
key: apiKey.slice(0, 32),
|
|
802
|
+
ivKey: apiKey.slice(-16),
|
|
803
|
+
});
|
|
790
804
|
}
|
|
791
805
|
const doc = yield firestoreInstance.doc(`${stripeUserPath}/${userId}/${stripePurchasePath}/${orderId}`).get();
|
|
792
806
|
const data = doc.data();
|
|
@@ -812,11 +826,21 @@ module.exports = (regions) => functions.region(...regions).https.onCall((query)
|
|
|
812
826
|
if (data["emailFrom"] && data["emailTo"] && data["emailTitle"] && data["emailContent"]) {
|
|
813
827
|
switch (stripeEmailProvider) {
|
|
814
828
|
case "gmail": {
|
|
815
|
-
yield gmail.send(
|
|
829
|
+
yield gmail.send({
|
|
830
|
+
from: data["emailFrom"],
|
|
831
|
+
to: data["emailTo"],
|
|
832
|
+
title: data["emailTitle"],
|
|
833
|
+
content: data["emailContent"].replace("{url}", nextActionUrl),
|
|
834
|
+
});
|
|
816
835
|
break;
|
|
817
836
|
}
|
|
818
837
|
case "sendgrid": {
|
|
819
|
-
yield sendgrid.send(
|
|
838
|
+
yield sendgrid.send({
|
|
839
|
+
from: data["emailFrom"],
|
|
840
|
+
to: data["emailTo"],
|
|
841
|
+
title: data["emailTitle"],
|
|
842
|
+
content: data["emailContent"].replace("{url}", nextActionUrl),
|
|
843
|
+
});
|
|
820
844
|
break;
|
|
821
845
|
}
|
|
822
846
|
}
|
|
@@ -873,11 +897,21 @@ module.exports = (regions) => functions.region(...regions).https.onCall((query)
|
|
|
873
897
|
if (data["emailFrom"] && data["emailTo"] && data["emailTitle"] && data["emailContent"]) {
|
|
874
898
|
switch (stripeEmailProvider) {
|
|
875
899
|
case "gmail": {
|
|
876
|
-
yield gmail.send(
|
|
900
|
+
yield gmail.send({
|
|
901
|
+
from: data["emailFrom"],
|
|
902
|
+
to: data["emailTo"],
|
|
903
|
+
title: data["emailTitle"],
|
|
904
|
+
content: data["emailContent"].replace("{url}", nextActionUrl),
|
|
905
|
+
});
|
|
877
906
|
break;
|
|
878
907
|
}
|
|
879
908
|
case "sendgrid": {
|
|
880
|
-
yield sendgrid.send(
|
|
909
|
+
yield sendgrid.send({
|
|
910
|
+
from: data["emailFrom"],
|
|
911
|
+
to: data["emailTo"],
|
|
912
|
+
title: data["emailTitle"],
|
|
913
|
+
content: data["emailContent"].replace("{url}", nextActionUrl),
|
|
914
|
+
});
|
|
881
915
|
break;
|
|
882
916
|
}
|
|
883
917
|
}
|