mirror of
https://github.com/discourse/discourse-subscriptions.git
synced 2025-02-07 12:18:09 +00:00
Merge pull request #1 from tudinhtu98/ft-more-payment-methods
Complete logic subcribe-google-pay
This commit is contained in:
commit
23767f6bd9
@ -1,25 +1,114 @@
|
|||||||
|
import Transaction from "discourse/plugins/discourse-subscriptions/discourse/models/transaction";
|
||||||
|
import Subscription from "discourse/plugins/discourse-subscriptions/discourse/models/subscription";
|
||||||
import Component from "@ember/component";
|
import Component from "@ember/component";
|
||||||
|
import { observes } from "discourse-common/utils/decorators";
|
||||||
|
import { inject as service } from "@ember/service";
|
||||||
|
|
||||||
export default Component.extend({
|
export default Component.extend({
|
||||||
didInsertElement() {
|
dialog: service(),
|
||||||
this._super(...arguments);
|
|
||||||
this.paymentRequest.canMakePayment().then((result)=> {
|
@observes("selectedPlan", "plans")
|
||||||
if(result) {
|
setupButtonElement() {
|
||||||
|
const plan = this.plans
|
||||||
|
.filterBy("id", this.selectedPlan)
|
||||||
|
.get("firstObject");
|
||||||
|
|
||||||
|
if (!plan) {
|
||||||
|
this.alert("plans.validate.payment_options.required");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.selectedPlan) {
|
||||||
|
const elements = this.stripe.elements();
|
||||||
|
const paymentRequest = this.stripe.paymentRequest({
|
||||||
|
currency: plan.currency,
|
||||||
|
country: "US",
|
||||||
|
requestPayerName: true,
|
||||||
|
requestPayerEmail: true,
|
||||||
|
total: {
|
||||||
|
label: plan.subscriptionRate,
|
||||||
|
amount: plan.unit_amount,
|
||||||
|
}
|
||||||
|
});
|
||||||
|
this.set("buttonElement",
|
||||||
|
elements.create('paymentRequestButton', {
|
||||||
|
paymentRequest: paymentRequest,
|
||||||
|
})
|
||||||
|
);
|
||||||
|
this.set("paymentRequest", paymentRequest);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.paymentRequest.canMakePayment().then((result) => {
|
||||||
|
if (result) {
|
||||||
// mount the element
|
// mount the element
|
||||||
this.buttonElement.mount("#payment-request-button");
|
this.buttonElement.mount("#payment-request-button");
|
||||||
} else {
|
} else {
|
||||||
//hide the button
|
//hide the button
|
||||||
document.getElementById("payment-request-button").style.display = "none";
|
document.getElementById("payment-request-button").style.display = "none";
|
||||||
console.log("GooglePay is unvailable")
|
console.log("GooglePay and ApplePay is unvailable");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
this.paymentRequest.on("paymentMethod", async (e) => {
|
this.paymentRequest.on('token', (result) => {
|
||||||
|
console.log("on token result", result);
|
||||||
|
const subscription = Subscription.create({
|
||||||
|
source: result.token.id,
|
||||||
|
plan: plan.get("id"),
|
||||||
|
promo: this.promoCode,
|
||||||
|
});
|
||||||
|
|
||||||
|
this.set("transaction", subscription.save());
|
||||||
|
});
|
||||||
|
|
||||||
|
this.paymentRequest.on("paymentmethod", async (e) => {
|
||||||
// create a payment intent on the server
|
// create a payment intent on the server
|
||||||
|
this.transaction
|
||||||
|
.then((result) => {
|
||||||
|
console.log("on paymentmethod transaction result", result);
|
||||||
|
if (result.error) {
|
||||||
|
this.dialog.alert(result.error.message || result.error);
|
||||||
|
} else if (
|
||||||
|
result.status === "incomplete" ||
|
||||||
|
result.status === "open"
|
||||||
|
) {
|
||||||
|
const transactionId = result.id;
|
||||||
|
const planId = this.selectedPlan;
|
||||||
|
this.handleAuthentication(plan, result).then(
|
||||||
|
(authenticationResult) => {
|
||||||
|
if (authenticationResult && !authenticationResult.error) {
|
||||||
|
return Transaction.finalize(transactionId, planId).then(
|
||||||
|
() => {
|
||||||
|
this.advanceSuccessfulTransaction(plan);
|
||||||
|
e.complete("success");
|
||||||
|
console.log(`Success: ${authenticationResult.paymentIntent.id}`);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
} else if (authenticationResult.error) {
|
||||||
|
console.log("Payment fail");
|
||||||
|
e.complete("fail");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
this.advanceSuccessfulTransaction(plan);
|
||||||
|
e.complete("success");
|
||||||
|
console.log(`Success`);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch((result) => {
|
||||||
|
e.complete("fail");
|
||||||
|
console.log("Payment fail");
|
||||||
|
this.dialog.alert(
|
||||||
|
result.jqXHR.responseJSON?.errors[0] || result.errorThrown
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
// confirm the payment on the client
|
// confirm the payment on the client
|
||||||
console.log(e);
|
console.log(e);
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
didDestroyElement() {},
|
didInsertElement() {
|
||||||
|
this._super(...arguments);
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
@ -21,28 +21,6 @@ export default Controller.extend({
|
|||||||
const elements = this.get("stripe").elements();
|
const elements = this.get("stripe").elements();
|
||||||
|
|
||||||
this.set("cardElement", elements.create("card", { hidePostalCode: true }));
|
this.set("cardElement", elements.create("card", { hidePostalCode: true }));
|
||||||
|
|
||||||
this.initButtonPay();
|
|
||||||
},
|
|
||||||
|
|
||||||
initButtonPay() {
|
|
||||||
const elements = this.get("stripe").elements();
|
|
||||||
const paymentRequest = this.get("stripe").paymentRequest({
|
|
||||||
currency: "usd",
|
|
||||||
country: "US",
|
|
||||||
requestPayerName: true,
|
|
||||||
requestPayerEmail: true,
|
|
||||||
total: {
|
|
||||||
label: "test payment apple",
|
|
||||||
amount: 99,
|
|
||||||
}
|
|
||||||
});
|
|
||||||
this.set("buttonElement",
|
|
||||||
elements.create('paymentRequestButton', {
|
|
||||||
paymentRequest: paymentRequest,
|
|
||||||
})
|
|
||||||
);
|
|
||||||
this.set("paymentRequest", paymentRequest);
|
|
||||||
},
|
},
|
||||||
|
|
||||||
alert(path) {
|
alert(path) {
|
||||||
@ -105,6 +83,15 @@ export default Controller.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
actions: {
|
actions: {
|
||||||
|
alert(path) {
|
||||||
|
this.alert(path)
|
||||||
|
},
|
||||||
|
handleAuthentication(plan, transaction) {
|
||||||
|
this.handleAuthentication(plan, transaction)
|
||||||
|
},
|
||||||
|
advanceSuccessfulTransaction(plan) {
|
||||||
|
this._advanceSuccessfulTransaction(plan)
|
||||||
|
},
|
||||||
stripePaymentHandler() {
|
stripePaymentHandler() {
|
||||||
this.set("loading", true);
|
this.set("loading", true);
|
||||||
const plan = this.get("model.plans")
|
const plan = this.get("model.plans")
|
||||||
|
@ -45,7 +45,16 @@
|
|||||||
label="discourse_subscriptions.plans.payment_button"
|
label="discourse_subscriptions.plans.payment_button"
|
||||||
}}
|
}}
|
||||||
|
|
||||||
{{subscribe-google-pay buttonElement=buttonElement paymentRequest=paymentRequest}}
|
{{subscribe-google-pay
|
||||||
|
alert=alert
|
||||||
|
stripe=stripe
|
||||||
|
plans=model.plans
|
||||||
|
selectedPlan=selectedPlan
|
||||||
|
promoCode=promoCode
|
||||||
|
advanceSuccessfulTransaction=(action "advanceSuccessfulTransaction")
|
||||||
|
handleAuthentication=(action "handleAuthentication")
|
||||||
|
}}
|
||||||
|
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{else}}
|
{{else}}
|
||||||
<h2>{{i18n "discourse_subscriptions.subscribe.already_purchased"}}</h2>
|
<h2>{{i18n "discourse_subscriptions.subscribe.already_purchased"}}</h2>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user