我的网站在同一页面上出售多种货币的产品,因此用户可以单击以欧元出售的产品并以欧元付款,或者他们可以单击以美元出售的产品并以美元付款。等等...
问题在于,一旦初始化了新的PayPal SDK,就不能在没有以下情况的情况下更改其接受的货币:
您可能会理解,它不是同时非常快速,稳定或安全。我想念什么吗?我知道您可以在旧的Express Checkout版本中将货币作为参数发送。
贝宝(PayPal)文档令人发指,它缺少很多信息,并且没有很大的社区,因此我无法在任何地方找到问题的答案。
我尝试发送付款参数中的货币,但是如果它与初始化的货币不同,则在尝试确认付款时会引发货币不匹配错误。
现在,如果用户单击使用PayPal进行付款的选项,那么我将使用正确的货币手动重新注入并重新初始化Paypal SDK,但这很慢并且需要对睡眠进行硬编码(尽管可能是由于我缺乏知识,可能有更好的方法。
以下是我当前设置中的伪代码:
initialisePaypalSDK(currency) {
destroy old initialisation
change link to paypal with new currency
inject new link to page
initialise the new sdk
sleep until the paypal variable is defined
showPayPalButton()
}
我希望有比这更简单,更安全的货币兑换方式。谢谢。
答案 0 :(得分:0)
您可以使用后端来解决此问题。 首先,定义如下的createOrder函数:
import tkinter as tk
from tkinter import ttk
import matplotlib
matplotlib.use('TkAgg')
from matplotlib.figure import Figure
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
# import ctypes,sys
#
# if sys.getwindowsversion().major == 10:
# ctypes.windll.shcore.SetProcessDpiAwareness(2) # DPI AWARENESS
class App(tk.Frame):
def getTabHeight(self):
self.left_frame.grid(row=0,column=0,pady=(self.tab1_frame.winfo_y()-2,0)) # Get its height,I don't know why it need to minus 2,But in this way,no matter you use DPI awareness,It looked good.
def __init__(self,parent):
tk.Frame.__init__(self, parent)
parent.deiconify()
self.parent = parent
#define and position the main panel on the left
self.left_frame = tk.LabelFrame(self.parent, text='Left Panel')
#define and position the tab-enabled secondary panel on the right
self.ntbk = ttk.Notebook(self.parent)
self.ntbk.grid(row=0,column=1)
#define internal frames for the tabs
self.tab1_frame = tk.LabelFrame(self.ntbk, text='Tab 1')
self.tab2_frame = tk.LabelFrame(self.ntbk, text='Tab 2')
self.ntbk.add(self.tab1_frame, text='Tab 1')
self.ntbk.add(self.tab2_frame, text='Tab 2')
#Left panel children
#define a figure canvas to go in the left panel
self.left_f = Figure(figsize=(7,5), dpi=100)
self.left_canvas = FigureCanvasTkAgg(self.left_f, master=self.left_frame)
self.left_toolbar_frame = tk.Frame(self.left_frame)
self.left_toolbar = NavigationToolbar2Tk(self.left_canvas, self.left_toolbar_frame)
self.left_toolbar.update()
self.left_canvas.get_tk_widget().grid(row=0,column=0)
self.left_toolbar_frame.grid(row=1,column=0)
#define a control panel for the left panel to go below the figure
self.left_control_frame = tk.LabelFrame(self.left_frame, text='Left Control Panel')
self.left_control_frame.grid(row=2,column=0, sticky=tk.E+tk.W)
self.left_button = tk.Button(self.left_control_frame, text='Button')
self.left_button.grid(row=0,column=0, sticky=tk.E+tk.W)
#notebook children
#define a figure canvas to go in tab 1
self.tab1_f = Figure(figsize=(7,5), dpi=100)
self.tab1_canvas = FigureCanvasTkAgg(self.tab1_f, master=self.tab1_frame)
self.tab1_toolbar_frame = tk.Frame(self.tab1_frame)
self.tab1_toolbar = NavigationToolbar2Tk(self.tab1_canvas, self.tab1_toolbar_frame)
self.tab1_toolbar.update()
self.tab1_canvas.get_tk_widget().grid(row=0,column=0)
self.tab1_toolbar_frame.grid(row=1,column=0)
self.tab1_control_frame = tk.LabelFrame(self.tab1_frame, text='Tab 1 Control Panel')
self.tab1_control_frame.grid(row=2,column=0, sticky=tk.E+tk.W)
self.tab1_button = tk.Button(self.tab1_control_frame, text='Button')
self.tab1_button.grid(row=0,column=0, sticky=tk.E+tk.W)
#define a figure canvas to go in tab 2
self.tab2_f = Figure(figsize=(7,5), dpi=100)
self.tab2_canvas = FigureCanvasTkAgg(self.tab2_f, master=self.tab2_frame)
self.tab2_toolbar_frame = tk.Frame(self.tab2_frame)
self.tab2_toolbar = NavigationToolbar2Tk(self.tab2_canvas, self.tab2_toolbar_frame)
self.tab2_toolbar.update()
self.tab2_canvas.get_tk_widget().grid(row=0,column=0)
self.tab2_toolbar_frame.grid(row=1,column=0)
self.tab2_control_frame = tk.LabelFrame(self.tab2_frame, text='Tab 2 Control Panel')
self.tab2_control_frame.grid(row=2,column=0, sticky=tk.E+tk.W)
self.tab2_button = tk.Button(self.tab2_control_frame, text='Button')
self.tab2_button.grid(row=0,column=0, sticky=tk.E+tk.W)
self.after(100,self.getTabHeight)
def main():
root=tk.Tk()
root.withdraw()
App(root).grid(row=0,column=0)
root.mainloop()
if __name__=="__main__":
main()
然后只需在后端实现REST Api即可创建订单(/ v2 /结帐/订单)。然后返回创建的付款的ID。
答案 1 :(得分:0)
对于使用 React 的用户,现在可以使用新库 @paypal/react-paypal-js
。来自自述文件:
usePayPalScriptReducer 钩子可用于在货币等参数更改时重新加载 JS SDK 脚本。它提供了用于重新加载新参数的操作 resetOptions。例如,您可以通过以下方式使用它来更改货币。
// get the state for the sdk script and the dispatch method
const [{ options }, dispatch] = usePayPalScriptReducer();
const [currency, setCurrency] = useState(options.currency);
function onCurrencyChange({ target: { value } }) {
setCurrency(value);
dispatch({
type: "resetOptions",
value: {
...scriptProviderOptions,
currency: value,
},
});
}
return (
<>
<select value={currency} onChange={onCurrencyChange}>
<option value="USD">United States dollar</option>
<option value="EUR">Euro</option>
</select>
<PayPalButtons />
</>
);