{"info":{"_postman_id":"f4a7b427-f2e3-4bf4-82c5-dd48df7f80d5","name":"FPayApiDoc","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","toc":[],"description":"<html><head></head><body></body></html>","owner":"17317829","collectionId":"f4a7b427-f2e3-4bf4-82c5-dd48df7f80d5","publishedId":"2sBXijJrgH","public":true,"customColor":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"FF6C37"},"publishDate":"2026-03-23T08:16:57.000Z"},"item":[{"name":"Collections","item":[{"name":"payin","item":[{"name":"payin","event":[{"listen":"prerequest","script":{"id":"3e011832-673f-4d62-b4f5-661a9d1a3221","exec":["// 简化版Postman Pre-request Script - 针对POST JSON请求\r","const key = pm.collectionVariables.get(\"key\");\r","const mid = pm.collectionVariables.get(\"mid\");\r","const timestamp = Math.floor(Date.now() / 1000);\r","let allParams = {};\r","\r","// 解析JSON请求体\r","try {\r","    if (pm.request.body && pm.request.body.raw) {\r","        const jsonData = JSON.parse(pm.request.body.raw);\r","        \r","        // 收集所有参数（除了sign），替换oid为时间戳\r","        for (const [paramKey, paramValue] of Object.entries(jsonData)) {\r","            if (paramKey !== 'sign') {\r","                allParams[paramKey] = paramKey === 'oid' ? timestamp : paramValue;\r","            }\r","        }\r","    }\r","} catch (e) {\r","    console.log(\"JSON解析错误:\", e.message);\r","}\r","\r","// 确保oid参数存在\r","if (!allParams.hasOwnProperty('oid')) {\r","    allParams['oid'] = timestamp;\r","}\r","\r","// 从collection变量中获取mid并添加到参数中\r","if (mid) {\r","    allParams['mid'] = mid;\r","}\r","\r","// 排序并构建签名字符串\r","const sortedKeys = Object.keys(allParams).sort();\r","let signString = sortedKeys.map(key => `${key}=${allParams[key]}`).join('&');\r","signString += `&key=${key}`;\r","\r","// 生成MD5签名\r","const sign = CryptoJS.MD5(signString).toString();\r","\r","// 更新JSON请求体中的oid、mid和sign\r","try {\r","    const jsonData = pm.request.body.raw ? JSON.parse(pm.request.body.raw) : {};\r","    jsonData.oid = timestamp;\r","    jsonData.sign = sign;\r","    // 如果请求体中原本没有mid，则添加mid\r","    if (mid) {\r","        jsonData.mid = mid;\r","    }\r","    pm.request.body.raw = JSON.stringify(jsonData);\r","} catch (e) {\r","    console.log(\"JSON更新错误:\", e.message);\r","}\r","\r","console.log(\"Sign String:\", signString);\r","console.log(\"Timestamp (oid):\", timestamp);\r","console.log(\"MID:\", mid);\r","console.log(\"Sign:\", sign);"],"type":"text/javascript","packages":{},"requests":{}}}],"id":"2b25bda3-ae2e-4b03-b6eb-4da1d2b51ca4","protocolProfileBehavior":{"disableBodyPruning":true,"disableCookies":true},"request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n    \"oid\": \"test001\",        // 商户订单号（唯一标识）\r\n    \"mid\": \"\",                // 商户ID/渠道ID\r\n    \"amt\": \"10000\",           // 支付金额（单位：最小货币单位分）\r\n    \"ptype\": \"1\",             // 支付类型/通道编码（1=html 2=deeplink）\r\n    \"nurl\": \"https://example.com\",  // 支付成功异步通知回调地址\r\n    \"rurl\": \"https://example.com\",  // 支付成功前端同步跳转地址\r\n    \"curr\": \"INR\",            // 货币类型（INR=印度卢比）\r\n    \"uname\": \"Ans Ytkk\",      // 用户姓名/付款人姓名\r\n    \"mail\": \"Ytkk123@gmail.com\", // 用户邮箱\r\n    \"mobile\": \"9887766111\",   // 用户手机号\r\n    \"sign\": \"\"                // 签名字段（最后统一计算赋值）\r\n}","options":{"raw":{"language":"json"}}},"url":"https://api.finvia.store/api/payin","auth":{"type":"noauth","isInherited":true,"source":{"_postman_id":"baf2cb77-cd21-48b5-b265-cfe3cc9ed97e","id":"baf2cb77-cd21-48b5-b265-cfe3cc9ed97e","name":"Collections","type":"folder"}},"urlObject":{"path":["api","payin"],"host":["https://api.finvia.store"],"query":[],"variable":[]}},"response":[{"id":"49c508e3-32ea-403c-9f48-caac260979b2","name":"payin","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n    \"oid\": \"test001\",\r\n    \"mid\": \"\",\r\n    \"amt\": \"10000\",\r\n    \"ptype\": \"1\",\r\n    \"nurl\": \"https://example.com\",\r\n    \"rurl\": \"https://example.com\",\r\n    \"curr\": \"INR\",\r\n    \"uname\": \"Ans Ytkk\",\r\n    \"mail\": \"Ytkk123@gmail.com\",\r\n    \"mobile\": \"9887766111\",\r\n    \"sign\": \"\"\r\n}","options":{"raw":{"language":"json"}}},"url":"https://api.finvia.store/api/payin"},"_postman_previewlanguage":"Text","header":[],"cookie":[{"expires":"Invalid Date","domain":"","path":""}],"responseTime":null,"body":"{\r\n    \"code\": 200,\r\n    \"data\": {\r\n        \"fee\": 1000,\r\n        \"amt\": 10000,\r\n        \"mid\": \"12345\",\r\n        \"id\": 12345,\r\n        \"oid\": \"123456789\",\r\n        \"url\": \"https://example.com/123\"\r\n    },\r\n    \"message\": \"SUCCESS\"\r\n}"}],"_postman_id":"2b25bda3-ae2e-4b03-b6eb-4da1d2b51ca4"},{"name":"check","event":[{"listen":"prerequest","script":{"id":"91f3d097-3c75-4954-b9a7-34d5fc48e150","exec":["// 简化版Postman Pre-request Script - 针对POST JSON请求\r","const key = pm.collectionVariables.get(\"key\");\r","const mid = pm.collectionVariables.get(\"mid\");\r","let allParams = {};\r","\r","// 解析JSON请求体\r","try {\r","    if (pm.request.body && pm.request.body.raw) {\r","        const jsonData = JSON.parse(pm.request.body.raw);\r","        \r","        for (const [paramKey, paramValue] of Object.entries(jsonData)) {\r","            if (paramKey !== 'sign') {\r","                allParams[paramKey] =  paramValue;\r","            }\r","        }\r","    }\r","} catch (e) {\r","    console.log(\"JSON解析错误:\", e.message);\r","}\r","\r","\r","// 从collection变量中获取mid并添加到参数中\r","if (mid) {\r","    allParams['mid'] = mid;\r","}\r","\r","// 排序并构建签名字符串\r","const sortedKeys = Object.keys(allParams).sort();\r","let signString = sortedKeys.map(key => `${key}=${allParams[key]}`).join('&');\r","signString += `&key=${key}`;\r","\r","// 生成MD5签名\r","const sign = CryptoJS.MD5(signString).toString();\r","\r","// 更新JSON请求体中的oid、mid和sign\r","try {\r","    const jsonData = pm.request.body.raw ? JSON.parse(pm.request.body.raw) : {};\r","    jsonData.sign = sign;\r","    // 如果请求体中原本没有mid，则添加mid\r","    if (mid) {\r","        jsonData.mid = mid;\r","    }\r","    pm.request.body.raw = JSON.stringify(jsonData);\r","} catch (e) {\r","    console.log(\"JSON更新错误:\", e.message);\r","}\r","\r","console.log(\"Sign String:\", signString);\r","console.log(\"Timestamp (oid):\", timestamp);\r","console.log(\"MID:\", mid);\r","console.log(\"Sign:\", sign);"],"type":"text/javascript","packages":{},"requests":{}}}],"id":"9717d0b2-c69f-4beb-82b6-6a310a770f49","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n    \"mid\":\"\",// 商户编号\r\n    \"oid\":\"139902620\", // 商户单号\r\n    \"sign\":\"\"\r\n}","options":{"raw":{"language":"json"}}},"url":"https://api.finvia.store/api/payin/status","auth":{"type":"noauth","isInherited":true,"source":{"_postman_id":"baf2cb77-cd21-48b5-b265-cfe3cc9ed97e","id":"baf2cb77-cd21-48b5-b265-cfe3cc9ed97e","name":"Collections","type":"folder"}},"urlObject":{"path":["api","payin","status"],"host":["https://api.finvia.store"],"query":[],"variable":[]}},"response":[{"id":"549ec791-41a8-4718-a90f-3942d2590024","name":"check","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n    \"mid\":\"\",\r\n    \"oid\":\"139902620\",\r\n    \"sign\":\"\"\r\n}","options":{"raw":{"language":"json"}}},"url":"{{baseurl}}/payin/status"},"_postman_previewlanguage":"Text","header":[],"cookie":[{"expires":"Invalid Date","domain":"","path":""}],"responseTime":null,"body":"{\r\n    \"code\": 200,  // 请求状态\r\n    \"data\": {\r\n        \"mid\": \"202366100\",\r\n        \"id\": \"139902620\",\r\n        \"oid\": \"1751709115309\",\r\n        \"status\": 0  // 订单状态 0 未成功  1 成功\r\n    },\r\n    \"message\": \"SUCCESS\"\r\n}\r\n\r\n{\r\n    \"code\": 400,\r\n    \"message\": \"order is not exist!\"\r\n}"}],"_postman_id":"9717d0b2-c69f-4beb-82b6-6a310a770f49"},{"name":"fillUtr","id":"7901113e-3c60-4e0f-a264-bc3567a62c73","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n    \"mid\":\"\",\r\n    \"oid\":\"\",\r\n    \"utr\":\"\"\r\n}","options":{"raw":{"language":"json"}}},"url":"https://api.finvia.store/payin/fillUtr","auth":{"type":"noauth","isInherited":true,"source":{"_postman_id":"baf2cb77-cd21-48b5-b265-cfe3cc9ed97e","id":"baf2cb77-cd21-48b5-b265-cfe3cc9ed97e","name":"Collections","type":"folder"}},"urlObject":{"path":["payin","fillUtr"],"host":["https://api.finvia.store"],"query":[],"variable":[]}},"response":[{"id":"380c0b0f-1f20-47b3-a881-e5b842c19940","name":"fillUtr","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n    \"mid\":\"\",\r\n    \"oid\":\"\",\r\n    \"utr\":\"\"\r\n}","options":{"raw":{"language":"json"}}},"url":"https://api.finvia.store/payin/fillUtr"},"_postman_previewlanguage":"Text","header":null,"cookie":[],"responseTime":null,"body":null}],"_postman_id":"7901113e-3c60-4e0f-a264-bc3567a62c73"},{"name":"callback","id":"ce21d06e-bd80-41fc-b2ef-94e5c168a445","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n  \"mid\": \"2025001\",          // 商户编号\r\n  \"id\": \"12345\",             // 平台订单ID/流水号\r\n  \"oid\": \"ORDER_202401150001\", // 商户订单号\r\n  \"amt\": \"10000\",            // 订单金额\r\n  \"fee\": \"100\",              // 手续费\r\n  \"curr\": \"INR\",             // 货币类型：印度卢比\r\n  \"status\": \"1\",             // 订单状态：1成功\r\n  \"utr\": \"UTR123456789\",     // 银行参考号/UTR号\r\n  \"sign\": \"a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6\"  // 签名字段\r\n}","options":{"raw":{"language":"json"}}},"url":"your callback url","auth":{"type":"noauth","isInherited":true,"source":{"_postman_id":"baf2cb77-cd21-48b5-b265-cfe3cc9ed97e","id":"baf2cb77-cd21-48b5-b265-cfe3cc9ed97e","name":"Collections","type":"folder"}},"urlObject":{"host":["your callback url"],"query":[],"variable":[]}},"response":[],"_postman_id":"ce21d06e-bd80-41fc-b2ef-94e5c168a445"}],"id":"320fe78e-3735-46d3-a0d1-2672f8b91f93","description":"<p>StartFragment</p>\n<h2 id=\"签名生成流程-（payin-创建订单-，payin--payout-回调使用）\">签名生成流程 （Payin 创建订单 ，Payin &amp; Payout 回调使用）</h2>\n<h3 id=\"1-获取商户密钥\">1. 获取商户密钥</h3>\n<p>从商户后台获取您的唯一商户密钥（key），该密钥用于签名验证。</p>\n<h3 id=\"2-参数排序与拼接\">2. 参数排序与拼接</h3>\n<p>将请求参数（不包括sign本身）按照参数名的ASCII码从小到大排序（字典序），使用URL键值对的格式（即key1=value1&amp;key2=value2...）拼接成字符串。</p>\n<h3 id=\"3-添加商户密钥\">3. 添加商户密钥</h3>\n<p>在拼接好的字符串末尾加上<code>&amp;key=您的商户密钥</code>。</p>\n<h3 id=\"4-生成签名\">4. 生成签名</h3>\n<p>对完整字符串进行MD5加密，得到32位大写的签名值sign。</p>\n<h2 id=\"代码示例\">代码示例</h2>\n<h3 id=\"php-示例\">PHP 示例</h3>\n<p>php</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>// 请求参数示例\n$params = [\n    'merchant_id' =&gt; '100001',\n    'out_trade_no' =&gt; '202405200001',\n    'amount' =&gt; '100.00',\n    'currency' =&gt; 'CNY',\n    'notify_url' =&gt; 'https://yourdomain.com/notify'\n];\n// 步骤1: 参数按key排序\nksort($params);\n// 步骤2: 拼接成URL参数字符串\n$string = '';\nforeach ($params as $key =&gt; $value) {\n    $string .= $key . '=' . $value . '&amp;';\n}\n// 步骤3: 拼接密钥\n$merchant_key = 'YOUR_MERCHANT_KEY'; // 替换为实际商户密钥\n$string .= 'key=' . $merchant_key;\n// 步骤4: MD5加密生成签名\n$sign = strtoupper(md5($string));\n// 将签名加入请求参数\n$params['sign'] = $sign;\n// 发送请求（JSON格式）\n$json_data = json_encode($params);\n?&gt;\n\n</code></pre><h3 id=\"java-示例\">Java 示例</h3>\n<p>java</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>import java.util.*;\nimport java.security.MessageDigest;\npublic class SignGenerator {\n    public static String generateSign(Map&lt;String, String&gt; params, String merchantKey) {\n        // 参数排序\n        List&lt;String&gt; keys = new ArrayList&lt;&gt;(params.keySet());\n        Collections.sort(keys);\n        // 拼接字符串\n        StringBuilder sb = new StringBuilder();\n        for (String key : keys) {\n            sb.append(key).append(\"=\").append(params.get(key)).append(\"&amp;\");\n        }\n        sb.append(\"key=\").append(merchantKey);\n        // MD5加密\n        return md5(sb.toString()).toUpperCase();\n    }\n    private static String md5(String input) {\n        try {\n            MessageDigest md = MessageDigest.getInstance(\"MD5\");\n            byte[] digest = md.digest(input.getBytes(\"UTF-8\"));\n            StringBuilder sb = new StringBuilder();\n            for (byte b : digest) {\n                sb.append(String.format(\"\u0002x\", b));\n            }\n            return sb.toString();\n        } catch (Exception e) {\n            throw new RuntimeException(\"MD5加密失败\", e);\n        }\n    }\n}\n\n</code></pre><h3 id=\"python-示例\">Python 示例</h3>\n<p>python</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>import hashlib\nimport json\ndef generate_sign(params, merchant_key):\n    # 参数排序\n    sorted_params = sorted(params.items(), key=lambda x: x[0])\n    # 拼接字符串\n    sign_str = ''\n    for key, value in sorted_params:\n        sign_str += f'{key}={value}&amp;'\n    sign_str += f'key={merchant_key}'\n    # MD5加密\n    md5 = hashlib.md5()\n    md5.update(sign_str.encode('utf-8'))\n    return md5.hexdigest().upper()\n# 使用示例\nparams = {\n    'merchant_id': '100001',\n    'out_trade_no': '202405200001',\n    'amount': '100.00',\n    'currency': 'CNY'\n}\nmerchant_key = 'YOUR_MERCHANT_KEY'\nsign = generate_sign(params, merchant_key)\nparams['sign'] = sign\n# 转换为JSON\njson_data = json.dumps(params)\n\n</code></pre><h2 id=\"注意事项\">注意事项</h2>\n<ol>\n<li><p>参数值必须使用字符串类型</p>\n</li>\n<li><p>签名验证时同样需要排除sign参数本身</p>\n</li>\n<li><p>MD5结果需要转换为大写形式</p>\n</li>\n<li><p>确保参数编码一致（建议使用UTF-8）</p>\n</li>\n<li><p>商户密钥需要妥善保管，不要在前端代码中暴露</p>\n</li>\n</ol>\n<p>EndFragment</p>\n","_postman_id":"320fe78e-3735-46d3-a0d1-2672f8b91f93","auth":{"type":"noauth","isInherited":true,"source":{"_postman_id":"baf2cb77-cd21-48b5-b265-cfe3cc9ed97e","id":"baf2cb77-cd21-48b5-b265-cfe3cc9ed97e","name":"Collections","type":"folder"}}},{"name":"payout","item":[{"name":"payout","event":[{"listen":"prerequest","script":{"id":"3e011832-673f-4d62-b4f5-661a9d1a3221","exec":[""],"type":"text/javascript","packages":{},"requests":{}}}],"id":"fce875fc-c78d-45fe-84b6-c6c9a81c23c5","protocolProfileBehavior":{"disableBodyPruning":true,"disableCookies":true},"request":{"method":"POST","header":[{"key":"signature","value":"","type":"text"}],"body":{"mode":"raw","raw":"{\r\n    \"oid\": \"test001\",\r\n    \"mid\": \"\",\r\n    \"amt\": \"100\",\r\n    \"wtype\": \"1\",\r\n    \"bcode\": \"SBIN1234567\",\r\n    \"acc\": \"17894546123\",\r\n    \"nurl\": \"https://example.com\",\r\n    \"curr\": \"INR\",\r\n    \"uname\": \"test\",\r\n    \"mail\": \"example@gmail.com\",\r\n    \"mobile\": \"9112345678\"\r\n}","options":{"raw":{"language":"json"}}},"url":"https://api.finvia.store/api/payout","auth":{"type":"noauth","isInherited":true,"source":{"_postman_id":"baf2cb77-cd21-48b5-b265-cfe3cc9ed97e","id":"baf2cb77-cd21-48b5-b265-cfe3cc9ed97e","name":"Collections","type":"folder"}},"urlObject":{"path":["api","payout"],"host":["https://api.finvia.store"],"query":[],"variable":[]}},"response":[{"id":"e5295f19-ce06-4d9a-a485-e8d5ce45b7b5","name":"payout","originalRequest":{"method":"POST","header":[{"key":"signature","value":"","type":"text"}],"body":{"mode":"raw","raw":"{\r\n    \"oid\": \"test001\",\r\n    \"mid\": \"\",\r\n    \"amt\": \"100\",\r\n    \"wtype\": \"1\",\r\n    \"bcode\": \"SBIN1234567\",\r\n    \"acc\": \"17894546123\",\r\n    \"nurl\": \"https://example.com\",\r\n    \"curr\": \"INR\",\r\n    \"uname\": \"test\",\r\n    \"mail\": \"example@gmail.com\",\r\n    \"mobile\": \"9112345678\"\r\n}","options":{"raw":{"language":"json"}}},"url":"https://api.finvia.store/api/payout"},"_postman_previewlanguage":"Text","header":[],"cookie":[{"expires":"Invalid Date","domain":"","path":""}],"responseTime":null,"body":"{\r\n    \"code\": 200,\r\n    \"data\": {\r\n        \"fee\": 1000,\r\n        \"amt\": 10000,\r\n        \"mid\": \"123456\",\r\n        \"id\": 123456,\r\n        \"oid\": \"123456789\"\r\n    },\r\n    \"message\": \"PENDING\"\r\n}\r\n\r\n{\r\n    \"code\": 400,\r\n    \"message\": \"'oid' is exist.\"  //单号重复\r\n}\r\n\r\n{\r\n    \"code\": 400,\r\n    \"message\": \"Create order failed.\"\r\n}\r\n\r\n{\r\n    \"code\": 400,\r\n    \"message\": \"Merchant deduct balance failed.\"\r\n}"}],"_postman_id":"fce875fc-c78d-45fe-84b6-c6c9a81c23c5"},{"name":"check","event":[{"listen":"prerequest","script":{"id":"526115c0-1266-4ba3-ace8-ff06c9ee8ae9","exec":["// 简化版Postman Pre-request Script - 针对POST JSON请求\r","const key = pm.collectionVariables.get(\"key\");\r","const mid = pm.collectionVariables.get(\"mid\");\r","let allParams = {};\r","\r","// 解析JSON请求体\r","try {\r","    if (pm.request.body && pm.request.body.raw) {\r","        const jsonData = JSON.parse(pm.request.body.raw);\r","        \r","        for (const [paramKey, paramValue] of Object.entries(jsonData)) {\r","            if (paramKey !== 'sign') {\r","                allParams[paramKey] =  paramValue;\r","            }\r","        }\r","    }\r","} catch (e) {\r","    console.log(\"JSON解析错误:\", e.message);\r","}\r","\r","\r","// 从collection变量中获取mid并添加到参数中\r","if (mid) {\r","    allParams['mid'] = mid;\r","}\r","\r","// 排序并构建签名字符串\r","const sortedKeys = Object.keys(allParams).sort();\r","let signString = sortedKeys.map(key => `${key}=${allParams[key]}`).join('&');\r","signString += `&key=${key}`;\r","\r","// 生成MD5签名\r","const sign = CryptoJS.MD5(signString).toString();\r","\r","// 更新JSON请求体中的oid、mid和sign\r","try {\r","    const jsonData = pm.request.body.raw ? JSON.parse(pm.request.body.raw) : {};\r","    jsonData.sign = sign;\r","    // 如果请求体中原本没有mid，则添加mid\r","    if (mid) {\r","        jsonData.mid = mid;\r","    }\r","    pm.request.body.raw = JSON.stringify(jsonData);\r","} catch (e) {\r","    console.log(\"JSON更新错误:\", e.message);\r","}\r","\r","console.log(\"Sign String:\", signString);\r","console.log(\"MID:\", mid);\r","console.log(\"Sign:\", sign);"],"type":"text/javascript","packages":{},"requests":{}}}],"id":"346950d8-7f64-421e-9940-2f9156dcbf8f","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n    \"mid\":\"\", //商户编号\r\n    \"oid\":\"51097\", //商户单号\r\n    \"sign\":\"\"\r\n}","options":{"raw":{"language":"json"}}},"url":"https://api.finvia.store/api/payout/status","auth":{"type":"noauth","isInherited":true,"source":{"_postman_id":"baf2cb77-cd21-48b5-b265-cfe3cc9ed97e","id":"baf2cb77-cd21-48b5-b265-cfe3cc9ed97e","name":"Collections","type":"folder"}},"urlObject":{"path":["api","payout","status"],"host":["https://api.finvia.store"],"query":[],"variable":[]}},"response":[{"id":"ca96faa6-7c80-4c37-ad67-a928f65315f0","name":"check","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n    \"mid\":\"\",\r\n    \"oid\":\"123456\",\r\n    \"sign\":\"\"\r\n}","options":{"raw":{"language":"json"}}},"url":"https://api.finvia.store/api/payout/status"},"_postman_previewlanguage":"Text","header":[],"cookie":[{"expires":"Invalid Date","domain":"","path":""}],"responseTime":null,"body":"{\r\n    \"code\": 200,  // 请求状态\r\n    \"data\": {\r\n        \"utr\": \"\",\r\n        \"mid\": \"123456\",\r\n        \"id\": \"123456\",\r\n        \"oid\": \"123456\",\r\n        \"status\": 1   // 订单状态  1 成功  0 未处理 -1 失败\r\n    },\r\n    \"message\": \"SUCCESS\"\r\n}\r\n\r\n{\r\n    \"code\": 400,\r\n    \"message\": \"order is not exist!\"\r\n}"}],"_postman_id":"346950d8-7f64-421e-9940-2f9156dcbf8f"},{"name":"checkBalance","event":[{"listen":"prerequest","script":{"id":"ea1935fc-33af-4733-9f0c-44530a73e2a6","exec":["// 简化版Postman Pre-request Script - 针对POST JSON请求\r","const key = pm.collectionVariables.get(\"key\");\r","const mid = pm.collectionVariables.get(\"mid\");\r","let allParams = {};\r","\r","// 解析JSON请求体\r","try {\r","    if (pm.request.body && pm.request.body.raw) {\r","        const jsonData = JSON.parse(pm.request.body.raw);\r","        \r","        for (const [paramKey, paramValue] of Object.entries(jsonData)) {\r","            if (paramKey !== 'sign') {\r","                allParams[paramKey] =  paramValue;\r","            }\r","        }\r","    }\r","} catch (e) {\r","    console.log(\"JSON解析错误:\", e.message);\r","}\r","\r","\r","// 从collection变量中获取mid并添加到参数中\r","if (mid) {\r","    allParams['mid'] = mid;\r","}\r","\r","// 排序并构建签名字符串\r","const sortedKeys = Object.keys(allParams).sort();\r","let signString = sortedKeys.map(key => `${key}=${allParams[key]}`).join('&');\r","signString += `&key=${key}`;\r","\r","// 生成MD5签名\r","const sign = CryptoJS.MD5(signString).toString();\r","\r","// 更新JSON请求体中的oid、mid和sign\r","try {\r","    const jsonData = pm.request.body.raw ? JSON.parse(pm.request.body.raw) : {};\r","    jsonData.sign = sign;\r","    // 如果请求体中原本没有mid，则添加mid\r","    if (mid) {\r","        jsonData.mid = mid;\r","    }\r","    pm.request.body.raw = JSON.stringify(jsonData);\r","} catch (e) {\r","    console.log(\"JSON更新错误:\", e.message);\r","}\r","\r","console.log(\"Sign String:\", signString);\r","console.log(\"MID:\", mid);\r","console.log(\"Sign:\", sign);"],"type":"text/javascript","packages":{}}}],"id":"19b0c6ff-6cf8-44f1-b7e7-4dafa9e0aad0","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n    \"mid\":\"\",\r\n    \"sign\":\"\"\r\n}","options":{"raw":{"language":"json"}}},"url":"https://api.finvia.store/api/payout/balance","auth":{"type":"noauth","isInherited":true,"source":{"_postman_id":"baf2cb77-cd21-48b5-b265-cfe3cc9ed97e","id":"baf2cb77-cd21-48b5-b265-cfe3cc9ed97e","name":"Collections","type":"folder"}},"urlObject":{"path":["api","payout","balance"],"host":["https://api.finvia.store"],"query":[],"variable":[]}},"response":[{"id":"cb2592b1-2eab-4ef5-8ce8-5bb3279fb1c3","name":"checkBalance","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n    \"mid\":\"\",\r\n    \"sign\":\"\"\r\n}","options":{"raw":{"language":"json"}}},"url":"https://api.finvia.store/api/payout/balance"},"_postman_previewlanguage":"Text","header":[],"cookie":[{"expires":"Invalid Date","domain":"","path":""}],"responseTime":null,"body":"{\r\n    \"code\": 200,\r\n    \"data\": {\r\n        \"total\": \"6653.00\",  // 总余额\r\n        \"available\": \"5349.00\",  // 可提现金额\r\n        \"mid\": \"123456\"\r\n    },\r\n    \"message\": \"SUCCESS\"\r\n}"}],"_postman_id":"19b0c6ff-6cf8-44f1-b7e7-4dafa9e0aad0"},{"name":"callback","id":"a500e02c-693f-4e97-a71f-a415a7968341","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n  \"mid\": \"123456789\",        // 商户编号\r\n  \"id\": \"10001\",             // 平台订单号\r\n  \"oid\": \"ORDER_20231025001\",// 商户订单号\r\n  \"amt\": \"15000\",            // 订单金额\r\n  \"fee\": \"150\",              // 手续费\r\n  \"utr\": \"UTR123456789\",     // 银行流水号/UTR\r\n  \"curr\": \"INR\",             // 货币类型：印度卢比\r\n  \"status\": \"1\",             // 订单状态：1 成功\r\n  \"sign\": \"a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6\"  // 签名\r\n}\r\n\r\n{\r\n  \"mid\": \"123456789\",        // 商户编号\r\n  \"id\": \"10002\",             // 平台订单号\r\n  \"oid\": \"ORDER_20231025002\",// 商户订单号\r\n  \"amt\": \"20000\",            // 订单金额\r\n  \"fee\": \"200\",              // 手续费\r\n  \"curr\": \"INR\",             // 货币类型：印度卢比\r\n  \"status\": \"-1\",            // 订单状态：-1 失败\r\n  \"sign\": \"z9y8x7w6v5u4t3s2r1q0p0n9m8l7k6\"  // 签名\r\n}","options":{"raw":{"language":"json"}}},"url":"your callback url","auth":{"type":"noauth","isInherited":true,"source":{"_postman_id":"baf2cb77-cd21-48b5-b265-cfe3cc9ed97e","id":"baf2cb77-cd21-48b5-b265-cfe3cc9ed97e","name":"Collections","type":"folder"}},"urlObject":{"host":["your callback url"],"query":[],"variable":[]}},"response":[],"_postman_id":"a500e02c-693f-4e97-a71f-a415a7968341"}],"id":"dbe54972-b116-4195-9806-53fbb2e0ffa9","description":"<h2 id=\"密钥生成\">密钥生成</h2>\n<p>首先生成 RSA 2048 PKCS#8 格式的公钥私钥对：</p>\n<h3 id=\"测试商户示例密钥对\">测试商户示例密钥对</h3>\n<p><strong>公钥：</strong></p>\n<p>text</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwsGijxp4XhfIOfVOVyDK\n1ey9sLLynWDrb0Mg3LSdW5OeED/oEEpT5i7mNv5osl4k3t9PnZBJuYlsr0i6aOaT\nqyrYcDr3CweX/hnst0yJGlYiNj37TjlQRG0xbDAq1LvEF+5M2lEK62sSzxuIfCJv\nPpwLxBOcv8B8mbjY/2TpakUB/IMmsw7ArzAwXhMaiSSykTr5ze7AsqgbFmpNbUuz\n65yV1cJT/yUePoAGq3HAS2Zdcg4yImkQeeoypnhsv+HBlUcPP0pgycyLkLlMknqd\nMZ3lux3gaSmgFLL6C0YzXmGhKiaw/pdFJQOqQlpqNQIPumbp3aTI93yZmLPkX48s\nyQIDAQAB\n-----END PUBLIC KEY-----\n\n</code></pre><p><strong>私钥：</strong></p>\n<p>text</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>-----BEGIN PRIVATE KEY-----\nMIIEwAIBADANBgkqhkiG9w0BAQEFAASCBKowggSmAgEAAoIBAQDCwaKPGnheF8g5\n9U5XIMrV7L2wsvKdYOtvQyDctJ1bk54QP+gQSlPmLuY2/miyXiTe30+dkEm5iWyv\nSLpo5pOrKthwOvcLB5f+Gey3TIkaViI2PftOOVBEbTFsMCrUu8QX7kzaUQrraxLP\nG4h8Im8+nAvEE5y/wHyZuNj/ZOlqRQH8gyazDsCvMDBeExqJJLKROvnN7sCyqBsW\nak1tS7PrnJXVwlP/JR4+gAarccBLZl1yDjIiaRB56jKmeGy/4cGVRw8/SmDJzIuQ\nuUySep0xneW7HeBpKaAUsvoLRjNeYaEqJrD+l0UlA6pCWmo1Ag+6ZundpMj3fJmY\ns+RfjyzJAgMBAAECggEBAKk3s7XhSvp+cXOiZ6oejP7pDzxrj5AcuRPYYMJDkIIU\nNf9qd4lH+7QBxfe8f12TnTelEjkWOGikNjHq4ETrKx1LQfnp0eLcezzGa74sGugu\nNNWqbyNdexepRIr7IwvqBYzBejcquXEpfJNFGga5qKzeyv5YCBc3+Utbp/foR0MU\nIgi9SLOY0ZA46Op7bLeatPn2cwlofvXFhq42p50jZ5b6FFBrM0OO8tTKVI8sYVPA\nsr3j08TFdZwL/6dCwyNxh/+N4Sm2zhcf5yB9W+SBOPDYGE6Q17Y7B4z+9UXueBbn\nEXMyqlVyCD47qL2W7oDQCjkVTlDF3XmFQ/iy1FtI94ECgYEA+iqkdCEQ23MGAsj1\nZEN4bSQv/ZCrfwXHNkyAzbFipNpZRerrfhT8ruic9G/1WSWZsUeUKiEyuAf36xxr\nzR6NhiMZQrcBJernxgfjxHkiw7rgWUnvRy+aUnRsyHhVH4VRXkVya2N/mvkXx0Wt\n8dsmqkPxfkjm0weBpI7ksEc2TpkCgYEAx0w5XqvvK9XvMrJlKogM5lDe7DeZp1lx\n1XR5Txdac4OAMkrzcqQlJGynEdkUToKvf19UkedkbxZ5QqorXQ+jOX6WcC2007ZN\nQW9VCaKIvjJsWcSRavRbtz1P4XcWXW6nTXPf3nkykYwbni3IL5NL41+4rveSGpJD\nfAbu2mennbECgYEAwPs8Ocl4M5GbxXI4usvBjpAn5TdA1JAkiSKjCgoYyosV6vW6\nDF0sP9F5oqbrYYW79iH9jjJl6clb2qbmEinLivpwdiKuZA2+FenoLpwz0UHL55U9\nXHDAX3Mop80L/XDewBZambT7rxUQ3sxFzxj7zsTy+jRKu+hCfistBz8oCaECgYEA\nqrvSKhiBPLx5vqS1pkoHQwfk8dhv+b3Wl1bA1dDb3Dm7iVpMVNnqN9odBl1B2EB8\nuFGi0Zu5nrFSEJpXq9HJs2eO2WtOjlCOvo/x+d8T5lysFfsf2NCeAcy0siKjNkel\na+To1F5fw/CTeF8gMCGv0YofXUUaFUlYJtiJpvFF1wECgYEA1auQS7p5ezf+u6Zq\nTZkOBowbpRsHJ8uI4OIEVUO20hd1u2jsW5v+WYn6ZbuL1I4nn5nOmADADVHeJZum\nDCRzWyVrXvfkDaty7C3ibodjV30561BhEzVDrmEhyPO8qrA5KBlev8LXEAzc2jd7\nwf98TECKH/Z097kgAq3XDEx65wI=\n-----END PRIVATE KEY-----\n\n</code></pre><h2 id=\"密钥管理\">密钥管理</h2>\n<ul>\n<li><p>商户需妥善保存私钥，确保安全不泄露</p>\n</li>\n<li><p>将公钥在商户后台上传至指定位置</p>\n</li>\n</ul>\n<h2 id=\"签名生成步骤-（payout-创建订单）\">签名生成步骤 （Payout 创建订单）</h2>\n<h3 id=\"1-参数拼接\">1. 参数拼接</h3>\n<p>将以下参数按指定顺序拼接成字符串：</p>\n<p>java</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>String needSignStr = \"acc=\" + 收款账号 +\n                    \"&amp;amt=\" + 金额（单位分） +\n                    \"&amp;bcode=\" + IFSC11位代码 +\n                    \"&amp;mid=\" + 商户id +\n                    \"&amp;oid=\" + 商户唯一订单号;\n\n</code></pre><h3 id=\"2-签名加密\">2. 签名加密</h3>\n<p>对拼接后的字符串进行加密：</p>\n<ul>\n<li><p>首先使用 SHA256 算法进行哈希计算</p>\n</li>\n<li><p>然后使用商户私钥进行 RSA 加密</p>\n</li>\n</ul>\n<h3 id=\"3-设置签名\">3. 设置签名</h3>\n<p>将加密结果放入 header signature 字段中</p>\n<h2 id=\"注意事项\">注意事项</h2>\n<ol>\n<li><p>参数拼接顺序必须严格按照上述要求</p>\n</li>\n<li><p>确保使用正确的加密算法（SHA256 with RSA）</p>\n</li>\n<li><p>签名结果需要进行 Base64 编码</p>\n</li>\n<li><p>在测试环境中使用提供的测试密钥进行验证</p>\n</li>\n<li><p>生产环境务必使用自己生成的密钥对</p>\n</li>\n</ol>\n<h2 id=\"常见问题\">常见问题</h2>\n<ul>\n<li><p>如果签名验证失败，请检查参数拼接顺序是否正确</p>\n</li>\n<li><p>确保使用的私钥与上传的公钥匹配</p>\n</li>\n<li><p>检查加密算法是否严格按照要求实现</p>\n</li>\n</ul>\n<p>如需进一步技术支持，请联系我们的技术团队。</p>\n","_postman_id":"dbe54972-b116-4195-9806-53fbb2e0ffa9","auth":{"type":"noauth","isInherited":true,"source":{"_postman_id":"baf2cb77-cd21-48b5-b265-cfe3cc9ed97e","id":"baf2cb77-cd21-48b5-b265-cfe3cc9ed97e","name":"Collections","type":"folder"}}}],"id":"baf2cb77-cd21-48b5-b265-cfe3cc9ed97e","description":"<p>The <code>/collections</code> endpoints let you manage your <a href=\"https://learning.postman.com/docs/sending-requests/intro-to-collections/\">collections</a>.</p>\n","auth":{"type":"noauth","isInherited":false},"event":[{"listen":"prerequest","script":{"id":"2960f942-e09b-4873-8658-d01986e967ca","type":"text/javascript","packages":{},"exec":[""]}},{"listen":"test","script":{"id":"2498880e-5eba-4b9f-97b1-08a0023cede9","type":"text/javascript","packages":{},"exec":[""]}}],"_postman_id":"baf2cb77-cd21-48b5-b265-cfe3cc9ed97e"}],"event":[{"listen":"prerequest","script":{"id":"631a6a94-98cf-4dd5-8bfc-d603f93fb554","type":"text/javascript","requests":{},"exec":[""]}},{"listen":"test","script":{"id":"d8f2c49a-b2e8-4a7e-a257-0d456b09fe1c","type":"text/javascript","requests":{},"exec":[""]}}],"variable":[{"id":"bf90d2d8-9f26-48b0-b074-210627e1a71a","key":"baseUrl","value":"https://api.finvia.store"},{"id":"2ef4ca83-352f-426d-85bb-40c4222dca75","key":"mid","value":"660"},{"id":"7af50488-93d5-4f40-92bb-d74acab0f851","key":"key","value":"93dbaaa01d2848dca4303daf80a2f602"},{"id":"2a6f9497-c032-46fb-9aa2-2606f4ac1d3e","key":"generated_sign","value":"1daf41687a1102a5d0bfd91b879ce83a"},{"id":"9d9b1f0f-3f77-404a-af62-de9aabfa6bea","key":"merchant_private_key","value":"MIIEwAIBADANBgkqhkiG9w0BAQEFAASCBKowggSmAgEAAoIBAQDCwaKPGnheF8g59U5XIMrV7L2wsvKdYOtvQyDctJ1bk54QP+gQSlPmLuY2/miyXiTe30+dkEm5iWyvSLpo5pOrKthwOvcLB5f+Gey3TIkaViI2PftOOVBEbTFsMCrUu8QX7kzaUQrraxLPG4h8Im8+nAvEE5y/wHyZuNj/ZOlqRQH8gyazDsCvMDBeExqJJLKROvnN7sCyqBsWak1tS7PrnJXVwlP/JR4+gAarccBLZl1yDjIiaRB56jKmeGy/4cGVRw8/SmDJzIuQuUySep0xneW7HeBpKaAUsvoLRjNeYaEqJrD+l0UlA6pCWmo1Ag+6ZundpMj3fJmYs+RfjyzJAgMBAAECggEBAKk3s7XhSvp+cXOiZ6oejP7pDzxrj5AcuRPYYMJDkIIUNf9qd4lH+7QBxfe8f12TnTelEjkWOGikNjHq4ETrKx1LQfnp0eLcezzGa74sGuguNNWqbyNdexepRIr7IwvqBYzBejcquXEpfJNFGga5qKzeyv5YCBc3+Utbp/foR0MUIgi9SLOY0ZA46Op7bLeatPn2cwlofvXFhq42p50jZ5b6FFBrM0OO8tTKVI8sYVPAsr3j08TFdZwL/6dCwyNxh/+N4Sm2zhcf5yB9W+SBOPDYGE6Q17Y7B4z+9UXueBbnEXMyqlVyCD47qL2W7oDQCjkVTlDF3XmFQ/iy1FtI94ECgYEA+iqkdCEQ23MGAsj1ZEN4bSQv/ZCrfwXHNkyAzbFipNpZRerrfhT8ruic9G/1WSWZsUeUKiEyuAf36xxrzR6NhiMZQrcBJernxgfjxHkiw7rgWUnvRy+aUnRsyHhVH4VRXkVya2N/mvkXx0Wt8dsmqkPxfkjm0weBpI7ksEc2TpkCgYEAx0w5XqvvK9XvMrJlKogM5lDe7DeZp1lx1XR5Txdac4OAMkrzcqQlJGynEdkUToKvf19UkedkbxZ5QqorXQ+jOX6WcC2007ZNQW9VCaKIvjJsWcSRavRbtz1P4XcWXW6nTXPf3nkykYwbni3IL5NL41+4rveSGpJDfAbu2mennbECgYEAwPs8Ocl4M5GbxXI4usvBjpAn5TdA1JAkiSKjCgoYyosV6vW6DF0sP9F5oqbrYYW79iH9jjJl6clb2qbmEinLivpwdiKuZA2+FenoLpwz0UHL55U9XHDAX3Mop80L/XDewBZambT7rxUQ3sxFzxj7zsTy+jRKu+hCfistBz8oCaECgYEAqrvSKhiBPLx5vqS1pkoHQwfk8dhv+b3Wl1bA1dDb3Dm7iVpMVNnqN9odBl1B2EB8uFGi0Zu5nrFSEJpXq9HJs2eO2WtOjlCOvo/x+d8T5lysFfsf2NCeAcy0siKjNkela+To1F5fw/CTeF8gMCGv0YofXUUaFUlYJtiJpvFF1wECgYEA1auQS7p5ezf+u6ZqTZkOBowbpRsHJ8uI4OIEVUO20hd1u2jsW5v+WYn6ZbuL1I4nn5nOmADADVHeJZumDCRzWyVrXvfkDaty7C3ibodjV30561BhEzVDrmEhyPO8qrA5KBlev8LXEAzc2jd7wf98TECKH/Z097kgAq3XDEx65wI="}]}