如何在MyFatoorah支付接口payload中循环添加商品信息?
解决MyFatoorah SendPayment接口批量添加商品问题
问题说明
我用Python调用MyFatoorah的SendPayment接口发送账单,原本只能手动添加单个商品到InvoiceItems字段,尝试用for循环批量添加商品的名称、价格和数量信息但没成功,以下是原始代码和尝试修改后的代码,求解决方法。
原始代码
###########Send Payment########### baseURL = "https://apitest.myfatoorah.com" token = 'rLtt6JWvbUHDDhsZnfpAhpYk4dxYDQkbcPTyGaKp2TYqQgG7FGZ5Th_WD53Oq8Ebz6A53njUoo1w3pjU1D4vs_ZMqFiz_j0urb_BH9Oq9VZoKFoJEDAbRZepGcQanImyYrry7Kt6MnMdgfG5jn4HngWoRdKduNNyP4kzcp3mRv7x00ahkm9LAK7ZRieg7k1PDAnBIOG3EyVSJ5kK4WLMvYr7sCwHbHcu4A5WwelxYK0GMJy37bNAarSJDFQsJ2ZvJjvMDmfWwDVFEVe_5tOomfVNt6bOg9mexbGjMrnHBnKnZR1vQbBtQieDlQepzTZMuQrSuKn-t5XZM7V6fCW7oP-uXGX-sMOajeX65JOf6XVpk29DP6ro8WTAflCDANC193yof8-f5_EYY-3hXhJj7RBXmizDpneEQDSaSz5sFk0sV5qPcARJ9zGG73vuGFyenjPPmtDtXtpx35A-BVcOSBYVIWe9kndG3nclfefjKEuZ3m4jL9Gg1h2JBvmXSMYiZtp9MR5I6pvbvylU_PP5xJFSjVTIz7IQSjcVGO41npnwIxRXNRxFOdIUHn0tjQ-7LwvEcTXyPsHXcMD8WtgBh-wxR8aKX7WPSsT1O8d8reb2aR7K3rkV3K82K_0OgawImEpwSvp9MNKynEAJQS6ZHe_J_l77652xwPNxMRTMASk1ZsJL' def send_payment(): url = baseURL + "/v2/SendPayment" payload = "{\"CustomerName\": \"Ahmed\",\"NotificationOption\": \"ALL\",\"MobileCountryCode\": \"+965\"," \ "\"CustomerMobile\": \"12345678\",\"CustomerEmail\": \"xx@yy.com\",\"InvoiceValue\": 100," \ "\"DisplayCurrencyIso\": \"KWD\",\"CallBackUrl\": \"https://google.com\",\"ErrorUrl\": " \ "\"https://google.com\",\"Language\": \"en\",\"CustomerReference\": \"ref 1\",\"CustomerCivilId\": " \ "12345678,\"UserDefinedField\": \"Custom field\",\"ExpireDate\": \"\",\"CustomerAddress\": {\"Block\": " \ "\"\",\"Street\": \"\",\"HouseBuildingNo\": \"\",\"Address\": \"\",\"AddressInstructions\": \"\"}," \ "\"InvoiceItems\": [{\"ItemName\": \"Product 01\",\"Quantity\": 1,\"UnitPrice\": 100}]} " headers = {'Content-Type': "application/json", 'Authorization': "Bearer " + token} response = requests.request("POST", url, data=payload, headers=headers) print("Send Payment Response:\n" + response.text)
尝试修改后的代码
url = baseURL + "/v2/SendPayment" sss={'ItemName': 'product 01', 'Quantity': 30, 'UnitPrice': 10,}, payload={ "CustomerName": "name", # Mandatory Field ("string") "NotificationOption": "SMS", # Mandatory Field ("LNK", "SMS", "EML", or "ALL") "InvoiceValue": 300, # Mandatory Field (Number) # Optional Fields "MobileCountryCode": "+966", "CustomerMobile": "12345678", #Mandatory if the NotificationOption = SMS or ALL # "CustomerEmail": "mail@company.com", #Mandatory if the NotificationOption = EML or ALL "DisplayCurrencyIso": "kwd", "CallBackUrl": "https://yoursite.com/success", "ErrorUrl": "https://yoursite.com/error", "Language": "ar", # "CustomerReference": "noshipping-nosupplier", # "CustomerAddress": { # "Block": "string", # "Street": "string", # "HouseBuildingNo": "string", # "Address": "address", # "AddressInstructions": "string" # }, "InvoiceItems": [ sss ] } payload=str(payload) print(f"this is pyload: {payload}") print(f"this is sss: {sss}") headers = {'Content-Type': "application/json", 'Authorization': "Bearer " + token} response = requests.request("POST", url, data=payload2, headers=headers) print("Send Payment Response:\n" + response.text)
错误原因分析
- 变量格式错误:
sss末尾多了逗号,导致它变成元组而非字典,放入InvoiceItems列表会引发JSON格式异常 - JSON序列化错误:用
str(payload)将字典转字符串,生成的内容含单引号,不符合JSON规范,接口无法解析 - 变量名错误:请求时使用了未定义的
payload2,会直接报错 - 未实现批量逻辑:代码里没有真正用循环生成多个商品条目
修正后的代码(支持批量添加)
import json import requests baseURL = "https://apitest.myfatoorah.com" token = 'rLtt6JWvbUHDDhsZnfpAhpYk4dxYDQkbcPTyGaKp2TYqQgG7FGZ5Th_WD53Oq8Ebz6A53njUoo1w3pjU1D4vs_ZMqFiz_j0urb_BH9Oq9VZoKFoJEDAbRZepGcQanImyYrry7Kt6MnMdgfG5jn4HngWoRdKduNNyP4kzcp3mRv7x00ahkm9LAK7ZRieg7k1PDAnBIOG3EyVSJ5kK4WLMvYr7sCwHbHcu4A5WwelxYK0GMJy37bNAarSJDFQsJ2ZvJjvMDmfWwDVFEVe_5tOomfVNt6bOg9mexbGjMrnHBnKnZR1vQbBtQieDlQepzTZMuQrSuKn-t5XZM7V6fCW7oP-uXGX-sMOajeX65JOf6XVpk29DP6ro8WTAflCDANC193yof8-f5_EYY-3hXhJj7RBXmizDpneEQDSaSz5sFk0sV5qPcARJ9zGG73vuGFyenjPPmtDtXtpx35A-BVcOSBYVIWe9kndG3nclfefjKEuZ3m4jL9Gg1h2JBvmXSMYiZtp9MR5I6pvbvylU_PP5xJFSjVTIz7IQSjcVGO41npnwIxRXNRxFOdIUHn0tjQ-7LwvEcTXyPsHXcMD8WtgBh-wxR8aKX7WPSsT1O8d8reb2aR7K3rkV3K82K_0OgawImEpwSvp9MNKynEAJQS6ZHe_J_l77652xwPNxMRTMASk1ZsJL' def send_payment(): url = baseURL + "/v2/SendPayment" # 模拟批量商品数据,可替换为你的数据源 products = [ {"ItemName": "Product 01", "Quantity": 2, "UnitPrice": 50}, {"ItemName": "Product 02", "Quantity": 3, "UnitPrice": 30}, {"ItemName": "Product 03", "Quantity": 1, "UnitPrice": 40} ] # 自动计算总金额,也可手动指定 invoice_value = sum(item["Quantity"] * item["UnitPrice"] for item in products) payload = { "CustomerName": "name", "NotificationOption": "SMS", "InvoiceValue": invoice_value, "MobileCountryCode": "+966", "CustomerMobile": "12345678", "DisplayCurrencyIso": "KWD", "CallBackUrl": "https://yoursite.com/success", "ErrorUrl": "https://yoursite.com/error", "Language": "ar", "InvoiceItems": products # 直接传入批量商品列表 } # 用json.dumps正确序列化字典为JSON字符串 payload_json = json.dumps(payload) headers = {'Content-Type': "application/json", 'Authorization': "Bearer " + token} response = requests.request("POST", url, data=payload_json, headers=headers) print("Send Payment Response:\n" + response.text) # 调用函数 send_payment()
关键修改点
- 用
json.dumps()替代str()序列化payload,确保生成符合规范的JSON格式 - 若商品数据是动态获取的,可通过循环生成商品列表:
# 动态生成示例 products = [] for item in your_data_list: products.append({ "ItemName": item["name"], "Quantity": item["qty"], "UnitPrice": item["price"] }) - 修正变量名错误,确保请求使用正确的payload变量
- 移除多余逗号,避免字典被转为元组
内容的提问来源于stack exchange,提问作者ahmed403
相关产品推荐
相关产品推荐

