欢迎回来
商户号管理
我的商户号
| ID | 商户号 | 名称 | 主小程序 | 半屏小程序 | AppID | 状态 | 支付开关 | 操作 |
|---|
订单管理
交易订单
| 商户订单号 | 平台订单号 | 微信订单号 | 用户OpenID | 商户号 | 金额 | 手续费 | 状态 | 商户通知 | 描述 | 时间 | 操作 |
|---|
异步通知
通知记录
| 商户订单号 | 平台订单号 | 微信订单号 | 通知地址 | 状态 | 重试 | 时间 |
|---|
分账管理
小程序分账配置
| 发起方商户号 | 接收方类型 | 接收方账号 | 接收方名称 | 分账比例 | 状态 | 操作 |
|---|
分账记录
| 订单号 | 微信订单号 | 接收方 | 分账金额 | 比例 | 状态 | 微信分账单号 | 备注 | 时间 | 操作 |
|---|
添加分账接收方
投诉处理
投诉列表
| 订单号 | 手机号 | 内容 | 状态 | 次数 | 更新时间 | 操作 |
|---|
💬 投诉对话
手续费账单
收支明细
| ID | 类型 | 金额 | 余额 | 关联订单 | 备注 | 时间 |
|---|
密钥管理
API密钥
| App ID | App Secret | 状态 | 创建时间 |
|---|
🔗 网关信息
API地址: https://minipay.1.taolianwl.cn
签名方式: MD5(app_id + app_secret + timestamp)
员工管理
| ID | 用户名 | 姓名 | 手机 | 角色 | 权限 | 状态 | 最后登录 | 操作 |
|---|
操作记录
| ID | 操作人 | 操作 | 对象 | 详情 | IP | 时间 |
|---|
开发文档
MiniPay Payment API v3.0📖 概述
MiniPay 是一套基于微信小程序的支付解决方案,通过 URL Link + 半屏小程序技术,实现微信外浏览器直接拉起微信支付,无需申请 H5 支付权限。
🌐 网关地址: https://minipay.1.taolianwl.cn
🔐 签名方式: MD5
📦 通信格式: JSON (Content-Type: application/json)
1️⃣ 统一下单
创建支付订单,生成支付链接。用户点击链接后拉起微信小程序完成支付。
成功响应:
out_order_no— 商户订单号,你传入的,用于关联你的业务系统order_no— 平台订单号,MiniPay生成,用于查询和对账transaction_id— 微信订单号,42000开头,支付成功后才有
2️⃣ 订单查询
通过平台订单号查询订单状态
3️⃣ 签名算法
所有API请求必须携带签名,算法如下:
app_id 和 app_secret 在「密钥管理」页面获取
4️⃣ 异步通知(支付回调)
用户支付成功后,MiniPay 会向你的 notify_url 发送 POST 请求:
你的接口收到通知后,必须返回字符串 SUCCESS 或 JSON {"code":0}。否则系统将自动重试通知:
重试间隔:15s → 30s → 60s → 120s → 300s,最多5次
你的服务器正确响应:
通知签名验证:
5️⃣ 同步回调
用户支付完成后,MiniPay 会将用户重定向到你传入的 sync_notify_url:
同步回调仅用于页面跳转展示,不保证支付结果准确性。最终状态请以异步通知或主动查询为准。
6️⃣ 支付流程
- 你的系统调用 统一下单 API,传入订单信息和回调地址
- API返回
url_link(支付链接) - 你的系统将链接展示给用户(二维码/超链接均可)
- 用户点击链接 → 拉起微信小程序 → 调起微信收银台 → 完成支付
- MiniPay 收到微信回调 → 更新订单状态 → POST通知你的 notify_url
- 你的接口返回
SUCCESS→ 通知完成 ✅
7️⃣ Native支付(扫码支付)
适用于PC端、线下场景。用户微信扫码直接完成支付,无需小程序。
✅ 优势:无需绑定小程序,无需URL Link,微信扫码即付
📋 适用场景:PC网站支付、线下扫码、二维码收款
请求参数(在统一下单基础上增加):
POST /api/pay/native-order
// 请求参数
{
"app_id": "你的AppID", // 必填
"timestamp": "1715827200", // 必填
"sign": "a1b2c3d4e5...", // 必填
"mch_id": "16888888", // 可选 - 指定商户号
"amount": 1.00, // 必填 - 支付金额(元)
"out_order_no": "ORDER20260518001", // 必填 - 商户订单号
"user_ip": "192.168.1.1", // 必填 - 付款用户IP
"notify_url": "https://yoursite.com/notify", // 必填 - 异步通知
"sync_notify_url": "https://yoursite.com/sync", // 必填 - 同步回调
"description": "商品描述" // 可选
}
成功响应:
{
"code": 0,
"data": {
"order_no": "WPMP7D18YL19B5F6",
"out_order_no": "ORDER20260518001",
"code_url": "weixin://wxpay/bizpayurl?pr=xxx", // ⭐ 扫码链接
"amount": 1.00,
"fee": 0.006
}
}
💡 code_url 使用方式:
- 生成二维码展示给用户(推荐使用
qrcode.js 等库)
- 用户用微信扫码 → 直接拉起微信收银台 → 完成支付
- code_url 有效期 2小时,过期需重新下单
Native支付流程:
- 你的系统调用 Native下单 API
- API返回
code_url(扫码链接)
- 你的系统将 code_url 生成二维码,展示给用户
- 用户微信扫码 → 微信收银台 → 完成支付
- MiniPay 收到微信回调 → POST通知你的 notify_url
cURL 示例:
# Native支付下单
curl -X POST https://minipay.1.taolianwl.cn/api/pay/native-order \
-H "Content-Type: application/json" \
-d '{
"app_id": "你的AppID",
"timestamp": "1715827200",
"sign": "md5签名",
"mch_id": "16888888",
"amount": 1.00,
"out_order_no": "ORDER001",
"user_ip": "192.168.1.1",
"notify_url": "https://yoursite.com/notify",
"sync_notify_url": "https://yoursite.com/sync"
}'
8️⃣ SDK Demo
以下为各语言统一下单调用示例,app_id / app_secret 请在「密钥管理」页面获取
<?php
// MiniPay 统一下单 - PHP Demo
$appId = '你的AppID';
$appSecret = '你的AppSecret';
$timestamp = time();
$sign = md5($appId . $appSecret . $timestamp);
$data = [
'app_id' => $appId,
'timestamp' => $timestamp,
'sign' => $sign,
// 'mch_id' => '16888888', // 可选,不传则自动轮询
'amount' => 0.01,
'out_order_no' => 'ORDER' . date('YmdHis') . rand(1000,9999),
'user_ip' => $_SERVER['REMOTE_ADDR'] ?? '127.0.0.1',
'notify_url' => 'https://yoursite.com/pay/notify',
'sync_notify_url'=> 'https://yoursite.com/pay/sync',
'description' => '商品描述',
];
$ch = curl_init('https://minipay.1.taolianwl.cn/api/pay/unified-order');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($data),
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
]);
$result = curl_exec($ch);
curl_close($ch);
$resp = json_decode($result, true);
if ($resp['code'] === 0) {
// 成功,引导用户跳转支付链接
header('Location: ' . $resp['data']['url_link']);
} else {
echo '下单失败: ' . $resp['msg'];
}
// === 异步通知处理 ===
$notify = json_decode(file_get_contents('php://input'), true);
$keys = array_filter(array_keys($notify), fn($k) => $k !== 'sign');
sort($keys);
$signStr = implode('&', array_map(fn($k) => $k.'='.$notify[$k], $keys)) . '&key=' . $appSecret;
if (md5($signStr) === $notify['sign'] && $notify['status'] === 'paid') {
// 验签通过,处理订单
$outOrderNo = $notify['out_order_no'];
$amount = $notify['amount'];
// ... 更新你的订单状态
echo json_encode(['code' => 0, 'msg' => 'ok']);
}
# MiniPay 统一下单 - Python Demo
import hashlib, time, requests, json
APP_ID = '你的AppID'
APP_SECRET = '你的AppSecret'
timestamp = str(int(time.time()))
sign = hashlib.md5((APP_ID + APP_SECRET + timestamp).encode()).hexdigest()
data = {
'app_id': APP_ID,
'timestamp': timestamp,
'sign': sign,
# 'mch_id': '16888888', # 可选,不传则自动轮询
'amount': 0.01,
'out_order_no': f'ORDER{int(time.time())}',
'user_ip': '127.0.0.1',
'notify_url': 'https://yoursite.com/pay/notify',
'sync_notify_url':'https://yoursite.com/pay/sync',
'description': '商品描述',
}
resp = requests.post(
'https://minipay.1.taolianwl.cn/api/pay/unified-order',
json=data, timeout=30
).json()
if resp['code'] == 0:
# 成功,引导用户跳转支付链接
print('支付链接:', resp['data']['url_link'])
else:
print('下单失败:', resp['msg'])
# === 异步通知处理 (Flask) ===
from flask import Flask, request
app = Flask(__name__)
@app.route('/pay/notify', methods=['POST'])
def pay_notify():
data = request.json
keys = sorted(k for k in data if k != 'sign')
sign_str = '&'.join(f'{k}={data[k]}' for k in keys) + f'&key={APP_SECRET}'
expected = hashlib.md5(sign_str.encode()).hexdigest()
if expected == data.get('sign') and data.get('status') == 'paid':
# 验签通过,处理订单
out_order_no = data['out_order_no']
amount = data['amount']
# ... 更新你的订单状态
return {'code': 0, 'msg': 'ok'}
return {'code': 1, 'msg': '验签失败'}, 400
// MiniPay 统一下单 - Node.js Demo
const crypto = require('crypto');
const https = require('https');
const APP_ID = '你的AppID';
const APP_SECRET = '你的AppSecret';
const timestamp = Math.floor(Date.now() / 1000).toString();
const sign = crypto.createHash('md5').update(APP_ID + APP_SECRET + timestamp).digest('hex');
const data = JSON.stringify({
app_id: APP_ID,
timestamp,
sign,
// mch_id: '16888888', // 可选,不传则自动轮询
amount: 0.01,
out_order_no: `ORDER${Date.now()}`,
user_ip: '127.0.0.1',
notify_url: 'https://yoursite.com/pay/notify',
sync_notify_url:'https://yoursite.com/pay/sync',
description: '商品描述',
});
const req = https.request({
hostname: 'minipay.1.taolianwl.cn',
path: '/api/pay/unified-order',
method: 'POST',
headers: { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(data) },
}, (res) => {
let body = '';
res.on('data', c => body += c);
res.on('end', () => {
const resp = JSON.parse(body);
if (resp.code === 0) {
console.log('支付链接:', resp.data.url_link);
} else {
console.log('下单失败:', resp.msg);
}
});
});
req.write(data);
req.end();
// === 异步通知处理 (Express) ===
const express = require('express');
const app = express();
app.use(express.json());
app.post('/pay/notify', (req, res) => {
const data = req.body;
const keys = Object.keys(data).filter(k => k !== 'sign').sort();
const signStr = keys.map(k => `${k}=${data[k]}`).join('&') + `&key=${APP_SECRET}`;
const expected = crypto.createHash('md5').update(signStr).digest('hex');
if (expected === data.sign && data.status === 'paid') {
// 验签通过,处理订单
console.log('支付成功:', data.out_order_no, data.amount);
res.json({ code: 0, msg: 'ok' });
} else {
res.status(400).json({ code: 1, msg: '验签失败' });
}
});
// MiniPay 统一下单 - Java Demo (JDK 11+)
import java.net.http.*;
import java.net.URI;
import java.security.MessageDigest;
import java.util.*;
public class MiniPayDemo {
static final String APP_ID = "你的AppID";
static final String APP_SECRET = "你的AppSecret";
static final String BASE_URL = "https://minipay.1.taolianwl.cn";
static String md5(String input) throws Exception {
byte[] hash = MessageDigest.getInstance("MD5").digest(input.getBytes());
StringBuilder sb = new StringBuilder();
for (byte b : hash) sb.append(String.format("%02x", b));
return sb.toString();
}
public static void main(String[] args) throws Exception {
String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
String sign = md5(APP_ID + APP_SECRET + timestamp);
String json = String.format("""
{"app_id":"%s","timestamp":"%s","sign":"%s",
"amount":0.01,
"out_order_no":"ORDER%d",
"user_ip":"127.0.0.1",
"notify_url":"https://yoursite.com/pay/notify",
"sync_notify_url":"https://yoursite.com/pay/sync",
"description":"商品描述"}
""", APP_ID, timestamp, sign, System.currentTimeMillis());
HttpClient client = HttpClient.newHttpClient();
HttpRequest req = HttpRequest.newBuilder()
.uri(URI.create(BASE_URL + "/api/pay/unified-order"))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(json))
.build();
HttpResponse resp = client.send(req, HttpResponse.BodyHandlers.ofString());
System.out.println(resp.body());
}
}
// MiniPay 统一下单 - Go Demo
package main
import (
"bytes"
"crypto/md5"
"encoding/hex"
"encoding/json"
"fmt"
"io"
"net/http"
"sort"
"strconv"
"strings"
"time"
)
const (
AppID = "你的AppID"
AppSecret = "你的AppSecret"
BaseURL = "https://minipay.1.taolianwl.cn"
)
func MD5(s string) string {
h := md5.Sum([]byte(s))
return hex.EncodeToString(h[:])
}
func main() {
timestamp := strconv.FormatInt(time.Now().Unix(), 10)
sign := MD5(AppID + AppSecret + timestamp)
body, _ := json.Marshal(map[string]interface{}{
"app_id": AppID,
"timestamp": timestamp,
"sign": sign,
// "mch_id": "16888888", // 可选,不传则自动轮询
"amount": 0.01,
"out_order_no": fmt.Sprintf("ORDER%d", time.Now().UnixMilli()),
"user_ip": "127.0.0.1",
"notify_url": "https://yoursite.com/pay/notify",
"sync_notify_url": "https://yoursite.com/pay/sync",
"description": "商品描述",
})
resp, err := http.Post(BaseURL+"/api/pay/unified-order", "application/json", bytes.NewReader(body))
if err != nil { panic(err) }
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}
// === 异步通知验签 ===
func VerifyNotify(params map[string]string, secret string) bool {
var keys []string
for k := range params {
if k != "sign" { keys = append(keys, k) }
}
sort.Strings(keys)
var parts []string
for _, k := range keys { parts = append(parts, k+"="+params[k]) }
expected := MD5(strings.Join(parts, "&") + "&key=" + secret)
return expected == params["sign"]
}
# MiniPay 统一下单 - cURL Demo
# 替换 APP_ID / APP_SECRET / TIMESTAMP / SIGN
# 1. 计算签名: MD5(app_id + app_secret + timestamp)
# 示例: echo -n "your_app_idyour_app_secret1715827200" | md5sum
# 2. 发起下单请求
curl -X POST https://minipay.1.taolianwl.cn/api/pay/unified-order \
-H 'Content-Type: application/json' \
-d '{
"app_id": "你的AppID",
"timestamp": "1715827200",
"sign": "计算出的签名",
"amount": 0.01,
"out_order_no": "ORDER_TEST_001",
"user_ip": "127.0.0.1",
"notify_url": "https://yoursite.com/pay/notify",
"sync_notify_url": "https://yoursite.com/pay/sync",
"description": "商品描述"
}'
# 3. 查询订单
curl -G https://minipay.1.taolianwl.cn/api/pay/query/ORDER_NO \
--data-urlencode 'app_id=你的AppID' \
--data-urlencode 'timestamp=1715827200' \
--data-urlencode 'sign=计算出的签名'
8️⃣ 错误码
错误码 含义 处理建议
1001 缺少鉴权参数 检查 app_id / sign / timestamp
1002 无效的 app_id 确认 app_id 是否正确
1003 签名错误 检查签名算法和 app_secret
2001 参数错误 检查必填参数是否完整
2002 商户号不存在/无可用商户号 确认 mch_id 是否正确且已激活,或在商户号管理中开启至少一个
2004 未配置支付密钥 在商户号管理中配置 API 密钥和证书
2005 手续费余额不足 联系管理员充值
2007 支付链接生成失败 检查小程序配置,稍后重试
7️⃣ Native支付(扫码支付)
适用于PC端、线下场景。用户微信扫码直接完成支付,无需小程序。
✅ 优势:无需绑定小程序,无需URL Link,微信扫码即付
📋 适用场景:PC网站支付、线下扫码、二维码收款
请求参数(在统一下单基础上增加):
成功响应:
- 生成二维码展示给用户(推荐使用
qrcode.js等库) - 用户用微信扫码 → 直接拉起微信收银台 → 完成支付
- code_url 有效期 2小时,过期需重新下单
Native支付流程:
- 你的系统调用 Native下单 API
- API返回
code_url(扫码链接) - 你的系统将 code_url 生成二维码,展示给用户
- 用户微信扫码 → 微信收银台 → 完成支付
- MiniPay 收到微信回调 → POST通知你的 notify_url
cURL 示例:
8️⃣ SDK Demo
以下为各语言统一下单调用示例,app_id / app_secret 请在「密钥管理」页面获取
<?php
// MiniPay 统一下单 - PHP Demo
$appId = '你的AppID';
$appSecret = '你的AppSecret';
$timestamp = time();
$sign = md5($appId . $appSecret . $timestamp);
$data = [
'app_id' => $appId,
'timestamp' => $timestamp,
'sign' => $sign,
// 'mch_id' => '16888888', // 可选,不传则自动轮询
'amount' => 0.01,
'out_order_no' => 'ORDER' . date('YmdHis') . rand(1000,9999),
'user_ip' => $_SERVER['REMOTE_ADDR'] ?? '127.0.0.1',
'notify_url' => 'https://yoursite.com/pay/notify',
'sync_notify_url'=> 'https://yoursite.com/pay/sync',
'description' => '商品描述',
];
$ch = curl_init('https://minipay.1.taolianwl.cn/api/pay/unified-order');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($data),
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
]);
$result = curl_exec($ch);
curl_close($ch);
$resp = json_decode($result, true);
if ($resp['code'] === 0) {
// 成功,引导用户跳转支付链接
header('Location: ' . $resp['data']['url_link']);
} else {
echo '下单失败: ' . $resp['msg'];
}
// === 异步通知处理 ===
$notify = json_decode(file_get_contents('php://input'), true);
$keys = array_filter(array_keys($notify), fn($k) => $k !== 'sign');
sort($keys);
$signStr = implode('&', array_map(fn($k) => $k.'='.$notify[$k], $keys)) . '&key=' . $appSecret;
if (md5($signStr) === $notify['sign'] && $notify['status'] === 'paid') {
// 验签通过,处理订单
$outOrderNo = $notify['out_order_no'];
$amount = $notify['amount'];
// ... 更新你的订单状态
echo json_encode(['code' => 0, 'msg' => 'ok']);
}
# MiniPay 统一下单 - Python Demo
import hashlib, time, requests, json
APP_ID = '你的AppID'
APP_SECRET = '你的AppSecret'
timestamp = str(int(time.time()))
sign = hashlib.md5((APP_ID + APP_SECRET + timestamp).encode()).hexdigest()
data = {
'app_id': APP_ID,
'timestamp': timestamp,
'sign': sign,
# 'mch_id': '16888888', # 可选,不传则自动轮询
'amount': 0.01,
'out_order_no': f'ORDER{int(time.time())}',
'user_ip': '127.0.0.1',
'notify_url': 'https://yoursite.com/pay/notify',
'sync_notify_url':'https://yoursite.com/pay/sync',
'description': '商品描述',
}
resp = requests.post(
'https://minipay.1.taolianwl.cn/api/pay/unified-order',
json=data, timeout=30
).json()
if resp['code'] == 0:
# 成功,引导用户跳转支付链接
print('支付链接:', resp['data']['url_link'])
else:
print('下单失败:', resp['msg'])
# === 异步通知处理 (Flask) ===
from flask import Flask, request
app = Flask(__name__)
@app.route('/pay/notify', methods=['POST'])
def pay_notify():
data = request.json
keys = sorted(k for k in data if k != 'sign')
sign_str = '&'.join(f'{k}={data[k]}' for k in keys) + f'&key={APP_SECRET}'
expected = hashlib.md5(sign_str.encode()).hexdigest()
if expected == data.get('sign') and data.get('status') == 'paid':
# 验签通过,处理订单
out_order_no = data['out_order_no']
amount = data['amount']
# ... 更新你的订单状态
return {'code': 0, 'msg': 'ok'}
return {'code': 1, 'msg': '验签失败'}, 400
// MiniPay 统一下单 - Node.js Demo
const crypto = require('crypto');
const https = require('https');
const APP_ID = '你的AppID';
const APP_SECRET = '你的AppSecret';
const timestamp = Math.floor(Date.now() / 1000).toString();
const sign = crypto.createHash('md5').update(APP_ID + APP_SECRET + timestamp).digest('hex');
const data = JSON.stringify({
app_id: APP_ID,
timestamp,
sign,
// mch_id: '16888888', // 可选,不传则自动轮询
amount: 0.01,
out_order_no: `ORDER${Date.now()}`,
user_ip: '127.0.0.1',
notify_url: 'https://yoursite.com/pay/notify',
sync_notify_url:'https://yoursite.com/pay/sync',
description: '商品描述',
});
const req = https.request({
hostname: 'minipay.1.taolianwl.cn',
path: '/api/pay/unified-order',
method: 'POST',
headers: { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(data) },
}, (res) => {
let body = '';
res.on('data', c => body += c);
res.on('end', () => {
const resp = JSON.parse(body);
if (resp.code === 0) {
console.log('支付链接:', resp.data.url_link);
} else {
console.log('下单失败:', resp.msg);
}
});
});
req.write(data);
req.end();
// === 异步通知处理 (Express) ===
const express = require('express');
const app = express();
app.use(express.json());
app.post('/pay/notify', (req, res) => {
const data = req.body;
const keys = Object.keys(data).filter(k => k !== 'sign').sort();
const signStr = keys.map(k => `${k}=${data[k]}`).join('&') + `&key=${APP_SECRET}`;
const expected = crypto.createHash('md5').update(signStr).digest('hex');
if (expected === data.sign && data.status === 'paid') {
// 验签通过,处理订单
console.log('支付成功:', data.out_order_no, data.amount);
res.json({ code: 0, msg: 'ok' });
} else {
res.status(400).json({ code: 1, msg: '验签失败' });
}
});
// MiniPay 统一下单 - Java Demo (JDK 11+)
import java.net.http.*;
import java.net.URI;
import java.security.MessageDigest;
import java.util.*;
public class MiniPayDemo {
static final String APP_ID = "你的AppID";
static final String APP_SECRET = "你的AppSecret";
static final String BASE_URL = "https://minipay.1.taolianwl.cn";
static String md5(String input) throws Exception {
byte[] hash = MessageDigest.getInstance("MD5").digest(input.getBytes());
StringBuilder sb = new StringBuilder();
for (byte b : hash) sb.append(String.format("%02x", b));
return sb.toString();
}
public static void main(String[] args) throws Exception {
String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
String sign = md5(APP_ID + APP_SECRET + timestamp);
String json = String.format("""
{"app_id":"%s","timestamp":"%s","sign":"%s",
"amount":0.01,
"out_order_no":"ORDER%d",
"user_ip":"127.0.0.1",
"notify_url":"https://yoursite.com/pay/notify",
"sync_notify_url":"https://yoursite.com/pay/sync",
"description":"商品描述"}
""", APP_ID, timestamp, sign, System.currentTimeMillis());
HttpClient client = HttpClient.newHttpClient();
HttpRequest req = HttpRequest.newBuilder()
.uri(URI.create(BASE_URL + "/api/pay/unified-order"))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(json))
.build();
HttpResponse resp = client.send(req, HttpResponse.BodyHandlers.ofString());
System.out.println(resp.body());
}
}
// MiniPay 统一下单 - Go Demo
package main
import (
"bytes"
"crypto/md5"
"encoding/hex"
"encoding/json"
"fmt"
"io"
"net/http"
"sort"
"strconv"
"strings"
"time"
)
const (
AppID = "你的AppID"
AppSecret = "你的AppSecret"
BaseURL = "https://minipay.1.taolianwl.cn"
)
func MD5(s string) string {
h := md5.Sum([]byte(s))
return hex.EncodeToString(h[:])
}
func main() {
timestamp := strconv.FormatInt(time.Now().Unix(), 10)
sign := MD5(AppID + AppSecret + timestamp)
body, _ := json.Marshal(map[string]interface{}{
"app_id": AppID,
"timestamp": timestamp,
"sign": sign,
// "mch_id": "16888888", // 可选,不传则自动轮询
"amount": 0.01,
"out_order_no": fmt.Sprintf("ORDER%d", time.Now().UnixMilli()),
"user_ip": "127.0.0.1",
"notify_url": "https://yoursite.com/pay/notify",
"sync_notify_url": "https://yoursite.com/pay/sync",
"description": "商品描述",
})
resp, err := http.Post(BaseURL+"/api/pay/unified-order", "application/json", bytes.NewReader(body))
if err != nil { panic(err) }
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}
// === 异步通知验签 ===
func VerifyNotify(params map[string]string, secret string) bool {
var keys []string
for k := range params {
if k != "sign" { keys = append(keys, k) }
}
sort.Strings(keys)
var parts []string
for _, k := range keys { parts = append(parts, k+"="+params[k]) }
expected := MD5(strings.Join(parts, "&") + "&key=" + secret)
return expected == params["sign"]
}
# MiniPay 统一下单 - cURL Demo
# 替换 APP_ID / APP_SECRET / TIMESTAMP / SIGN
# 1. 计算签名: MD5(app_id + app_secret + timestamp)
# 示例: echo -n "your_app_idyour_app_secret1715827200" | md5sum
# 2. 发起下单请求
curl -X POST https://minipay.1.taolianwl.cn/api/pay/unified-order \
-H 'Content-Type: application/json' \
-d '{
"app_id": "你的AppID",
"timestamp": "1715827200",
"sign": "计算出的签名",
"amount": 0.01,
"out_order_no": "ORDER_TEST_001",
"user_ip": "127.0.0.1",
"notify_url": "https://yoursite.com/pay/notify",
"sync_notify_url": "https://yoursite.com/pay/sync",
"description": "商品描述"
}'
# 3. 查询订单
curl -G https://minipay.1.taolianwl.cn/api/pay/query/ORDER_NO \
--data-urlencode 'app_id=你的AppID' \
--data-urlencode 'timestamp=1715827200' \
--data-urlencode 'sign=计算出的签名'
8️⃣ 错误码
| 错误码 | 含义 | 处理建议 |
|---|---|---|
| 1001 | 缺少鉴权参数 | 检查 app_id / sign / timestamp |
| 1002 | 无效的 app_id | 确认 app_id 是否正确 |
| 1003 | 签名错误 | 检查签名算法和 app_secret |
| 2001 | 参数错误 | 检查必填参数是否完整 |
| 2002 | 商户号不存在/无可用商户号 | 确认 mch_id 是否正确且已激活,或在商户号管理中开启至少一个 |
| 2004 | 未配置支付密钥 | 在商户号管理中配置 API 密钥和证书 |
| 2005 | 手续费余额不足 | 联系管理员充值 |
| 2007 | 支付链接生成失败 | 检查小程序配置,稍后重试 |