对于开发者而言,支付接口的对接往往是电商、SaaS平台或各类商业网站开发过程中最关键也最容易出问题的环节。易支付作为一站式聚合支付平台,提供了简洁高效的API接口体系,帮助开发者快速完成支付能力的集成。本文将从注册开始,手把手带你完成易支付API的完整对接流程。
一、对接前的准备工作
在开始编码之前,你需要完成以下几项准备工作,确保后续对接顺利进行:
注册商户账号:访问易支付官网注册商户账号,填写企业或个人信息并提交资质审核。审核通过后,你将获得商户ID(pid)和商户密钥(key),这是后续API调用的核心凭证,请务必妥善保管。
了解接口类型:易支付提供网页支付、扫码支付、H5支付和公众号支付等多种支付方式。不同的业务场景对应不同的接口类型,在开发之前,明确你的产品需要哪种支付方式可以避免返工。我们建议大多数网站和App选择网页支付+H5支付的组合方案,一次对接覆盖PC和移动端。
配置服务器环境:确保你的服务器能够发起HTTPS请求(用于调用易支付API)并能够接收外部请求(用于接收异步通知)。如果服务器在本地开发环境,可以使用内网穿透工具(如ngrok)暴露一个公网地址用于测试回调。
准备测试商户号:易支付为所有商户提供了测试模式。在管理后台开启"测试模式"后,所有交易均为模拟支付,不会产生真实资金流动。强烈建议在测试环境充分验证后再切换到生产模式。
二、签名算法详解
签名(Sign)是易支付API安全机制的核心,也是对接过程中最容易出错的地方。所有请求参数都需要按照规则计算签名,服务端通过验签来确认请求的完整性和来源合法性。
签名步骤:
第一步:将所有请求参数(不包括sign本身)按照参数名的ASCII码从小到大排序。
第二步:将排序后的参数用"&"符号拼接成字符串,格式为 key1=value1&key2=value2&key3=value3。
第三步:在拼接后的字符串末尾加上商户密钥(key),注意key直接拼接,不加任何分隔符。
第四步:对最终字符串进行MD5加密,结果即为sign签名值。
下面以PHP和Python两种语言展示签名算法的具体实现:
PHP签名示例:
function getSign($params, $key) {
// 移除sign参数
unset($params['sign']);
// 按键名ASCII码排序
ksort($params);
// 拼接参数
$str = http_build_query($params);
// 末尾追加商户密钥
$str .= $key;
// MD5加密返回
return md5($str);
}
// 调用示例
$params = [
'pid' => '1001',
'type' => 'alipay',
'out_trade_no' => 'ORDER20240624001',
'notify_url' => 'https://yourdomain.com/notify',
'return_url' => 'https://yourdomain.com/return',
'name' => '测试商品',
'money' => '0.01'
];
$key = 'your_merchant_key';
$params['sign'] = getSign($params, $key);
Python签名示例:
import hashlib
from urllib.parse import urlencode
def get_sign(params, key):
# 移除sign参数
params.pop('sign', None)
# 按键名排序
sorted_params = sorted(params.items())
# 拼接参数
sign_str = urlencode(sorted_params)
# 追加商户密钥
sign_str += key
# MD5加密返回
return hashlib.md5(sign_str.encode()).hexdigest()
# 调用示例
params = {
'pid': '1001',
'type': 'alipay',
'out_trade_no': 'ORDER20240624001',
'notify_url': 'https://yourdomain.com/notify',
'return_url': 'https://yourdomain.com/return',
'name': '测试商品',
'money': '0.01'
}
key = 'your_merchant_key'
params['sign'] = get_sign(params, key)
常见签名错误排查:参数值不要进行URL编码后再参与签名计算;空值参数不要参与签名(直接移除);确保参数名与文档完全一致(区分大小写);MD5结果必须为小写。很多对接问题都出在签名环节,建议先写一个单元测试来验证签名是否正确。
三、支付下单接口
签名准备就绪后,接下来就是最核心的支付下单环节。易支付的支付下单接口只需要一次HTTP POST请求即可完成。
接口地址:https://pay.mqsq.cn/submit.php
请求方式:POST(Content-Type: application/x-www-form-urlencoded)
核心参数说明:
pid(必填):商户ID,在管理后台获取。
type(必填):支付方式,可选值包括 alipay(支付宝)、wxpay(微信支付)、qqpay(QQ钱包)等。
out_trade_no(必填):商户订单号,建议使用时间戳+随机数生成,确保唯一性。格式如:PAY20240624143025ABC123。
notify_url(必填):异步通知地址,交易完成后易支付服务器会向此地址POST通知数据。
return_url(必填):同步跳转地址,用户支付完成后浏览器会跳转到此地址。
name(必填):商品名称,会展示在支付页面上。
money(必填):订单金额,单位为元,支持两位小数。
sign(必填):签名值,按照上述签名算法计算。
sign_type(可选):签名类型,默认MD5。
下单后的处理方式:
方式一——直接跳转:将表单以POST方式提交到接口地址,用户浏览器会自动跳转到支付页面。这是最简单的对接方式,适合传统网站。
方式二——获取支付链接:在请求中额外传入 format=json 参数,接口将返回一个JSON响应,其中包含支付页面URL。你可以拿到这个URL后自行处理(如生成二维码、在App中打开等)。这种方式更灵活,适合移动端和自定义支付流程。
// format=json 模式下的响应示例
{
"code": 1,
"msg": "下单成功",
"trade_no": "2024062414302567890",
"payurl": "https://pay.mqsq.cn/pay/xxx",
"qrcode": "https://pay.mqsq.cn/qrcode/xxx"
}
四、异步通知与订单状态处理
异步通知(回调)是支付对接中最容易被忽视但至关重要的环节。用户的支付结果不是通过return_url的同步跳转来确认的,而是依赖异步通知。原因很简单:用户在支付完成后可能直接关闭浏览器,return_url的跳转不一定会发生。
异步通知的处理流程:
第一步:接收POST请求。易支付服务器会向你的notify_url发送POST请求,携带订单信息和签名。
第二步:验证签名。使用与下单时相同的签名算法验证通知的合法性。这是安全的第一道防线,防止伪造通知。
第三步:验证订单状态。检查POST中的trade_status字段,值为"TRADE_SUCCESS"时才表示支付成功。
第四步:验证金额。将通知中的订单金额与你数据库中记录的金额进行比较,确保金额一致。这是防止金额篡改的关键步骤。
第五步:更新订单状态。以上验证全部通过后,更新数据库中的订单状态为"已支付",并执行相应的业务逻辑(发货、开通会员等)。
第六步:返回成功标识。处理完成后,必须向易支付返回字符串"success"(纯文本,不要加HTML标签)。如果返回其他内容或未返回,易支付会认为通知失败并在之后重试。
PHP异步通知处理示例:
// notify.php - 异步通知处理
$key = 'your_merchant_key';
$params = $_POST;
// 1. 验证签名
$received_sign = $params['sign'];
unset($params['sign']);
ksort($params);
$sign_str = http_build_query($params) . $key;
if (md5($sign_str) !== $received_sign) {
die('sign error');
}
// 2. 验证交易状态
if ($params['trade_status'] !== 'TRADE_SUCCESS') {
die('trade not success');
}
// 3. 查询数据库订单
$order = getOrderByTradeNo($params['out_trade_no']);
if (!$order) {
die('order not found');
}
// 4. 验证金额
if (floatval($params['money']) !== floatval($order['money'])) {
die('money mismatch');
}
// 5. 更新订单状态(注意幂等性)
if ($order['status'] === 'paid') {
echo 'success'; // 已处理过,直接返回成功
exit;
}
updateOrderStatus($params['out_trade_no'], 'paid', $params['trade_no']);
// 6. 返回成功
echo 'success';
重要提醒:异步通知的处理函数必须保证幂等性——同一个订单的通知可能因为网络原因被多次发送,你的代码需要能够正确处理重复通知而不会重复发货或重复开通服务。推荐的做法是在更新订单状态前先检查订单当前状态。
五、订单查询与退款接口
除了支付下单和异步通知,易支付还提供了订单查询和退款两个重要的辅助接口,帮助商户实现完整的支付管理闭环。
订单查询接口:用于主动查询某一笔订单的支付状态。当异步通知未收到或系统异常时,可以通过此接口确认订单的真实状态。
接口地址:https://pay.mqsq.cn/api.php?act=query
必传参数:pid(商户ID)、key(商户密钥)、out_trade_no(商户订单号)。注意,查询接口的签名方式与下单接口一致,但key直接作为参数传递用于身份校验。
返回字段说明:status为1表示支付成功,0表示未支付,-1表示已关闭或已退款。money为实际支付金额,trade_no为易支付系统订单号。
退款接口:当需要为用户办理退款时使用。
退款操作注意事项:退款金额不能超过原订单金额;支持部分退款和多次退款;退款结果以异步通知方式告知商户;退款处理时间通常为1-3个工作日,具体取决于支付通道。建议在管理后台或通过API查询退款状态。
以下为订单查询的完整示例:
// 订单查询示例
$pid = '1001';
$key = 'your_merchant_key';
$out_trade_no = 'ORDER20240624001';
$params = [
'act' => 'query',
'pid' => $pid,
'key' => $key,
'out_trade_no' => $out_trade_no
];
$url = 'https://pay.mqsq.cn/api.php?' . http_build_query($params);
$response = file_get_contents($url);
$result = json_decode($response, true);
if ($result['status'] == 1) {
echo "订单已支付,金额:{$result['money']}元";
} else {
echo "订单未支付";
}
六、常见问题与调试技巧
在实际对接过程中,开发者经常会遇到一些共性问题。以下是高频问题及解决方案:
签名验证失败:这是最高频的问题。排查步骤:检查参数排序是否正确(ASCII码升序);确认key是否正确拼接在末尾;验证MD5结果是否为小写;检查是否有空值参数参与了签名。
异步通知收不到:检查notify_url是否可以从公网访问(内网地址无效);确认服务器防火墙是否放行了易支付服务器的IP;查看服务器日志中是否有POST请求到达;使用易支付后台的"补发通知"功能手动触发通知。
return_url跳转后订单仍显示未支付:记住核心原则:以异步通知为准,不能依赖return_url的同步跳转来更新订单状态。return_url仅用于改善用户体验(展示支付结果页面),真正的状态更新必须通过异步通知完成。
金额精度问题:所有金额计算使用整数(单位:分)而非浮点数,避免浮点精度问题。发送给易支付时再转换为元(除以100)。
超时处理:建议为每笔订单设置有效期(如30分钟),超时未支付的订单自动关闭并向用户展示过期提示。这样既避免了僵尸订单堆积,也提升了用户体验。
七、生产环境上线检查清单
在从测试环境切换到生产环境之前,请逐项确认以下检查清单:
□ 已将测试密钥替换为生产环境密钥
□ notify_url和return_url已更新为生产域名
□ 异步通知处理逻辑已充分测试(包括重复通知场景)
□ 订单金额校验逻辑已生效
□ 数据库订单表已建立out_trade_no唯一索引(防止重复下单)
□ 支付超时自动关闭机制已部署
□ 日志记录功能已开启(便于排查线上问题)
□ 已完成至少一笔真实小额支付验证(0.01元测试)
□ 管理后台关闭了"测试模式"
□ 准备了回滚方案(如支付通道临时关闭的应对策略)
总结
易支付的API设计遵循简洁高效的原则,开发者只需掌握签名算法、支付下单、异步通知三个核心环节,即可在半天内完成支付功能的对接。对接支付接口看似复杂,但只要理解了背后的流程逻辑——下单获取支付链接、异步通知确认支付结果、查询接口兜底验证——就能做到游刃有余。
值得一提的是,易支付作为聚合支付平台,一套接口即可覆盖微信支付、支付宝、银联等多个渠道,大幅降低了多通道对接的开发和维护成本。对于中小型项目而言,选择聚合支付是一个性价比极高的技术决策。
支付是商业的"最后一公里",一个好的支付体验直接决定着转化率和用户信任。易支付将持续优化接口设计和文档质量,为开发者提供更流畅的对接体验。如果在对接过程中遇到任何问题,欢迎查阅官方技术文档或联系技术支持团队获取帮助。