diff --git a/object/product.go b/object/product.go index 564b7bdb..413509f5 100644 --- a/object/product.go +++ b/object/product.go @@ -210,6 +210,11 @@ func BuyProduct(id string, providerName string, user *User, host string) (string ReturnUrl: product.ReturnUrl, State: "Created", } + + if provider.Type == "Dummy" { + payment.State = "Paid" + } + affected, err := AddPayment(&payment) if err != nil { return "", err diff --git a/pp/dummy.go b/pp/dummy.go new file mode 100644 index 00000000..0c306e45 --- /dev/null +++ b/pp/dummy.go @@ -0,0 +1,45 @@ +// Copyright 2023 The Casdoor Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package pp + +import ( + "fmt" + "net/http" +) + +type DummyPaymentProvider struct { +} + +func NewDummyPaymentProvider() (*DummyPaymentProvider, error) { + pp := &DummyPaymentProvider{} + return pp, nil +} + +func (pp *DummyPaymentProvider) Pay(providerName string, productName string, payerName string, paymentName string, productDisplayName string, price float64, returnUrl string, notifyUrl string) (string, error) { + payUrl := fmt.Sprintf("/payments/%s/result", paymentName) + return payUrl, nil +} + +func (pp *DummyPaymentProvider) Notify(request *http.Request, body []byte, authorityPublicKey string) (string, string, float64, string, string, error) { + return "", "", 0, "", "", nil +} + +func (pp *DummyPaymentProvider) GetInvoice(paymentName string, personName string, personIdCard string, personEmail string, personPhone string, invoiceType string, invoiceTitle string, invoiceTaxId string) (string, error) { + return "", nil +} + +func (pp *DummyPaymentProvider) GetResponseError(err error) string { + return "" +} diff --git a/pp/provider.go b/pp/provider.go index 6b2d5798..4a176a12 100644 --- a/pp/provider.go +++ b/pp/provider.go @@ -24,26 +24,32 @@ type PaymentProvider interface { } func GetPaymentProvider(typ string, clientId string, clientSecret string, host string, appCertificate string, appPrivateKey string, authorityPublicKey string, authorityRootPublicKey string, clientId2 string) (PaymentProvider, error) { - if typ == "Alipay" { - newAlipayPaymentProvider, err := NewAlipayPaymentProvider(clientId, appCertificate, appPrivateKey, authorityPublicKey, authorityRootPublicKey) + if typ == "Dummy" { + pp, err := NewDummyPaymentProvider() if err != nil { return nil, err } - return newAlipayPaymentProvider, nil + return pp, nil + } else if typ == "Alipay" { + pp, err := NewAlipayPaymentProvider(clientId, appCertificate, appPrivateKey, authorityPublicKey, authorityRootPublicKey) + if err != nil { + return nil, err + } + return pp, nil } else if typ == "GC" { return NewGcPaymentProvider(clientId, clientSecret, host), nil } else if typ == "WeChat Pay" { - newWechatPaymentProvider, err := NewWechatPaymentProvider(clientId, clientSecret, clientId2, appCertificate, appPrivateKey) + pp, err := NewWechatPaymentProvider(clientId, clientSecret, clientId2, appCertificate, appPrivateKey) if err != nil { return nil, err } - return newWechatPaymentProvider, nil + return pp, nil } else if typ == "PayPal" { - newPaypalPaymentProvider, err := NewPaypalPaymentProvider(clientId, clientSecret) + pp, err := NewPaypalPaymentProvider(clientId, clientSecret) if err != nil { return nil, err } - return newPaypalPaymentProvider, nil + return pp, nil } return nil, nil diff --git a/web/src/ProductBuyPage.js b/web/src/ProductBuyPage.js index 0ebe396b..af9dec0e 100644 --- a/web/src/ProductBuyPage.js +++ b/web/src/ProductBuyPage.js @@ -151,7 +151,9 @@ class ProductBuyPage extends React.Component { getPayButton(provider) { let text = provider.type; - if (provider.type === "Alipay") { + if (provider.type === "Dummy") { + text = i18next.t("product:Dummy"); + } else if (provider.type === "Alipay") { text = i18next.t("product:Alipay"); } else if (provider.type === "WeChat Pay") { text = i18next.t("product:WeChat Pay"); diff --git a/web/src/ProviderEditPage.js b/web/src/ProviderEditPage.js index a1582399..b74e15fc 100644 --- a/web/src/ProviderEditPage.js +++ b/web/src/ProviderEditPage.js @@ -305,7 +305,7 @@ class ProviderEditPage extends React.Component { } else if (value === "SAML") { this.updateProviderField("type", "Aliyun IDaaS"); } else if (value === "Payment") { - this.updateProviderField("type", "Alipay"); + this.updateProviderField("type", "PayPal"); } else if (value === "Captcha") { this.updateProviderField("type", "Default"); } else if (value === "AI") { diff --git a/web/src/Setting.js b/web/src/Setting.js index 57d26d6b..a7f1e38f 100644 --- a/web/src/Setting.js +++ b/web/src/Setting.js @@ -163,6 +163,10 @@ export const OtherProviderInfo = { }, }, Payment: { + "Dummy": { + logo: `${StaticBaseUrl}/img/payment_paypal.png`, + url: "", + }, "Alipay": { logo: `${StaticBaseUrl}/img/payment_alipay.png`, url: "https://www.alipay.com/", @@ -848,6 +852,7 @@ export function getProviderTypeOptions(category) { ]); } else if (category === "Payment") { return ([ + {id: "Dummy", name: "Dummy"}, {id: "Alipay", name: "Alipay"}, {id: "WeChat Pay", name: "WeChat Pay"}, {id: "PayPal", name: "PayPal"},