Flutter集成Tap支付:如何同时传入src_card与src_kw.knet参数
Flutter集成Tap支付:同时支持src_card和src_kw.knet的解决方案
我在Flutter移动端集成Tap支付时遇到问题:根据Tap文档,VISA/万事达卡需传入src_card作为source ID,KNET支付网关需传入src_kw.knet,但当前代码只能传入一个source值:
Map<String, dynamic> getOrderParams() { var cartModel = Provider.of<CartModel>(context, listen: false); return { 'amount': cartModel.getTotal(), 'currency': kAdvanceConfig.defaultCurrency?.currencyDisplay, 'threeDSecure': true, 'save_card': false, 'receipt': {'email': false, 'sms': true}, 'customer': { 'first_name': cartModel.address?.firstName ?? '', 'last_name': cartModel.address?.lastName ?? '', 'email': cartModel.address?.email ?? '', }, 'source': {'id':'src_card'}, <--- 这里只能传一个值 'post': {'url': kRedirectUrl}, 'redirect': {'url': kRedirectUrl} }; }
尝试添加第二个参数时触发错误:
The literal can't be either a map or a set because it contains at least one literal map entry or a spread operator spreading a 'Map', and at least one element which is neither of these.
解决方法
Tap支付的source字段是单值对象,不支持同时传入多个ID。正确的做法是根据用户选择的支付方式,动态传入对应的source ID:
- 修改方法,添加参数接收选中的支付来源ID:
Map<String, dynamic> getOrderParams(String selectedSourceId) { var cartModel = Provider.of<CartModel>(context, listen: false); return { 'amount': cartModel.getTotal(), 'currency': kAdvanceConfig.defaultCurrency?.currencyDisplay, 'threeDSecure': true, 'save_card': false, 'receipt': {'email': false, 'sms': true}, 'customer': { 'first_name': cartModel.address?.firstName ?? '', 'last_name': cartModel.address?.lastName ?? '', 'email': cartModel.address?.email ?? '', }, 'source': {'id': selectedSourceId}, // 动态赋值 'post': {'url': kRedirectUrl}, 'redirect': {'url': kRedirectUrl} }; }
- 调用方法时,根据用户选择传对应ID:
- 用户选VISA/万事达:
getOrderParams('src_card') - 用户选KNET:
getOrderParams('src_kw.knet')
如果需要让Tap支付页面展示多种支付选项供用户选择,需确认Tap API是否支持通过其他参数配置可用支付方式(比如payment_methods类的参数),但核心逻辑仍是用户选择后,将对应source ID传入订单参数。
内容的提问来源于stack exchange,提问作者Hassan Yousuf
相关产品推荐
相关产品推荐

