能否通过终端运行Python脚本处理PayNow支付?相关技术疑问
PayNow是新加坡的一项服务,无需知晓收款人账号,即可通过手机号或新加坡身份证号(NRIC)收发款项。
以下是你参考PayPal并结合星展银行(DBS)开发者文档修改后,设想的通过Python脚本实现PayNow支付(通过收款人注册手机号转账)的代码:
import paynow paynowrestsdk.configure({ "mode": "sandbox", # sandbox or live "client_id": "EBWKjlELKMYqRNQ6sYvFo64FtaRLRR5BdHEESmha49TM", "client_secret": "EO422dn3gQLgDbuwqTjzrFgFtaRLRR5BdHEESmha49TM" }) payment = paynowrestsdk.Payment({ "fundTransferDetl":{ "partyId":"11845277752388953651", "debitAccountId":"21841900319944140151001", "payeeReference":{ "referenceType":"MSISDN", "referenceDesc":"Mobile no.", "reference":"65998899758" }, "amount":5, "transferCurrency":"SGD", "comments":"Transfer", "purpose":"Transfer", "referenceId":"4P3EDAB1C853A004117A330" } }) if payment.create(): print(referenceId) print(status) else: print(payment.error)
你目前聚焦于单条支付的脚本实现,提出了以下疑问,我来逐一解答:
1. 上述提供的Python脚本是否正确?
这个脚本存在几个明显的问题:
- 导入的库是
paynow,但初始化用的是paynowrestsdk,这会直接触发NameError,因为未导入对应的模块; - 支付创建成功后的打印语句中,
referenceId和status都是未定义的变量,你需要从创建后的payment对象里读取API返回的对应属性,比如payment.referenceId(具体字段名需对照DBS API文档); - 请求体的
fundTransferDetl结构可能和DBS官方API要求不匹配,比如部分字段的命名、必填项规则,建议严格参照DBS开发者文档里的参数格式调整。
2. 是否有可导入的相关Python库及对应的文档?
目前没有官方的DBS PayNow Python SDK,你提到的paynow库大概率是非官方或针对其他PayNow服务商的。更稳妥的方式是直接用Python的requests库调用DBS的REST API,这样能完全掌控请求的结构和参数。
如果想找第三方库,优先查看DBS开发者平台的合作伙伴资源或社区贡献库,但一定要先验证其安全性和兼容性。
3. 已知涉及API调用和redirect URI,该如何在本场景中应用?
Redirect URI主要用于OAuth 2.0的授权码流程,适合需要用户交互的Web应用。但你的场景是终端运行脚本,属于服务端到服务端的调用,通常用**客户端凭证流(Client Credentials Flow)**获取访问令牌即可,这种流程不需要redirect URI——直接用Client ID和Client Secret向DBS授权服务器请求token就行。
如果确实需要涉及用户授权的流程(比如指定用户账户转账),可以临时设置一个本地可访问的URI(比如http://localhost:8000/callback),在终端启动一个简单的HTTP服务器接收回调的授权码,再用这个码换取token。
4. 我仅需通过终端运行脚本而非开发应用,如何获取ClientID、ClientSecret及token?
步骤如下:
- 先在DBS开发者平台注册开发者账户,创建一个应用(哪怕是终端脚本,也需要创建应用来获取凭证);
- 申请PayNow转账相关的API权限,确保你的应用被授权访问对应接口;
- 获取Client ID和Client Secret后,用
requests库调用DBS的授权接口获取access token,示例代码如下:
import requests auth_url = "https://api.dbs.com/oauth/token" payload = { "grant_type": "client_credentials", "client_id": "你的Client ID", "client_secret": "你的Client Secret" } response = requests.post(auth_url, data=payload) token_data = response.json() access_token = token_data.get("access_token")
- 后续调用PayNow转账API时,需要在请求头中携带这个token,格式为
Authorization: Bearer {access_token}。
内容的提问来源于stack exchange,提问作者Julliard

